我有一個使用 Flask-CORS 的 Flask 應用程式,以及一個 WSGI 中間件,它為某些路由回傳自定義回應而不是 Flask 應用程式。對于中間件回傳的回應,未應用 Flask-CORS,因此我必須手動將 CORS 標頭應用于該回應。
class Middleware:
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
request = Request(environ)
if request.path == "/foo":
res = Response("...", mimetype="application/json", status=403)
# flask-cors is not applied, so I set headers manually
res.access_control_allow_credentials = True
res.access_control_allow_origin = "*"
res.access_control_allow_methods = ["GET", "PUT", "DELETE", "PATCH", "OPTIONS", "POST", "HEAD"]
return res(environ, start_response)
return self.app(environ, start_response) # flask-cors works here
app = Flask(__name__)
app.wsgi_app = Middleware(app)
CORS(app)
我嘗試顛倒應用中間件和 Flask-CORS 的順序,但這并沒有改變它。
app = Flask(__name__)
CORS(app)
app.wsgi_app = Middleware(app)
我不想重復 Flask-CORS 所做的事情。如何將 Flask-CORS 應用于來自中間件的回應?
uj5u.com熱心網友回復:
Flask-CORS 是 Fl??ask 的擴展。它作業在 Flask 應用程式層,即它對到達 Flask 應用程式的請求進行操作。中間件應用到應用程式發生周圍的瓶應用,該層以上的燒瓶延伸所看到的。注冊擴展與應用中間件的順序與此無關,它們位于 WSGI 呼叫堆疊的不同層。
當請求進來時,您的中間件決定盡早回傳回應,并且永遠不會呼叫它包裝的 Flask 應用程式,因此 Flask 應用程式不會執行任何內容,包括其上的 Flask-CORS 擴展。您不能將 Flask-CORS 應用于中間件回應,因為它不在同一層作業。
如果您的中間件回傳的回應中需要 CORS 標頭,則需要按照您的操作進行設定并自行設定。如果您想避免這種重復,您需要在 Flask 中完成所有操作,或者撰寫一個中間件來圍繞其他中間件而不是 Flask-CORS 擴展執行 CORS。
要在 Flask 堆疊中撰寫等效于您的中間件,以便 Flask-CORS 擴展影響您生成的回應,請使用before_request. 甲before_request函式可以回傳一個回應(或中止),以端視圖早期處理并移動到回應處理。
from flask import request, Response
@app.before_request
def some_users_403():
if request.path == "/foo":
return Response("...", status=403)
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/316759.html
