回顾
- (为什么get请求来了,就会执行get方法:原生View的dispatch控制的)
- 路由配置:视图类. as_view( ) - - - - > view(闭包函数)的内存地址
- 请求来了,就会执行view( requst, 分组分出的字段,默认传的字段) - - - 》self. dispatch( ) - - > 处理的
- APIView重写了dispatch:包装了request对象,解析器,分页,三大认证,响应器,全局异常,去掉了csrf
- 前端传过来的数据从那取?
- 地址栏里:request. GET/ query_params
- 请求体中的数据:request. data/ POST( json格式解释不了) - - - 》request. body中取
- 请求头中数据:request. META. get( "HTTP_变成大写" )
- Serializer
- 写字段,字段名要跟表的字段对应,想不对应(source可以修改),有属性,read_only, max_len. . .
- SerializerMethodField必须配套一个get_字段名,返回什么,前台就看到什么
- ModelSerializer
- class Meta :
表对应
取出的字段(__all__, 列表)
排除的字段(用的很少)
extra_kwargs会给字段的属性
- 重写某个字段
password= serializers. SerializerMethodField( )
def get_password ( self, instance) :
return "***"
- 校验:字段自己的校验,局部钩子,全局钩子
- 只要序列化类的对象执行了is_valiad( ) , 这些钩子都会走,可以再钩子里写逻辑
- 在表模型(model)中写方法,可以在上面取出的字段中直接写,不参与反序列化
- 序列化多条(many= True ): 本质,ListSerializer内部套了一个个的serializer对象
- 重写ListSerializer,让序列化对象和自己写的ListSerializer对应上(了解)
- 序列化类( instance, data, many, context= { requtst: request} )
- 视图函数中给序列化对象传递数据,使用context,传回来,放进去直接使用序列化对象. context. get( )
- 两个视图基类 APIView,GenericAPIView(继承APIView):涉及到数据库和序列化类的操作,尽量用GenericAPIView
- 5 个视图扩展类(父类都是object )
CreateModelMixin:create
DestroyModelMixin:destory
ListModelMixin
RetrieveModelMixin
UpdateModelMixin
- 9 个视图子类(GenericAPIView+ 上面5 个视图扩展类中的一个或多个)
RetrieveUpdateDestroyAPIView
CreateAPIView
RetrieveAPIView
DestroyAPIView
RetrieveUpdateAPIView
ListCreateAPIView
UpdateAPIView
ListAPIView
RetrieveDestroyAPIView
- 视图集
- ModelViewSet: 5 大接口都有了
- ReadOnlyModelViewSet:获取一条和获取多条的接口
- GenericViewSet:ViewSetMixin+ GenericAPIView
ViewSet: ViewSetMixin+ APIView
ViewSetMixin: 类重写了as_view, 路由配置就变样了
- 基本配置:跟之前一样
- 有action的:必须继承ViewSetMixin
- 自动生成:DefaultRouter和SimpleRouter
- 导入,实例化得到对象,注册多个,对象. urls( 自动生成的路由)
- 路由相加urlpatterns+= router. urls/ include: path( '' , include( router. urls) )
- 视图类中自己定义的方法,如何自动生成路由
- 在自己定义的方法上加装饰器(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( 一小时访问三次)
- 全局配置,局部配置,局部禁用
- 需求:发送短信验证码的接口,一分钟只能发送一次,局部使用,配在视图类上
- 注册应用
- setting中配置DjangoFilterBackend或者局部配置
- filter_fields = ( 'age' , 'sex' )
- 全局或者局部配置rest_framework. filters. OrderingFilter
- 视图类中配置: ordering_fields = ( 'id' , 'age' )
- 使用:
继承了APIView的视图类中使用
page= Mypage( )
page_list= page. paginate_queryset( queryset对象, request, view= self)
ser= BookSerializer1( instance= page_list, many= True )
继承了视图子类的视图中使用
pagination_class = PageNumberPagination(配置成自己重写的,可以修改字段)
- CursorPagination
cursor_query_param: 默认查询字段,不需要修改
page_size:每页数目
ordering:按什么排序,需要指定
- LimitOffsetPagination
default_limit 默认限制,默认值与PAGE_SIZE设置一直
limit_query_param limit参数名,默认’limit’
offset_query_param offset参数名,默认’offset’
max_limit 最大limit限制,默认None
- PageNumberPagination:最常用的,需要在setting中配置page_size,四个参数
page_size 每页数目
page_query_param 前端发送的页数关键字名,默认为”page”
page_size_query_param 前端发送的每页数目关键字名,默认为None
max_page_size 前端最多能设置的每页数量
- 写一个方法
def exception_handler ( exc, context) :
response = drf_exception_handler( exc, context)
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'
}
- 18 jwt
- 是什么json web token 新的认证方式
- 三段:头,荷载(用户信息),签名
- 使用:最简单方式(在路由中配置)
- path( 'login/' , obtain_jwt_token) ,
- 自定制:
多方式登录,手动签发token(两个方法)
- 自定制基于jwt的认证类
- 取出token
- 调用jwt提供的解析出payload的方法(校验是否过期,是否合法,如果合法,返回荷载信息)
- 转成user对象
- 返回
- 19 RBAC:基于角色的权限控制(django默认的auth就是给你做了这个事),公司内部权限管理
对外的权限管理就是用三大认证
- 用户表
- 用户组表
- 权限表
- 用户对用户组中间表
- 用户组对权限中间表
- 用户对权限中间表
今日内容
0 企业软件开发流程
- 传统软件行业,互联网行业
1 pip换源
1 pip3 install pymysql 国外很慢
2 pip3 install pymysql - i 地址
3 配置,以后pip3 install全走配好的源
- 来到C: UsersoldboyAppDataRoaming % 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
- workon aaa
- mkvirtualenv - p python3 luffy
- rmvirtualenv 虚拟环境名字
4 安装django环境
pip install django== 2.2 .2
5 基于虚拟环境创建项目(不要再pycharm中选择虚拟环境了)
3 路飞后台创建,配置修改,目录变更
os. environ. setdefault( 'DJANGO_SETTINGS_MODULE' , 'luffyapi.settings.dev' )
os. environ. setdefault( 'DJANGO_SETTINGS_MODULE' , 'luffyapi.settings.dev' )
python . . / . . / manage. py startapp home
-
4 数据库配置
- create database luffyapi;
- grant all privileges on luffyapi. * to 'luffyapi' @'%' identified by 'Luffy123?' ;
- grant all privileges on luffyapi. * to 'luffyapi' @'localhost' identified by 'Luffy123?' ;
- flush privileges;
- setting中配置
DATABASES = {
'default' : {
'ENGINE' : 'django.db.backends.mysql' ,
'NAME' : 'luffyapi' ,
'USER' : 'luffyapi' ,
'PASSWORD' : 'Luffy123?' ,
'HOST' : '127.0.0.1' ,
'PORT' : 3306
}
}
import pymysql
pymysql. install_as_MySQLdb( )
- 用pymysql连接数据库
- django超过:2.0 .7
- 需要改源码,两个地方
5 User表配置
- 把所有app下的迁移文件,全删除
- admin,auth app下的迁移文件删除
- 删库(数据一定要导出来),重新迁移 (自己尝试一下)
MEDIA_URL= '/media/'
MEDIA_ROOT= os. path. join( BASE_DIR, 'media' )
AUTH_USER_MODEL= 'user.user'
re_path( 'media/(?P<path>.*)' , serve, { 'document_root' : settings. MEDIA_ROOT} ) ,
6 路飞前台搭建
node - v
v10. 16.3
npm install 模块名
cnpm install - g @vue/ cli
npm cache clean - - force
vue 就会有提示
vue create luffycity
选Manually
在terminal下敲:npm run serve
Vue目录介绍
public
- favicon. ico
- index. html
src
- assets
- components
- router
- store
- views
- App. vue
- main. js
< template>
< / template>
< style>
< / style>
< script>
< / script>
作业
## 1 路飞前后台搭建完成
## 2 解决跨域问题,写一个首页轮播图接口,数据打通(部分人写)