118

他のどの 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経由でリダイレクトしたいと考えています。

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てください。<url_to_home_view>

permanent=FalseHTTP 302を返しますが、HTTP301permanent=Trueを返します。

または、django.shortcuts.redirect

Django2+バージョンのアップデート

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))

を使用する代わりに、DRY ではない をurl使用できます。これにより、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 はそのレベルでの URL リダイレクトを許可していません)。 .htaccess)。

于 2014-03-03T22:19:44.643 に答える