开启CMS_Permission登录要求后出现页面未找到(404)错误的解决方法
问题描述
为网站页面设置密码保护,已在settings.py中设置CMS_PERMISSION = True,并在页面权限中勾选“login required”,但访问该页面时出现404错误,请求URL为http://localhost:8000/en/accounts/login/?next=/en/private/,提示路径/en/accounts/login/不匹配任何URL规则。
错误信息
Page not found (404) Request Method: GET Request URL: http://localhost:8000/en/accounts/login/?next=/en/private/ Raised by: cms.views.details Using the URLconf defined in backend.urls, Django tried these URL patterns, in this order: en/ ^jsi18n/$ [name='javascript-catalog'] ^static/(?P<path>.*)$ en/ ^admin/ en/ ^ ^blog-content/\Z [name='posts-latest'] en/ ^ ^blog-content/feed/\Z [name='posts-latest-feed'] en/ ^ ^blog-content/feed/fb/\Z [name='posts-latest-feed-fb'] en/ ^ ^blog-content/(?P<year>[0-9]+)/\Z [name='posts-archive'] en/ ^ ^blog-content/(?P<year>[0-9]+)/(?P<month>[0-9]+)/\Z [name='posts-archive'] en/ ^ ^blog-content/author/(?P<username>[^/]+)/\Z [name='posts-author'] en/ ^ ^blog-content/category/(?P<category>[^/]+)/\Z [name='posts-category'] en/ ^ ^blog-content/tag/(?P<tag>[-a-zA-Z0-9_]+)/\Z [name='posts-tagged'] en/ ^ ^blog-content/tag/(?P<tag>[-a-zA-Z0-9_]+)/feed/\Z [name='posts-tagged-feed'] en/ ^ ^blog-content/(?P<year>[0-9]+)/(?P<month>[0-9]+)/(?P<day>[0-9]+)/(?P<slug>[^/]+)/\Z [name='post-detail'] en/ ^ ^blog-content/(?P<year>[0-9]+)/(?P<month>[0-9]+)/(?P<slug>[^/]+)/\Z [name='post-detail'] en/ ^ ^blog-content/(?P<category>[^/]+)/(?P<slug>[^/]+)/\Z [name='post-detail'] en/ ^ ^blog-content/(?P<slug>[^/]+)/\Z [name='post-detail'] en/ ^ ^cms_login/$ [name='cms_login'] en/ ^ ^cms_wizard/ en/ ^ ^(?P<slug>[0-9A-Za-z-_.//]+)/$ [name='pages-details-by-slug'] en/ ^ ^$ [name='pages-root'] en/ ^sitemap\.xml$ en/ ^taggit_autosuggest/ en/ ^filer/ en/ ^accounts/ login/ [name='login'] en/ ^accounts/ logout/ [name='logout'] en/ ^accounts/ password_change/ [name='password_change'] en/ ^accounts/ password_change/done/ [name='password_change_done'] en/ ^accounts/ password_reset/ [name='password_reset'] en/ ^accounts/ password_reset/done/ [name='password_reset_done'] en/ ^accounts/ reset/<uidb64>/<token>/ [name='password_reset_confirm'] en/ ^accounts/ reset/done/ [name='password_reset_complete'] The current path, /en/accounts/login/, didn’t match any of these.
当前urls.py代码
from django.conf.urls.i18n import i18n_patterns from django.contrib import admin from django.contrib.staticfiles.urls import staticfiles_urlpatterns from django.urls import include, re_path, path from django.views.i18n import JavaScriptCatalog from django.contrib.sitemaps.views import sitemap from cms.sitemaps import CMSSitemap from djangocms_blog.sitemaps import BlogSitemap urlpatterns = i18n_patterns( re_path(r'^jsi18n/$', JavaScriptCatalog.as_view(), name='javascript-catalog'), ) urlpatterns += staticfiles_urlpatterns() urlpatterns += i18n_patterns( re_path(r'^admin/', admin.site.urls), re_path(r'^', include('cms.urls')), re_path(r'^sitemap\.xml$', sitemap, {'sitemaps': {'cmspages': CMSSitemap, 'blog': BlogSitemap,}}), re_path(r'^taggit_autosuggest/', include('taggit_autosuggest.urls')), re_path(r'^filer/', include('filer.urls')), re_path(r'^accounts/', include('django.contrib.auth.urls')), ) admin.site.enable_nav_sidebar = False
解决方案
问题出在URL匹配顺序上:cms.urls的通用匹配规则re_path(r'^', include('cms.urls'))会在匹配到/en/accounts/login/之前就拦截所有请求,导致accounts相关的URL规则无法被触发。
调整urls.py中i18n_patterns里的URL顺序,把accounts的规则放在cms.urls之前:
urlpatterns += i18n_patterns( re_path(r'^admin/', admin.site.urls), re_path(r'^accounts/', include('django.contrib.auth.urls')), # 移到cms.urls前面 re_path(r'^', include('cms.urls')), re_path(r'^sitemap\.xml$', sitemap, {'sitemaps': {'cmspages': CMSSitemap, 'blog': BlogSitemap,}}), re_path(r'^taggit_autosuggest/', include('taggit_autosuggest.urls')), re_path(r'^filer/', include('filer.urls')), )
这样Django会优先匹配accounts相关的URL,再交给CMS处理其他路径,就能正常跳转到登录页面了。
内容的提问来源于stack exchange,提问作者user16573292
相关产品推荐
相关产品推荐

