zoukankan      html  css  js  c++  java
  • Django学习8

    事务和锁

    mysql:
    select * from t1 where id=1 for update;
    orm:
    models.T1.objects.select_or_update().filter(id=1)
    
    事务
    1.全局的 settings.py配置
    	DATABASES中的ATOMIC_REQUESTS设置为True
    2.局部的
    	视图函数
    	from django.db import transaction
    	@transaction.atomic
    	def index(request):
    		orm...sql...
    		return ...	
    	上下文逻辑里面加
    	def idnex(request):
    		...
    		with transaction.atomic():
    			orm...sql...		# 这里面的逻辑就包进一个事务里了
    		...
    		return ...
    
    

    ajax请求

    将自己写ajax请求的js代码看做客户端,将django看做服务端
    特性:
    	1.异步请求
    	2.局部刷新
    	
    	$.ajax({
            url:'/login/',  // 请求路径
            type:'post',	// 请求方式
            data:{
                username:$('#username').val(),
                password:$('#password').val(),
                csrfmiddlewaretoken:$('[#csrfmiddlewaretoken]').val(),
            },
            success:function(res){
                res  //响应内容
                //写处理逻辑
                var resStr = JSON.parse(res);
                if (){
                    location.href=...
                    }
                else if (){
                         ...
                         }
            } 
        })
    
    
    
    注意:
    外部文件导入的方式来写js代码,那么js代码中不能写django的模板语法,因为html文件的加载顺序:
    urls.py -- views.py -- html模板渲染(字符串替换) -- return给浏览器 -- 浏览器渲染 -- srcipt的src属性 -- 请求js文件 -- 此时js文件的代码才加载到文件中,但这个时候已经不能模板渲染了!
    

    上传文件

    form表单上传文件

    <!-- multipart/form-data -->
    <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">
    </form>
    

    ajax上传文件

    <script>
        $('#btn').click(function () {
        	//ajax借助FormData才能上传文件
        	var formdata = new FormData();
            formdata.append('head_pic',$('#file')[0].files[0]);
            formdata.append('username',$('#username').val());
            formdata.append('csrfmiddlewaretoken',$('[name=csrfmiddlewaretoken]').val());
            
        	$.ajax({
                url:'/upload/',
                type:'post',
                data:formdata,
                
                processData:false,  //不处理数据
                contentType:false,  //不设置内容类型
                
                success:function (res) {
                    console.log(res)
                }
            })
        })
    </script>
    
    

    后端写入

    file_obj = request.FILES.get('head_pic')    # 拿到文件对象,视为文件句柄
    file_name = file_obj.name           # 拿到文件名
    path = os.path.join(settings.BASE_DIR,'staticFile','img',file_name)		# 拼接到目的路径
    
    with open(path,'wb') as f:
        # for line in file_obj:
        #     f.write(line)
        for chunk in file_obj.chunks():  # 默认65535b,64kb
            f.write(chunk)
    
    

    JsonResponse

    import json
    from django.http import JsonResponse
    
    def index(request):
    	d1 = {'name':'bbb'}
        d2 = [11,22,33]
    	return HttpResponse(json.dumps(d1))  --- ajax: var retStr = JSON.parse(res)
    	return HttpResponse(json.dumps(d1),content-type='application/json')  --- ajax会自动解析
    	
    	return JsonResponse(d1)
    	return JsonResponse(d2,safe=False)	# 非字典类型的数据,safe=False
    
    

    JSON序列化时间日期类型的数据的方法

    import json
    from datetime import datetime
    from datetime import date
    
    #对含有日期格式数据的json数据进行转换
    # 在 json.JSONEncoder类的 default方法上拓展
    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)
    
    d = {'name':'guanxing','birth':datetime.now()}
    json_str = json.dumps(d,cls=JsonCustomEncoder)
    print(json_str)  # {"name": "guanxing", "birth": "2020-08-08 23:32:54"}
    

    零碎知识点

    ajax请求在 Network -- XHR能看到
    
    获取多对多数据的时候:
    authors = request.POST.getlist('authors')
    
    关键字传参的时候想到**打散字典的方法
    
  • 相关阅读:
    WSL 修改默认登录用户为root
    WSL ssh服务自启动
    odoo 获取model的所有字段
    C++类型父类与子类的转换--dynamic_cast(转)
    开源软件/镜像库
    C/C++编译器gcc的windows版本MinGW-w64安装教程(转)
    msys2 环境搭建
    Windows下利用Cygwin搭建C/C++开发环境GCC(转)
    模板类中子类访问父类中的成员需要通过this指针
    C++ 构造函数与this指针
  • 原文地址:https://www.cnblogs.com/straightup/p/13461158.html
Copyright © 2011-2022 走看看