Pengalihan URL Django

101

Bagaimana cara mengarahkan kembali lalu lintas yang tidak cocok dengan URL saya yang lain kembali ke beranda?

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

Seperti berdiri, entri terakhir mengirimkan semua lalu lintas "lainnya" ke beranda tetapi saya ingin mengalihkan baik melalui HTTP 301 atau 302 .

felix001
sumber

Jawaban:

181

Anda dapat mencoba Tampilan Berbasis Kelas yang disebut 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')
)

Perhatikan bagaimana seperti urldalam <url_to_home_view>Anda harus benar-benar menentukan url.

permanent=Falseakan mengembalikan HTTP 302, sedangkan permanent=Trueakan mengembalikan HTTP 301.

Atau Anda bisa menggunakan django.shortcuts.redirect

Pembaruan untuk versi Django 2+

Dengan Django 2+, url()tidak digunakan lagi dan diganti oleh re_path(). Penggunaannya sama persis url()dengan ekspresi reguler. Untuk penggantian tanpa perlu ekspresi reguler, gunakan path().

from django.urls import re_path

re_path(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
dmg
sumber
saya menambahkan ini tetapi baru saja mendapat kesalahan HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanent = False)
felix001
1
Anda tampaknya kehilangan ")", gulir samping ke ujung dan Anda akan melihatnya. Anda dapat menghilangkan namebagian itu
dmg
1
@ felix001 btw, HTTP 500 biasanya (seperti pada 99% waktu) berarti Anda mengalami kesalahan sintaks, lihat ini - docs.djangoproject.com/en/dev/howto/error-reporting/… . Saat situs sedang dalam pengembangan, ada baiknya untuk memiliki DEBUG = Trueatau setidaknya menyetel ADMINSopsi - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg
BAGAIMANA saya melewatkan siput dan menggunakan bidang itu untuk membuat url pengalihan. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', permanen = False),)
Roshan
Perhatikan bahwa menggunakan metode ini sangat mudah untuk membuat pengguna terjebak dalam pengulangan pengalihan.
smilebomb
35

Dalam Django 1.8, ini adalah bagaimana saya melakukan milik saya.

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

Alih-alih menggunakan url, Anda dapat menggunakan pattern_name, yang agak tidak KERING, dan akan memastikan Anda mengubah url, Anda tidak perlu mengubah pengalihan juga.

KhoPhi
sumber
11

Jika Anda terjebak pada django 1.2 seperti saya dan RedirectView tidak ada, cara lain yang berpusat pada rute untuk menambahkan pemetaan pengalihan adalah menggunakan:

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

Anda juga dapat merutekan ulang semuanya pada pertandingan. Ini berguna saat mengubah folder aplikasi tetapi ingin mempertahankan bookmark:

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

Ini lebih disukai daripada django.shortcuts.redirect jika Anda hanya mencoba mengubah perutean url dan tidak memiliki akses ke .htaccess, dll (Saya menggunakan Appengine dan app.yaml tidak mengizinkan pengalihan url pada tingkat itu seperti .htaccess).

Blaine Garrett
sumber
3
Format lama ini tidak digunakan lagi atau dihapus dalam versi baru Django, tetapi Anda masih dapat menggunakan kata kunci url saat mengarahkan menggunakan RedirectView seperti yang dijelaskan dalam jawaban yang diterima. Contoh:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Mikha Walter
9

Cara lain untuk melakukannya adalah menggunakan HttpResponsePermanentRedirect seperti ini:

Dalam view.py

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

Di url.py

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

Metode lain berfungsi dengan baik, tetapi Anda juga dapat menggunakan metode lama yang baik django.shortcut.redirect.

Kode di bawah ini diambil dari jawaban ini .

Di 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')),
]
bom
sumber