51 lines
1.7 KiB
Python
51 lines
1.7 KiB
Python
# -*- coding: utf-8 -*-
|
|
"""
|
|
自定义中间件。
|
|
"""
|
|
import json
|
|
|
|
|
|
class ResponseCodeMiddleware:
|
|
"""为所有 JSON 响应 body 统一注入 code 字段(与 HTTP 状态码一致)。"""
|
|
|
|
def __init__(self, get_response):
|
|
self.get_response = get_response
|
|
|
|
def __call__(self, request):
|
|
response = self.get_response(request)
|
|
if "application/json" not in response.get("Content-Type", ""):
|
|
return response
|
|
try:
|
|
content = response.content.decode(response.charset or "utf-8")
|
|
data = json.loads(content)
|
|
code = response.status_code
|
|
if isinstance(data, dict):
|
|
if "code" not in data:
|
|
data["code"] = code
|
|
elif isinstance(data, list):
|
|
data = {"code": code, "data": data}
|
|
else:
|
|
data = {"code": code, "data": data}
|
|
response.content = json.dumps(data, ensure_ascii=False).encode(response.charset or "utf-8")
|
|
except (ValueError, TypeError, UnicodeDecodeError):
|
|
pass
|
|
return response
|
|
|
|
|
|
class CorsMiddleware:
|
|
"""简易 CORS 中间件,允许所有跨域请求。"""
|
|
|
|
def __init__(self, get_response):
|
|
self.get_response = get_response
|
|
|
|
def __call__(self, request):
|
|
response = self.get_response(request)
|
|
response["Access-Control-Allow-Origin"] = "*"
|
|
response["Access-Control-Allow-Methods"] = "GET, POST, PUT, DELETE, OPTIONS"
|
|
response["Access-Control-Allow-Headers"] = "*"
|
|
response["Access-Control-Allow-Credentials"] = "true"
|
|
if request.method == "OPTIONS":
|
|
response.status_code = 200
|
|
response.content = b""
|
|
return response
|