2012-03-26 11 views
0

私はDjangoプロジェクトでプレミアムアプリを作りたいと思っています。 ここにはアプリの関数があります。私はちょうどベストプラクティスを知っています。djangoでの一般的なデータやプロセスのベストプラクティスは何ですか?

ケース1セッションでデコレータを使用して#

''' In custom decorator ''' 
    def get_premium_status(): 
     def decorator(func): 
      def inner_decorator(request, *args, **kwargs): 
       #checking user status logic... 

       request.session['premium'] = True 

      return func(request, *args, **kwargs) 

     return wraps(func)(inner_decorator) 
    return decorator 


    ''' In app ''' 
    @get_premium_status() # using decorator with session 
    function premium_bbs_list() { 
     status = request.session["premium"] 
     print status 
    } 

    @get_premium_status() # using decorator with session 
    function premium_bbs_view() { 
     status = request.session["premium"] 
     print status 
    } 

ケース2

function get_premium_status() 
     return True 

    function premium_bbs_list() { 
     status = get_premium_status() 
     print status 
    } 

    function premium_bbs_view() { 
     status = get_premium_status() 
     print status 
    } 

ビューの機能#callケース1は動作しません。 b/cユーザーがログインしていなければ、Djangoセッションは機能しません。 ケース2は空想的ではありません。私はデコレータを使用したいと思います。私は最初のケースを修正する方法を知らない。

どちらが最善のケースですか?どのようにして最初のケースを修正できますか? またはこのトピックの良いベストプラクティスをお持ちの場合は、ちょうど私に事件を教えてください。

ありがとうございました。

+0

ユーザーは強制的にログインすることができます... –

答えて

0

私がこれを実装していた場合は、と書いて、is_premiumフィールドをrequestに追加することを検討します。

+0

これについてスニペットやチュートリアルを入手できますか?私はそれを調べ、グーグルで語った。しかし、私は完全に理解していませんでした。ありがとう! – Hwan

+0

具体的に何のためのスニペットやチュートリアルですか?ドキュメンテーションがカバーしていないことをあなたが探しているものはありますか? –

+0

私の言うことです...ドキュメントには例がありません。ミドルウェアの要求にis_premiumフィールドを追加する例が必要です。ありがとう。 – Hwan

0

セッションの最初はdjango.contrib.authに依存しません。逆も同様です。したがって、セッションは匿名ユーザーと連携します。

しかし、依然としてセッションを使用しているのは、セッションが要求の間ではなく状態間を保存するように設計されているためです。あなたはDecoratorパターンに固執する場合は、次のように要求するために、カスタム属性を追加することができます。

request._is_user_premium = True 

from your view: 
is_premium = getattr(request, '_is_user_premium', False) 

しかし、私があなただったら、私はパーミッションクラスのいくつかの種類でこのロジックをカプセル化することで、これを実装します:

class Permissions(object): 
    def __init__(self, request): 
     self.request = request 

    def has_premium_access(): 
     #implement your logic here and return a boolean 
     return True 

#view code 
def myView(request): 
    perm = Permissions(request) 
    if perm.has_premium_access(): 
     #do stuff 
    else: 
     #do other stuff 

(ちょうど私の頭の上にそれを書いて、いくつかの構文エラーがある可能性があります;))

しかしダビデWoleverは、それがアルで、述べたようにミドルウェアでこの種のロジックを実装するには、カスタム属性を怠惰にして、一部のビューでのみこの属性が必要な場合はすべてのリクエストでデータベースにヒットしないようにしてください。

+0

David Woleverが言及したように、ミドルウェアを使ってテストしました。ご存知のように、それは怠惰に見えます。私はこのように考えています。おかげでvkryachko。 – Hwan

関連する問題