簡體   English   中英

如何從flask中的中間件(app.before_request())返回flask響應?

[英]How to return flask response from the middleware(app.before_request()) in flask?

我在我的應用程序中聲明了一個中間件部分,在請求之前在哪里執行一些代碼。 在 flask 中有兩個裝飾器@app.before_request@app.after_request通過使用它們我們可以聲明一個中間件部分。 我想在中間件中驗證 JWT 令牌的身份驗證。

@app.before_request
def before_request_callback():
    try:

    # Checking jwt-authentication for every request
        verify_jwt_in_request()
    except:
        #Fill this block


如果令牌有問題,那么我想捕獲該異常並返回消息“無效令牌”。 我不想執行進一步的代碼。 那么如何從那個 except 塊返回響應呢?

正如文檔中所提到的,您可以以與從 Flask 視圖代碼中正常完成的方式相同的方式返回響應。 例如:

@app.before_request
def before_request_callback():
    try:
    # Checking jwt-authentication for every request
        verify_jwt_in_request()
    except:
        return 'invalid token', 401

知道如何解決它。

@app.before_request
def before_request_callback():
    try:
        # Checking jwt-authentication for every request except login
         verify_jwt_in_request()
    except:
        return make_response(jsonify(error_dict(current_request_id(), 'Invalid token ', 401)),
                             status.HTTP_401_UNAUTHORIZED)

對於燒瓶 jwt 擴展,您根本不需要捕獲異常。 只需使用verify_jwt_in_request()就足夠了,它會調用默認錯誤處理程序並返回適當的響應,說明令牌不存在或無效的原因。 您可以在此處查看默認響應並對其進行自定義: https : //flask-jwt-extended.readthedocs.io/en/stable/api/#module-flask_jwt_extended

你可以使用flask-http-middleware鏈接

from flask import Flask, jsonify
from flask_http_middleware import MiddlewareManager, BaseHTTPMiddleware

app = Flask(__name__)

class AccessMiddleware(BaseHTTPMiddleware):
    def __init__(self):
        super().__init__()
    
    def dispatch(self, request, call_next):
        if request.headers.get("token") == "secret":
            return call_next(request)
        else:
            return jsonify({"message":"invalid token"})

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()

每次你發出請求,它都會通過中間件

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM