day 89 pip换源、 虚拟环境搭建、 路飞后台创建,配置修改,目录变更、 数据库配置、 user表配置、 路飞前台搭建、

回顾

# 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
上一篇:union,connect,Iterate,project


下一篇:Zabbix监控系统——附超详细步骤和图解