簡體   English   中英

如何訪問 Flask 的 WSGI 中間件中的響應內容?

[英]How do I access response content in WSGI middleware for Flask?

我想為 Flask 編寫中間件,以更改 HTML 響應中的數據。 在 Django 中,我可以使用Middleware class 並訪問response.content來更改內容。 如何訪問和修改 Flask 或 WSGI 中間件中的響應內容?

class Middleware:
    def __init__(self, get_response=None):
        self.get_response = get_response

    def __call__(self, request):
        response = self.get_response(request)
        self.process_response(request, response)
        return response

    def process_response(self, request, response):
        html = response.content.decode('utf-8')
        # do stuff with the HTML
        return response

Flask 中 Django 的“中間件”最接近的等價物是 Flask 的before_requestafter_request函數。 他們可以在與 Flask 應用程序相同的層內自省和修改請求和響應。

要獲取響應內容,請訪問after_request function 中的response.get_data(as_text=True) function 必須返回一個響應,要么直接修改response.data要么使用app.make_response(new_data)創建一個新的響應。 您還可以修改共振的任何其他屬性。

from flask import request

@app.before_request
def modify_incoming():
    if {some test on request}:
        ...

    # can return app.make_response() to end the request early

@app.after_request
def modify_outgoing(response):
    html = response.get_data(as_text=True)
    response.data = {modify html}
    return response

WSGI 中間件(可以與任何 WSGI 框架一起使用,包括 Django)位於應用程序本身之外的一層,因此您需要使用 WSGI 規范提供的基本接口。 Werkzeug 的實用程序可能在這個較低層有用。

class ModifyHTMLMiddleware:
    def __init__(self, app):
        self.app = app

    def __call__(self, environ, start_response):
        # can modify environ to affect what the wrapped application sees
        app_iter = self.app(environ, start_response)
        # decode and encode need to use the appropriate codec
        html = b"".join(app_iter).decode("utf8")
        # modify html
        return [html.encode("utf8")]

暫無
暫無

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

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