Regex Django与URL不匹配
我一直在开发一个django web应用程序(使用django 1.3),这是一个产品的web目录,在我被要求添加一个自定义管理站点之前,它一直运行良好。我完全了解Django管理站点,但是客户端非常老式,而且对技术一无所知,所以我必须创建一个“傻瓜版”管理站点。根urlconf:Regex Django与URL不匹配,regex,django,django-urls,Regex,Django,Django Urls,我一直在开发一个django web应用程序(使用django 1.3),这是一个产品的web目录,在我被要求添加一个自定义管理站点之前,它一直运行良好。我完全了解Django管理站点,但是客户端非常老式,而且对技术一无所知,所以我必须创建一个“傻瓜版”管理站点。根urlconf: from django.conf.urls.defaults import * from django.views.generic import TemplateView from store.models imp
from django.conf.urls.defaults import *
from django.views.generic import TemplateView
from store.models import Category
from django.contrib import admin
admin.autodiscover()
urlpatterns = patterns('',
url(r'^admin/', include(admin.site.urls)),
url(r'^^$', TemplateView.as_view(
template_name='homepage.html',
get_context_data=lambda: {
'crumb': 'home',
'category_list':Category.objects.all()
}
),
name='home'),
url(r'^favicon\.ico$', 'django.views.generic.simple.redirect_to', {'url': '/static/img/favicon.ico'}),
url(r'^store/', include('store.urls', app_name='store', namespace='store')),
)
以及商店应用程序的urlconf:
from django.conf import settings
from django.conf.urls.defaults import *
from store import views
urlpatterns = patterns ('',
url(r'^category/$', views.get_brands, name='get_brands'),
url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),
)
以及原意:
from django.http import Http404
from django.shortcuts import render, get_object_or_404
from django.views.generic import ListView
from store.models import Category, Brand, Product
def get_brands(request):
q = request.GET.get('q')
if q is not None:
category = get_object_or_404(Category, slug__iexact=q)
try:
brands = category.brands.all()
except:
brands = []
template = 'infobox.html'
data = {
'category': category,
'brands': brands,
}
return render( request, template, data )
class GalleryView(ListView):
context_object_name = 'product_list'
template_name = 'store/gallery.html'
def get_queryset(self):
self.category = get_object_or_404(Category, slug__iexact=self.args[0])
try:
brand = Brand.objects.get(slug__iexact = self.args[1])
self.brand_name = brand.name
except:
#no brand is specified, show products with no brand
if self.category.category_products.filter(brand__isnull=True):
#if there are products with no brand, return those
return self.category.category_products.filter(brand__isnull=True)
else:
#if all products have a brand, return the products of the first brand
all = self.category.brands.all()
if all:
brand = all[0]
self.brand_name = brand.name
return brand.brand_products.all()
else:
raise Http404
else:
#brand is specified, show its products
return Product.objects.filter(category=self.category, brand=brand)
def get_context_data(self, **kwargs):
context = super(GalleryView, self).get_context_data(**kwargs)
category = self.category
category_brands = self.category.brands.all()
context['category_list'] = Category.objects.all()
context['category'] = category
context['crumb'] = category.name
context['category_brands'] = category_brands
try:
context['brand'] = self.brand_name
except:
context['brand'] = None
return context
现在,我的自定义管理应用程序在本地开发环境中运行良好,但当我向prod添加新的URL和视图时,Django似乎与任何新的URL都不匹配。原来的视图和URL仍然有效,但是没有一个新的URL得到匹配,我只是不断得到一个404NotFound错误
更新的urlconf:
from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
from django.contrib.auth.decorators import login_required
from store import views
admin_urls = patterns ('',
url(r'^$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
url(r'^add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
)
urlpatterns = patterns ('',
url(r'^category/$', views.get_brands, name='get_brands'),
url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),
url(r'^login/$', views.admin_login, name='login'),
url(r'^logout/$', views.admin_logout, name='logout'),
url(r'^logout/success/$', views.admin_logout_success, name='logout_success'),
url(r'^test/', views.test, name='test'),
url(r'^admin/', include(admin_urls, namespace='admin')),
url(r'^ajax/$', views.ajax_request, name='ajax_request'),
)
from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
from django.contrib.auth.decorators import login_required
from store import views
admin_urls = patterns ('',
)
urlpatterns = patterns ('',
url(r'^category/$', views.get_brands, name='get_brands'),
url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),
url(r'^login/$', views.admin_login, name='login'),
url(r'^logout/$', views.admin_logout, name='logout'),
url(r'^logout/success/$', views.admin_logout_success, name='logout_success'),
url(r'^ajax/$', views.ajax_request, name='ajax_request'),
url(r'^administration/$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
url(r'^administration/add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
)
请注意,即使是简单的“/store/test/”url也不会匹配。我不太清楚Django为什么不匹配我的url,非常感谢您的帮助。我不太清楚发生了什么,因为我的所有模板都使用{%url%}标记链接到其他页面,但我认为我的url变得混乱的原因是因为我使用了r'^(\w+/$)正则表达式,所以它匹配任何单词。我只是简单地将带有(\w+)规则的URLConf移到了urls.py的底部,并对它们进行了重构,使其更加具体,它们再次成为黄金 更新的urlconf:
from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
from django.contrib.auth.decorators import login_required
from store import views
admin_urls = patterns ('',
url(r'^$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
url(r'^add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
)
urlpatterns = patterns ('',
url(r'^category/$', views.get_brands, name='get_brands'),
url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),
url(r'^login/$', views.admin_login, name='login'),
url(r'^logout/$', views.admin_logout, name='logout'),
url(r'^logout/success/$', views.admin_logout_success, name='logout_success'),
url(r'^test/', views.test, name='test'),
url(r'^admin/', include(admin_urls, namespace='admin')),
url(r'^ajax/$', views.ajax_request, name='ajax_request'),
)
from django.conf import settings
from django.conf.urls.defaults import patterns, include, url
from django.contrib.auth.decorators import login_required
from store import views
admin_urls = patterns ('',
)
urlpatterns = patterns ('',
url(r'^category/$', views.get_brands, name='get_brands'),
url(r'^(\w+)/$', views.GalleryView.as_view(), name='gallery'),
url(r'^(\w+)/(\w+)/$', views.GalleryView.as_view(), name='gallery'),
url(r'^login/$', views.admin_login, name='login'),
url(r'^logout/$', views.admin_logout, name='logout'),
url(r'^logout/success/$', views.admin_logout_success, name='logout_success'),
url(r'^ajax/$', views.ajax_request, name='ajax_request'),
url(r'^administration/$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
url(r'^administration/add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
)
正如您在评论中提到的,删除所需的登录名可以修复问题。以下是django文档对decorator的看法: login_required()执行以下操作:
url(r'^login/$', views.admin_login, name='login'),
由于新url中需要的登录名指向默认url,而默认url不存在,因此返回404。但是,当您在其他URL之后配置登录所需的视图时:
url(r'^login/$', views.admin_login, name='login'),
...
url(r'^administration/$', login_required(views.AdminIndexView.as_view()), name='admin_index'),
url(r'^administration/add/(\w+)/$', login_required(views.AdminAddView.as_view()), name='admin_add'),
成功了。为什么呢?您没有在此处覆盖登录URL,对吗?但您确实这样做了,因为此时,您重新定义了名称空间“login”以指向您自己的视图。现在,文档中没有提到这一点,但它是有意义的,查看默认的管理模板,您可以看到这是正在使用的名称空间
这对您有意义吗?难道您忘了重新加载prod服务器吗?不,我没有。如果解决方案真的那么简单的话:我一次只评论一行,然后重新加载。你可能会发现正则表达式中遗漏了一些愚蠢的东西。另外,我注意到您将admin更改为手动包含,请尝试回滚该部分(或者一起注释admin)。我尝试了您的建议,似乎管理索引的urlconf是罪魁祸首。尽管正则表达式本身没有问题(r'^$),但当我删除了登录所需的装饰器时,它又开始工作了。HmmDoesn管理员不需要在没有decorator的情况下登录吗?您的视图是否在未手动添加的情况下未被标记?是否需要解释此处发生的情况的答案?当然,这将帮助我避免在开发过程中出现任何进一步的问题:我认为我理解这一点,但不再那么确定。你能帮我测试一下吗?像以前一样重做urlconf并将这一行添加到settings.py:
LOGIN\u URL='/store/LOGIN/'
实际上,我的settings.py中已经有了这一行。对不起,我在问题中不清楚。你看到我的答案了吗?