首页 > 其他分享 >Django入门到放弃之ajax

Django入门到放弃之ajax

时间:2022-08-27 23:14:43浏览次数:116  
标签:入门 request json Django ajax file path data

1.ajax简单使用

特性:
	1. 异步请求
	2. 局部刷新
	
	# 登录认证
	$.ajax({
		url:'/login/', #请求路径
 		type:'post' ,   #请求方式
		data:{
			username:$('#username').val(),
			password:$('#password').val(),
			},
			# 后端返回什么response就是什么
		success:function(response){
			  # response 响应内容
			var resStr = JOSN.parse(respone); #将响应内容序列化
			# {"aa":0,"bb":"/index/"}
			if (resStr['aa'] === 0){
				locaction.href=resStr['bb'];
				location.href='/index/';  #利用location实现页面跳转
			}
			else{
				...	
			}
		},
        # 请求失败时触发error执行,并将错误信息给error
        error:function(error){
            xxxxx
        }
	})
	
	
	view.py
        class LoginView(View):
        def get(self,request):
            return render(request,'login.html')

        def post(self,request):
            name = request.POST.get('uname')
            pwd = request.POST.get('pwd')
            if name == 'bge' and pwd == '213':
                ret = '{"code":0,"msg":"登录成功"}'
                return HttpResponse(ret)
            else:
                # return redirect(reverse('login'))
                ret = '{"code":3,"msg":"用户名或密码错误"}'
                return HttpResponse(ret)
urls.py
    path('login/', views.LoginView.as_view(),name='login'),

2.jax上传文件

固定模板

1 http请求,body体中放文件内容,ajax本质就是发送http请求,所以它可以上传文件
2 两种上传文件的方式,form表单,ajax

3 固定模板
    var formdata=new FormData() 
    formdata.append('myfile',$("#id_file")[0].files[0])
    # 还可以带数据
    $.ajax({
            url:'/uploadfile/',
            method: 'post',
            //上传文件必须写这两句话
            processData:false,  # 预处理数据,
            contentType:false,  # 不指定编码,如果不写contentType,默认用urlencoded
            data:formdata,      # formdata内部指定了编码,并且自行处理数据
            success:function (data) {  
                console.log(data)
            }
        })

form表单上传文件

upload.html
    <form action="/upload/" method="post" enctype="multipart/form-data">
        {% csrf_token %}
        头像:<input type="file" name="head-pic">
        用户名:<input type="text" name="username">
        <input type="submit" value="提交">

    </form>
    <hr>
    <hr>
    ajax文件上传: <input type="file" id="file">
    ajax用户名 <input type="text" id="uname">
    <button id="btn">提交</button>



view.py
    def upload(request):
        if request.method == 'GET':
            return render(request,'uplaod.html')
        else:
            print(request.POST)
            print(request.FILES)
            file_obj=request.FILES.get('head-pic')
            print(file_obj)
            print(file_obj.name)
            path = os.path.join(settings.BASE_DIR,'static','image')
            file_path=os.path.join(path,file_obj.name)
            with open(file_path,'wb') as f:
                # for i in file_obj:
                #     f.write(i)
                for chunk in file_obj.chunks(chunk_size=65535): #默认为65535b
                    f.write(chunk)
            return HttpResponse('ok')

ajax上传文件

<script src="/static/jquery-3.3.1/jquery-3.3.1.js"></script>
<script>
    $('#btn').click(function () {
        var formdata = new FormData();   #ajax上传文件的时候,需要这个类型,它会将添加给它的键值对加工成formdata的类型
        formdata.append('name',$('#uname').val()); #添加键值的方法是append,注意写法,键和值之间是逗号
        formdata.append('file_obj', $('#file')[0].files[0]);
        formdata.append('csrfmiddlewaretoken',$('[name=csrfmiddlewaretoken]').val());
        $.ajax({
            url: '/upload/',
            type: 'post',
            data: formdata, #将添加好数据的formdata放到data这里
            processData:false,   // 不处理数据
            contentType:false,  // 不设置内容类型

            success: function (res) {
                console.log(res)

            }
        })
    })
</script>



def upload(request):
    if request.method == 'GET':
        return render(request,'uplaod.html')
    else:
        print(request.POST) #拿到的是post请求的数据,但是文件相关数据需要用request.FILES去拿
        print(request.FILES) #<MultiValueDict: {'head-pic': [<InMemoryUploadedFile: 1.png (image/png)>]}>
        file_obj=request.FILES.get('file_obj')
        print(file_obj)
        print(file_obj.name)
        path = os.path.join(settings.BASE_DIR,'static','image')
        file_path=os.path.join(path,file_obj.name)
        with open(file_path,'wb') as f:  #可以通过循环文件句柄或通过chunks方法获取文件数据
            # for i in file_obj:
            #     f.write(i)
            for chunk in file_obj.chunks(chunk_size=65535): #默认为65535b
                f.write(chunk)
        return HttpResponse('ok')

3.ajax提交json格式

$.ajax({
            url:'/uploajson/',  //写全,是什么样就写什么样
            method:'post',
            contentType: 'application/json',
            //data要是json格式字符串
            //data:'{"name":"","password":""}',
            //把字典转成json格式字符串
            //JSON.stringify(dic)
            //把json格式字符串转成对象
            //JSON.parse(data)
            data:JSON.stringify({name:$("#id_name1").val(),password:$("#id_password1").val()}),
            success:function (data) {
                //返回字符串类型,需要转成js的对象,字典

                //1 如果:django 返回的是HttpResponse,data是json格式字符串,需要自行转成字典
                //2 如果:django 返回的是JsonResponse,data是就是字典
                //ajax这个方法做的是,如果响应数据是json格式,自动反序列化
                console.log(typeof data)
                var res=JSON.parse(data)
                console.log(typeof res)
                console.log(res.status)
                console.log(res.msg)


            }
        })
        
     ================================================================================================   
    def data(request):
        l1=[11,22,33]
        res=request.GET.get('k1')
        print(request.get_full_path())
        print(request.body)
        return JsonResponse(l1,safe=False)  #注意,非字典类型的数据都需要加safe=False

4.json序列化时间日期类型的数据的方法

import json
from datetime import datetime
from datetime import date

#对含有日期格式数据的json数据进行转换
class JsonCustomEncoder(json.JSONEncoder):
    def default(self, field):
        if isinstance(field,datetime):
            return field.strftime('%Y-%m-%d %H:%M:%S')
        elif isinstance(field,date):
            return field.strftime('%Y-%m-%d')
        else:
            return json.JSONEncoder.default(self,field)


d1 = datetime.now()

dd = json.dumps(d1,cls=JsonCustomEncoder)
print(dd)

5.django内置序列化器

# 把对象转成json格式,json.dumps实现不了,
# django内置了一个东西,可以把对象转成json格式
from django.core import serializers
book_list = Book.objects.all()    
ret = serializers.serialize("json", book_list)  # ret就是json格式字符串

  

标签:入门,request,json,Django,ajax,file,path,data
From: https://www.cnblogs.com/panwenbin-logs/p/16631742.html

相关文章

  • Django入门到放弃之分页器
    1.属性和方法#######1Paginator对象的属性和方法book_list=models.Book.objects.all()#注意all操作实际是分批次获取数据,当前版本为limit21#实例化得到对......
  • Django入门到放弃之ORM单表操作
    1.常用和非常用字段和参数概览#常用字段 -IntegerField整数-AutoField-BooleanField-CharField-DateField-DateTimeField-DecimalFi......
  • Django入门到放弃之模板及标签
    1.django模板使用的两种方式#方式一 returnrender(request,'time.html',context={'current_date':str(now),'title':'lqzNB'})#方式二(页面静态化,提高网站并发量)......
  • Django入门到放弃之常见配置及基本命令
    1.基本命令1.新建一个djangoproject django-admin.pystartprojectproject_name 特别是在windows上,如果报错,尝试用django-admin代替django-admin.py试试 2......
  • Django框架  快速查询目录
    Django框架 快速查询目录 django中前后端传输数据的编码格式(contentType)django中的中间件django中的cookie和sessiondjango中的csrf跨站请求伪造django中视图函数......
  • U8 V13.0小白入门开发记录十八-------------------初识UAP开发
    需要先认证二开的许可是否有二开的许可1.打开UAP应用  2.查看许可,如果没有需要联系官方客服获取相应的开发许可方式。 ......
  • U8 V13.0小白入门开发记录七-------------------插件开发(C#)调试
    这里继续延用上一章所写的内容举例。在上一章创建完工程并写完方法后,如何调试我们的业务逻辑呢? 1.首先登录我们的U8V13客户端 2.在VS打开的工程中,点击【调试】->【......
  • U8 V13.0小白入门开发记录五-------------------自定义按钮开发(VB)调试
    这里继续延用上一章所写的内容举例。在上一章(U8V13.0小白入门开发记录四)创建完工程并写完方法后,如何调试我们的业务逻辑呢?1.首先登录我们的U8V13客户端     ......
  • 小记 【django git python】
    迁移此处生成的迁移文件包含了所有的表结构(已创建和未创建的表)pythonmanage.pymakemigrationsapp_namepythonmanage.pymigrate--fake-initial--fake-initial的......
  • Docker入门
    Dockerfile文件详解Docker的常用命令Centos7基于容器安装运行Docker私有仓库及添加认证Centos7本地安装运行Dockerregistry私有仓库及添加认证Centos下安装Docker集群管理......