在处理请求之前设置属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在处理请求之前设置属性相关的知识,希望对你有一定的参考价值。

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

我使用App Engine Python2.7标准运行时与webapp2作为框架。

我尝试创建一个可调用的WSGI中间件,它修改了WSGI environ字典,并定义了一个webapp_add_wsgi_middleware函数appengine_config.py来添加中间件,但是中间件直到应用程序处理完请求后才运行。

如何在应用程序处理请求之前修改请求?

答案

我找到的解决方案是创建webapp2.WSGIApplication的子类,并在调用超类运行应用程序之前修改environ字典。要将实例设置为请求的属性,而不是通过Request.environ访问它,我将其添加到environ的'webob.adhoc_attrs'值。这是因为webapp2的Request类继承自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)

以上是关于在处理请求之前设置属性的主要内容,如果未能解决你的问题,请参考以下文章

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

VSCode自定义代码片段14——Vue的axios网络请求封装

将多个输出中的hls属性设置为单独的片段代码

QT 实用代码片段

在具有多行标题的选项卡上设置片段