如何在Django 1.11中为所有接口响应头设置UTF-8编码的charset参数
可行实现方案
你提到的后置中间件方案完全可行,是通用性最强的解决方案,除此之外也可以根据你的项目场景选择更轻量化的方案:
方案1:自定义后置中间件(推荐,全场景兼容)
该方案可以统一处理所有接口的响应头,不会覆盖已有正确配置:
- 在你的项目任意应用下新建
middleware.py文件,写入以下代码:
# 兼容Django 1.11 版本的中间件写法 class UTF8CharsetMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 先执行所有上游中间件和视图逻辑,拿到最终响应 response = self.get_response(request) # 仅处理未指定charset的响应,可按需添加判断仅针对json类型修改 if "Content-Type" in response and "charset" not in response["Content-Type"]: # 若只需要修改json接口,放开下一行的判断即可 # if "application/json" in response["Content-Type"]: response["Content-Type"] = f"{response['Content-Type']}; charset=UTF-8" return response
- 在
settings.py的MIDDLEWARE列表最末尾添加中间件注册配置,保证它是最后一个处理响应的中间件,避免被上游逻辑覆盖:
MIDDLEWARE = [ # 其他原有中间件保持不变 '你的应用名称.middleware.UTF8CharsetMiddleware', ]
方案2:统一使用JsonResponse返回接口数据
如果你的项目接口均为json类型,不需要处理其他返回格式,可以直接替换所有手动构造的HttpResponse为Django自带的JsonResponse,它默认会自动携带charset=UTF-8参数:
# 旧写法,不会自动加charset from django.http import HttpResponse import json return HttpResponse(json.dumps(data), content_type="application/json") # 新写法,自动生成符合要求的Content-Type from django.http import JsonResponse return JsonResponse(data)
方案3:全局配置默认参数(仅全接口为json场景可用)
如果你的项目所有接口都是json返回,没有其他页面、静态文件等响应,可直接在settings.py中添加以下配置:
DEFAULT_CHARSET = "utf-8" DEFAULT_CONTENT_TYPE = "application/json; charset=utf-8"
内容的提问来源于stack exchange,提问作者Antonio Gamiz Delgado
相关产品推荐
相关产品推荐

