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_to_home_view>실제로 URL을 지정해야하는 방법 에 유의하십시오.

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', 영구 = False)
felix001

1
")"가 누락 된 것 같고, 측면 스크롤을 끝까지 볼 수 있습니다. name하지만 부분을 생략 할 수 있습니다
dmg

1
@ felix001 btw, HTTP 500 (대개 99 %)은 구문 오류가 있음을 의미합니다 . docs.djangoproject.com/en/dev/howto/error-reporting/… 사이트가 개발 중일 때 항상 옵션 을 가지고 DEBUG = True있거나 적어도 설정하는 것이 ADMINS좋습니다 -docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg

슬러그를 전달하고 해당 필드를 사용하여 리디렉션 URL을 만드는 방법. EXA : url (r '^ (? P <slug> [a-zA-Z0-9-] +) /', RedirectView.as_view (url = 'http : //'+slug+'.mywebsite.com', 영구 = False),)
Roshan

이 방법을 사용하면 사용자가 리디렉션 루프에 빠지기 쉽습니다.
smilebomb

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_nameURL을 변경할 수 있으므로 리디렉션도 변경할 필요가 없습니다.


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


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.