问题: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进行重定向。
How can I redirect traffic that doesn’t match any of my other URLs back to the home page?
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'),
)
As it stands, the last entry sends all “other” traffic to the home page but I want to redirect via either an HTTP 301 or 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')
You can try the Class Based View called 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')
)
Notice how as url
in the <url_to_home_view>
you need to actually specify the url.
permanent=False
will return HTTP 302, while permanent=True
will return HTTP 301.
Alternatively you can use django.shortcuts.redirect
Update for Django 2+ versions
With Django 2+, url()
is deprecated and replaced by re_path()
. Usage is exactly the same as url()
with regular expressions. For replacements without the need of regular expression, use 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
,它有点不干,可以确保您更改了网址,也不必更改重定向。
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))
Instead of using url
, you can use the pattern_name
, which is a bit un-DRY, and will ensure you change your url, you don’t have to change the redirect too.
回答 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)。
If you are stuck on django 1.2 like I am and RedirectView doesn’t exist, another route-centric way to add the redirect mapping is using:
(r'^match_rules/$', 'django.views.generic.simple.redirect_to', {'url': '/new_url'}),
You can also re-route everything on a match. This is useful when changing the folder of an app but wanting to preserve bookmarks:
(r'^match_folder/(?P<path>.*)', 'django.views.generic.simple.redirect_to', {'url': '/new_folder/%(path)s'}),
This is preferable to django.shortcuts.redirect if you are only trying to modify your url routing and do not have access to .htaccess, etc (I’m on Appengine and app.yaml doesn’t allow url redirection at that level like an .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"),
Another way of doing it is using HttpResponsePermanentRedirect like so:
In view.py
def url_redirect(request):
return HttpResponsePermanentRedirect("/new_url/")
In the 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')),
]
The other methods work fine, but you can also use the good old django.shortcut.redirect
.
The code below was taken from this answer.
In 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')),
]