2013-02-19 112 views
76

如何將不符合我其他任何URL的流量重定向回主頁。 我的urls.py的樣子,Django URL重定向

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

由於重定向

回答

131

您可以嘗試基於類視圖稱爲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') 
) 

請注意,在如何爲你需要實際指定網址。

permanent=False將返回HTTP 302,而permanent=True將返回HTTP 301

或者您可以使用django.shortcuts.redirect

+1

對於URL中的基於類的視圖+1。 – 2013-02-19 13:59:05

+0

我總是忘記提倡基於類的視圖+1 – danodonovan 2013-02-19 14:02:03

+0

我添加了這個,但剛剛得到了HTTP 500錯誤? url(r'^。* $',RedirectView.as_view(url ='macmon_about',permanent = False) – felix001 2013-02-19 18:01:59

8

如果你是卡在Django的1.2像我和RedirectView的不存在,另一種爲route-以添加重定向映射的方式爲:

(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不允許像.htaccess那樣的URL重定向)。

+2

謝謝你,第二個變體幫了我很多:) – 2015-02-17 14:20:17

6

做的另一種方法是使用HttpResponsePermanentRedirect像這樣:

在view.py

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

在url.py

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

在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,這是一個有點未乾的,並確保你改變你的網址,你不必改變重定向了。

+1

我喜歡這個!仍然適用於Django 1.10 :) – teewuane 2017-04-17 15:03:06