2011-01-07 4 views
0

튜플 (사용자 이름 중 ... 튜플의 사용자 이름 만 사이트의 특정 영역을 통과 할 수 있도록 허용)을 사용하는 미들웨어가 있습니다.함수를 호출하고 설정 파일 내에서 사용할 반환 객체를 만들려면 어떻게해야합니까?

나는 각 사용자에 대한 정보가 들어있는 UserProfile 모델을 가지고 있으며,이 미들웨어와 함께 사용할 사용자 이름의 튜플을 반환하도록 필터링하려고합니다. 즉, 변수를 설정하십시오. BETA_USERS = (동적으로 생성 된 변수) 튜플).

이 작업에 대한 제안 사항이 있습니까?

편집 :

그래서, 튜플 정말 중요한 세부 사항이 아닌 - 여기 예입니다 : 설정에 난 그냥 것, 일반적으로

하드 코딩이 :

BETA_USERS = ('username1', 'username2', 'username3', 'username4') 

그러나 베타 열을 포함하는 UserProfile 모델이 있습니다. 베타 열은 1로 설정할 수 있습니다. 처음 50 명이 베타에 가입하면 1, 다른 모든 사용자는 0으로 설정됩니다. mo에 대한 필터 메서드 호출 델 개체 :

users = UserProfile.objects.filter(beta='1') 

내가 할 수있는이 이상한 작은 루프와 좋은 튜플 : 날이 전화를 할 수있는 가장 좋은 방법이 무엇인지

for user in users: 
    list.append((user.user.username).upper()) 
return tuple(list) 

내가 내 진짜 질문은 생각, 내 설정 파일?

또는 다른 말로하면 설정 파일에 동적으로 생성 된 변수를 할당하는 가장 좋은 방법은 무엇입니까?

+1

마지막 코드 샘플을'return tuple (사용자의 사용자에 대한 user.user.username.upper()) '로 줄일 수 있습니다. –

+0

감사합니다. 매우 우아합니다. –

답변

2

와 권한을 필요로하는 뷰를 장식한다. 또는 자신의 장식을 만들 :

from django.utils.functional import wraps 

def beta(view): 
    @wraps(view) 
    def inner(request, *args, **kwargs): 
     if request.user.user_profile.beta: 
      return view(request, *args, **kwargs) 
     # Up to you how you return failure... 
    return inner 

지금 당신이로 사용할 수 있습니다

@beta 
def my_view(request): 
    # do something new here. 

대안 것은 :

@user_passes_test(lambda u: u.profile.beta) 
def my_view(request): 
    # do something clever 

@beta 형태의 장점은 조금 때문이다 재사용하기 쉽습니다.

+0

나는 이것을 좋아한다. 그것을 구현하려고합니다. –

0

문제를 올바르게 이해하고 있는지 잘 모르겠습니다. 이게 뭔가?

>>> allowed_users = ("John", "Eric", "Graham", "Terry") 
>>> current_users = ("Connie", "John", "Ian", "Terry") 
>>> tuple(user for user in current_users if user in allowed_users) 
('John', 'Terry') 

더 나은 솔루션을 (저를 생각 나게하기위한 석버 덕분에!) :

>>> set(allowed_users) & set(current_users) 
{'John', 'Terry'} 

또는 결과 튜플 수있는 경우 :

>>> tuple(set(allowed_users) & set(current_users)) 
('John', 'Terry') 

유일한 단점 사용 세트는 그 순서가 반드시 보존되지는 않을 것이다.

+1

여기에 튜플 이해를 사용한 이유가 있습니까? 'set (allowed_users) & set (current_users)'- 그게 더 좋지 않을까요? – user225312

+0

@ sukhbir : 당신은 절대적으로 맞습니다. 나는 세트를 전혀 생각하지 않았다. 세트에 대한 이유는 그들이 순서가 없다는 것일 수 있습니다. –

+0

나는 더 많은 정보와 함께 위에서 분명히하려고 노력했다. –

0

가장 먼저 떠오르는 것은 목록을 작성한 다음 tuple()을 호출하거나 각 사용자 이름을 생성하는 생성기 함수를 사용하여 즉시 튜플을 작성하는 것입니다. 어느 쪽이든 데이터를위한 인터페이스를 구축해야합니다. 나는 this site을 훑어 보았고 여러분의 데이터는 객체의 전역 객체에 액세스하는 인터페이스에 의해 가장 잘 액세스되는 것 같습니다. 간단히 django.model 객체를 반복하고 사용자 이름을 추출하여 매번 터플을 생성하는 데 사용되는 생성기를 생성합니다.

+0

네, 그게 내가하고있는 일입니다. 편집 내용은 위의 내용을 참조하십시오. –

0

Tim은 지금 어떻게하고 있는지 계속하고 싶다면 좋은 답변입니다.

그러나 django는 custom permissions을 통해 사이트의 일부 사용자 만 허용하는 좋은 방법을 제공합니다.

당신이 그들을 구현하고 또한 사용자의 특정의 부분 집합에 대한 견해를 제한 할 @user_passes_test 장식을 사용할 수 있습니다 @permission_required

+0

특정 앱에서는 괜찮을 것이지만 "Login Gates"설정을 사용하면 프로젝트의 모든 URL을 제한적으로 정의하여 액세스를 제한 할 수 있습니다 (특히 사이트 유지 관리 또는 베타 기능에 유용). –

+0

데코레이터를 사용하여 동일한 작업을 수행 할 수 있습니다. 설정 검사에서 사용 권한 + 플래그를 확인하십시오. 그런 다음 설정에서 플래그를 변경할 수 있습니다 (또는이를 결정할 수 있음). –

+0

음, 좀 더 자세히 읽어 보겠습니다. 그래도 유용한 것 같습니다. –

관련 문제