一、web开发与视图类,restful
(一)视图类
视图:可以被调用的的对象,接收一个请求,返回响应。
之前写的是函数视图。
以类定义的视图,叫做类视图。
函数视图:以函数定义的视图,每个视图处理一个请求,一种类型的请求。代码可读性较差。
类视图:以类定义的视图,定义各种方法分别处理不同请求。
(二)视图类的使用
视图
路由
结果–使用postman发送请求,进行验证
post、put、delete发送请求,有csrf验证
将指定视图避免csrf验证的方法:
优化视图–返回统一格式
1.实现get请求
get:获取商品数据
传id参数时,查询指定id的数据,不传id参数时,查询所有数据
class GoodsView(View):
def __init__(self):
super().__init__()
# 构造一个返回的格式
self.result = {
'version':'v1.0',
'code':200,
'data':''
}
self.obj=Goods
def get(self,request):
# 返回商品信息
id = request.GET.get('id')
if id:
goods = self.obj.objects.filter(id=id)
else:
goods = self.obj.objects.all()
data=[]
for one in goods:
data.append({
'goods_number':one.goods_number,
'goods_name':one.goods_name,
'goods_price':one.goods_price,
'goods_count':one.goods_count,
'goods_location':one.goods_location,
'goods_safe_date':one.goods_safe_date,
'goods_pro_time':one.goods_pro_time,
})
self.result['data']=data
return JsonResponse(self.result)
发送请求
2.实现post请求
def post(self,request):
# 用来保存数据
data = request.POST
goods = self.obj()
goods.goods_number=data.get('goods_number')
goods.goods_name=data.get('goods_name')
goods.goods_price=data.get('goods_price')
goods.goods_count=data.get('goods_count')
goods.goods_location=data.get('goods_location')
goods.goods_safe_date=data.get('goods_safe_date')
goods.goods_status=data.get('goods_status')
goods.save()
self.result['data']={
'id':goods.id,
'data':'保存成功'
}
return JsonResponse(self.result)
发送请求
数据库
3.实现put请求
import json
转成json对象,序列化
json.dumps
json.dump 操作文件 文件->xxx.json 经常配合open使用
反序列化
json.loads
json.load 操作文件 xxx.json->文件 经常配合open使用
def put(self,request):
# 更新数据
# 更新指定id的商品的名字
# request.body是一个bytes类型
# json.loads需要一个string类型 bytes->string decode
data = json.loads(request.body.decode())
print(data)
id=data.get('id')
goodsname=data.get('goodsname')
goods=self.obj.objects.get(id=id)
goods.goods_name=goodsname
goods.save()
self.result['data'] = {
'id':id,
'data':'商品名称更新成功'
}
return JsonResponse(self.result)
发送请求
数据库
4.实现delete请求
def delete(self,request):
# 获取商品id,将该数据删除
data = json.loads(request.body.decode())
id = data.get('id')
self.obj.objects.filter(id=id).delete()
self.result['data']={
'id':id,
'data':'商品删除成功'
}
return JsonResponse(self.result)
发送请求
(三)DRF–Django Restful Framework
pep8:编码规范
restful:一种接口的编写风格,设计风格
讲究资源
DRF就是django提供的一种restful编写风格的接口插件
1.基本使用
安装
pip install djangorestframework
pip install django-filter
配置settings.py
django安装的插件是以app的形式存在的
REST_FRAMEWORK = {
'DEFAULT_PERMISSION_CLASSES':[
'rest_framework.permissions.DjangoModelPermissionsOrAnonReadOnly'
]
}
过滤器
from rest_framework import serializers
from LoginUser.models import *
class GoodsSerializer(serializers.HyperlinkedModelSerializer):
class Meta: # 元类
model = Goods # 遍历的对象
fields = [
'id',
'goods_number',
'goods_name',
'goods_price',
'goods_count',
'goods_location',
'goods_safe_date',
'goods_status',
'goods_pro_time',
]
class UsersSerializer(serializers.HyperlinkedModelSerializer):
class Meta: # 元类
model = LoginUser # 遍历的对象
fields = [
'email',
'password',
'username',
'phone_number',
'photo',
'age',
'gender',
'address',
]
视图
路由
使用
所有数据
指定id的数据
2.添加增删改功能
视图
postman发送请求
报错:认证缺失,“未提供身份验证凭据”。
(四)接口总结
1.种类
函数视图,类视图,DRF
2.返回数据类型方式
HttpResponse,JsonResponse,HttpResponseRidirect,render…
DRF提供了增删改查的方法
查(get)
- 获取单条数据
- 通过id
- http://127.0.0.1:8000/API/goods/1/
- 获取所有数据
- http://127.0.0.1:8000/API/goods/
增(post)
- http://127.0.0.1:8000/API/goods/
- 需要携带参数
删(delete)
http://127.0.0.1:8000/API/goods/
修改(put)
http://127.0.0.1:8000/API/goods/
3.接口的作用
- 提供数据支持
- 爬虫
- ajax动静分离
- 扩大了数据的可用范围
二、增添个人中心页
视图
@loginVaild
def personal_info(request):
user_id = request.COOKIES.get('userid')
user = LoginUser.objects.filter(id=user_id).first()
if request.method=="POST":
data = request.POST
user.phone_number=data.get('phone_number')
user.age=data.get('age')
user.gender=data.get('gender')
user.address=data.get('address')
user.photo=request.FILES.get('photo')
user.save()
return render(request,'personal.html',locals())
路由
模板
{% extends 'base.html' %}
{% block title %}
个人中心
{% endblock %}
{% block content %}
<form action="#" method="post" enctype="multipart/form-data">
{% csrf_token %}
<table class="table ">
<tr>
<td style="width: 300px;" rowspan="3">
<img style="width: 100%;" src="/static/{{ user.photo }}" alt=""><br>
<input type="file" name="photo">
</td>
<td>邮箱:</td>
<td><input type="text" value="{{ user.email }}" disabled></td>
<td>联系电话:</td>
<td><input name="phone_number" type="text" value="{{ user.phone_number }}"></td>
</tr>
<tr>
<td>年龄:</td>
<td><input name="age" type="text" value="{{ user.age }}"></td>
<td>性别:</td>
<td><input type="text" name="gender" value="{{ user.gender }}"></td>
</tr>
<tr>
<td>家庭住址:</td>
<td><input type="text" name="address" value="{{ user.address }}"></td>
<td></td>
<td></td>
</tr>
<tr>
<td colspan="5" style="text-align: center">
<input type="submit" class="btn btn-primary" value="完善用户信息">
</td>
</tr>
</table>
</form>
{% endblock %}
三、Django项目结构
一个项目中可能有多个模块,在一个项目中创建多个app进行管理,分别负责各自的功能模块,可移植性比较强,方便管理。
电商项目分两个app进行管理,一个是管理后台(卖家),一个web前端(买家)
(一)创建一个项目Qshop
创建两个app:
一个负责卖家 Saller
一个负责买家 Buyer
配置
将之前编写的电商项目的文件,复制到这个新项目的Saller子应用的对应位置