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')

关键字传参的时候想到**打散字典的方法
posted @ 2020-08-09 00:04  straightup  阅读(110)  评论(0编辑  收藏  举报