2017-01-30 1 views
2

Django 프로젝트의 "animals"에는 "birds"라는 앱이 있습니다. 이 같은 동물에서 /은 "새"의 URI가 새로 연결됩니다 urls.py를/urls.py :Django 프로젝트의 app URI에 대한 별칭 urls.py

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

은 "새 /"공식이며, 영구적 기본 URI; "b /"는 바로 가기/별칭으로 허용됩니다.

"b/penguin"을 입력 할 수 있지만 브라우저의 주소 표시 줄에 "새"가 표시되도록 "birds /"로 리디렉션되는 "영구적 인"b/URI를 어떻게 가질 수 있습니까?/펭귄 "? 프로젝트에서 URI를 앱에 매핑하는 방법을 알지 않아야하므로 "새"앱에서 코드를 건드리지 않는 것이 좋습니다.

나는

RedirectView.as_view(pattern_name='birds')) 

를 사용하려고했지만이 410 사라 응답 결과. 및

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

리디렉션/b/펭귄/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

이것은 나를 위해 (장고 버전 1.9.5) 작동합니다. 브라우저는 초기'/ b/penguin' 요청이 Django에서'/ birds/penguin' 위치 헤더와 함께'302 Found' 상태 응답을 얻는 것을 기록합니다. 그러면 브라우저는 두 번째/새/펭귄 요청을 '200 OK'로 만듭니다. Django가'302 Found' 대신'301 Moved Permanently'을 리턴하도록'permanent = True' 속성을 추가했습니다. – Roger

0

당신은 당신이

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/가있는 경우,로 리디렉션 수의 리디렉션을 처리 할 custom middleware을 만들 수 있습니다 필요한 목적지.

그렇지 않으면 birds의 모든 URL을 반복하여 리디렉션 뷰를 지정할 수 있지만 다른 URL의 네임 스페이스 인 새의 URL은 지저분해질 수 있습니다.

+0

P.S을 : 새를 저장! – Sayse

+1

나는 새들이 이제 안전하다고 생각한다. 이 접근법은 매우 적절하고 깨끗합니다. –

+1

DRY 위반 - 귀하의 미들웨어는 url 매핑에 대해 너무 많은 것으로 가정하고 누군가 url 패턴을 변경하거나 i18n URL 등을 추가하자마자 깨지게됩니다. –