Django URL 重定向

如何将不匹配任何其他 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重定向。

130267 次浏览

您可以尝试名为 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_to_home_view>中,作为 url,您需要实际指定 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')

如果你像我一样停留在 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 路由,并且不能访问,那么这比 djang.Shorcuts.redirect 更好。等等(我在 Appengine 上,app.yaml 不允许像。Htaccess).

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

In view. py

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

在网上

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

In Django 1.8, this is how I did mine.

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,它有点不干,并且可以确保您更改您的 URL,您不必也更改重定向。

其他方法工作得很好,但是您也可以使用老式的 django.shortcut.redirect

下面的代码取自 这个答案

在姜戈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')),
]