Chuyển hướng URL Django


101

Làm cách nào để chuyển hướng lưu lượng truy cập không khớp với bất kỳ URL nào khác của tôi trở lại trang chủ?

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

Như hiện tại, mục nhập cuối cùng sẽ gửi tất cả lưu lượng truy cập "khác" đến trang chủ nhưng tôi muốn chuyển hướng qua HTTP 301 hoặc 302 .

Câu trả lời:


181

Bạn có thể thử Chế độ xem dựa trên lớp được gọi là 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')
)

Thông báo như thế nào như urltrong <url_to_home_view>bạn cần phải thực sự xác định url.

permanent=Falsesẽ trả về HTTP 302, trong khi permanent=Truesẽ trả về HTTP 301.

Ngoài ra bạn có thể sử dụng django.shortcuts.redirect

Cập nhật cho các phiên bản Django 2+

Với Django 2+, url()không được dùng nữa và được thay thế bằng re_path(). Cách sử dụng hoàn toàn giống url()với biểu thức chính quy. Để thay thế mà không cần biểu thức chính quy, hãy sử dụng path().

from django.urls import re_path

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

tôi đã thêm cái này nhưng chỉ gặp lỗi HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', vĩnh viễn = Sai)
felix001

1
Có vẻ như bạn đang thiếu dấu ")", hãy cuộn đến cuối và bạn sẽ thấy nó. Bạn có thể bỏ qua namephần mặc dù
dmg

1
@ felix001 btw, HTTP 500 thường (trong 99% trường hợp) có nghĩa là bạn gặp lỗi cú pháp, hãy xem phần này - docs.djangoproject.com/en/dev/howto/error-reporting/… . Khi một trang web đang được phát triển nó luôn luôn là tốt để có DEBUG = Truehoặc ít nhất là thiết lập các ADMINStùy chọn - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg

LÀM THẾ NÀO để tôi vượt qua slug và sử dụng trường đó để tạo url chuyển hướng. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', vĩnh viễn = Sai),)
Roshan

Lưu ý rằng sử dụng phương pháp này rất dễ khiến người dùng bị mắc vào một vòng lặp chuyển hướng.
smilebomb

35

Trong Django 1.8, đây là cách tôi đã là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))

Thay vì sử dụng url, bạn có thể sử dụng pattern_name, hơi không KHÔ, và sẽ đảm bảo bạn thay đổi url của mình, bạn cũng không phải thay đổi chuyển hướng.


11

Nếu bạn bị mắc kẹt trên django 1.2 như tôi và RedirectView không tồn tại, một cách khác tập trung vào tuyến đường để thêm ánh xạ chuyển hướng đang sử dụng:

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

Bạn cũng có thể định tuyến lại mọi thứ trên một trận đấu. Điều này hữu ích khi thay đổi thư mục của một ứng dụng nhưng muốn giữ lại dấu trang:

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

Điều này phù hợp với django.shortcuts.redirect nếu bạn chỉ đang cố gắng sửa đổi định tuyến url của mình và không có quyền truy cập vào .htaccess, v.v. (Tôi đang sử dụng Appengine và app.yaml không cho phép chuyển hướng url ở cấp độ đó như một .htaccess).


3
Định dạng cũ này không được chấp nhận hoặc bị xóa trong các phiên bản mới của Django, nhưng bạn vẫn có thể sử dụng từ khóa url khi chuyển hướng bằng RedirectView như được mô tả trong câu trả lời được chấp nhận. Ví dụ:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter

9

Một cách khác để làm điều đó là sử dụng HttpResponsePermanentRedirect như sau:

Trong view.py

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

Trong url.py

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

8

Các phương pháp khác hoạt động tốt, nhưng bạn cũng có thể sử dụng phương pháp cũ tốt django.shortcut.redirect.

Đoạn mã dưới đây được lấy từ câu trả lời này .

Trong 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')),
]
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.