如何在Djangodjango 使用ajaxx的POST

如何在Django使用ajax的POST?
&div class=&highlight&&&pre&&code class=&language-text&&前端完整js:&script&
$('html').ajaxSend(function(event, xhr, settings) {
function getCookie(name) {
var cookieValue =
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i & cookies. i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
return cookieV
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader(&X-CSRFToken&, getCookie('csrftoken'));
$(document).ready(function(){
$(&.each-ch-del&).click(function(){
var eno_id = $(this).attr(&id&);
var eno_div = &#each-ch-&+eno_
var pno = &0&+{{pno}};
type:'POST',
url:&/exercise_system/teacher/paper/delete/&,
data:'id=30',
dataType:'json',
success:function(data)
alert(data);
complete:function(data){
alert('c');
error:function(data)
alert('error');
url:url(r'^exercise_system/teacher/paper/delete/','exercise.teacher.deletePaper')
&/code&&/pre&&/div&&div class=&highlight&&&pre&&code class=&language-text&&def deletePaper(req):
if req.is_ajax():
return HttpResponse('ajax_handle')
return HttpResponse('ajax_')
GET能够通过,但是POST不能通过,为什么?哪里有问题了?该怎么修改?
&/code&&/pre&&/div&
前端完整js:&script&
$('html').ajaxSend(function(event, xhr, settings) {
function getCookie(name) {
var cookieValue =
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i & cookies. i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
return cookieV
if (!(/^http:.*/.test(settings.url) || /^https:.*/.test(settings.url))) {
// Only send the token to relative URLs i.e. locally.
xhr.setRequestHeader("X-CSRFToken", getCookie('csrftoken'));
$(document).ready(function(){
$(".each-ch-del").click(function(){
var eno_id = $(this).attr("id");
var eno_div = "#each-ch-"+eno_
var pno = "0"+{{pno}};
type:'POST',
url:"/exercise_system/teacher/paper/delete/",
data:'id=30',
dataType:'json',
success:function(data)
alert(data);
complete:function(data){
alert('c');
error:function(data)
alert('error');
url:url(r'^exercise_system/teacher/paper/delete/','exercise.teacher.deletePaper')
按投票排序
加@csrf_exempt了吗
已解决,不是楼上的原因,同样的代码,过了几天,就post成功了
看下django 文档关于csrf的实例吧有ajax的,需要在cookie中把csrftoken添加到post数据中,当然也可以关闭csrf
已有帐号?
无法登录?
社交帐号登录jQuery 教程
jQuery AJAX 方法
jQuery AJAX 方法
AJAX 是一种与服务器交换数据的技术,可以在补充在整个页面的情况下更新网页的一部分。
下面的表格列出了所有的 jQuery AJAX 方法:
执行异步 AJAX 请求
$.ajaxPrefilter()
在每个请求发送之前且被 $.ajax() 处理之前,处理自定义 Ajax 选项或修改已存在选项
为将来的 AJAX 请求设置默认值
$.ajaxTransport()
创建处理 Ajax 数据实际传送的对象
使用 AJAX 的 HTTP GET 请求从服务器加载数据
使用 HTTP GET 请求从服务器加载 JSON 编码的数据
使用 AJAX 的 HTTP GET 请求从服务器加载并执行 JavaScript
创建数组或对象的序列化表示形式(可用于 AJAX 请求的 URL 查询字符串)
使用 AJAX 的 HTTP POST 请求从服务器加载数据
规定 AJAX 请求完成时运行的函数
规定 AJAX 请求失败时运行的函数
规定 AJAX 请求发送之前运行的函数
规定第一个 AJAX 请求开始时运行的函数
规定所有的 AJAX 请求完成时运行的函数
规定 AJAX 请求成功完成时运行的函数
从服务器加载数据,并把返回的数据放置到指定的元素中
编码表单元素集为字符串以便提交
编码表单元素集为 names 和 values 的数组如果您认为本站教程很有帮助,可以以鼓励翻译或写出更多高质量教程。
Django Ajax
有时候我们需要在不刷新的情况下载入一些内容,在网页的基本知识中我们介绍了 ajax 技术。在本文中讲解如何用 Django 来实现 不刷新网页的情况下加载一些内容。由于用 jQuery 实现 ajax 比较简单,所以我们用 jQuery库来实现,想用原生的 javascript 的同学可以参考:,下面也有例子提供下载。本节有多个实例提供下载,通过看代码可以更快的学习。第一节,源代码下载:这里用
第一节 中的一个例子,我们要实现的是在不刷新的情况下显示计算结果到页面上。修改 index.html 文件&!DOCTYPE&html&
&p&请输入两个数字&/p&
&form&action=&/add/&&method=&get&&
&&&&a:&&input&type=&text&&id=&a&&name=&a&&&&br&
&&&&b:&&input&type=&text&&id=&b&&name=&b&&&&br&
&&&&&p&result:&&span&id='result'&&/span&&/p&
&&&&&button&type=&button&&id='sum'&提交&/button&
&script&src=&/libs/jquery/1.11.1/jquery.min.js&&&/script&
&&&&$(document).ready(function(){
&&&&&&$(&#sum&).click(function(){
&&&&&&&&var&a&=&$(&#a&).val();
&&&&&&&&var&b&=&$(&#b&).val();
&&&&&&&&$.get(&/add/&,{'a':a,'b':b},&function(ret){
&&&&&&&&&&&&$('#result').html(ret)
&&&&&&&&})
&/html&在原来的基础上,在一些元素上加了 id, 以便于获取值和绑定数据,然后我们用了jQuery.get() 方法,并用 $(selector).html() 方法将结果显示在页面上,如下图:备注:关于请求头和 request.is_ajax() 方法使用views.py 中可以用 &request.is_ajax()&方法判断是否是 ajax 请求,需要添加一个 HTTP 请求头:原生javascript:xmlhttp.setRequestHeader(&X-Requested-With&,&&XMLHttpRequest&);用 jQuery:用&$.ajax&方法代替&$.get,因为&$.get&在&IE&中不会发送&ajax&header服务器端会将请求头的值全部大写,中划线改成下划线,并在非标准的头前面加上 HTTP_,这个过程可以认为相当于以下Python代码:STANDARD_HEADERS&=&['REFER',&'HOST',&...]&#&just&for&example
def&handle_header(value):
&&&&value&=&value.replace('-',&'_').upper()
&&&&if&value&in&STANDARD_HEADERS:
&&&&&&&&return&value
&&&&return&'HTTP_'&+&value判断ajax方法,以及原生的 javascript实现ajax的示例下载:第二节,源代码下载:更复杂的例子,传递一个数组或字典到网页,由JS处理,再显示出来。views.pyfrom&django.http&import&HttpResponse
import&json
def&ajax_list(request):
&&&&a&=&range(100)
&&&&return&HttpResponse(json.dumps(a),&content_type='application/json')
def&ajax_dict(request):
&&&&name_dict&=&{'twz':&'Love&python&and&Django',&'zqxt':&'I&am&teaching&Django'}
&&&&return&HttpResponse(json.dumps(name_dict),&content_type='application/json')Django 1.7 及以后的版本有更简单的方法(使用 (官方文档)):from&django.http&import&JsonResponse
def&ajax_list(request):
&&&&a&=&range(100)
&&&&return&JsonResponse(a,&safe=False)
def&ajax_dict(request):
&&&&name_dict&=&{'twz':&'Love&python&and&Django',&'zqxt':&'I&am&teaching&Django'}
&&&&return&JsonResponse(name_dict)在 django 1.6 及以前的旧版本中可以自己写一个 JsonResponse 方法,如下:from&django.http&import&HttpResponse
import&json
class&JsonResponse(HttpResponse):
&&&&def&__init__(self,
&&&&&&&&&&&&content={},
&&&&&&&&&&&&mimetype=None,
&&&&&&&&&&&&status=None,
&&&&&&&&&&&&content_type='application/json'):
&&&&&&&&super(JsonResponse,&self).__init__(
&&&&&&&&&&&&json.dumps(content),
&&&&&&&&&&&&mimetype=mimetype,
&&&&&&&&&&&&status=status,
&&&&&&&&&&&&content_type=content_type)写好后,我们在 urls.py 中添加以下两行:&&&&url(r'^ajax_list/$',&'tools.views.ajax_list',&name='ajax-list'),
&&&&url(r'^ajax_dict/$',&'tools.views.ajax_dict',&name='ajax-dict'),打开开发服务器 python manage.py runserver我们访问对应的网址会看到输出值:下一步就是在无刷新的情况下把内容加载到网页了,我们修改一下首页的模板 index.html&!DOCTYPE&html&
&p&请输入两个数字&/p&
&form&action=&/add/&&method=&get&&
&&&&a:&&input&type=&text&&id=&a&&name=&a&&&&br&
&&&&b:&&input&type=&text&&id=&b&&name=&b&&&&br&
&&&&&p&result:&&span&id='result'&&/span&&/p&
&&&&&button&type=&button&&id='sum'&提交&/button&
&div&id=&dict&&Ajax&加载字典&/div&
&p&id=&dict_result&&&/p&
&div&id=&list&&Ajax&加载列表&/div&
&p&id=&list_result&&&/p&
&script&src=&/libs/jquery/1.11.1/jquery.min.js&&&/script&
&&&&$(document).ready(function(){
&&&&&&//&求和&a&+&b
&&&&&&$(&#sum&).click(function(){
&&&&&&&&var&a&=&$(&#a&).val();
&&&&&&&&var&b&=&$(&#b&).val();
&&&&&&&&$.get(&/add/&,{'a':a,'b':b},&function(ret){
&&&&&&&&&&&&$('#result').html(ret);
&&&&&&&&})
&&&&&&//&列表&list
&&&&&&$('#list').click(function(){
&&&&&&&&&&$.getJSON('/ajax_list/',function(ret){
&&&&&&&&&&&&//返回值&ret&在这里是一个列表
&&&&&&&&&&&&for&(var&i&=&ret.length&-&1;&i&&=&0;&i--)&{
&&&&&&&&&&&&&&//&把&ret&的每一项显示在网页上
&&&&&&&&&&&&&&$('#list_result').append('&'&+&ret[i])
&&&&&&&&&&&&};
&&&&&&&&&&})
&&&&&&//&字典&dict
&&&&&&$('#dict').click(function(){
&&&&&&&&&&$.getJSON('/ajax_dict/',function(ret){
&&&&&&&&&&&&&&//返回值&ret&在这里是一个字典
&&&&&&&&&&&&&&$('#dict_result').append(ret.twz&+&'&br&');
&&&&&&&&&&&&&&//&也可以用&ret['twz']
&&&&&&&&&&})
&/html&技能提升:getJSON中的写的对应网址,用 urls.py 中的 name 来获取是一个更好的方法!标签:{% url 'name' %}&script&
&&&&$(document).ready(function(){
&&&&&&//&求和&a&+&b
&&&&&&$(&#sum&).click(function(){
&&&&&&&&var&a&=&$(&#a&).val();
&&&&&&&&var&b&=&$(&#b&).val();
&&&&&&&&$.get(&{%&url&'add'&%}&,{'a':a,'b':b},&function(ret){
&&&&&&&&&&&&$('#result').html(ret);
&&&&&&&&})
&&&&&&//&列表&list
&&&&&&$('#list').click(function(){
&&&&&&&&&&$.getJSON(&{%&url&'ajax-list'&%}&,function(ret){
&&&&&&&&&&&&//返回值&ret&在这里是一个列表
&&&&&&&&&&&&for&(var&i&=&ret.length&-&1;&i&&=&0;&i--)&{
&&&&&&&&&&&&&&//&把&ret&的每一项显示在网页上
&&&&&&&&&&&&&&$('#list_result').append('&'&+&ret[i])
&&&&&&&&&&&&};
&&&&&&&&&&})
&&&&&&//&字典&dict
&&&&&&$('#dict').click(function(){
&&&&&&&&&&$.getJSON(&{%&url&'ajax-dict'&%}&,function(ret){
&&&&&&&&&&&&&&//返回值&ret&在这里是一个字典
&&&&&&&&&&&&&&$('#dict_result').append(ret.twz&+&'&br&');
&&&&&&&&&&&&&&//&也可以用&ret['twz']
&&&&&&&&&&})
&/script&这样做最大的好处就是在修改 urls.py 中的网址后,不用改模板中对应的网址。补充:如果是一个复杂的 列表 或 字典,因为比如如下信息:person_info_dict&=&[
&&&&{&name&:&xiaoming&,&&age&:20},
&&&&{&name&:&tuweizhong&,&&age&:24},
&&&&{&name&:&xiaoli&,&&age&:33},
]这样我们遍历列表的时候,每次遍历得到一个字典,再用字典的方法去处理,当然有更简单的遍历方法:用 $.each() 方法代替 for 循环,html 代码(jQuery)$.getJSON('ajax-url-to-json',&function(ret)&{
&&&&$.each(ret,&function(i,item){
&&&&&&&&//&i&为索引,item为遍历值
});最后,附上一个返回图片并显示的ajax实例:代码下载:
您的邮件地址:
错误详细描述:
自强学堂为提供的内容仅用于学习,测试和培训。实例可能为了更容易理解而简化。我们一直对教程,参考手册,在线实例保持修订,但是我们不能保证所有内容全部正确。通过使用本站进行学习随之而来的风险与本站无关。当使用本站时,代表您已接受了本站的使用条款和隐私条款。自强学堂是以学习和分享知识为目的,对任何法律问题及风险不承担任何责任。版权所有,保留一切权利。
自强学堂是用
技术开发的站点,托管在平台
Copyright &
Powered by 自强学堂 All Rights Reserved.
JavaScript
Server Side
JavaScript
服务器相关
浏览器脚本
服务器脚本第三方登录:post方式不同于get方式可以被django直接得到,因为django为post加入了csrf保护, &详细的文档地址/en/dev/ref/csrf/
注释:在最新版本中,在setting.py里'django.middleware.csrf.CsrfViewMiddleware',默认是使用中的,如果没有请自行添加,并且确保此引用在其他所有viewware前面
MIDDLEWARE_CLASSES = (
'django.contrib.sessions.middleware.SessionMiddleware',
'monMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',//this line is vsrf&
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django_cas.middleware.CASMiddleware',
'django.contrib.auth.middleware.SessionAuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',)
如果想避过csrf检测这一层直接使用post的话,有几种方法:
1 需要在views.py里要出发post请求的函数前加入@csrf_exempt ,之前要引入from django.views.decorators.csrf import csrf_exempt
2 在&settings.py 中 MIDDLEWARE_CLASSES 中 注释掉'django.middleware.csrf.CsrfViewMiddleware'
说下正确使用csrf的方法 :
对于ajax.post方法,需要在ajax方法触发前加入一段js,这段我理解是用来生成不同的token,但是很好奇如果禁掉了cookie会怎样我没研究.
function getCookie(name) {
var cookieValue =
if (document.cookie && document.cookie != '') {
var cookies = document.cookie.split(';');
for (var i = 0; i & cookies. i++) {
var cookie = jQuery.trim(cookies[i]);
// Does this cookie string begin with the name we want?
if (cookie.substring(0, name.length + 1) == (name + '=')) {
cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
return cookieV}
function csrfSafeMethod(method) {
// these HTTP methods do not require CSRF protection
return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));}
ajax方法 :
url: "ticket/operation/?action=get_vmlist",
data: { 'env': env, 'subenv': subenv },
type: "post",
dataType: 'json',
beforeSend: function (xhr, settings) {
//此处调用刚刚加入的js方法
var csrftoken = getCookie('csrftoken');&
if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
xhr.setRequestHeader("X-CSRFToken", csrftoken);&
success: function (data) {&
complete: function () {&
error: function (er) {&
def ticket_handler(request): &
if request.method == 'POST':   if request.GET['action'] == 'get_vmlist':
    try:
      d = {}  
      env = request.POST['env']&
      print env //这里就可以看到env的值被正确传递给后台了
      d['Result'] = 'Fail'
      s = json.dumps(d)
      return HttpResponse(s)
可以显示对单个view函数进行csrf保护,from django.views.decorators.csrf import csrf_protect
@csrf_protect
def my_view(request):
return render(request, "a_template.html", c)
阅读(...) 评论()

我要回帖

更多关于 django request.post 的文章

 

随机推荐