我的App Engine应用程序具有自定义用户模型。在应用程序代码中经常访问此模型。我想通过在处理请求之前将模型实例注入每个经过身份验证的请求来简化代码(类似于Django中间件类的process_request
方法)。
我使用App Engine Python2.7标准运行时,webapp2作为框架。
我尝试创建一个WSGI中间件可调用,它修改了WSGI environ字典并定义了webapp_add_wsgi_middleware
函数appengine_config.py
来添加中间件,但是中间件直到请求被处理后才运行。应用
如何在应用程序处理请求之前修改请求?
答案 0 :(得分:2)
我找到的解决方案是创建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)