繁体   English   中英

如何为Django / Python视图编写装饰器?

[英]How do I write a decorator for my Django/Python view?

这是我的看法。 基本上,它会根据是否登录返回不同的响应。

@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

问题是..在这种情况下,我不知道如何写一个合适的装饰器! 有什么争论? 有什么功能? 怎么样?

仅使用@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”,则此装饰器将调用执行您的登录功能,然后调用原始方法。

普通装饰器只是一个函数,它接受一个函数或类并返回其他东西(通常是相同的类型,但这不是必需的)。 参数化装饰器是返回装饰器的函数。

因此,考虑到这一点,我们创建一个闭包并返回它:

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

这是我写的一个装饰器,用于检查用户是否在某个组中。 它显示了一点。

https://github.com/mzupan/django-decorators/blob/master/auth.py

你喜欢它

@group_required(["group1", "group2"])
def show_index(request):
    view_code_here

用户可以在group1或group2中,如果他们不是404页面

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM