Django URLリダイレクト


101

他のどの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のいずれかを介してリダイレクトしたいと思います

回答:


181

あなたは呼び出されたクラスベースのビューを試すことができます 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 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')

これを追加しましたが、HTTP 500エラーが発生しましたか?url(r '^。* $'、RedirectView.as_view(url = 'macmon_about'、permanent = False)
felix001

1
")"が欠落しているように見え、最後まで横スクロールすると表示されます。nameただし、この部分は省略できます
dmg

1
@ felix001ところで、HTTP 500は通常(99%の場合のように)構文エラーがあることを意味します。これを見てください-docs.djangoproject.com/en/dev/howto/error-reporting/…。サイトが開発中の場合は、常にオプションをDEBUG = True設定するか、少なくともADMINSオプションを設定することをお勧め
dmg

slugを渡し、そのフィールドを使用してリダイレクトURLを作成する方法 EXA:url(r '^(?P <slug> [a-zA-Z0-9-] +)/'、RedirectView.as_view(url = 'http://'+slug+'.mywebsite.com'、パーマネント= False)、)
Roshan 2014年

この方法を使用すると、ユーザーをリダイレクトループに巻き込むのが本当に簡単になることに注意してください。
smilebomb 14年

35

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。これにより、URLを確実に変更できます。リダイレクトも変更する必要はありません。


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'}),  

これはdjango.shortcuts.redirectよりも、URLルーティングを変更するだけで.htaccessなどにアクセスできない場合に推奨されます(Appengineを使用していて、app.yamlはそのようなレベルでのURLリダイレクトを許可していません。 .htaccess)。


3
この古い形式は、Djangoの新しいバージョンでは非推奨または削除されていますが、承認された回答に記載されているように、RedirectViewを使用してリダイレクトする場合でも、urlキーワードを使用できます。例:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter

9

それを行う別の方法は、次のようにHttpResponsePermanentRedirectを使用することです:

view.py

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

url.py

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

8

他の方法は問題なく動作しますが、古き良きを使用することもできます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')),
]
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.