如何将与我的任何其他网址不匹配的流量重定向回主页?
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 301 或 302 进行重定向。
答案 0 :(得分:161)
您可以尝试名为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>
如何实际指定网址。
permanent=False
将返回HTTP 302,而permanent=True
将返回HTTP 301。
或者您可以使用django.shortcuts.redirect
答案 1 :(得分:25)
在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
,这可能会确保您更改网址,也不必更改重定向
答案 2 :(得分:9)
如果你像我一样被困在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'}),
这比django.shortcuts.redirect更好,如果你只是想修改你的url路由并且没有访问.htaccess等等(我在Appengine上,而app.yaml不允许在那里进行url重定向等级.htaccess)。
答案 3 :(得分:8)
另一种方法是使用HttpResponsePermanentRedirect,如下所示:
在view.py
中def url_redirect(request):
return HttpResponsePermanentRedirect("/new_url/")
在url.py
中url(r'^old_url/$', "website.views.url_redirect", name="url-redirect"),
答案 4 :(得分:0)
其他方法也可以,但是您也可以使用旧的django.shortcut.redirect
。
以下代码摘自this answe r
在Django 2.x中,
from django.contrib import admin
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=False)),
path('hola/', include("hola.urls")),
path('admin/', admin.site.urls),
]