【问题标题】:Django URL RedirectDjango URL 重定向
【发布时间】:2013-02-04 05:40:15
【问题描述】:

如何将与我的任何其他 URL 不匹配的流量重定向回主页?

urls.py:

urlpatterns = patterns('',
    url(r'^$', 'macmonster.views.home'),
    #url(r'^macmon_home$', 'macmonster.views.home'),
    url(r'^macmon_output/$', 'macmonster.views.output'),
    url(r'^macmon_about/$', 'macmonster.views.about'),
    url(r'^.*$',  'macmonster.views.home'),
)

就目前而言,最后一个条目将所有“其他”流量发送到主页,但我想通过 HTTP 301302 重定向。

【问题讨论】:

    标签: python django django-urls


    【解决方案1】:

    您可以尝试名为 RedirectView 的基于类的视图

    from django.views.generic.base import RedirectView
    
    urlpatterns = patterns('',
        url(r'^$', 'macmonster.views.home'),
        #url(r'^macmon_home$', 'macmonster.views.home'),
        url(r'^macmon_output/$', 'macmonster.views.output'),
        url(r'^macmon_about/$', 'macmonster.views.about'),
        url(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
    )
    

    注意url&lt;url_to_home_view&gt; 中您需要实际指定网址。

    permanent=False 将返回 HTTP 302,而permanent=True 将返回 HTTP 301。

    您也可以使用django.shortcuts.redirect

    Django 2+ 版本更新

    在 Django 2+ 中,url() 已被弃用并被 re_path() 取代。用法与带有正则表达式的url() 完全相同。对于不需要正则表达式的替换,使用path()

    from django.urls import re_path
    
    re_path(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
    

    【讨论】:

    • 我添加了这个但刚刚收到 HTTP 500 错误? url(r'^.*$', RedirectView.as_view(url='macmon_about', Permanent=False)
    • 你好像少了一个“)”,侧滚动到最后你会看到的。不过,您可以省略 name 部分
    • @felix001 顺便说一句,HTTP 500 通常(在 99% 的情况下)意味着您有语法错误,看看这个 - docs.djangoproject.com/en/dev/howto/error-reporting/…。当网站正在开发中时,最好有DEBUG = True 或至少设置ADMINS 选项 - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
    • 如何做我传递 slug 并使用该字段创建重定向 url。 EXA : url(r'^(?P[a-zA-Z0-9-]+)/', RedirectView.as_view(url='http://'+slug+'.mywebsite.com', 永久=假),)
    • 请注意,使用这种方法很容易让用户陷入重定向循环。
    【解决方案2】:

    在 Django 1.8 中,我就是这样做的。

    from django.views.generic.base import RedirectView
    
    url(r'^$', views.comingSoon, name='homepage'),
    # whatever urls you might have in here
    # make sure the 'catch-all' url is placed last
    url(r'^.*$', RedirectView.as_view(pattern_name='homepage', permanent=False))
    

    您可以使用pattern_name,而不是使用url,它有点不干,并且可以确保您更改您的网址,您不必更改重定向。

    【讨论】:

      【解决方案3】:

      其他方法工作正常,但您也可以使用旧的django.shortcut.redirect

      以下代码取自this answer

      在 Django 2.x 中:

      from django.shortcuts import redirect
      from django.urls import path, include
      
      urlpatterns = [
          # this example uses named URL 'hola-home' from app named hola
          # for more redirect's usage options: https://docs.djangoproject.com/en/2.1/topics/http/shortcuts/
          path('', lambda request: redirect('hola/', permanent=True)),
          path('hola/', include('hola.urls')),
      ]
      

      【讨论】:

      • 这似乎是最简单的方法。
      【解决方案4】:

      如果你像我一样被困在 django 1.2 上并且 RedirectView 不存在,另一种添加重定向映射的以路由为中心的方法是使用:

      (r'^match_rules/$', 'django.views.generic.simple.redirect_to', {'url': '/new_url'}),  
      

      您还可以重新路由比赛中的所有内容。这在更改应用程序的文件夹但想要保留书签时很有用:

      (r'^match_folder/(?P<path>.*)', 'django.views.generic.simple.redirect_to', {'url': '/new_folder/%(path)s'}),  
      

      如果您只是尝试修改您的 url 路由并且无权访问 .htaccess 等,这比 django.shortcuts.redirect 更可取(我在 Appengine 和 app.yaml 不允许 url 重定向.htaccess 级别)。

      【讨论】:

      • 这种旧格式在新版本的 Django 中已被弃用或删除,但您仍然可以在使用 RedirectView 重定向时使用 url 关键字,如接受的答案中所述。示例:(r'^match_folder/(?P&lt;path&gt;.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
      【解决方案5】:

      另一种方法是像这样使用 HttpResponsePermanentRedirect:

      在view.py中

      def url_redirect(request):
          return HttpResponsePermanentRedirect("/new_url/")
      

      在 url.py 中

      url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-10-07
        • 2020-09-07
        • 2015-12-29
        • 2018-02-14
        • 2012-10-03
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多