You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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:自定义中间件处理根路径重定向(灵活扩展)

如果需要保留请求参数等复杂场景,可自定义中间件拦截根路径请求:

  1. 在项目目录下创建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)
  1. 在settings.py的MIDDLEWARE中添加该中间件(放在LocaleMiddleware之后):
MIDDLEWARE = [
    # ... 其他中间件
    'django.middleware.locale.LocaleMiddleware',
    'your_project_name.middleware.RootLangRedirectMiddleware',  # 替换为你的项目名
    # ... 其他中间件
]

测试验证

设置DEBUG=False后启动服务器,访问localhost:8000,应该会自动重定向到/en/或用户上次使用的语言路径,不再返回404。

内容的提问来源于stack exchange,提问作者lolo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 15:45:50