• day89-路飞项目-企业软件开发流程、 pip换源、 虚拟环境搭建、路飞后台创建,配置修改,目录变更、数据库配置、User表配置、路飞前台搭建


    回顾

    
    # 1 restful规范--10条
    # 2 django上写符合restful规范的接口
    # 3 drf写接口
    # 4 APIView--》继承了原生View---》get,post方法
    	-(为什么get请求来了,就会执行get方法:原生View的dispatch控制的)
        -路由配置:视图类.as_view()---->view(闭包函数)的内存地址
        -请求来了,就会执行view(requst,分组分出的字段,默认传的字段)---》self.dispatch()-->处理的
        
        -APIView重写了dispatch:包装了request对象,解析器,分页,三大认证,响应器,全局异常,去掉了csrf
    # 5 Request对象:request._request,request.data,重写了__getattr__,request.method-->去原生request中拿
    	-前端传过来的数据从那取?
        	-地址栏里:request.GET/query_params
           	-请求体中的数据:request.data/POST(json格式解释不了)---》request.body中取
            -请求头中数据:request.META.get("HTTP_变成大写")
    #6  Response对象---》封装了原生的HttpResponse,Response(data,headers={},status=1/2/3/4/5开头的)
    #7  自己封装了Response对象
    
    # 8 序列化类:
    	-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()
    # 9 视图
    	-两个视图基类 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,路由配置就变样了
                
    # 10 路由
    	-基本配置:跟之前一样
        -有action的:必须继承ViewSetMixin
        -自动生成:DefaultRouter和SimpleRouter
        	-导入,实例化得到对象,注册多个,对象.urls(自动生成的路由)
            -路由相加urlpatterns+=router.urls/include:path('', include(router.urls))
        -视图类中自己定义的方法,如何自动生成路由
        	-在自己定义的方法上加装饰器(action)
            -两个参数methods=[GET,POST],表示这两种请求都能接受
            -两个参数detail=True,表示生成带pk的连接
    # 11 三大认证
    	-认证组件:校验用户是否登录
        	-写一个认证类,继承BaseAuthentication,重写authenticate,内部写认证逻辑,认证通过返回两个值,第一个是user,认证失败,抛去异常
            -全局使用,局部使用,局部禁用
        -权限:校验用户是否有权限进行后续操作
        	-写一个类,继承BasePermission,重写has_permission,TrueFalse
            -全局使用,局部使用,局部禁用
        -频率:限制用户访问频次
        	-写一个类,继承SimpleRateThrottle,重写get_cache_key,返回什么,就以谁做限制,scop=luffy字段,需要跟setting中的key对应   luffy:3/h(一小时访问三次)
            
            -全局配置,局部配置,局部禁用
            -需求:发送短信验证码的接口,一分钟只能发送一次,局部使用,配在视图类上
    # 12 解析器:前端传的编码格式,能不能解析(默认三种全配了,基本不需要改),可能你写了个上传文件接口,局部配置一下,只能传form-data格式  局部使用:MultiPartParser
    # 13 响应器:响应的数据,是json格式还是带浏览器的那种(不需要配)
    # 14 过滤器:借助于第三方django-filter
    	-注册应用
        -setting中配置DjangoFilterBackend或者局部配置
        -filter_fields = ('age', 'sex')
    # 15 排序
    	-全局或者局部配置rest_framework.filters.OrderingFilter
        -视图类中配置: ordering_fields = ('id', 'age')
        
    # 16 分页
    	-使用:
            继承了APIView的视图类中使用
            	 page=Mypage()
                # 在数据库中获取分页的数据
                page_list=page.paginate_queryset(queryset对象,request,view=self)
                # 对分页进行序列化
                ser=BookSerializer1(instance=page_list,many=True)
                # return Response(ser.data)
            继承了视图子类的视图中使用
            	 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 前端最多能设置的每页数量
    # 17 全局异常
    	-写一个方法
        	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'
            }
            
     -18 jwt
    	-是什么json web token  新的认证方式
        -三段:头,荷载(用户信息),签名
        -使用:最简单方式(在路由中配置)
        	-path('login/', obtain_jwt_token),
        -自定制:
        	多方式登录,手动签发token(两个方法)
        -自定制基于jwt的认证类
        	-取出token
            -调用jwt提供的解析出payload的方法(校验是否过期,是否合法,如果合法,返回荷载信息)
            -转成user对象
            -返回
            
      -19 RBAC:基于角色的权限控制(django默认的auth就是给你做了这个事),公司内部权限管理
    		对外的权限管理就是用三大认证
    	-用户表
        -用户组表
        -权限表
        -用户对用户组中间表
        -用户组对权限中间表
        -用户对权限中间表
    

    今日内容

    0 企业软件开发流程

    #1 web方向,类型
    #2 开发流程
    	-传统软件行业,互联网行业
        
    

    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  #列出有的虚拟环境(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?';
        -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表配置

    # 用户要基于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 
        v10.16.3 # 表示成功
    #2 安装模块
    	npm install 模块名 #npm比较慢,用淘宝的cnpm来替换npm
    	
    #3 npm install -g cnpm --registry=https://registry.npm.taobao.org   
    
    #4 创建vue的工程(需要一个vue脚手架)
    	cnpm install -g @vue/cli
        
    #5 如果出问题执行如下,重新走3,4
    	npm cache clean --force
        
    #5 命令行下敲
    	vue 就会有提示
    	
    # 6 创建vue项目
    vue create luffycity
    选Manually
    
    
    #7 用pycharm打开
    	在terminal下敲:npm run serve
    #8 配置pycharm
    	
    

    Vue目录介绍

    public
        -favicon.ico   # 
        -index.html    #整个项目的单页面
    src
        -assets  #静态文件,js,css,img
        -components # 小组件,头部组件,尾部组件
        -router     # 路由相关
        -store      # vuex相关,状态管理器,临时存储数据的地方
        -views      # 页面组件
        -App.vue    # 根组件
        -main.js    # 配置文件(跟django的setting一样)
        
        
        
    #任何一个组件都有三部分
    	<template>
        	#html相关
    	</template>
        <style>
    		# css相关
    	</style>
    
        <script>
    		# js相关
        </script>
    

    作业

    ## 1 路飞前后台搭建完成
    
    ## 2 解决跨域问题,写一个首页轮播图接口,数据打通(部分人写)
    
  • 相关阅读:
    线性表——(2)单向链表
    线性表——(1)顺序表
    UVa 1592 数据库
    UVa 12096 集合栈计算机
    Python 协程
    Python 多线程及进程
    Python 日志(Log)
    Python 函数式编程
    Python基础
    DB2 获取前两天的数据
  • 原文地址:https://www.cnblogs.com/zdw20191029/p/14553279.html
Copyright © 2020-2023  润新知