|
1 |
|
2 Managing requests |
|
3 ----------------- |
|
4 |
|
5 PyAMS_utils package provides some useful functions to handle requests. |
|
6 |
|
7 The "check_request" function can be used when you have to be sure that a request is active in |
|
8 the current execution thread; if no "real" request is active, a new one is created: |
|
9 |
|
10 >>> from pyams_utils.request import query_request, check_request |
|
11 >>> request = query_request() |
|
12 >>> request is None |
|
13 True |
|
14 >>> request = check_request() |
|
15 >>> request |
|
16 <PyAMSRequest at ... GET http://localhost/> |
|
17 |
|
18 If a new request is created "from scratch", it's registry is assigned to global registry: |
|
19 |
|
20 >>> request.registry |
|
21 <Registry global> |
|
22 |
|
23 A request context can be used to activate a request into execution thread: |
|
24 |
|
25 >>> from pyramid.threadlocal import RequestContext |
|
26 >>> with RequestContext(request) as context_request: |
|
27 ... context_request is request |
|
28 True |
|
29 >>> with RequestContext(request): |
|
30 ... context_request = check_request() |
|
31 ... context_request is request |
|
32 True |
|
33 |
|
34 Requests can now support annotations to set and retrieve any information to a given request: |
|
35 |
|
36 >>> from zope.annotation.interfaces import IAttributeAnnotatable, IAnnotations |
|
37 >>> from zope.annotation.attribute import AttributeAnnotations |
|
38 >>> from pyams_utils.registry import get_global_registry |
|
39 >>> registry = get_global_registry() |
|
40 >>> registry.registerAdapter(AttributeAnnotations, (IAttributeAnnotatable, ), IAnnotations) |
|
41 |
|
42 >>> from pyams_utils.request import get_request_data, set_request_data |
|
43 >>> set_request_data(request, 'test', 'This is request data') |
|
44 >>> get_request_data(request, 'test') |
|
45 'This is request data' |
|
46 |
|
47 Annotations can be used to automatically reify a given property into request annotations: |
|
48 |
|
49 >>> from pyams_utils.request import request_property |
|
50 >>> class RequestPropertyTestClass(object): |
|
51 ... |
|
52 ... @request_property(key='My property') |
|
53 ... def my_property(self): |
|
54 ... print("This is my property") |
|
55 ... return 1 |
|
56 ... |
|
57 >>> with RequestContext(request): |
|
58 ... instance = RequestPropertyTestClass() |
|
59 ... instance.my_property() |
|
60 This is my property |
|
61 1 |
|
62 |
|
63 As property value is cached into request annotations, other property calls will just return |
|
64 cached value: |
|
65 |
|
66 >>> with RequestContext(request): |
|
67 ... instance.my_property() |
|
68 1 |
|
69 |
|
70 The "copy_request" function is used to clone another request. All request methods and properties |
|
71 defined via "add_request_method()" are kept, as "registry" and "root" attributes: |
|
72 |
|
73 >>> from pyams_utils.request import copy_request |
|
74 >>> request2 = copy_request(request) |
|
75 >>> request2.registry is request.registry |
|
76 True |
|
77 >>> request2.root is None |
|
78 True |