我使用Falcon,我需要将变量从中间件传递到资源,我该怎么做?
主.py
app = falcon.API(middleware=[
AuthMiddleware()
])
app.add_route('/', Resource())
并验证
class AuthMiddleware(object):
def process_request(self, req, resp):
self.vvv = True
和资源
class Resource(object):
def __init__(self):
self.vvv = False
def on_get(self, req, resp):
logging.info(self.vvv) #vvv is always False
为什么self.vv总是假的?我已经在中间件中将其更改为true。
首先,您混淆了self
的含义。Self只影响类的实例,是向类添加属性的一种方式,因此AuthMiddleware
中的self.vvv
与Resource
中的self.vvv
是完全不同的属性。
其次,您不需要从资源中的AuthMiddleware了解任何信息,这就是您想要使用中间件的原因。中间件是在每个请求之后或之前执行逻辑的一种方式。你需要实现你的中间件,这样它就会引发Falcon异常,或者修改你的请求或响应。
例如,如果你没有授权一个请求,你必须引发这样的异常:
class AuthMiddleware(object):
def process_request(self, req, resp):
token = req.get_header('Authorization')
challenges = ['Token type="Fernet"']
if token is None:
description = ('Please provide an auth token '
'as part of the request.')
raise falcon.HTTPUnauthorized('Auth token required',
description,
challenges,
href='http://docs.example.com/auth')
if not self._token_is_valid(token):
description = ('The provided auth token is not valid. '
'Please request a new token and try again.')
raise falcon.HTTPUnauthorized('Authentication required',
description,
challenges,
href='http://docs.example.com/auth')
def _token_is_valid(self, token):
return True # Suuuuuure it's valid...
查看Falcon页面示例。
来源https://falcon.readthedocs.io/en/stable/api/middleware.html:
为了将数据从中间件函数传递到资源函数,请使用
req.context
和resp.context
对象。这些上下文对象用于在应用程序通过框架时保存特定于应用程序的请求和响应数据。
class AuthMiddleware(object):
def process_request(self, req, resp):
# self.vvv = True # -
req.context.vvv = True # +
class Resource(object):
# def __init__(self): # -
# self.vvv = False # -
def on_get(self, req, resp):
# logging.info(self.vvv) # -
logging.info(req.context.vvv) # +
您不应该将中间件和资源实例上的属性用于请求数据。由于您只实例化它们一次,因此修改它们的属性通常不是线程安全的。