Django中require_POST/require_GET装饰器的用法及安全贴士咨询
Django中require_GET、require_POST装饰器的用法及安全注意事项
首先是导入语句:
from django.views.decorators.http import require_GET, require_POST
一、具体用法
1. require_GET 装饰器
这个装饰器会限制视图仅接受GET请求,如果用户用POST、PUT、DELETE等其他方法访问,服务器直接返回405 Method Not Allowed状态码。适合做搜索、列表展示这类不需要提交数据的查询场景。
示例代码:
from django.shortcuts import render from django.views.decorators.http import require_GET from .models import Post @require_GET def search_posts(request): # 从GET参数中获取搜索关键词 keyword = request.GET.get('keyword', '') # 执行查询逻辑 posts = Post.objects.filter(title__icontains=keyword) return render(request, 'post_list.html', {'posts': posts, 'keyword': keyword})
2. require_POST 装饰器
这个装饰器要求视图仅接受POST请求,非POST请求同样返回405状态码。适合处理表单提交、数据创建/修改这类需要传递结构化或敏感数据的操作。
示例代码:
from django.shortcuts import render, redirect from django.views.decorators.http import require_POST from .forms import CommentForm @require_POST def submit_comment(request): form = CommentForm(request.POST) if form.is_valid(): comment = form.save(commit=False) comment.author = request.user comment.save() return redirect('post_detail', pk=request.POST.get('post_id')) # 表单验证失败,返回原页面展示错误 return render(request, 'post_detail.html', {'form': form})
二、安全注意事项
- 敏感操作禁止使用GET:GET请求的参数会明文暴露在URL中,还会被浏览器缓存、记录在历史记录里。修改密码、删除数据这类敏感操作,必须用POST实现。
- POST请求必须添加CSRF防护:Django默认开启CSRF中间件,使用require_POST的视图如果处理用户表单,必须在模板中加入
{% csrf_token %}标签,否则会返回403禁止访问错误,这是防范跨站请求伪造的核心手段。 - 不要仅依赖装饰器做安全校验:装饰器只是限制了请求方法,但攻击者可以绕过前端页面直接构造请求。视图内部必须额外做校验:比如表单验证、用户权限检查、数据合法性校验等。
- 自定义405错误提示:默认的405页面比较生硬,你可以在项目中配置自定义的405响应页面,或者返回JSON格式的提示信息,让用户清晰了解错误原因。
内容的提问来源于stack exchange,提问作者seyed abas alavi
相关产品推荐
相关产品推荐

