118

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

网址.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重定向。

4

5 回答 5

205

您可以尝试名为的基于类的视图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')
于 2013-02-19T13:57:49.540 回答
40

在 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,这有点不干,并且将确保您更改您的网址,您不必更改重定向。

于 2015-07-08T20:22:35.567 回答
15

其他方法工作正常,但您也可以使用旧的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')),
]
于 2019-07-27T10:08:00.200 回答
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 更可取(我在 Appengine 上并且 app.yaml 不允许像.htaccess)。

于 2014-03-03T22:19:44.643 回答
9

另一种方法是使用 HttpResponsePermanentRedirect ,如下所示:

在视图.py

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

在 url.py

url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),
于 2015-02-26T12:32:06.460 回答