#python #flask
#python #flask
Вопрос:
Я планировал использовать flask framework для своего нового проекта. Итак, я начал изучать сегодня. Я мог понять базовые маршрутизации и промежуточное программное обеспечение. Я пытаюсь прочитать значения заголовка в промежуточном программном обеспечении, после этого мне нужно проверить эти заголовки. Но я не смог прочитать промежуточное программное обеспечение заголовка. Пожалуйста, смотрите мои кодировки ниже.
app.py
from flask import Flask
from flask_restx import Resource, Api
import middleware
app = Flask(__name__)
app.wsgi_app = middleware.middleware(app.wsgi_app)
api = Api(app)
@api.route('/hello')
class HelloWorld(Resource):
def get(self):
return {'hello': 'world'}
if __name__ == '__main__':
app.run(debug=True)
middleware.py
from flask import request
class middleware():
'''
Simple WSGI middleware
'''
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
if 'auth-key' in request.headers:
authKey = request.headers['auth-key']
print(authKey)
return self.app(environ, start_response)
Но я получаю приведенную ниже ошибку.
Traceback (most recent call last):
File "/home/testuser/Projects/Python/m-registry/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
return self.wsgi_app(environ, start_response)
File "/home/testuser/Projects/Python/m-registry/middleware.py", line 14, in __call__
if 'auth-key' in request.headers:
File "/home/testuser/Projects/Python/m-registry/lib/python3.8/site-packages/werkzeug/local.py", line 347, in __getattr__
return getattr(self._get_current_object(), name)
File "/home/testuser/Projects/Python/m-registry/lib/python3.8/site-packages/werkzeug/local.py", line 306, in _get_current_object
return self.__local()
File "/home/testuser/Projects/Python/m-registry/lib/python3.8/site-packages/flask/globals.py", line 38, in _lookup_req_object
raise RuntimeError(_request_ctx_err_msg)
RuntimeError: Working outside of request context.
This typically means that you attempted to use functionality that needed
an active HTTP request. Consult the documentation on testing for
information about how to avoid this problem.
Пожалуйста, кто-нибудь, помогите решить эту проблему.
Заранее спасибо
Ответ №1:
request
Объект создается в приложении Flask, но ваше промежуточное программное обеспечение по существу находится между сервером WSGI и этим приложением flask. Таким образом, вы не можете получить доступ к объекту запроса в промежуточном программном обеспечении.
Вы можете попытаться написать свою логику как обработчик @before_request или что-то в этом роде. Например
@app.before_request
def handle_every_request():
if 'auth-key' in request.headers:
authKey = request.headers['auth-key']
#DO SOEMTHIGN HERE?
Ответ №2:
Вы можете использовать flask-http-middleware
для этого (ссылка)
У вас также будет прямой доступ как для request
, так и response
from flask import Flask
from flask_http_middleware import MiddlewareManager, BaseHTTPMiddleware
app = Flask(__name__)
class MetricsMiddleware(BaseHTTPMiddleware):
def __init__(self):
super().__init__()
def dispatch(self, request, call_next):
authkey = request.headers.get("auth-key")
response = call_next(request)
return response
app.wsgi_app = MiddlewareManager(app)
app.wsgi_app.add_middleware(MetricsMiddleware)
@app.get("/health")
def health():
return {"message":"I'm healthy"}
if __name__ == "__main__":
app.run()