web-dev-qa-db-ja.com

Django URLリダイレクト

他のURLのいずれとも一致しないトラフィックをホームページにリダイレクトするにはどうすればよいですか?

rls.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または2のいずれかでリダイレクトしたいです。

92
PacketPimp

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_to_home_view>urlとして実際にURLを指定する必要があることに注意してください。

permanent=FalseはHTTP 302を返し、permanent=TrueはHTTP 301を返します。

または、 Django.shortcuts.redirect を使用できます

165
dmg

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

31
Rexford

私のように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)。

9
Blaine Garrett

別の方法では、次のように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
sirFunkenstine

他の方法は正常に機能しますが、古き良きDjango.shortcut.redirectを使用することもできます。

以下のコードは this answe rから取られました

Django 2.xでは、

from Django.contrib import admin
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=False)),
    path('hola/', include("hola.urls")),
    path('admin/', admin.site.urls),
]
1
bombs