Django(23)Django限制请求装饰器

Django(23)Django限制请求装饰器前言有时候,我们想要限制访问的请求方法,比如我们希望用户只能通过get方式请求,post不允许,那么我们可以采用装饰器的方式,django已经为我们提供了内置的装饰器限制请求装饰器Django内


Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

前言

有时候,我们想要限制访问的请求方法,比如我们希望用户只能通过get方式请求,post不允许,那么我们可以采用装饰器的方式,django已经为我们提供了内置的装饰器
 

限制请求装饰器

Django内置的视图装饰器可以给视图提供一些限制。比如这个视图只能通过GET的method访问等。
django.http.decorators.http.require_http_methods装饰器方法的路径,接下来我们看下它的源码

def require_http_methods(request_method_list):
    """
    Decorator to make a view only accept particular request methods.  Usage::

        @require_http_methods(["GET", "POST"])
        def my_view(request):
            # I can assume now that only GET or POST requests make it this far
            # ...

    Note that request methods should be in uppercase.
    """
    def decorator(func):
        @wraps(func)
        def inner(request, *args, **kwargs):
            if request.method not in request_method_list:
                response = HttpResponseNotAllowed(request_method_list)
                log_response(
                    'Method Not Allowed (%s): %s', request.method, request.path,
                    response=response,
                    request=request,
                )
                return response
            return func(request, *args, **kwargs)
        return inner
    return decorator

上述装饰器的含义是如果请求方法不在request_method_list这个列表中,那么就返回HttpResponseNotAllowed405方法不允许
 
在源码中django又定义了3个属性

require_GET = require_http_methods(["GET"])
require_GET.__doc__ = "Decorator to require that a view only accepts the GET method."

require_POST = require_http_methods(["POST"])
require_POST.__doc__ = "Decorator to require that a view only accepts the POST method."

require_safe = require_http_methods(["GET", "HEAD"])
require_safe.__doc__ = "Decorator to require that a view only accepts safe methods: GET and HEAD."

上述代码django又帮助我们定义好了只允许GET方法,只允许POST方法,只允许GET和HEAD方法,了解完源码后,我们就可以开始实操了
 

实战案例

我们创建一个视图,导入装饰器,定义一个index函数,在函数上加上一个require_GET装饰器,代码如下

from django.views.decorators.http import require_http_methods, require_GET, require_POST
from django.http import HttpResponse


@require_POST  
def index(request):
    return HttpResponse('success')

接下来我们访问这个视图,可以从PyCharm的控制台清楚的看到,返回的是405

Method Not Allowed (GET): /
[21/May/2021 02:08:05] "GET / HTTP/1.1" 405 0

接下来我们使用require_http_methods方法来给大家演示,代码如下

require_http_methods(['GET'])
def index1(request):
    return HttpResponse('success')

接下来我们通过网页访问,可以看到是可以正常访问的

[21/May/2021 02:20:59] "GET / HTTP/1.1" 200 7
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/164918.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 《Java核心技术 卷1》「建议收藏」

    《Java核心技术 卷1》「建议收藏」<1>静态字段和静态方法classEmployee{privatestaticintnextId=1;privateintid;….}每一个Employee对象都有一个自己的id字段,但是这个类的所有实例将共享一个nextId字段,换句话说,如果有1000个Employee类对象,则有1000个实例字段id,分别对应一个对象,但是只有一个静态字段nextId,即使没有Employee对象,静态字段nextId也存在,它属于类,…

    2022年7月8日
  • Netty 权威指南学习

    Netty 权威指南学习2019-03-04Netty是一个异步事件驱动的网络应用程序框架,用于快速开发可维护的高性能协议服务器和客户端。bio和niobio作为阻塞io,一个请求一个线程,应对不了高并发的应用。nio:缓冲区Buffer通道Channel多路复用器Selector…

    2022年9月1日
  • 一个多边形内部有3枚钉子_多边形的内部和外部

    一个多边形内部有3枚钉子_多边形的内部和外部Time Limit : 2000/1000ms (Java/Other) Memory Limit : 65536/32768K (Java/Other)Total Submission(s) : 24 Accepted Submission(s) : 7Problem DescriptionStatement of the Problem Several drawing applications allow us to draw polygons and almost all of the

    2022年8月10日
  • golang coredump分析「建议收藏」

    背景最近在分析golang的一个内存泄漏问题。一般来讲,使用golang自带的pprof工具就可以分析内存的使用,协程情况,是否有block等情况。但是我们项目中调用了C库,导致C库的一些东西没法通过pprof来进行监控分析。实际上通过pprof来监控程序的话,内存是稳定的,但是占用Linux的内存是一直增长的,即RES一直增长,实际上程序是有泄漏的。怀疑是使用C库导致,所以通过coredump…

    2022年4月12日
  • linux查看ttys0的设置_centos查看文件内容的命令是

    linux查看ttys0的设置_centos查看文件内容的命令是准备工具0.下载ttylinux系统。http://minimalinux.org/ttylinux/downloadX86.html(ttylinux-i686-11.1.iso.gz)(bootcd-i386-5.3.iso.gz)1.下载thttpd。(一)ttylinux安装(ttylinux-i686-11.1.iso)1.将ttylinux-i686-11.1.iso.gz解压t…

    2022年8月12日
  • 二维数组初始化规则

    二维数组初始化规则二维数组初始化的形式为:  数据类型数组名[整常量表达式][整常量表达式]={初始化数据};  在{}中给出各数组元素的初值,各初值之间用逗号分开。把{}中的初值依次赋给各数组元素。  有如下几种初始化方式:  ⑴分行进行初始化  inta[2][3]={{1,2,3},{4,5,6}};  在{}内部再用{}把各行分开,第一对{}中的初值1,2,3是0行的3个元素的初值。第…

    2022年7月18日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号