it-swarm.dev

Django reindirizzamento URL

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

rls.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 voglio reindirizzare tramite un HTTP 301 o 2.

92
PacketPimp

Puoi provare la vista basata sulla classe 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 url nel <url_to_home_view> devi effettivamente specificare l'URL.

permanent=False restituirà HTTP 302, mentre permanent=True restituirà HTTP 301.

In alternativa puoi usare Django.shortcuts.redirect

165
dmg

In Django 1.8, ecco come 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 ASCIUTTO, e ti assicurerà di cambiare il tuo url, non devi cambiare anche il reindirizzamento.

31
Rexford

Se sei bloccato su Django 1.2 come I am e RedirectView non esiste, un altro modo incentrato sul percorso per aggiungere il mapping di reindirizzamento sta usando:

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

Puoi anche reindirizzare tutto su 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 cercando di modificare il tuo 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).

9
Blaine Garrett

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

In view.py

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

In url.py

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

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

Il codice seguente è stato preso da this answe r

In Django 2.x,

from Django.contrib import admin
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=False)),
    path('hola/', include("hola.urls")),
    path('admin/', admin.site.urls),
]
1
bombs