回顾
# 1 restful规范--10条
# 2 django上写符合restful规范的接口
# 3 drf写接口
# 4 APIView--->继承了原生view--->get, post方法
-(为什么get请求来了就会执行get方法, 原生view)
-路由配置:视图类.as_view()--->view(闭包函数)的内存地址
-请求来了,就会执行view(request, 分组分出的字段,默认传的字段)---self.dispatch()
-APIView重写了dispatch: 包装了request对象, 解析器, 分页, 三大认证, 响应器, 全局异常, 去掉了csrf
# Request对象: request._request, request.data, 重写了__getattr__, request.method--去原生的request中拿
-前端传过来的数据从哪儿取?
-地址栏里: reqeust.GET/query_params
-请求体中的数据: request.data/POST/(json格式解释不了)--->request.body中去取
-请求头中数据: request.META.get('HTTP_变成大写 ')
# Response对象---》封装了原生的HttpResponse, Response: (data, headers=[], status=1/2/3/4/5开头的)
# 自己封装了Response对象
# 序列化类:
-Serializer
-写字段, 字段名要跟表的字段对应,想不对应(source可以修改)
-SerializerMethodField必须配套一个get_字段名,返回什么,前台就看到什么
-ModelSerializer
-class Meta:
表对应
取出的字段(__all__, 列表)
排除的字段(用的很少)
extra_kwargs会给字段属性
-重写某个字段
password = serializers.SerializerMethodField()
def get_password(self, instance):
return '***'
-校验: 字段自己的校验,局部钩子,全局钩子
-只要序列化类的对象执行了is_valiad(), 这些钩子都会走,在钩子里写逻辑
-在表模型(model)中写方法, 可以在上面取出的字段当中直接写,不参与反序列化
-序列化多条(many=True) 本质,ListSerializer内部套了一个个的serializer对象
-重写ListSerilizer, 让序列化对象和自己写的ListSerializer对应上
-序列化类(instance, data, many, context={request, request})
-视图函数中给序列化传递数据,使用context,传回来, 放进去
# 视图
-两个视图基类APIView, GenericAPIView(继承APIView):涉及到数据库和序列化类的操作尽量用GenericAPIView
-五个试图扩展类
CreateModelMixin: create
DestroyModelMixin: destory
ListModelMixin
RetrieveModelMixin
UpdateModelMixin
-9个视图子类(GenericAPIView+上面5个扩展类一个或多个)
RetrieveUpdateDestroyAPIView
CreateAPIView
RetrieveAPIView
DestroyAPIView
RetrieveUpdateAPIView
UpdateAPIView
ListAPIView
RetrieveDestroyAPIView
-视图集
GenericViewSet: ViewSetMixin+GenerocAPIView
ModelViewSet: 5大接口都有了
ReadOnlyModelViewSet: 获取一条和多条的接口
ViewSet: ViewSetMixin+APIView
ViewSetMinin:类重写了as_view,路由配置就变样了
# 路由
-基本配置
-有action的: 必须继承ViewSetMixin
-自动生成: DefaultRouter和SimpleRouter
-导入,实例化得到对象,注册过个,对象urls(自动生成路由)
-路由相加/include
-试图类当中自己定义的方法,如何自动生成路由
-在自己定义的方法上加装饰器(action)
-两个参数methods=[GET,POST], 表示这两种请求都能接收
-两个参数detail=True, 表示生成带pk的链接
# 三大认证
-认证组件:校验用户是否登陆
-写一个认证类,继承BaseAuthentication, 重写authenticate,内部写认证逻辑,认证通过返回两个值,第一个是user, 认证失败,抛出异常
-全局使用,局部使用,局部禁用
-权限: 校验用户是否有权限进行后续操作
-写一个类,继承BasePermission,重写has_permission,True和False
-全局使用,局部使用,局部禁用
-频率:限制用户访问频次
-写一个类,继承SimpleRateThrottle, 重写get_cache_key, 返回什么,就以谁做限制
scop=luffy字段,需要跟setting中key对应 luffy:3/h(一小时访问三次)
-全局配置,局部配置, 局部禁用
-需求:发送短信验证码的接口,一分钟只能发送一次, 局部使用,配在视图类上
# 解析器:前端传的编码格式,能不能解析(默认三种全配, 基本上不需要改), 可能你写了个上传文件接口,局部配置一下,只能传form-data格式 局部使用: MultiPartParser
# 响应器: 相应的数据,是json格式还是带浏览器的那种(不需要配)
# 过滤器: 借助于第三方django-filter
-注册应用
-setting中配置DjangoFilterBackend或者局部配置
-filter_fields = ('age', 'sex')
# 排序
-全局或者局部配置rest_framework.filters.orderingFilter
-视图类中配置: ordering_fields = ('id', 'age')
# 分页
-使用: 继承了APIView的视图中使用
-CursorPagination
cursor_query_param:默认查询字段,不需要修改
page_size: 每页数目
ordering: 按什么排序,需要指定
-LimitOffsetPagination
default_limit 默认限制,默认值与PAGE_SIEZE设置一致
limit_query_param limit参数名,默认'limit'
offset_query_param offset 参数名,默认'offset'
-PageNumberPagination: 最常用的,需要在setting中配置page_size,四个参数
page_size 每页数目
page_query_param 前端发送的页数关键字名,默认为'page'
page_size_query_param 前端发送的每页数据关键字名,默认为None
max_page_size 前端最多能设置的每页数量
# 全局异常
-写一个方法
def exception_handler(exc, context):
# 走drf原来的异常,原理异常有一些处理
response = drf_exception_handler(exc, context)
# 我们自己处理,drf没有处理,丢给django的异常
if response is None:
if isinstance(exc, DatabaseError):#处理了一下数据库错误
response = Response({'detail': '数据库错误'}, status=status.HTTP_507_INSUFFICIENT_STORAGE)
else:#其他异常
response = Response({'detail': '未知错误'}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
return response
-配置文件中配置(以后所有drf的异常,都会走到这里)
REST_FRAMEWORK = {
'EXCEPTION_HANDLER': 'my_project.my_app.utils.custom_exception_handler'
}
# jwt
-是什么json web token 新的认证方式
-三段: 头,荷载(用户信息), 签名
-使用: 最简单的方式,在路由配置
-path('login/', obtain_jwt_token)
-自定制:
多方式登录,手动签发token(两个方法)
- 自定制基于jwt的认证类
-取出token
-调用jwt提供的解析出payload的方法(校验是否过期, 是否合法,如果合法,返回荷载信息)
-转成user对象
-返回
-RBAC: 基于角色的权限控制(django默认的auth就是给你做了这个事), 公司内部权限管理
对外的权限管理就是三大认证
-用户表
-用户组的表
-权限表
-用户对用户组中间表
-用户组对权限中间表
-用户对权限中间表
企业软件开发流程
#1 web方向,类型
#2 开发流程
-传统软件行业, 互联网行业
1 pip换源
1 pip install pymysql 国外很慢
2 pip install pymysql -i 地址
3 配置 以后pip install全走配好的源
-来到C:\Users\oldboy\AppData\Roaming %APPDATA%
-创建一个pip文件夹
-新建一个文件pip.ini
-写入
[global]
index-url = http://pypi.douban.com/simple
[install]
use-mirrors =true
mirrors =http://pypi.douban.com/simple/
trusted-host =pypi.douban.com
2 虚拟环境搭建
1 不同的项目依赖不同的模块版本,不能共用一套环境,虚拟环境
2 在系统的python环境中安装
-下载
pip3 install virtualenv
pip3 install virtualenvwrapper-win
-修改环境变量
WORKON_HOME: D:\Virtualenvs
-python安装路径,scripts文件下执行virtualenvwrapper.bat
3 使用:
-workon #列出有的虚拟环境(aaa)
-workon aaa #使用这个虚拟环境
-mkvirtualenv -p python3 luffy # 创建虚拟环境
-rmvirtualenv 虚拟环境 # 删除虚拟环境
4 安装django环境
pip install django==2.2.2
5 基于虚拟环境创建项目(不要在pycharm选择)
3 路飞后台创建,配置修改,目录变更
# 在控制台直接指向项目 python manage.py runserver ---》manage.py的内容要改
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
# 项目上线,走的不是manage.py---》uwsgi.py,需要修改
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'luffyapi.settings.dev')
# 国际化
# 创建app:startapp在哪执行,就把app创建在哪
python ../../manage.py startapp home
# 注册app
-
4 数据库配置
# 项目依赖的数据库, luffyapi
-create database luffyapi
# 创建数据库用户,并且授予luffyapi这个库的权限
-grant all privileges on luffyapi.* to 'luffyapi'@'%' identified by 'Luffy123?';
-fulsh privileges
# 项目连接
-setting中配置
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'luffyapi',
'USER': 'luffyapi',
'PASSWORD': 'Luffy123?',
'PORT': 3306,
'HOST': '127.0.0.1'
}
}
-用pymysql连接数据库
-django超过: 2.0.7
-需要改源码
5 User表配置
# 用户要基于auth的user表,必须在数据库迁移命令之前操作好,后期如果再做,会出错
-把所有app下的迁移文件,全删除
-admin,auth app下的迁移文件删除
-删库(数据一定要导出来),重新迁移 (自己尝试一下)
# 继承AbstractUser,增加两个字段,telephone,icon(依附于pillow)
# 在setting中配置
MEDIA_URL='/media/'
MEDIA_ROOT=os.path.join(BASE_DIR,'media') #现在的BASEDIR是luffyapi下的luffyapi
AUTH_USER_MODEL='user.user'
# 路由,打开media文件夹
re_path('media/(?P<path>.*)', serve,{'document_root':settings.MEDIA_ROOT}),
6 路飞前台搭建
# 1 安装node,官网下载,直接下一步
node -v
# 2 a安装模块
npm install 模块名 #npm比较慢,用淘宝的cnpm来替换npm
# 3 npm install -g cnpm --registry=https://registry.npm.taobao.org
# 4 创建Vue的工程(需要有一个Vue脚手架)
# 5 如果出问题执行如下, 重新走3,4
npm cache clean --force
# 6 命令行敲
Vue 就会有提示
# 7 创建Vue项目
vue create luffycity
# 8 用pycharm打开
在terminal下敲: npm run serve