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
相关产品推荐
相关产品推荐

