src/pyams_utils/doctests/request.rst
changeset 435 4504a27af426
parent 317 66a46827a3e1
equal deleted inserted replaced
434:7f256d281e84 435:4504a27af426
       
     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