python和ajax和json

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python和ajax和json相关的知识,希望对你有一定的参考价值。

python 网页做ajax效果的时候 页面到视图得到 返回值的时候 如果值是实体对象(models)的话 怎么样才能直接回传实体 我用json传的 实体对象应该可以转换json类型吧 要不表里面很多字段都要重新循环转换成字典
当然 我知道这么手写能转换过去 但是有没有直接转换的代码
把那个models 直接换成json 类型 models 里面有很多字段 而且还不是一个表 如果不能转 手写很累

ajax是属于template里面的一个异步请求而已,如果你在views里面传回来是你说的“实体对像(models)”的话,我就有点搞不明白了。。。

不知道你在那个view方法直接return的是什么?
如果使用json处理对象的话请使用:
from django.http import HttpResponse
from models import mymodels

import simplejson

...
def ajax(request):
a = mymodels.objects.all()[0]
'''
此处假设a中有name、age参数
model对象是不能直接作为json可以处理,必须先转换为dict类型
'''
result =
result['name'] = a.name
result['age'] = a.age
result = simplejson.dumps(result)
return HttpResponse(result)

此时用ajax访问这个试图返回的内容就是:
"name":"Jim Green","age":"14"

上面这种办法不是很好,建议先写一个template模板专门来显示此model内容。

假设模板ajax.html的内容为:
===================ajax.html===============
name: a.name<br />
age: a.age
=======================================

views视图如下:

from django.http import HttpResponse
from models import mymodels
from django.shortcuts import render_to_response

...
def ajax(request):
a = mymodels.objects.all()[0]
return render_to_response("ajax.html","a":a)

此时用ajax访问这个视图返回的内容就是:

name: Jim Green
age: 14

以上的代码可能会有错误,因为是随手写的,希望能够帮到你

====修改了一下====
模板文件名打错了。。。
修改了一下就到了楼上的下面了,楼上你也太没水准了。直接复制

=====修改=====

使用model.__dict__属性可以获得字典,希望能帮到你
参考技术A ajax是属于template里面的一个异步请求而已,如果你在views里面传回来是你说的“实体对像(models)”的话,我就有点搞不明白了。。。

不知道你在那个view方法直接return的是什么?
如果使用json处理对象的话请使用:
from django.http import HttpResponse
from models import mymodels

import simplejson

...
def ajax(request):
a = mymodels.objects.all()[0]
'''
此处假设a中有name、age参数
model对象是不能直接作为json可以处理,必须先转换为dict类型
'''
result =
result['name'] = a.name
result['age'] = a.age
result = simplejson.dumps(result)
return HttpResponse(result)

此时用ajax访问这个试图返回的内容就是:
"name":"Jim Green","age":"14"

上面这种办法不是很好,建议先写一个template模板专门来显示此model内容。

假设模板ajax.html的内容为:
===================ajax.html===============
name: a.name<br />
age: a.age
=======================================

views视图如下:

from django.http import HttpResponse
from models import mymodels
from django.shortcuts import render_to_response

...
def ajax(request):
a = mymodels.objects.all()[0]
return render_to_response("ajax.html","a":a)

此时用ajax访问这个视图返回的内容就是:

name: Jim Green
age: 14
模板文件名打错了。。。
修改了一下就到了楼上的下面了,楼下的你也太没水准了。直接复制
参考技术B 你用的是什么框架?Django?

json和ajax技术

什么是json
json指的是javaScript对象表示法
json是轻量级的文本数据交换格式
json 独立于语言
json具有自我描述性,,更易理解
json使用jsvaScript语法描述数据对象,但是jsjon仍然独立于语言和平台,json解析器和json库支持许多不同的编程语言
使用js的时候:转化为json : JSON.stringify()
转回字符串:JSON.parse()
使用python 的:
转化为json : json.dumps
转回字符串:josn.loads
合格的json对象:
["one", "two", "three"]
{ "one": 1, "two": 2, "three": 3 }
{"names": ["张三", "李四"] }
[ { "name": "张三"}, {"name": "李四"} ] 
json为替代XML 的格式
ajax:(Asynchronous Javascript And XML)异步的javascript和XML
是一种异步与服务器交互的一种技术
优势:
1,异步:发一个请求不用等待响应,可以继续发下一个请求
2,偷偷的发请求,用户感受不到,不用刷新
3,数据量小,只需要想要的内容,不需要整个页面
缺点:
滥用技术,造成服务器压力
参数:
$.ajax({
url:‘/calc/‘  请求的网址
type:‘post‘,   请求的方式
data:{
‘i1‘:i1,
‘i2‘:i2
},
success.function(res){  成功之后做什么
console.log(res);  res 拿到的响应
$(‘#i3‘).val(res)
}
})
 
AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
  • 同步交互:客户端发出一个请求后,需要等待服务器响应结束后,才能发出第二个请求;
  • 异步交互:客户端发出一个请求后,无需等待服务器响应结束,就可以发出第二个请求。
<body>
<h1>计算</h1>
<input type="text" id="i1">
<input type="text" id="i2">
<input type="text" id="i3">
<button type="submit" id="d1">提交</button>
<script src="https://cdn.bootcss.com/jquery/3.3.1/jquery.js"></script>
<script>
    $(‘#d1‘).click(function () {
        var i1 = $(‘#i1‘).val();  注意加上val取值
        var i2 = $(‘#i2‘).val();
        $.ajax({
            url:‘/sale/‘,
            type:‘post‘,
            data:{
                ‘i1‘:i1,
                ‘i2‘:i2,
            },
            success:function (res) {
                $(‘#i3‘).val(res)     得到值 
            }
        })
    })
</script>
 
在函数中return要使用HttpResponse对象
 
ajax设置csrf_token
1,通过获取隐藏的input标签中的csrfmiddlewaretoken值,放置在data中发送。
"csrfmiddlewaretoken": $("[name = ‘csrfmiddlewaretoken‘]").val()使用jq获取
$.ajax({
  url: "/cookie_ajax/",
  type: "POST",
  data: {
    "username": "Q1mi",
    "password": 123456,
    "csrfmiddlewaretoken": $("[name = ‘csrfmiddlewaretoken‘]").val()  // 使用jQuery取出csrfmiddlewaretoken的值,拼接到data中
  },
  success: function (data) {
    console.log(data);
  }
})
 
2,放置到请求头中:
headers: {"X-CSRFToken": $.cookie(‘csrftoken‘)},
 
$.ajax({
  url: "/cookie_ajax/",
  type: "POST",
  headers: {"X-CSRFToken": $.cookie(‘csrftoken‘)},  // 从Cookie取csrftoken,并设置到请求头中
  data: {"username": "Q1mi", "password": 123456},
  success: function (data) {
    console.log(data);
  }
})
 
3,给全局添加:
建立一个js文件:
加入:
1,自己写的GetCookie方法:
function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== ‘‘) {
        var cookies = document.cookie.split(‘;‘);
        for (var i = 0; i < cookies.length; 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));
                break;
            }
        }
    }
    return cookieValue;
}
var csrftoken = getCookie(‘csrftoken‘);
2,使用$ajaxSteup()方法为ajax请求同一的设置
function csrfSafeMethod(method) {
  // these HTTP methods do not require CSRF protection
  return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}
 
$.ajaxSetup({
  beforeSend: function (xhr, settings) {
    if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
      xhr.setRequestHeader("X-CSRFToken", csrftoken);
    }
  }
});
 
如果使用从cookie中取csrftoken的方式,需要确保cookie存在csrftoken值。
如果你的视图渲染的HTML文件中没有包含 {% csrf_token %},Django可能不会设置CSRFtoken的cookie。
这个时候需要使用ensure_csrf_cookie()装饰器强制设置Cookie。
django.views.decorators.csrf import ensure_csrf_cookie
@ensure_csrf_cookie
def login(request):
    pass







以上是关于python和ajax和json的主要内容,如果未能解决你的问题,请参考以下文章

平面 json 到嵌套 json python

漂亮的打印 JSON python

python与json的数据转换

使用 Json Python 格式化 Websocket 数据

Python 模板和 Ajax

python -- ajax数组传递和后台接收