Django URL Redirect


104

ฉันจะเปลี่ยนเส้นทางการรับส่งข้อมูลที่ไม่ตรงกับ 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

คำตอบ:


183

คุณสามารถลองใช้มุมมองตามคลาสที่เรียกว่า 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=Falseจะส่งคืน HTTP 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', ถาวร = เท็จ)
felix001

1
ดูเหมือนคุณจะไม่มี ")" เลื่อนด้านข้างไปจนสุดแล้วคุณจะเห็น คุณสามารถละเว้นnameส่วนนั้นได้
dmg

1
@ felix001 btw โดยปกติ HTTP 500 (เช่นเดียวกับ 99% ของเวลา) หมายความว่าคุณมีข้อผิดพลาดทางไวยากรณ์ลองดูที่ - docs.djangoproject.com/en/dev/howto/error-reporting/… 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

36

ใน 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 เวอร์ชันใหม่ แต่คุณยังสามารถใช้คีย์เวิร์ด url ได้เมื่อเปลี่ยนเส้นทางโดยใช้ RedirectView ตามที่อธิบายไว้ในคำตอบที่ยอมรับ ตัวอย่าง:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter

10

วิธีอื่น ๆ ใช้ได้ผลดี แต่คุณสามารถใช้ของเก่าได้เช่นกัน 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')),
]

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"),
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.