2011-01-24 5 views
3

Django가 내 URL 패턴을 처리하는 방식이 이상하게 보입니다. 사용자가 로그인 한 다음 프로필 페이지로 리디렉션되어야합니다. 또한 사용자가 프로필을 편집 할 수있는 기능이 있습니다.Django - view, urld weirdness

urlpatterns=patterns('student.views', 
    (r'profile/$', login_required(profile,'student')), 
    (r'editprofile/$', login_required(editprofile,'student')), 
) 

이 학생이라는 앱입니다 : 여기

내 URL의 내 애플 리케이션 중 하나에 대한 패턴입니다. 사용자가/student/profile로 이동하면 프로필보기가 표시됩니다. 그들은/student/editprofile에 가면 editprofile 뷰를 얻어야합니다. login_required라는 함수를 설정하여 사용자에 대한 검사를 수행합니다. 단지 주석으로 처리 할 수있는 것보다 조금 더 복잡합니다. 여기

은 login_required 것 :

Going to <function profile at 0x03015DF0> 
Going to <function editprofile at 0x03015BB0> 
:

def login_required(view,user_type='common'): 
    print 'Going to '+str(view) 
    def new_view(request,*args,**kwargs): 
     if(user_type == 'common'): 
      perm = '' 
     else: 
      perm = user_type+'.is_'+user_type 
     if not request.user.is_authenticated(): 
      messages.error(request,'You must be logged in. Please log in.') 
      return HttpResponseRedirect('/') 
     elif request.user.is_authenticated() and user_type != 'common' and not request.user.has_perm(perm): 
      messages.error(request,'You must be an '+user_type+' to visit this page. Please log in.') 
      return HttpResponseRedirect('/') 
     return view(request,*args,**kwargs) 
    return new_view 

어쨌든, 이상한 것은 내가 오른쪽 페이지에 도착하더라도/학생/프로파일을 방문 할 때, 다음과 같은 인쇄 login_required,이다

둘 다 왜 인쇄됩니까? 왜 둘 다 방문하려고합니까? 내가/학생/editprofile를 방문하려고 할 때

심지어 괴상는 프로필 페이지는 어떤 부하이며,이 인쇄 무슨이다 :

Going to <function profile at 0x02FCA370> 
Going to <function editprofile at 0x02FCA3F0> 
Going to <function view_profile at 0x02FCA4F0> 

view_profile 완전히 다른 응용 프로그램의 기능입니다.

+3

decorators.login_required() 및 decorators.permission_required()에 대한 참을 수없는 점은 무엇입니까? – hop

답변

2

이 두 패턴

(r'profile/$', login_required(profile,'student')), 
(r'editprofile/$', login_required(editprofile,'student')), 

두 경기 http://your-site/student/editprofile.

시도 :

(r'^profile/$', login_required(profile,'student')), 
(r'^editprofile/$', login_required(editprofile,'student')), 

장고 패턴입니다 (see number 3 here) 첫 번째 일치하는보기를 사용합니다.

+0

이것이 문제였다. 나는이 urls.py가 다른 urls.py에 포함되어 있기 때문에 앞에서 '^'를 사용하지 말고 필요한 것으로 밝혀 졌다고 생각했습니다. 감사! – JPC

1

login_required은 파이썬 장식 자처럼 보입니다. 당신이 당신의 urls.py에 그것을 가질 필요가있는 어떤 이유?

어떤보기를 실행할지 결정하기 위해 urlpatterns을 읽을 때 print 'Going to '+str(view) 라인이 평가되고 있다고 생각합니다. 이상하게 보이지만, 너를 해칠 거라고 생각하지 않아.

라인 print 'Going to '+str(view)은 URL 패턴이 평가 될 때만 뷰가 히트 될 때마다 실행되지 않습니다 (제 생각 엔). new_view의 코드는보기의 일부로 특정하게 실행되는 유일한 코드입니다.

+0

아마도 장식으로 사용할 수있을 것입니다. 하지만 여전히 ... 그래, 당신은 edit_file을 시도 할 때 new_view가 실행되는 것이 옳았지만 왜 잘못된 뷰가로드 되는가? – JPC

2

당신이 표준 @login_required 장식을 사용할 수없는 이유는 확실하지가 - 당신의 버전은 실제로는 항상 오히려 실제 로그인보기보다, \로 리디렉션 주어진, 적은 기능을 제공하는 것으로 보인다. print 문이 urlconf가 가 평가 될 때 실행 따라서 장식의 최상위 레벨에 있고, 때문에 어떤 경우

는 모두 인쇄 이유는 다음과 같다.내부 new_view 함수에 넣으면 실제로 호출 될 때만 실행되고 관련 뷰 이름 만 인쇄해야합니다.

+0

당신은 print 문에 대해 옳았습니다. 그러나 editprofile에 대해 여전히 잘못된보기가 반환되었습니다. – JPC