在处理请求之前对其设置属性

2024-04-19 17:12:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我的应用程序引擎应用程序有一个自定义的用户模型。在应用程序代码中经常访问此模型。我想通过在处理请求之前向每个经过身份验证的请求中注入一个模型实例来简化代码(类似于Django中间件类的process_request方法)。你知道吗

我正在使用appengine Python2.7标准运行时和webapp2作为框架。你知道吗

我尝试创建一个WSGI中间件callable,它修改了WSGI环境字典并定义了一个webapp_add_wsgi_middleware函数appengine_config.py来添加中间件,但是直到应用程序处理了请求之后,中间件才运行。你知道吗

在应用程序处理请求之前,如何修改请求?你知道吗


Tags: 中间件django实例代码用户模型引擎身份验证
1条回答
网友
1楼 · 发布于 2024-04-19 17:12:38

我找到的解决方案是创建一个子类webapp2.WSGIApplication,并在调用超类运行应用程序之前修改environ字典。将实例设置为请求的属性,而不必通过请求环境,我将它添加到environ网站临时属性'值。这是因为webapp2的请求类继承自webob,后者又继承自管理属性访问的mixin class。你知道吗

下面是一个为所有请求设置属性的示例应用程序:

import webapp2


class Handler(webapp2.RequestHandler):

    def get(self):
        try:
            foo = self.request.foo
        except AttributeError:
            foo = 'Default'
        self.response.write('Hello %s' % foo)


routes = [('/', Handler)]


class MyWSGIApplication(webapp2.WSGIApplication):

    def __call__(self, environ, start_response):
        adhoc_attrs = {'foo': 'Foo'}
        if 'webob.adhoc_attrs' in environ:
            environ['webob.adhoc_attrs'].update(adhoc_attrs)
        else:
            environ['webob.adhoc_attrs'] = adhoc_attrs
        return super(MyWSGIApplication, self).__call__(environ, start_response)


app = MyWSGIApplication(routes)

相关问题 更多 >