2

我正在尝试使用 python gae 制作所需的登录装饰器。

import utils

def login_required(func):
    def check_login(self, *args, **kw):
        user_cookie = self.request.cookies.get("username")
        user_logged_in = False
        if user_cookie and utils.check_user_login("username"):
            username = user_cookie.split('|')[0]
            user_logged_in = True
            return func(self, *args, **kw)
        else:
            self.redirect('/login') 

    return check_login

class Handler(webapp2.RequestHandler):
    @login_required
    def render_with_login(self, template, template_values={}):
        self.render(template, template_values)

我想将装饰器中的用户名和 user_logged_in 值传递给模板。有可能这样做吗?是的,我应该如何修改上面的代码?提前致谢。

4

1 回答 1

2

我相信您遇到的问题是可变范围。user_logged_in 和 username 对于您的 check_login 是本地的,并在返回新的 render_with_login 函数之前执行,然后再执行。

我认为您最好的选择可能是通过更改将您的用户名和 user_logged_in 作为关键字参数传递给您的 render_with_login 函数:

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

    return func(self, username=username, user_logged_in=user_logged_in, *args, **kwargs)

顺便说一句,我不是 python 专家,所以我对范围界定部分并不肯定,但这是我最好的猜测。无论如何,这很容易测试。

于 2013-01-26T08:35:55.873 回答