Какова наилучшая практика для общих данных или процессов на Django? - PullRequest
0 голосов
/ 26 марта 2012

Я бы хотел сделать приложение премиум-класса в своем проекте 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
    }

Случай 1 не работает.b / c Сессия Django не работает, если пользователь не вошел в систему. Случай 2 не является модным.Я хотел бы использовать декоратор.но я не знаю, как исправить первый случай.

Какой из них лучший?и как я могу это исправить в первом случае?или если у вас есть хорошие передовые практики в этой теме, просто дайте мне знать любой случай

Большое спасибо.

Ответы [ 2 ]

0 голосов
/ 26 марта 2012

Ну, первый сеанс не зависит от django.contrib.auth, наоборот. При этом сеанс работы с анонимными пользователями.

Но все равно использование сеанса в этом случае кажется неправильным, поскольку сеансы были разработаны для сохранения состояния между запросами, а не во время запроса. Если вы хотите придерживаться шаблона декоратора, вы можете добавить пользовательский атрибут для запроса следующим образом:

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

(Просто вычеркнув это из головы, могут возникнуть некоторые синтаксические ошибки;))

Но, как упоминал Дэвид Вулевер, также возможно реализовать такую ​​логику в промежуточном программном обеспечении, просто убедитесь, что ваш пользовательский атрибут ленив, чтобы вы не обращались к базе данных при каждом запросе, если вам это нужно только атрибут только в некоторых видах.

0 голосов
/ 26 марта 2012

Если бы я реализовывал это, я бы подумал написать Middleware , чтобы добавить поле is_premium к request.

...