Django URL Redirect

101

Como posso redirecionar o tráfego que não corresponde a nenhum dos meus outros URLs de volta para a página inicial?

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

Como está, a última entrada envia todo o tráfego "outro" para a página inicial, mas desejo redirecionar por meio de um HTTP 301 ou 302 .

felix001
fonte

Respostas:

181

Você pode tentar a visão baseada em classe chamada 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')
)

Observe como como urlna <url_to_home_view>você precisa realmente especificar a url.

permanent=Falseretornará HTTP 302, enquanto permanent=Trueretornará HTTP 301.

Alternativamente, você pode usar django.shortcuts.redirect

Atualização para as versões do Django 2+

Com Django 2+, url()está obsoleto e foi substituído por re_path(). O uso é exatamente igual url()ao das expressões regulares. Para substituições sem a necessidade de expressão regular, use path().

from django.urls import re_path

re_path(r'^.*$', RedirectView.as_view(url='<url_to_home_view>', permanent=False), name='index')
dmg
fonte
Eu adicionei isso, mas acabou de receber um erro HTTP 500? url (r '^. * $', RedirectView.as_view (url = 'macmon_about', permanent = False)
felix001
1
Parece que está faltando um ")", role a lateral até o final e você verá. Você pode omitir a nameparte
dmg
1
@ felix001 btw, HTTP 500 normalmente (como em 99% das vezes) significa que você tem um erro de sintaxe, dê uma olhada nisso - docs.djangoproject.com/en/dev/howto/error-reporting/… . Quando um site está em desenvolvimento, é sempre bom ter DEBUG = Trueou pelo menos definir a ADMINSopção - docs.djangoproject.com/en/dev/ref/settings/#std:setting-ADMINS
dmg
COMO faço para passar o slug e usar esse campo para criar a url de redirecionamento. EXA: url (r '^ (? P <slug> [a-zA-Z0-9 -] +) /', RedirectView.as_view (url = 'http: //'+slug+'.mywebsite.com', permanente = False),)
Roshan
Observe que, usando este método, é muito fácil fazer o usuário ser pego em um loop de redirecionamento.
smilebomb
35

No Django 1.8, é assim que fiz o meu.

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

Em vez de usar url, você pode usar o pattern_name, que é um pouco não-SECO, e irá garantir que você altere seu url, você não precisa alterar o redirecionamento também.

KhoPhi
fonte
11

Se você está preso no django 1.2 como eu estou e RedirectView não existe, outra maneira centrada na rota de adicionar o mapeamento de redirecionamento é usando:

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

Você também pode redirecionar tudo em uma partida. Isso é útil ao alterar a pasta de um aplicativo, mas deseja preservar os favoritos:

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

É preferível a django.shortcuts.redirect se você está apenas tentando modificar o roteamento de url e não tem acesso a .htaccess, etc (estou no Appengine e app.yaml não permite o redirecionamento de url nesse nível como um .htaccess).

Blaine Garrett
fonte
3
Este formato antigo está obsoleto ou foi removido nas novas versões do Django, mas você ainda pode usar palavras-chave url ao redirecionar usando RedirectView conforme descrito na resposta aceita. Exemplo:(r'^match_folder/(?P<path>.*)/$', RedirectView.as_view(url='/new_folder/%(path)s/', permanent=True), name='view-name'),
Micah Walter
9

Outra maneira de fazer isso é usando HttpResponsePermanentRedirect assim:

Em view.py

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

No url.py

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

Os outros métodos funcionam bem, mas você também pode usar o bom e velho django.shortcut.redirect.

O código abaixo foi retirado desta resposta .

No 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')),
]
bombas
fonte