动态检查是否存在slu ..

时间:2016-06-28 15:25:29

标签: python regex django url slug

在旧版应用中,我需要检查网址是否存在,如果不存在,则将其重定向到其他位置。问题是我需要在url文件中检查一组值中是否存在该URL,并且我不清楚如何最好地执行此操作。

例如,项目和城市都共享相同的网址格式。例如/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

1 个答案:

答案 0 :(得分:2)

您可以动态生成包含所有城市名称的网址,但是一旦django第一次访问该网址,网址就会被缓存,因此为了修改网址正则表达式,您必须重新启动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视图本身的结果。

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