2013-05-04 6 views
2

데코레이터가 정상적으로 작동하지만 사용자가 필수 그룹에 속하지 않은 경우 오류 메시지 (메시지 프레임 워크을 사용하고 싶습니다.)를 표시하려고합니다.데코레이터 실패시 오류 메시지 표시

def group_required(*group_names): 
    """Requires user membership in at least one of the groups passed in.""" 
    def in_groups(user): 
     if user.is_authenticated(): 
      if bool(user.groups.filter(name__in=group_names)) or user.is_superuser: 
       return True 
     return False 
    return user_passes_test(in_groups) 

나는 같은 것을 사용하여 전화 : 여기에 장식의 난 (이것은 요청 객체를 필요로하기 때문에) 메시지 프레임 워크를 사용하려면이 snippet를 사용하여 시도

@require_http_methods(['GET'])  
@group_required('supervisor') 
def home_view(request): 
    return render(request, 'home.html') 

는하지만 실현 메시지 프레임 워크 미들웨어가 데코레이터 안에 설치되지 않은 것 같습니다.

나는 그것이 무엇이든 :) 변경 기꺼이

업데이트 :

def group_required(request, *group_names): 
    """Requires user membership in at least one of the groups passed in.""" 
    def in_groups(user): 
     if user.is_authenticated(): 
      if user.groups.filter(name__in=group_names).exists() or user.is_superuser: 
       return True 
      else: 
       # I'm getting: 
       # You cannot add messages without installing django.contrib.messages.middleware.MessageMiddleware 
       messages.add_message(request, messages.ERROR, 'Group is not allowed') 
     return False 
    return user_passes_test(in_groups, request) 
+0

요청에 포함 된 내용이 기록되었으며 요청 개체가 아닙니다. 내 문제는 데코레이터에 요청 객체를 전달하고 있다고 생각합니다. – chachan

답변

1

난 당신이 정말이에 ThreadLocals을 필요하다고 생각하지 않습니다 : I가

을 찾고 있어요 무엇 유스 케이스. 그리고 일반적으로 threadlocals가 Django 앱에 들어가는 유일한 방법 인 것처럼 보이면 잘못 구성된 컨텍스트 레이어가있을 수 있습니다. ThreadLocals을 승/비교, 차라리 (쉽게 user_passes_test의 코드를 수정하지 않고 우리는 is_grouprequest를 통과 할 수없는 질문을 확인하십시오.. : How to pass Django request object in user_passes_test decorator callable function를) user_passes_test을 복제 한 후 in_groupsrequest을 통과를 수정하는 것 (이것에 대한 어쩌면 티켓 ?)

또한, bool(user.groups.filter(name__in=group_names)) 직접 DB 백엔드에서 부울 결과를 반환하는 exists() 따라서 user.groups.filter(name__in=group_names).exists()를 사용하여, 존재를 결정하기 전에 DB 어댑터와 파이썬 인스턴스에 검색 할 항목을 발생하는 것입니다 여기에 훨씬 더 효율적입니다.

+0

응답 해 주셔서 감사합니다. 쿼리 문이 변경되어 더 좋아집니다. 메시지 문제에 관해서는 교체를했지만 여전히 "django.contrib.messages.middleware.MessageMiddleware를 설치하지 않고 메시지를 추가 할 수 없습니다"라는 메시지가 표시됩니다.이 메시지는 해당 컨텍스트에서 벗어난 것입니다. 이 시점에서 메시지 프레임 워크를 사용할 수있게하려면 어떻게해야합니까? – chachan

+0

@chachan user_passes_test를 무시 했습니까? 어떻게 group_required 안에 요청 객체를 가져 오는 부분을 고쳤습니까? –

+0

@SandeepBalagopal 죄송합니다, 지금은 말할 수 없습니다. 그게 4 년 전이었습니다. – chachan