高级视图_限制请求method

Django限制请求method


常用的请求method

1、GET请求:GET请求一般用来向服务器索取数据,不会向服务器提交数据,不会对服务器的状态进行更改。比如向服务器获取某篇文章的详情

2、POST请求:POST请求一般是用来向服务器提交数据,会对副武器的状态进行更改。比如提交一篇文章给服务器(提交数据也可以使用GET请求,只是说安全性较低)

 

 

限制请求装饰器

Django内置的视图装饰器可以给视图提供一些限制。比如这个视图只能通过GET的method进行访问等

注:
1、一般来说一个URL请求访问服务器有两种方式(GET和POST):即一个URL对应两种请求方式GET和POST。但是有时候这个URL只存在获取数据不存在提交数据,那么的话我们就可以对URL的请求方式进行一些限制

2、一个提交数据的页面(URL),首先需要使用Get请求获取提交数据的HTML页面(如果不获取这个页面又怎么填写数据并提交呢),然后再使用Post请求向这个URL提交数据。所以一定要分清楚URL存在哪些请求方式

3、一般来说:一个URL默认有两种请求方式,在获取数据时默认使用的是GET请求,提交数据时默认使用Post请求。当然也可以自己设置提交数据时使用GET请求


例1:

⑴编辑模型:本篇文章都使用这个模型
高级视图_限制请求method

⑵查看数据
高级视图_限制请求method

⑶编辑视图
高级视图_限制请求method

⑷编辑模板
高级视图_限制请求method

⑸访问:默认使用GET请求
    可以看到,在获取数据时浏览器默认使用的是GET请求,那这里是否可以使用POST方式请求请求呢(这里还没有限制请求方式)
高级视图_限制请求method

⑹访问:POST请求
    因为浏览器在获取数据默认使用的是GET请求,因此如果需要模拟POST请求的话,需要借助接口测试工具Postman来进行请求
高级视图_限制请求method

注:从上面的例子可以看出
1、在没有限制请求方式时,同一个请求使用GET方式或POST方式都可以正常进行请求

2、但是,一般来说在获取数据时最好使用GET请求,提交数据时最好使用POST请求:从设计初衷来说获取使用POST,提交数据使用GET是不合适的。当然从技术上来说这两种方式是可以实现的

3、因此一个URL在进行请求时,最好在视图函数中对请求方式进行一些限制

 

 

require_http_methods

1、这个装饰器需要传递一个允许访问的请求方式的列表

2、即:URL只能使用参数列表中的方式进行访问(参数列表中可以有一个或多个参数)

例2:
⑴编辑视图
高级视图_限制请求method

⑵访问:GET方式
高级视图_限制请求method

⑶访问:POST方式
高级视图_限制请求method

注:
1、上面例子中的视图函数使用的"请求method限制装饰器:@require_http_methods()",并且该装饰器的参数为"["GET"]",即表示只能使用GET方式来进行请求

2、当然这个装饰器参数中也可以传入多个参数,如["GET","POST"],即表示只能使用GET方式和POST方式来进行请求

3、注意:使用了这种装饰器在使用POST进行请求时,请求根本不会走到视图函数中(不会执行index视图函数),而是在装饰器中就报错了。可以说这个URL根本就不支持这个请求方式

 

例2_1:
⑴编辑视图
高级视图_限制请求method

⑵访问:GET方式
高级视图_限制请求method

⑶访问:POST方式
高级视图_限制请求method

注:
1、这个例子中就没有使用请求方式限制装饰器,但是在视图函数中进行了请求方式的限制(判断),不同请求对应不同的处理:request.method == "GET"(使用request.method来获取请求方式)

2、但是这个处理方式其实还是没有对请求方式进行限制,只是说在处理方式上进行了一些限制:在使用POST方式请求时还是请求成功了(状态码为200),只是说返回的是错误信息,并且使用这种方式时还是会走到视图函数中

3、"请求method限制装饰器"是从根本上限制请求的方式,如果我们确定一个URL只会有哪些请求方式那么最好使用"请求method限制装饰器"来对请求方式进行限制。表示根本就不支持这种请求方式

4、而上面这个例子中的写法适用于:一个URL存在多种请求方式时,针对不同的请求方式该如何处理。实际上这个URL还是支持对应的请求方式的,只是说不同的请求方式有不同的处理

 

 

require_GET

1、作用:与require_http_methods装饰器类似,只是说这个装饰器不需要传递参数,只支持GET方式的请求

2、require_http_methods装饰器可以通过传递参数列表来表示支持的请求方式,而require_GET不需要传递参数,表示只支持GET方式的请求

例3:
⑴编辑视图
高级视图_限制请求method

⑵访问:GET方式
高级视图_限制请求method

⑶访问:POST方式
高级视图_限制请求method

 

 

require_POST

1、作用:与require_GET装饰器相反,只支持POST方式的请求

2、require_GET装饰器表示只支持GET方式的请求,require_POST装饰器表示只支持POST方式的请求

例4:

⑴编辑视图
高级视图_限制请求method

⑵访问:GET方式
高级视图_限制请求method

⑶访问:POST方式
高级视图_限制请求method

⑷查看数据
高级视图_限制请求method

注:
1、上面这个例子中,请求方式就只支持POST,如果请求方式是GET或其他方式时,在执行装饰器函数时就会报错

2、视图函数中的request.POST.get("title")表示:
    ⑴request.POST:目前可以这个理解,它表示一个请求对象,它包含了客户端使用POST方式进行请求时的所有数据,其中就包含了这个例子中的"title"等数据
    ⑵与之对应的还有request.GET:只是说它表示使用GET方式请求时,包含了客户端请求中的所有数据
    ⑶request.POST和request.GET数据是一个类字典型的数据,因此可以数据字典方法get()或[ ]来获取其中具体数据的值

3、实际中,只支持POST方式的请求一般是不存在,比如你在一个页面提交数据时,首先是使用GET请求来获取这个页面,然后才是使用POST方式来向这个URL提交数据(所以我们这里使用了Postman来绕过客户端的get请求直接使用POST)

 

 

综合实例

1、实际中一个页面如果只是单纯的获取数据的话,那就只需要支持GET方式的请求就可以了。但是有时候一个页面不仅要获取数据并且还可以提交数据(一个页面只有获取到提交数据的页面后才能进行提交数据,不获取到提交数据的页面的话,又在哪里填写需要提交的数据呢)

2、因此如果一个页面即可以获取数据又可以提交数据,那么就需要同时支持GET方式和POST方式的请求了,并且需要在视图函数中判断请求的方式并针对不同的方式进行不同的处理

例5:
⑴编辑视图
高级视图_限制请求method

⑵编辑模板
高级视图_限制请求method

⑶访问:GET方式
高级视图_限制请求method

⑷访问:POST方式
高级视图_限制请求method


注:从上面的例子可以看出
1、如果一个URL支持多个请求方式时,那么就必须使用require_http_methods装饰器来限制请求方式了,如:"@require_http_methods(["GET","POST"])"

2、如果一个URL支持多个请求方式时,那么在视图函数中就应该判断请求方式是什么,然后根据不同的请求方式来进行不同的处理。总不可能说多种请求方式都是干一件事哇,那还不如就支持一个请求方式了。如这个例子中
    ⑴当请求方式为GET时:就只是获取填写数据的页面(返回HTML页面)
    ⑵当请求方式为POST时:就进行提交数据
3、另外就是:当我们在浏览器中输入一个网址然后进行请求时,默认使用的是GET方式。根据这个例子中的模板也可以看出来,在提交数据时所使用的的方式是在模板中定义的

4、一个URL可能存在多种请求方式:使用POST方式向一个URL提交数据时,肯定会先使用GET请求获取提交数据的页面(一般来说POST方式的请求是不会单独出现的)