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

Django动态URL模式生产环境返回404错误求助

Django CMS动态URL生产环境404问题排查与解决

问题描述

开发Django CMS应用时,动态URL模式gallery/<int:folder_pk>/在生产环境持续返回404错误。开启DEBUG=True后,Django提示当前路径/ro/gallery/3/未匹配到已定义的ro/gallery/<int:folder_pk>/(name='dynamic_gallery_view')模式。

  • 本地开发服务器(Django内置服务器)功能正常,生产环境失效
  • 排除ro/后空格问题(其他同格式URL正常)
  • 开发环境调用URL不带语言标签,未发现URL配置差异

相关代码

应用urls.py

from django.urls import path
from .views import (postBarbersCards_create_employee,
                    postBarbersCards_create_location,
                    postBarbersCards_update_employee,
                    postBarbersCards_update_location,
                    postBarbersCards_delete_employee,
                    postBarbersCards_delete_location,
                    postBarbersCards_caroussel,
                    render_gallery_location,
                    render_gallery_location_selector)

urlpatterns = [
    # ... other urls
    path('post/ajax/postBarbersCards_create_employee', postBarbersCards_create_employee, name = "postBarbersCards_create_employee"),
    path('post/ajax/postBarbersCards_create_location', postBarbersCards_create_location, name = "postBarbersCards_create_location"),
    path('post/ajax/postBarbersCards_update_employee', postBarbersCards_update_employee, name = "postBarbersCards_update_employee"),
    path('post/ajax/postBarbersCards_update_location', postBarbersCards_update_location, name = "postBarbersCards_update_location"),
    path('post/ajax/postBarbersCards_delete_employee', postBarbersCards_delete_employee, name = "postBarbersCards_delete_employee"),
    path('post/ajax/postBarbersCards_delete_location', postBarbersCards_delete_location, name = "postBarbersCards_delete_location"),
    path('post/ajax/postBarbersCards_caroussel', postBarbersCards_caroussel, name = "postBarbersCards_caroussel"),
    path('gallery/<int:folder_pk>/',render_gallery_location, name='dynamic_gallery_view'),
    path('gallery/location',render_gallery_location_selector, name='dynamic_gallery_location_view'),

    # ...
]

应用views.py

from django.shortcuts import get_object_or_404, render
from django.http import JsonResponse
from django.core import serializers
from django.http import HttpResponse
from .models import Barbers_Locations_Model, Barbers_Employees_Model
from filer.models.filemodels import File
from filer.models.foldermodels import Folder
import json

[...]

def render_gallery_location(request, folder_pk):
    item = File.objects.filter(folder_id=folder_pk).values('file', 'folder_id')
    return render(request, '_barbers_cards_gallery_page.html', {'item': item })

根urls.py

from django.conf import settings
from django.conf.urls.i18n import i18n_patterns
from django.conf.urls.static import static
from django.contrib import admin
from django.urls import include, path
from django.views.i18n import JavaScriptCatalog
from django.views.static import serve
from django.urls import path, include,re_path

urlpatterns = i18n_patterns(
    path('jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),
    path('admin/', admin.site.urls),
    path('filer/', include('filer.urls')),
    path('', include('cms.urls')),
    re_path(r'^media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT}),
    path('',include('Apps.barbers_cards.urls')),
)

if settings.DEBUG:
    urlpatterns += static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

DEBUG模式下的URL模式列表

@dcf-links/
ro/ jsi18n/ [name='javascript-catalog']
ro/ admin/
ro/ filer/
ro/ ^cms_login/$ [name='cms_login']
ro/ ^cms_wizard/
ro/ ^(?P<slug>[0-9A-Za-z-_.//]+)/$ [name='pages-details-by-slug']
ro/ ^$ [name='pages-root']
ro/ ^media/(?P<path>.*)$
ro/ post/ajax/postBarbersCards_create_employee [name='postBarbersCards_create_employee']
ro/ post/ajax/postBarbersCards_create_location [name='postBarbersCards_create_location']
ro/ post/ajax/postBarbersCards_update_employee [name='postBarbersCards_update_employee']
ro/ post/ajax/postBarbersCards_update_location [name='postBarbersCards_update_location']
ro/ post/ajax/postBarbersCards_delete_employee [name='postBarbersCards_delete_employee']
ro/ post/ajax/postBarbersCards_delete_location [name='postBarbersCards_delete_location']
ro/ post/ajax/postBarbersCards_caroussel [name='postBarbersCards_caroussel']
ro/ gallery/<int:folder_pk>/ [name='dynamic_gallery_view']
ro/ gallery/location [name='dynamic_gallery_location_view']
^media/(?P<path>.*)$

解决步骤

1. 调整URL包含顺序

根urls.py中,CMS的URL规则path('', include('cms.urls'))在自定义应用URL之前,其^(?P<slug>[0-9A-Za-z-_.//]+)/$会优先捕获所有类似gallery/3/的路径,导致自定义URL无法匹配。将自定义应用的URL包含移到CMS之前:

urlpatterns = i18n_patterns(
    path('jsi18n/', JavaScriptCatalog.as_view(), name='javascript-catalog'),
    path('admin/', admin.site.urls),
    path('filer/', include('filer.urls')),
    path('',include('Apps.barbers_cards.urls')),  # 移至CMS规则前
    path('', include('cms.urls')),
    re_path(r'^media/(?P<path>.*)$',serve,{'document_root':settings.MEDIA_ROOT}),
)

2. 验证生产环境语言配置

检查settings.py中的语言相关配置,确保ro在LANGUAGES列表中,且LANGUAGE_CODE设置正确:

LANGUAGE_CODE = 'ro'
LANGUAGES = [
    ('ro', 'Romanian'),
    # 其他支持的语言
]

3. 重启生产环境应用服务器

生产环境可能存在路由缓存,部署修改后的URL配置后,重启Gunicorn、uWSGI等应用服务器,确保新配置生效。

4. 检查反向代理服务器配置

如果使用Nginx或Apache作为反向代理,确保配置正确传递完整请求路径:

  • Nginx示例配置:
location / {
    proxy_pass http://127.0.0.1:8000;  # 替换为你的Django服务地址
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 17:08:11