事务和锁
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文件的代码才加载到文件中,但这个时候已经不能模板渲染了!
上传文件
<!-- 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')
关键字传参的时候想到**打散字典的方法