Django URL重定向


101

如何将与其他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进行重定向。

Answers:


181

您可以尝试称为 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<url_to_home_view>您实际需要如何指定url。

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',永久=假)
felix001 2013年

1
您似乎错过了一个“)”,将其滚动到最后,您将看到它。您可以忽略该name部分
dmg

1
@ 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
dmg

我该如何传递子弹并使用该字段创建重定向URL。EXA:url(r'^(?P <slug> [a-zA-Z0-9-] +)/',RedirectView.as_view(url ='http://'+slug+'.mywebsite.com',永久= False),)
Roshan

请注意,使用此方法很容易使用户陷入重定向循环。
smilebomb 2014年

35

在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))

除了使用之外url,您还可以使用pattern_name,它有点不干,可以确保您更改了网址,也不必更改重定向。


11

如果像我一样坚持使用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更可取。 .htaccess)。


3
在新版本的Django中已弃用或删除了这种旧格式,但是如接受的答案所述,在使用RedirectView进行重定向时,您仍然可以使用url关键字。范例:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter

9

做到这一点的另一种方法是使用HttpResponsePermanentRedirect,如下所示:

在view.py

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

在url.py中

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

8

其他方法也可以,但是您也可以使用旧方法django.shortcut.redirect

下面的代码是从此答案中获取的

在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')),
]
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.