Добавление декоратора отправки - PullRequest
0 голосов
/ 07 июля 2011

У меня есть следующая функция просмотра:

def gettingstarted_info(request): 
    """
    First page of gettingstarted after Registration.
    """
    if request.user.is_authenticated():
        if request.user.get_profile().getting_started_boolean: 
             return redirect('/home/')                       
        else:
            user = request.user
    else:
        username = request.session.get('username', False)                                                   
        if not username:
            return redirect('/login')                
        else:
            user = User.objects.get(email=username)  
    # the main part of the view function #

Я хотел бы преобразовать первую часть функции просмотра в @ декоратор, чтобы я мог получить что-то вроде -

@gettingstarted_dispatch
def getting_started_info(request):
    # the main part of the view function

Я взглянул на документы по функции декоратора, но мне было немного трудно преобразовать эту функцию, чтобы я мог использовать ее в качестве @ декоратора. Декоратор должен отфильтровать посторонних лиц и вернуть переменную user (обратите внимание, что это не то же самое, что request.user). Как бы я это сделал? Спасибо.

1 Ответ

1 голос
/ 07 июля 2011

Я думаю, что эта функция должна помочь вам. :)

def gettingstarted_dispatch(f):
    def wrap(request, *args, **kwargs):
        if request.user.is_authenticated():
            if request.user.get_profile().getting_started_boolean:
                return redirect('/home/')
            else:
                user = request.user
        else:
            username = request.session.get('username', False)
            if not username:
                return redirect('/login')
            else:
                user = User.objects.get(email=username)
        kwargs['user'] = user
        return f(request, *args, **kwargs)
    return wrap

Функция передает пользовательскую переменную как ключевое слово user arg.

В качестве альтернативы, если вы предпочитаете, пользователь в качестве второго аргумента ...

            else:
                user = User.objects.get(email=username)
        return f(request, user, *args, **kwargs)
    return wrap

Кроме того, вот очень хороший урок о том, как делать декораторы. :)

(часть I) http://www.artima.com/weblogs/viewpost.jsp?thread=240808
(Часть II) http://www.artima.com/weblogs/viewpost.jsp?thread=240845
(Часть III) http://www.artima.com/weblogs/viewpost.jsp?thread=241209

...