这是我的看法。基本上,它会根据是否登录返回不同的响应。
@check_login()
def home(request):
if is_logged_in(request):
return x
else:
return y
这是我的装饰代码。我只想检查请求是否有标题,如果是,请将其登录。
#decorator to log the user in if there are headers
def check_login():
def check_dec(func):
if request.META['username'] == "blah":
login(request, user)
return check_dec
问题是..在这种情况下我不知道如何写一个合适的装饰器!有什么争论?有什么功能?怎么样?
答案 0 :(得分:11)
仅使用@check_login
代替check_login()
- 否则你的装饰师必须像往常一样返回装饰home = check_login()(home)
这是一个装饰示例:
def check_login(method):
@functools.wraps(method)
def wrapper(request, *args, **kwargs):
if request.META['username'] == "blah"
login(request, user) # where does user come from?!
return method(request, *args, **kwargs)
return wrapper
如果用户名字段设置为“blah”,则此装饰器将调用执行您的登录函数,然后调用原始方法。
答案 1 :(得分:3)
普通装饰器只是一个函数,它接受一个函数或类并返回其他东西(通常是相同的类型,但这不是必需的)。参数化装饰器是一个返回装饰器的函数。
因此,考虑到这一点,我们创建一个闭包并返回它:
def check_login(func):
def inner(request, *args, **kwargs):
if request.META['username'] == 'blah':
login(request, user) # I have no idea where user comes from
func(request, *args, **kwargs)
return inner
答案 2 :(得分:2)
这是我写的一个装饰器,用于检查用户是否在某个组中。它显示了更多。
https://github.com/mzupan/django-decorators/blob/master/auth.py
你像
一样使用它@group_required(["group1", "group2"])
def show_index(request):
view_code_here
如果用户不是404页面,则用户可以在group1或group2中