问题: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 301或302进行重定向。
回答 0
您可以尝试称为 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')
回答 1
在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
如果像我一样坚持使用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
做到这一点的另一种方法是使用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
其他方法也可以,但是您也可以使用旧方法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')),
]
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。