文章目录
django基础02
1、使用虚拟环境建django项目
-
1、workon 虚拟环境命令
-
2、创建django项目 django-admin starproject 项目名
-
3、创建app python manage.py startapp 应用名
-
4、更改配置
-
注册app
-
更改大路由包含所有的小app里的路由
-
app里写url和对应的views
-
libs 存放第三方包
-
media 静态文件
-
utils 存放自己的方法 可以公用的
① 、为了方便管理app,我们添加专门的apps文件夹来存放所有的app。结构如下
1.1设置完apps文件夹以后我们需要对配置文件做相应的更改
1.1.1、在seetings.py里添加django文件的导包路径
#settings.py
import sys
sys.path.insert(0, os.path.join(BASE_DIR,'apps'))
1.1.2、django的导包路径添加完毕,这时候可以像原来一样引用文件了。但是这时候你的pycharm编辑器还是不能正确的显示导包总是给你报红。
1.1.3、这时候你需要把apps这个文件夹设为源码根即可解决这个问题
②、添加libs存放第三
③、添加utils文件夹存放封装的公用
④、添加media存放图片
⑤、创建static手机模板的静态文件
2、添加sys.path的作用?
import sys
sys.path.insert(0, os.path.join(BASE_DIR, ‘apps’))
增加导包路径
3、base_dir的作用?
manage.py文件的路径
4、RESTFUL风格API
1.1 什么是RESTful
-
REST与技术无关,代表的是一种软件架构风格(REST是Representational State Transfer的简称,中 文翻译为“表征状态转移”)
-
REST从资源的角度类审视整个网络,它将分布在网络中某个节点的资源通过URL进行标识
-
所有的数据,不过是通过网络获取的还是操作(增删改查)的数据,都是资源,将一切数据视为资 源是REST区别与其他架构风格的最本质属性
-
对于REST这种面向资源的架构风格,有人提出一种全新的结构理念,即:面向资源架构(ROA: Resource Oriented Architecture)
1.2web开发本质
- 对数据库中的表进行增删改查操作
- Restful风格就是把所有数据都当做资源,对表的操作就是对资源操作
- 在url同通过 资源名称来指定资源
- 通过 get/post/put/delete/patch 对资源的操作
5、RESTFUL API设计规范
-
1.API与用户的通信协议,总是使用HTTPs协议。
-
2.域名
1)子域名方式
https://api.example.com 尽量将API部署在专用域名(会存在跨 域问题)
https://www.example.com2)url方式
https://example.org
https://example.org/api/ API很简单
- 3.版本
URL,如:https://api.example.com/v1/
请求头 跨域时,引发发送多次请求
- 4.面向资源编程 : 路径,视网络上任何东西都是资源,均使用名词表示(可复数)
https://api.example.com/v1/zoos
https://api.example.com/v1/animals
https://api.example.com/v1/employees
- 5.method
GET(查询数据) # 从服务器取出资源(一项或多项)
POST(创建数据) # 在服务器新建一个资源
PUT(修改数据) # 在服务器更新资源(客户端提供改变后的完整资源)
PATCH(修改属性) # 在服务器更新资源(客户端提供改变的属性)
DELETE(删除数据) # 从服务器删除资源
- 6.过滤,分页,排序 :通过在url上传参的形式传递搜索条件
https://api.example.com/v1/zoos?limit=10:指定返回记录的数量
https://api.example.com/v1/zoos?offset=10:指定返回记录的开始位置
https://api.example.com/v1/zoos?page=2&per_page=100:指定第几页,以及每页的记录数
https://api.example.com/v1/zoos?sortby=name&order=asc:指定返回结果按照哪个属性排序, 以及排序顺序
https://api.example.com/v1/zoos?animal_type_id=1:指定筛选条件
- 状态码
'''1. 2XX请求成功'''
# 200 请求成功,一般用于GET与POST请求
# 201 Created - [POST/PUT/PATCH]:用户新建或修改数据成功。
# 202 Accepted - [*]:表示一个请求已经进入后台排队(异步任务)
# 204 NO CONTENT - [DELETE]:用户删除数据成功。
'''2. 3XX重定向'''
# 301 NO CONTENT - 永久重定向
# 302 NO CONTENT - 临时重定向
'''3. 4XX客户端错误'''
# 400 INVALID REQUEST - [POST/PUT/PATCH]:用户发出的请求有错误。
# 401 Unauthorized - [*]:表示用户没有权限(令牌、用户名、密码错误)。
# 403 Forbidden - [*] 表示用户得到授权(与401错误相对),但是访问是被禁止的。
# 404 NOT FOUND - [*]:用户发出的请求针对的是不存在的记录。
# 406 Not Acceptable - [GET]:用户请求的格式不可得(比如用户请求JSON格式,但是只有XML格 式)。
# 410 Gone -[GET]:用户请求的资源被永久删除,且不会再得到的。
# 422 Unprocesable entity - [POST/PUT/PATCH] 当创建一个对象时,发生一个验证错误。
'''4. 5XX服务端错误'''
# 500 INTERNAL SERVER ERROR - [*]:服务器内部错误,无法完成请求
# 501 Not Implemented 服务器不支持请求的功能,无法完成请求
更多状态码参考:https://www.runoob.com/http/http-status-codes.html
6、django和Drf的不同点
django中封装了drf
view 是 父类
class test1(View):
def post(self,request):
data=request.POST.get('name')
return HttpResponse(data)
def get(self,request):
data = request.GET.get('name')
return HttpResponse(data)
apiview是view的子类
class test2(APIView):
def get(self,request):
data=request.query_params
return Response(data)
def post(self,request):
data=request.data
return Response(data)
7、django不使用序列化器来进行查询结果序列化
# from django.http import JsonResponse
# from django.views import View
# from .models import *
# class App03(View):
# def get(self,request):
# user=User.objects.all()
# list=[]
# for i in user:
# data={
# 'name':i.username,
# 'age':i.age,
# 'home':i.home
# }
# list.append(data)
# print(list)
# return JsonResponse({'data':list})
8、DRF使用Serializer来进行序列化和反序列化操作
1、定义一个序列化器
# 这里的字段需要和模型类中的字段名、字段类型、约束一致
class UserSer(serializers.Serializer):
username=serializers.CharField(max_length=20)
age=serializers.IntegerField(allow_null=True)
home=serializers.CharField(max_length=30)
想要添加数据 就需要在序列化器类中定义一个create()方法
def create(self, validated_data):
'''
序列化器进行新增数据的方法
:param validated_data: 通过验证的字典数据
:return:根据RESTful设计方式,需要将添加的数据返回
'''
return User.objects.create(**validated_data)
想要修改数据时,需要在序列化器类中定义一个update()方法。
def update(self,instance,validated_data):
'''
序列化器进行修改数据的方法
:param instance: 需要修改的模型对象
:param validated_data: 前端传递的字典数据
:return: 根据RESTful设计方式,需要将修改的数据返回
'''
# instance 你的数据库里的模型
# validated_data 传进来要修改的数据
instance.username=validated_data.get('username',instance.username)
instance.age=validated_data.get('age',instance.age)
instance.home=validated_data.get('home',instance.home)
instance.save()
return instance
单一字段验证 对单一字段进行验证我们需要在序列化器类中定义一个名字为(validate_字段名)的方法,来补充验证逻辑。
# def validated_username(self,attrs):
# if attrs !='gy':
# raise serializers.ValidationError('不是gy本人')
# return attrs
多字段验证 对所有字段进行扩展验证我们需要在序列化器中定义一个名字为(validate())的方法,来补充对所有字段进行扩展验证的逻辑。
def validate(self, attrs):
'''
对多个字段进行验证
:param attrs: 前段传递的字典数据
:return: 验证成功:返回attrs;验证失败:返回错误信息
'''
username = attrs['username']
age=attrs['age']
home=attrs['home']
print(username)
if username != 'gy' or age!=18 or home!='河南':
# 失败
raise serializers.ValidationError('不是gy本人')
# 成功
return attrs
class UserV(APIView):
def get(self,request):
users=User.objects.all()
ser=UserSer(users,many=True) #many=True 序列化多条数据
data=ser.data
return Response(data)
def post(self,request):
data=request.data
ser=UserSer(data=data)
ser.is_valid()
# 打印的是sers.py里的 raise serializers.ValidationError('不是gy本人')
print(ser.errors)
ser.save()
return Response({'code':200})
def put(self,request):
data=request.data
id=request.data.get('id')
print(data)
print(id)
user=User.objects.get(id=1)
print(user)
ser=UserSer(user,data=data)
ser.is_valid()
ser.save()
return Response({'code':200})