![](/img/trans.png)
[英]How to access wsgi params from a request inside a middleware and a flask request without side effect?
[英]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_request
和after_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.