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
相关产品推荐
相关产品推荐

