0

タプルを取るミドルウェアがあります(ユーザー名の...タプル内のユーザー名のみがサイトの特定の領域を通過できるようにします)。

各ユーザーに関する情報を含む UserProfile モデルがあり、このミドルウェアで使用するユーザー名のタプルを返すようにフィルター処理したいと考えています。つまり、変数 BETA_USERS = (動的に生成されたタプル) を設定します。

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

編集:

したがって、タプルは実際には重要な詳細ではありません。例を次に示します。

通常、これを設定にハードコーディングします。

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

ただし、1 に設定できる Beta 列を含む UserProfile モデルがあります。ベータ版にサインアップした最初の 50 人は 1 に設定され、それ以外の人は 0 に設定されます。モデル オブジェクトの filter メソッド:

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

そして、この奇妙な小さなループを使用して、それを素敵なタプルにすることができます。

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

私の本当の質問は、設定ファイルでこれを呼び出す最良の方法は何ですか?

または、別の言い方をすれば、設定ファイルで動的に作成された変数を割り当てる最良の方法は何ですか?

4

4 に答える 4

2

@user_passes_testデコレーターを使用して、ビューを特定のユーザーのサブセットに制限することもできます。または、独自のデコレータを作成します。

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再利用が少し簡単なことです。

于 2011-01-07T08:06:00.553 に答える
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')

より良い解決策 (思い出させてくれた sukhbir に感謝!):

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

または、結果がタプルでなければならない場合:

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

セットを使用する場合の唯一の欠点は、順序が必ずしも保持されないことです。

于 2011-01-07T06:08:36.347 に答える
0

最初に頭に浮かぶのは、リストを作成してから tuple() を呼び出すか、各ユーザー名を生成するジェネレーター関数を使用してオンザフライでタプルを作成することです。いずれにせよ、データ用のインターフェースを構築する必要があります。このサイトにざっと目を通したところ、オブジェクトのグローバル オブジェクトにアクセスするインターフェイスからデータにアクセスするのが最適なようです。単純に django.model オブジェクトを反復処理してユーザー名を抽出し、そのたびにタプルを作成するために使用されるジェネレーターに渡します。

于 2011-01-07T06:09:40.493 に答える
0

あなたが今のやり方を続けたいなら、ティムは良い答えを持っています.

しかし、django は、カスタム権限を使用して、一部の人だけがサイトの領域に入るのを許可する良い方法を提供します。

それらを実装し、パーミッションが必要なビューを@permission_required

于 2011-01-07T06:22:00.987 に答える