【问题标题】:Dynamically check if a slug exists动态检查是否存在 slug
【发布时间】:2016-10-31 00:33:14
【问题描述】:

在旧版应用程序中,我需要检查 URL 是否存在,如果不存在,则将其重定向到另一个位置。问题是我需要检查该 url 是否存在于一组值中,在 urls 文件中,我不清楚如何最好地做到这一点。

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

【问题讨论】:

    标签: python regex django url slug


    【解决方案1】:

    您可以动态生成包含所有城市名称的 url,但是一旦 django 第一次访问它,该 url 将被缓存,因此为了修改 url 正则表达式,您必须重新启动 django 进程。如果这对您来说没问题,您可以像这样生成 url:

    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 视图本身的结果。

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

    【讨论】:

    • 谢谢 - 非常有帮助。我有点被困在杂草中,错过了我应该将所有逻辑交给视图/路由器
    猜你喜欢
    • 2018-06-06
    • 2011-10-23
    • 2021-12-22
    • 1970-01-01
    • 2014-08-11
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 2019-10-07
    相关资源
    最近更新 更多