Django多语言站点DEBUG=False时根路径访问出现404错误求助
解决Django DEBUG=False时根路径404的多语言问题
问题分析
当DEBUG=True时,Django调试中间件会自动处理不带语言前缀的根路径(/),重定向到默认语言或用户上次使用的语言路径;但DEBUG=False时调试中间件被禁用,而你的路由配置中没有为根路径(/)匹配任何视图,因此返回404错误。
解决方案
方案1:在非国际化路由中添加根路径重定向视图
修改项目根目录的urls.py,在普通urlpatterns中添加根路径的处理逻辑,手动重定向到对应语言路径:
from django.shortcuts import redirect from django.conf import settings def redirect_to_default_language(request): # 优先获取用户Cookie中保存的语言,无则使用默认语言 user_lang = request.COOKIES.get(settings.LANGUAGE_COOKIE_NAME, settings.LANGUAGE_CODE) return redirect(f"/{user_lang}/") urlpatterns = [ path('i18n/', include('django.conf.urls.i18n')), path('', redirect_to_default_language), # 新增根路径处理 ] urlpatterns += i18n_patterns( path('admin/', admin.site.urls), path('', include('app1.urls')), path('', include('app2.urls')), ) handler404='app1.views.handle_not_found'
方案2:确保LocaleMiddleware配置正确
检查settings.py中的MIDDLEWARE列表,必须包含django.middleware.locale.LocaleMiddleware,且顺序要放在SessionMiddleware之后、CommonMiddleware之前:
MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.locale.LocaleMiddleware', # 位置不可错 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', ]
注:LocaleMiddleware是Django处理语言自动切换的核心中间件,缺失或顺序错误会导致语言路由逻辑失效。
方案3:自定义中间件处理根路径重定向(灵活扩展)
如果需要保留请求参数等复杂场景,可自定义中间件拦截根路径请求:
- 在项目目录下创建
middleware.py:
from django.shortcuts import redirect from django.conf import settings class RootLangRedirectMiddleware: def __init__(self, get_response): self.get_response = get_response def __call__(self, request): # 仅处理根路径且未带语言前缀的请求 if request.path == '/' and not request.path.startswith(f"/{settings.LANGUAGE_CODE}"): user_lang = request.COOKIES.get(settings.LANGUAGE_COOKIE_NAME, settings.LANGUAGE_CODE) # 保留查询参数重定向 target_url = f"/{user_lang}/?{request.GET.urlencode()}" if request.GET else f"/{user_lang}/" return redirect(target_url) return self.get_response(request)
- 在
settings.py的MIDDLEWARE中添加该中间件(放在LocaleMiddleware之后):
MIDDLEWARE = [ # ... 其他中间件 'django.middleware.locale.LocaleMiddleware', 'your_project_name.middleware.RootLangRedirectMiddleware', # 替换为你的项目名 # ... 其他中间件 ]
测试验证
设置DEBUG=False后启动服务器,访问localhost:8000,应该会自动重定向到/en/或用户上次使用的语言路径,不再返回404。
内容的提问来源于stack exchange,提问作者lolo
相关产品推荐
相关产品推荐

