2016-06-28 64 views
1

在传统应用程序上,我需要检查URL是否存在,如果不存在,请将其重定向到其他位置。问题是,我需要检查该URL是否存在于一组值中,在urls文件中,我不清楚如何最好地做到这一点。动态检查是否存在slu 012

例如,项目和城市都共享相同的网址格式。例如/projects/london/projects/my-project-name

我想先检查slug是否与城市相匹配,如果它不能返回项目视图(城市不能匹配项目名称)。

我的网址是目前的结构如下:

url(r'^projects/(?P<project-name>[-\w]+)', get_project, name='project-view'), 
url(r'^projects/.*', get_city, name='city-view'), 

我知道这是很凌乱,和一个坏的整体格局,但不幸的是它不是东西,可以在瞬间不会改变。所以我的目标是弄清楚我是否可以首先检查project-name是否可以成为一个城市,如果是,则重定向到该视图而不会陷入重定向循环。

我想,如果我可以做这样的事情:

url(r'^projects/(?P<city>london|paris|new-york)/', get_city, name='city-view'), 

其中london|paris|new-york动态

回答

2

产生可以动态地生成所有的城市名称的网址,但该网址将被一次缓存django第一次访问它,所以为了修改url正则表达式,你必须重新启动django进程。如果这是罚款的目的,您可以产生这样的网址:

url(r'^projects/(?P<city>{})/$'.format(city_slugs.join('|')), 
    get_city, name='city-view') 

但是,它可能会更好地创建一个实现将请求发送到适当的视图的逻辑视图路由方法:

# urls.py 
# ... 
url(r'^projects/(?P<slug>[-\w]+)/$', 
    project_city_router, name='project-city-router'), 
# ... 

# views.py 
def is_a_city(slug): 
    # If they're in the database, something like: 
    # return City.objects.filter(slug=slug).exists() 
    return slug in ['london', 'paris', 'new-york', '...'] 

def project_city_router(request, slug=None): 
    if not slug: 
     # /projects/ 
     return render(request, 'my/template.html', {'foo': 'bar'}) 
    elif is_a_city(slug): 
     # /projects/<city>/ 
     return get_city(request, city=slug) 
    else: 
     # /projects/<project-name/ 
     return get_project(request, project_name=slug) 

使用此路由器,如果参数slug是项目或城市,则返回视图本身的结果get_projectget_city

这也允许您根据数据库或文件动态检查城市列表。

+0

谢谢 - 非常有帮助。我有一点被困在杂草中,错过了我应该将所有逻辑交给视图/路由器 – djq