React+i18next项目中通过Axios向Django REST Framework传递语言信息
React + i18next + Axios 传递语言信息到后端及Django DRF获取方案
前端实现:全局Axios自动注入语言头
利用Axios请求拦截器,每次发起请求前动态添加当前语言到请求头,这是最简便的全局统一处理方式:
- 确保已通过i18next获取当前语言(
i18next.language为全局可用的语言标识) - 给你的全局Axios实例添加拦截器:
import i18next from 'i18next'; // 你的全局Axios实例 const client = axios.create({ baseURL: CONSTANTS.API.BASE, headers: { "Content-Type": "application/json", }, timeout: TIME_OUT, }); // 请求拦截器:自动注入语言头 client.interceptors.request.use( (config) => { // 优先用标准的Accept-Language头,符合HTTP规范 config.headers['Accept-Language'] = i18next.language; // 若需自定义头,可添加:config.headers['X-Language'] = i18next.language; return config; }, (error) => Promise.reject(error) );
注意:如果是在组件内使用,确保i18next已完成初始化,避免获取到空值。
后端Django REST Framework 获取语言信息
方式1:利用Django内置Locale中间件(推荐)
Django默认支持解析Accept-Language请求头,只需配置好相关中间件即可直接获取:
- 配置settings.py:
# settings.py MIDDLEWARE = [ # 注意顺序:LocaleMiddleware需放在SessionMiddleware和CommonMiddleware之后 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', 'django.middleware.common.CommonMiddleware', # ... 其他中间件 ] # 配置支持的语言列表 LANGUAGES = [ ('zh-hans', '简体中文'), ('en', 'English'), ] # 配置翻译文件路径 LOCALE_PATHS = [ BASE_DIR / 'locale', ]
- 在视图中获取语言:
from rest_framework.views import APIView from rest_framework.response import Response class DemoView(APIView): def get(self, request): # request.LANGUAGE_CODE会自动根据Accept-Language头返回匹配的语言代码 current_lang = request.LANGUAGE_CODE return Response({"current_language": current_lang})
方式2:读取自定义请求头
如果前端使用了自定义头(如X-Language),直接从request的META属性中读取:
class DemoView(APIView): def get(self, request): # HTTP头在Django中会被转成大写并添加HTTP_前缀 current_lang = request.META.get('HTTP_X_LANGUAGE', 'en') return Response({"current_language": current_lang})
常见问题排查(之前后端未获取到值的可能原因)
- 前后端头名不匹配:比如前端用
X-Language,后端误读HTTP_X_LANG - 跨域限制:自定义头需在Django的corsheaders配置中加入
CORS_ALLOW_HEADERS列表 - 前端初始化问题:i18next未完成初始化时,语言值为空,导致注入空的请求头
内容的提问来源于stack exchange,提问作者Bruno Silvestre
相关产品推荐
相关产品推荐

