2017-01-30 11 views
2

В моем проекте Django «животные» есть приложение под названием «птицы». У животных/urls.py в URIs «птицы» направляются на птиц/urls.py так:Псевдоним для URI приложения в проекте Django urls.py

urlpatterns=[ 
    url(r'^birds/', include('birds.urls')), 
    url(r'^b/',  include('birds.urls')), # alias 
] 

«птицы /» является официальным, постоянная база URI; «b /» принимается как ярлык/псевдоним.

Как я могу называть «b /» URI (постоянно) перенаправленными на «птицы /», так что даже если пользователи могут вводить «b/penguin», адресная строка браузера будет (в конечном счете) показывать «птицы/пингвин "? Я предпочитаю не касаться какого-либо кода в приложении «птицы», потому что он не должен знать, как проект сопоставляет URI с приложением.

Я пытался использовать

RedirectView.as_view(pattern_name='birds')) 

, но это приводит к 410 Унесенные ответ. И

RedirectView.as_view(url='/birds/')) 

redirects/b/penguin to/birds /, убивающий мою птицу.

ответ

1

Вы должны попробовать что-то вроде этого:

from django.views.generic import RedirectView 

urlpatterns=[ 
    url(r'^birds/', include('birds.urls')), 
    url(r'^b/(?P<path>.*)$', RedirectView.as_view(url='/birds/%(path)s')), 
] 
+1

Это работает для меня (версия Django 1.9.5). Мой браузер регистрирует, что первоначальный запрос '/ b/penguin' получает ответ« 302 Найдено »от Django, сопровождаемый заголовком местоположения'/birds/penguin'. Затем браузер делает второй запрос '/ birds/penguin', который является' 200 OK'. Я добавил атрибут 'constant = True', чтобы вернуть Django' 301 Moved Permanentently' вместо '302 Found'. – Roger

0

Вы можете сделать custom middleware обрабатывать редиректы для вас

class BirdMiddleware(MiddlewareMixin, object): 
    def process_view(self, request, view_func, view_args, view_kwargs): 
     if '/b/' in request.path: 
      return HttpResponseRedirect(request.path.replace('/b/', '/birds/')) 
     return None 

Реализация может понадобиться немного работы, но фактический метод стоит, проверить текущий путь, и если /b/ присутствует, перенаправлять его ваш необходимый пункт назначения.

В противном случае вы можете указать просмотр переадресации через итерацию по каждому URL-адресу в birds, но это будет беспорядочно для URL-адресов птиц, которые являются пространством имен для других URL-адресов.

+0

P.S: Сохранить птиц! – Sayse

+1

Я думаю, птицы теперь в безопасности. Этот подход кажется очень подходящим и чистым. –

+1

Нарушение DRY - ваше промежуточное ПО слишком много думает о URL-адресе и будет разорваться, как только кто-либо изменит URL-адреса, добавит URL-адреса i18n и т. Д. –