django限制HTTP请求方式

Django框架在进行路由分发时,完全依赖于用户请求的URL,并没有考虑请求所使用 的HTTP方法。这意味着对同一个URL使用不同的HTTP方法发起请求,都将路由到同一 个视图函数被处理。

在下图的示例中,用户向URL/report/1234/使用不同的HTTP方法,发起了四次请求, 都将被Django路由到视图v_report()进行处理:
这里写图片描述
装饰器:require_http_method()

当然你可以在视图函数内丢弃那些期望之外的请求(比如上例中的POST /report/1234/), 但更简单的做法是使用Django预置的require_http_methods(methods)装饰器进行限制, 让框架帮你拦截那些不想要的请求。

例如,下面的示例声明了视图函数v_login()只支持GET和POST方法:

from django.views.decorators.http import require_http_methods
@require_http_methods(['GET','POST'])
def v_login(request):pass

这时,如果用户试图使用其他HTTP方法(比如DELETE)请求指向这个视图函数的URL, Django框架将自动拦截并返回405错误 —— 在HTTP协议中,405代码表示:请求的方法 不被允许。

装饰器的语法糖

有几个语法糖可以缩短require_http_method()这个装饰器的书写长度:

require_GET() - 声明被装饰的视图仅支持GET方法
require_POST() - 声明被装饰的视图仅支持POST方法
require_SAFE() - 声明被装饰的视图仅支持GET和HEAD方法

例如,下面的示例声明了视图函数v_index()仅支持HTTP GET方法:

@require_GET
def v_index(request):pass

限制 != 分发 :请不要错误地认为这个装饰器可以指示Django框架将使用不同 HTTP方法向同一URL发起的请求自动路由到不同的视图函数,Django做不 到这一点,你必须在视图内自行实现不同HTTP方法的分发。

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值