Reindirizzamento URL Django


101

Come posso reindirizzare il traffico che non corrisponde a nessuno dei miei altri URL alla home page?

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

Allo stato attuale, l'ultima voce invia tutto il traffico "altro" alla home page, ma desidero reindirizzare tramite HTTP 301 o 302 .

Risposte:


181

Puoi provare la visualizzazione basata su classi chiamata 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')
)

Notare come come urlnel<url_to_home_view> è necessario specificare effettivamente l'URL.

permanent=Falserestituirà HTTP 302, mentre permanent=Truerestituirà HTTP 301.

In alternativa puoi usare django.shortcuts.redirect

Aggiornamento per le versioni Django 2+

Con Django 2+, url()è deprecato e sostituito da re_path(). L'utilizzo è esattamente lo stesso url()delle espressioni regolari. Per le sostituzioni senza la necessità di espressioni regolari, utilizzare path().

from django.urls import re_path

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

ho aggiunto questo ma ho appena ricevuto un errore HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanent = False)
felix001,

1
Ti sembra che manchi un ")", scorri fino alla fine e lo vedrai. Puoi omettere la nameparte però
dmg

1
@ felix001 btw, HTTP 500 di solito (come nel 99% delle volte) significa che hai un errore di sintassi, dai un'occhiata a questo - docs.djangoproject.com/en/dev/howto/error-reporting/… . Quando un sito è in fase di sviluppo è sempre bene avere DEBUG = Trueo almeno impostare l' ADMINSopzione - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg

COME faccio a passare lo slug e utilizzare quel campo per creare l'URL di reindirizzamento. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', permanente = Falso),)
Roshan

Si noti che utilizzando questo metodo è molto facile catturare l'utente in un ciclo di reindirizzamento.
smilebomb

35

In Django 1.8, è così che ho fatto il mio.

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

Invece di usare url, puoi usare pattern_name, che è un po 'non DRY, e ti assicurerà di cambiare l'URL, non devi cambiare anche il reindirizzamento.


11

Se sei bloccato su django 1.2 come me e RedirectView non esiste, un altro modo incentrato sul percorso per aggiungere la mappatura di reindirizzamento sta usando:

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

Puoi anche reindirizzare tutto in una partita. Ciò è utile quando si cambia la cartella di un'app ma si desidera conservare i segnalibri:

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

Questo è preferibile a django.shortcuts.redirect se stai solo tentando di modificare il routing dell'URL e non hai accesso a .htaccess, ecc. (Sono su Appengine e app.yaml non consente il reindirizzamento dell'URL a quel livello come un .htaccess).


3
Questo vecchio formato è deprecato o rimosso nelle nuove versioni di Django, ma puoi comunque utilizzare le parole chiave dell'URL quando esegui il reindirizzamento utilizzando RedirectView come descritto nella risposta accettata. Esempio:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter

9

Un altro modo per farlo è usare HttpResponsePermanentRedirect in questo modo:

In view.py

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

Nel url.py

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

8

Gli altri metodi funzionano bene, ma puoi anche usare il buon vecchio django.shortcut.redirect .

Il codice seguente è stato preso da questa risposta .

In 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')),
]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.