ORM之视图层
小白必会三板斧
## 视图函数必须返回一个HttpResponse对象
from django.shortcuts import HttpResponse,render,redirect
分析:为什么说视图函数必须返回一个HttpResponse对象
HttpResponse # 返回普通字符串(不能返回文件)
class HttpResponse: # 查看源码,HttpResponse是一个类,加括号调用实例化出一个对象
pass
render # 查看源码(调用render函数,返回HttpResponse(...))
def render(...):
return HttpResponse(...)
redirect
def redirect(...)
# redirect_class是HttpResponse子类
return redirect_class(...)
JsonResponse(前后端数据交互)
将数据在后端转成json格式再提交到前端
# 不同编程语言之间如何交互???
json格式数据
'jaso格式的标志双引号'
"""
前后端不分离
django写项目(前端直接使用模板层及模板语法)
前后端分离
django写项目(前端使用其他框架和语言)
python中如何序列化反序列化
dumps()
loads()
js中如何序列化反序列化
JSON.stringfy()
JSON.parse()
"""
在python中我们可以使用json模块将数据转成json格式(json格式支持其他语言)
import json
d = {'username': 'jason老师', 'pwd': 123, 'hobby': [111, 222, 333]}
json_str = json.dumps(d)
print(json_str) # 序列化默认会对中文字符做转码
{"username": "jason\u8001\u5e08", "pwd": 123, "hobby": [111, 222, 333]}
我们可以查看dumps源码文件,将ensure_ascii参数改为False(默认为True),就不会对中文字符进行处理
json_str = json.dumps(d,ensure_ascii=False) # 这样就可以正常显示了
{"username": "jason老师", "pwd": 123, "hobby": [111, 222, 333]}
--------------------------------------------------------------------
# 在django项目中,django给我们提供了更加简便的方法,不需要我们自己序列化
from django.http import JsonResponse
d = {'username': 'jason老师', 'pwd': 123, 'hobby': [111, 222, 333]}
l = [111,2232,454,555,666]
def index(request):
return JsonResponse(d) # 序列化默认会对中文字符做转码(这里也会出现转码问题)
# 查看源码
return JsonResponse(d, json_dumps_params={'ensure_ascii': False})
# 列表序列化,直接传会报错,需要修改一个默认参数safe=False
return JsonResponse(l,safe=False)
form表单提交文件
# 前提条件
<form action="" method="post" enctype="multipart/form-data" >
</form>
'''
action=""方法,
1.不填会将post请求直接转到当前界面
2.可以填后缀,会自动拼接ip和端口
3.全填
method="post" 请求方式
'''
1.method必须是post
2.enctype参数必须是multipart/form-data
request.POST无法获取到文件类型的数据(只能获取普通键值对数据)
request.FILES获取文件类型的数据
前端获取文件数据
<input type="file" name="file"> 只能获取一个(上传)
<input type="file" name="file" multiple> 可以一次性获取多个
后端获取文件数据
request.FILES.get() # 默认获取最后一个数据
request.FILES.getlist() #获取全部数据
-----------------------------------------------------------------------------------------
简单逻辑代码
# 后端
def get_file(request):
if request.method == "POST":
data = request.FILES.get("file")
with open(data.name, 'wb') as f:
for line in data :
f.write(line)
return render(request,'get_file.html')
# 前端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<div class="container">
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<p>
<input type="submit">
</p>
</form>