Django 1.6 Views(I) — View Decorators

今天项目做到需要进一步整理的阶段,遇到如下问题:

我需要将 view 请求分为 post,get 和普通的页面请求,其中 post 类视图会产生更改,get 类视图会不会产生更改,返回的都是 JSON 数据,但是这两类都需要用户登录才可以通过。

到这里我想到 python 里面的 decorator 特性,这是 python 的一个极好的语法糖果特性,就是在函数的外层套用一个装饰器,可以理解为在函数执行之前或者之后做某些动作。

问题到这里的话,我事实上是想要做两个 decorator,一个限制调用视图的时候必须由用户登录,另一个限制调用视图的时候请求的类型必须是 POST。

由于 python 也是半桶水,不具体了解 decorator 的用法,仅仅是知道有这么个东西,研究一下自己写了个这样的东西:

def require_post(func):
    def wrapper(req, *args, **kwargs):
        if req.META['REQUEST_METHOD'] != 'POST':
            raise django.core.exceptions.PermissionDenied
        return func(req, *args, **kwargs)
    return wrapper

这样的话在 view 函数之前使用 @require_post 就可以了,当视图被调用但是没有 post 方式请求的话,就会返回一个 http 403 响应,内部的函数也不执行了。

我想如法炮制做一个 require_logged_in,应该也是顺理成章。忽然想到其实这些工作 django 应该是义务帮我们做的,就去文档搜索,果不然,有一堆 decorator 供我们使用,下面仅做罗列:

from django.views.decorators.http import *
  1. require_http_methods(request_method_list)
  2. require_GET()
  3. require_POST()
  4. require_safe()

  5. condition(etag_func=None, last_modified_func=None)

  6. etag(etag_func)
  7. last_modified(last_modified_func)

  8. gzip_page()

  9. vary_on_cookie(func)

  10. vary_on_headers(*headers)

另外在 django.contrib.auth 模块也有专用的 decorators,相当强大,具体看文档

from django.contrib.auth.decorators import *
  1. login_required([redirect_field_name=REDIRECT_FIELD_NAME, login_url=None])
  2. user_passes_test(func[, login_url=None, redirect_field_name=REDIRECT_FIELD_NAME])
  3. permission_required(perm[, login_url=None, raise_exception=False])

有了这些工具已经是可以简化超级多工作了!继续学习!


【转载请附】愿以此功德,回向 >>

原文链接:https://www.huangwenchao.com.cn/2014/05/django-views-1.html【Django 1.6 Views(I) — View Decorators】

发表评论

电子邮件地址不会被公开。 必填项已用*标注