content_type --> 做数据接口,解析器的时候 会用到
content_type
1. 是前后端,跟其他项目交互的一种消息格式
2. 响应头里的格式 content_type:text/html;charset=utf-8(默认的)
3. 请求头里的格式 Content-Type: application/x-www-form-urlencoded; charset=UTF-8
django 认识 form-data数据 和 urlencoded 数据格式
django内置一种解析器原理 (urlencoded格式数据)
django解析器 会拿到请求头里的content_type 做判断
if content_type = \'application/x-www-form-urlencoded; charset=UTF-8\'
会从view sourse拿数据,数据如下
name=root&pwd=zdd.961225&csrfmiddlewaretoken=YNhJKBb1z3heoUrxmOybCLqswYtJYWXtkNLVTch6b074apxifs8JFV8plKTMqiF6
&符号分割处理,把数据以键值对存到request.POST里
<QueryDict: {\'name\': [\'root\'], \'csrfmiddlewaretoken\': [\'YNhJKBb1z3heoUrxmOybCLqswYtJYWXtkNLVTch6b074apxifs8JFV8plKTMqiF6\'], \'pwd\': [\'123\']}>
content_type 上传文件
前端代码:
<form action="{% url \'upload\' %}" method="post" enctype="multipart/form-data">
{% csrf_token %}
<input type="file" name="head_portrait">
<input type="submit">
</form>
后端代码:
def upload(request):
if request.method == \'GET\':
return render(request,\'upload.html\')
else:
#request.POST拿到的是文件请求数据,request.FILES拿到的是文件数据
# print(request.FILES)
file_obj = request.FILES.get(\'head_portrait\')
print(file_obj)
file_name = file_obj.name
print(file_name)
import os
file_path = os.path.join(settings.BASE_DIR,\'statics\',\'img\',file_name)
with open(file_path,\'wb\')as f:
for line in file_obj:
f.write(line)
return HttpResponse(\'OK\')
ajax上传文件
<script>
$(\'#btn\').click(function () {
var formdData = new FormData();
var file = $(\'#file\')[0].files[0];
formdData.append(\'head_portrait\',file);
formdData.append(\'csrfmiddlewaretoken\',\'{{ csrf_token }}\');
$.ajax({
url:{% url \'upload\' %},
type:\'post\',
data:formdData,
processData:false,
contentType:false,
success:function (res) {
console.log(res)
}
})
})
</script>
后端跟上边一样
读文件的另一种方法
for i in file_obj.chunks(chunk_size=none):#chunks() 默认一次返回的大小为65536B,也就是64kb,最大2.5M,就是一个生成器,chunk_size 指定文件大小
f.write(i)