【问题标题】:How do I access response content in WSGI middleware for Flask?如何在 Flask 的 WSGI 中间件中访问响应内容?
【发布时间】:2021-08-06 08:14:31
【问题描述】:

我想为 Flask 编写中间件,以更改 HTML 响应中的数据。在 Django 中,我可以使用 Middleware 类并访问 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

【问题讨论】:

    标签: python flask wsgi


    【解决方案1】:

    Flask 中与 Django 的“中间件”最接近的等价物是 Flask 的 before_requestafter_request 函数。他们可以在 Flask 应用程序的同一层内自省和修改请求和响应。

    要获取响应内容,请在 after_request 函数中访问 response.get_data(as_text=True)。该函数必须返回一个响应,要么直接修改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")]
    

    【讨论】:

      猜你喜欢
      • 2022-06-13
      • 2021-12-02
      • 2015-07-23
      • 1970-01-01
      • 2013-09-05
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 2017-05-19
      相关资源
      最近更新 更多