DRF架构
什么是DRF架构
DRF: (django rest framework)
restframework
restframework是django对restful架构扩展的第三方库
restful架构
主要原则
1.网络上的所有事物都被抽象成为资源
2.每个资源都有唯一的资源标识符
3.同一个资源具有多种表现形式(xml, json等)
4.对资源的各种操作不会修改资源标识符
5.所有操作均是无状态的
6.符合REST原则的架构
什么是restful
对应的中文是rest式的;Restful web service是一种常见的rest的应用,是遵守了rest风格的web服务,rest式的web服务是一种ROA(面向资源架构)
如何使用
http方法 | 资源操作 | 幂等 | 安全 |
---|---|---|---|
GET | SELECT | 是 | 是 |
POST | INSERT | 否 | 否 |
PUT | UPDATE | 是 | 否 |
DELETE | DELETE | 是 | 否 |
注释: 幂等性:对同一个接口的多次访问,得到的资源状态是相同的。
安全性:对该REST 接口访问,不会使服务端资源状态发生改变
DRF的基本配置
安装第三方包
添加应用
在项目的同名文件夹下色settings.py文件中配置下面信息
序列化和反序列化
序列化:将模型数据转化成json数据
反序列化:将接收到的json数据转化成模型
JsonResponse(data_list, safe=False, json_dumps_params={'ensure_ascii': False})
# 第一个参数是json数据,默认要是dict,
# 第二个参数设置为False可以传json
# 第三个参数是设置中文编码格式
return JsonResponse(data_list, safe=False, json_dumps_params={'ensure_ascii': False})
json.dumps和json.loads函数
1、json.dumps()和json.loads()是json格式处理函数 (json,是一种数据格式可以理解为json是字符串)
(1)json.dumps()函数是将一个Python数据类型列表进行json格式的编码.即json.dumps()函数是将字典转化为字符串)
(2)json.loads()函数是将json格式数据转换为字典.即:json.loads()函数是将字符串转化为字典
2.json.dump()和json.load()主要用来读写json文件函数
import json
newdict = {'a': 1,'b' :2}
print(type(newdict))
#字典转为字符串
data_dumps = json.dumps(newdict)
print(type(data_dumps))
#字符串转为字典
data_json = json.loads(data_dumps)
print(type(data_json))
输出:
<class 'str'>
<class 'dict'>
前端用ajax传递数据到后端
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script src="jquery-1.12.4.min.js"></script>
<script>
$(function () {
$('#btn').click(function () {
var data = {
'name':'李五',
'city':'北京'
};
alert('ok')
#字典转化为字符串
data = JSON.stringify(data)
alert('ok123')
#在控制台显示数据,调试用
#console.log(data)
$.ajax({
url:'http://127.0.0.1:8000/user/userinfo/',
type:'post',
data:data,
success:function () {
alert('提交数据成功')
},
error:function () {
alert('123')
}
})
})
})
</script>
</head>
<body>
<button id="btn">提交数据</button>
</body>
</html>
后端接受数据并解析存进数据库
# 继承于django.view:View
class UserInfos(View):
# 返回所有的get请求,这里返回用户信息
def get(self, request):
userobj_list = UserInfo.objects.all()
print(userobj_list)
data_list = []
for userobj in userobj_list:
dictnew = {
'id': userobj.id,
'username': userobj.name
}
data_list.append(dictnew)
# 第一个参数是json数据,默认要是dict,
# 第二个参数设置为False可以传json
# 第三个参数是设置中文编码格式
return JsonResponse(data_list, safe=False, json_dumps_params={'ensure_ascii': False})
# POST请求时调用这个方法
def post(self, request):
# 先打印看看是什么
print('###################3')
print(request.body)
# 获取到前段传递过来的ajax请求
data_byte = request.body
# 将传递过来的ajax的byte类型的数据转成str字符串
data_str = data_byte.decode()
# 获取用户名
print(data_str)
# 转成字典类型
# data_str = "[{'name': 'lier', 'country':'us'}]"
data_json = json.loads(data_str)
print('%%%%%%%%%%%%%%%%%%%%%%')
print(data_json)
# 因为存在外键,先创建地址数据库对象,然后赋值给用户信息的地址外键
try:
# 先判断有没有存在,没有则创建
add_obj = AddressInfo.objects.get(add=data_json.get('add'))
except:
add_obj = AddressInfo.objects.create(add=data_json.get('add'))
finally:
UserInfo.objects.create(name=data_json.get('name'), phone=data_json.get('phone'), addkey=add_obj)
# 外键也可以用xx_id设置数字来设置
# UserInfo.objects.create(name=data_json.get('name'), phone=data_json.get('phone'), addkey_id=1)
return HttpResponse('ok')
def show(self, request):
return render(request, 'postdata.html')
在urls.py文件配置跳转逻辑:
from django.conf.urls import url
from user.views import *
urlpatterns = [
url(r'^userinfo/', UserInfos.as_view(),
]