Django URL Yönlendirmesi


102

Diğer URL'lerimden hiçbiriyle eşleşmeyen trafiği ana sayfaya nasıl yeniden yönlendirebilirim?

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

Olduğu gibi, son giriş tüm "diğer" trafiği ana sayfaya gönderir, ancak bir HTTP 301 veya 302 yoluyla yeniden yönlendirmek istiyorum .

Yanıtlar:


182

Sınıfa Dayalı Görünümü deneyebilirsiniz. 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')
)

Bildirim olarak nasıl urlyer <url_to_home_view>aslında url belirtmek gerekir.

permanent=FalseHTTP 302, permanent=TrueHTTP 301 döndürür.

Alternatif olarak kullanabilirsiniz django.shortcuts.redirect

Django 2+ sürümleri için güncelleme

Django 2+ url()ile kullanımdan kaldırıldı ve ile değiştirildi re_path(). Kullanım, url()normal ifadelerle tamamen aynıdır . Normal ifadeye ihtiyaç duymadan değiştirmeler için kullanın path().

from django.urls import re_path

re_path(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')

bunu ekledim ama az önce HTTP 500 hatası mı aldım? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanent = False)
felix001

1
Görünüşe göre bir ")" eksik, yana kaydırın ve göreceksiniz. nameYine de parçayı atlayabilirsiniz
dmg

1
@ felix001 btw, HTTP 500 genellikle (zamanın% 99'unda olduğu gibi) bir sözdizimi hatası olduğu anlamına gelir, şuna bir göz atın - docs.djangoproject.com/en/dev/howto/error-reporting/… . Bir site geliştirme aşamasındayken, DEBUG = Truebu ADMINSseçeneğe sahip olmak veya en azından bu seçeneği ayarlamak her zaman iyidir - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg

NASIL slug iletirim ve bu alanı yeniden yönlendirme url'si oluşturmak için kullanırım. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', kalıcı = Yanlış),)
Roshan

Bu yöntemi kullanarak kullanıcıyı bir yönlendirme döngüsüne almanın gerçekten kolay olduğunu unutmayın.
smilebomb

35

Django 1.8'de benimkini böyle yaptım.

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

Bunun yerine kullanmanın urlkullanabileceğiniz pattern_nameçok yönlendirmeyi değiştirmek gerekmez, biraz un-KURU olan ve size url değiştirmek sağlayacaktır.


11

Benim gibi django 1.2'de takılı kalırsanız ve RedirectView yoksa, yönlendirme eşlemesini eklemenin başka bir yol merkezli yolu şudur:

(r'^match_rules/$', 'django.views.generic.simple.redirect_to', {'url': '/new_url'}),  

Ayrıca bir maçtaki her şeyi yeniden yönlendirebilirsiniz. Bu, bir uygulamanın klasörünü değiştirirken ancak yer işaretlerini korumak istediğinizde kullanışlıdır:

(r'^match_folder/(?P<path>.*)', 'django.views.generic.simple.redirect_to', {'url': '/new_folder/%(path)s'}),  

Bu, yalnızca url yönlendirmenizi değiştirmeye çalışıyorsanız ve .htaccess vb. Erişiminiz yoksa django.shortcuts.redirect'e tercih edilir (Appengine'deyim ve app.yaml bu düzeyde url yeniden yönlendirmesine izin vermiyor .htaccess).


3
Bu eski biçim, Django'nun yeni sürümlerinde kullanımdan kaldırıldı veya kaldırıldı, ancak kabul edilen yanıtta açıklandığı gibi RedirectView kullanarak yeniden yönlendirme yaparken url anahtar sözcüklerini kullanmaya devam edebilirsiniz. Örnek:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter

9

Bunu yapmanın başka bir yolu da HttpResponsePermanentRedirect'i şu şekilde kullanmaktır:

View.py içinde

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

Url.py içinde

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

8

Diğer yöntemler iyi çalışıyor, ancak eskiyi de kullanabilirsiniz django.shortcut.redirect.

Aşağıdaki kod bu cevaptan alınmıştır .

Django 2.x'te:

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')),
]
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.