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

Django 2.0中TemplateView通过POST请求发送验证Token的问题

解决Django 2.0 TemplateView处理POST Token验证的问题

首先得明确:TemplateView 默认只处理 GET 请求,要实现你需要的POST Token验证逻辑,得重写post方法来处理POST请求,同时按需调整上下文数据。下面是完整的可行方案:

1. 完善LearnQuestion视图类

from django.views.generic.base import TemplateView
from django.http import JsonResponse, HttpResponseBadRequest
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator

# 如果你用的是自定义Token而非Django自带CSRF Token,需要禁用CSRF验证;用CSRF的话就去掉这个装饰器
@method_decorator(csrf_exempt, name='dispatch')
class LearnQuestion(TemplateView):
    template_name = 'learn/learn_question.html'

    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        # 这里可以给GET请求的模板传递初始化数据,比如把session里的Token放到上下文供前端使用
        # context['valid_token'] = self.request.session.get('user_valid_token', '')
        return context

    def post(self, request, *args, **kwargs):
        # 从POST请求里提取Token
        received_token = request.POST.get('token', '')
        # 从session中取出预存的验证Token
        stored_token = request.session.get('user_valid_token', '')

        # 执行Token验证逻辑
        if received_token == stored_token:
            # 验证通过,返回AJAX需要的成功响应(也可以调用render_to_response重新渲染模板)
            return JsonResponse({'status': 'success', 'msg': 'Token验证通过'})
        else:
            # 验证失败,返回错误响应
            return HttpResponseBadRequest(JsonResponse({'status': 'error', 'msg': 'Token无效'}))

2. 模板中的AJAX请求示例(learn/learn_question.html)

因为不需要表单,直接用JS发送POST请求即可:

<script>
// 从上下文或session中获取要发送的Token
const token = "{{ request.session.user_valid_token }}";

// 发送POST请求到当前视图地址
fetch(window.location.href, {
    method: 'POST',
    headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
    },
    body: `token=${encodeURIComponent(token)}`
})
.then(response => response.json())
.then(data => {
    if (data.status === 'success') {
        // 验证成功后的逻辑,比如加载动态内容
        console.log('验证通过,开始加载内容');
    } else {
        console.error('验证失败:', data.msg);
    }
})
.catch(error => {
    console.error('请求出错:', error);
});
</script>

关键细节说明

  • CSRF处理:如果用自定义Token,就保留csrf_exempt装饰器;如果用Django自带的CSRF机制,去掉装饰器,同时在AJAX请求里带上页面中{% csrf_token %}生成的Token。
  • Session数据获取:不管是在get_context_data还是post方法里,都可以通过self.request.session.get('键名')来获取session中的数据。
  • 响应方式:如果AJAX需要动态数据就返回JSON;如果要重新渲染模板,就调用self.render_to_response(context)返回渲染后的页面。

内容的提问来源于stack exchange,提问作者Anuj TBE

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 08:30:15