2011-01-07 3 views
0

私はタプルを取るミドルウェアを持っています(ユーザー名の...タプル内のユーザー名はサイトの特定の領域を通過するだけです)。設定ファイル内で関数を呼び出して戻りオブジェクトを作成するにはどうすればよいですか?

私は、各ユーザに関する情報を含むUserProfileモデルを持っており、このミドルウェアで使用するユーザ名のタプルを返すようにフィルタリングしたいと思います。つまり、変数BETA_USERS =(動的生成 - タプル)。

これを達成するための提案はありますか?

編集:

ので、タプルは本当に重要ディテールではありません - ここでの例です:

一般的に、私は設定にだけハードコードこのことを希望:

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

しかし、私は1に設定することができるベータの列を含むUserProfileモデルを持っています。ベータ版にサインアップする最初の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

に許可が必要なビューを飾る必要があります。または、独自のデコレータを作成:代替がある

@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フォームの利点は、それが少しあるということであるよう

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 

今、あなたはそれを使用することができます再利用が容易です。

+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

あなたが今やっていることをやり続けたいのであれば、ティムは良い答えを持っています。

しかし、djangoは、custom permissionsを経由して、サイトの領域に人を入れる方法を提供しています。

あなたはそれらを実装します。また、ユーザーの特定のサブセットにビューを制限する@user_passes_testデコレータを使用することができます@permission_required

+0

これは特定のアプリケーションでは問題ありませんが、「Login Gates」設定を使用して、アクセスを制限するためにプロジェクト内の任意のURLをすばやく定義できます(サイトのメンテナンスやベータ機能などに便利です) –

+0

あなたはデコレータで同じことをすることができます。その後、設定でフラグを変更することができます(またはこれを決定します)。 –

+0

ええと、もう少し詳しくお読みください。しかし、役に立つと思われます。 –

関連する問題