【问题标题】:Alias for app URI in Django project urls.pyDjango 项目 urls.py 中应用 URI 的别名
【发布时间】:2017-06-15 18:40:02
【问题描述】:

我的 Django 项目“animals”有一个名为“birds”的应用程序。在 animal/urls.py 中,“birds” URI 被路由到 bird/urls.py,如下所示:

urlpatterns=[
    url(r'^birds/', include('birds.urls')),
    url(r'^b/',     include('birds.urls')), # alias
]

“birds/”是官方的、永久的基础 URI; “b/”被接受为快捷方式/别名。

如何将“b/” URI(永久)重定向到“birds/”,这样即使用户可以输入“b/penguin”,浏览器的地址栏也会(最终)显示“birds/”企鹅”?我不想接触“鸟”应用程序中的任何代码,因为它不应该知道(关心)项目如何将 URI 映射到应用程序。

我试过用

RedirectView.as_view(pattern_name='birds'))

但这会导致 410 Gone 响应。和

RedirectView.as_view(url='/birds/'))

将 /b/penguin 重定向到 /birds/,杀死我的鸟。

【问题讨论】:

    标签: django django-urls django-apps


    【解决方案1】:

    你应该尝试这样的事情:

    from django.views.generic import RedirectView
    
    urlpatterns=[
        url(r'^birds/', include('birds.urls')),
        url(r'^b/(?P<path>.*)$', RedirectView.as_view(url='/birds/%(path)s')),
    ]
    

    【讨论】:

    • 这对我有用(Django 版本 1.9.5)。我的浏览器记录了初始的 /b/penguin 请求从 Django 获得了 302 Found 状态响应以及 /birds/penguin Location 标头。然后浏览器发出第二个/birds/penguin 请求,即200 OK。我添加了permanent=True 属性以使Django 返回301 Moved Permanently 而不是302 Found
    【解决方案2】:

    您可以创建custom middleware 来为您处理重定向

    class BirdMiddleware(MiddlewareMixin, object):
        def process_view(self, request, view_func, view_args, view_kwargs):
            if '/b/' in request.path:
                 return HttpResponseRedirect(request.path.replace('/b/', '/birds/'))
            return None
    

    实现可能需要一些工作,但实际方法是可行的,检查当前路径,如果存在/b/,请将其重定向到所需的目的地。

    否则,您可以通过遍历 birds 中的每个 url 来指定重定向视图,但这对于作为其他 url 的命名空间的鸟类中的 url 来说会变得混乱。

    【讨论】:

    • PS:拯救小鸟!
    • 我想,这些鸟现在是安全的。这种方法看起来非常合适和干净。
    • DRY 违规 - 您的中间件对 url 映射的方式假设太多,一旦有人更改 urlpatterns、添加 i18n url 等,就会中断。
    • @brunodesthuilliers - 同意,给定的实现仅用于演示目的,并且有一些方法可以提取硬编码字符串(诚然,我更喜欢其他答案)
    • @Sayse “其他答案”也有类似的问题。
    猜你喜欢
    • 1970-01-01
    • 2014-02-10
    • 2015-05-02
    • 2012-02-16
    • 2021-10-26
    • 1970-01-01
    • 2012-03-08
    • 1970-01-01
    • 2019-07-05
    相关资源
    最近更新 更多