You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 09:15:35