zoukankan      html  css  js  c++  java
  • flask

    Flask项目拆分

    • XXXProject

      • manage.py

        • 调用了App创建 Flask对象创建

          import os

          from ZpcProject import create_app
          from flask_script import Manager

          env = os.environ.get("FLASK_PORJECT") or "default"

          app = create_app(env)

          manager = Manager(app)




          if __name__ == '__main__':
             manager.run()
      • XXXProject

        • __init__

          • 创建Flask对象

          • 加载配置

          • 加载各种第三方插件(除路由)

          • 加载中间件

          • 加载路由,对外暴漏入口,暴漏路由

            from flask import Flask


            from ZpcProject.config import envs
            from ZpcProject.extension import init_ext
            from ZpcProject.middleware import load_middleware
            from ZpcProject.route import init_route


            def create_app(env):
               app = Flask(__name__,static_folder="../static",template_folder="../templates")

               # 加载配置
               app.config.from_object(envs.get(env))


               # 加载第三方插件
               init_ext(app)

               # 加载中间件
               load_middleware(app)


               # 加载路由
               init_route(app)
               return app

             

        • config 或 settings

          def get_db_uri(db_info):

             database = db_info.get("DATABASE")
             driver = db_info.get("DRIVER")
             user = db_info.get("USER")
             password = db_info.get("PASSWORD")
             host = db_info.get("HOST")
             port = db_info.get("PORT")
             name = db_info.get("NAME")

             return "{}+{}://{}:{}@{}:{}/{}".format(database,driver,user,password,host,port,name)

          class BaseConfig:

             DEBUG = False

             TESTING = False

             SECRET_KEY = "SDFGHGSAGDFHSDFHVNrtgsdhgsd"

             SQLALCHEMY_TRACK_MODIFICATIONS = False



          class DevelopConfig(BaseConfig):

             DEBUG = True

             db_info = {
                 "DATABASE":"mysql",
                 "DRIVER":"pymysql",
                 "USER":"root",
                 "PASSWORD":"",
                 "HOST":"localhost",
                 "PORT":"3306",
                 "NAME":"zpc"
            }

             SQLALCHEMY_DATABASE_URI = get_db_uri(db_info)

          class TestingConfig(BaseConfig):

             TESTING = True

             db_info = {
                 "DATABASE":"mysql",
                 "DRIVER":"pymysql",
                 "USER":"root",
                 "PASSWORD":"",
                 "HOST":"localhost",
                 "PORT":"3306",
                 "NAME":"zpc"
            }

             SQLALCHEMY_DATABASE_URI = get_db_uri(db_info)



          class StaginConfig(BaseConfig):



             db_info = {
                 "DATABASE":"mysql",
                 "DRIVER":"pymysql",
                 "USER":"root",
                 "PASSWORD":"",
                 "HOST":"localhost",
                 "PORT":"3306",
                 "NAME":"zpc"
            }

             SQLALCHEMY_DATABASE_URI = get_db_uri(db_info)

          class OnlineConfig(BaseConfig):

             db_info = {
                 "DATABASE":"mysql",
                 "DRIVER":"pymysql",
                 "USER":"root",
                 "PASSWORD":"",
                 "HOST":"localhost",
                 "PORT":"3306",
                 "NAME":"zpc"
            }

             SQLALCHEMY_DATABASE_URI = get_db_uri(db_info)


          envs = {
             "develop":DevelopConfig,
             "testing":TestingConfig,
             "staging":StaginConfig,
             "online":OnlineConfig,
            "default":OnlineConfig
          }

           

        • extension

          def init_ext(app):
             pass

           

        • middleware

          def load_middleware(app):
             pass

           

        • route

          from App.route import app_api


          def init_route(app):
             app_api.init_app(app)
      • common

      • App

        • __init__

        • views

          from flask_restful import Resource


          class AppResource(Resource):

             def get(self):
                 return {"msg":"app ok"}

           

        • models

        • apis 或 route

          from flask_restful import Api

          from App.views import AppResource

          app_api = Api()

          app_api.add_resource(AppResource,"/app/")
      • App1

      • AppN

     

     

    Flask-RESTful

    官方文档:http://www.pythondoc.com/Flask-RESTful/index.html

    • api 路由体系 Router

      • CBV的Resource

        from flask_restful import Api
        
        from App.views import AppResource
        
        app_api = Api()   # 创建接口
        
        app_api.add_resource(AppResource,"/app/")   # 设置路由
        
    • 参数转换 输入体系 Request

      • reqparse

      • type 约定参数类型

      • help 约定参数错误提示

      • 参数默认都是不是必须的

        • 添加必须使用 required=True

      • 一个参数存在多个值

        • 使用 action="append"

      • 更改数据获取方式

        • dest 会替代默认的键

      • 指定参数来源

        • location

        • 可以支持同时从多个位置获取

      • 支持复制

        • copy

        • 变相的继承

    • 数据格式化 输出体系 Response

      • fileds

      • marshal_with

        • 装饰器

          • 内部调用marshal

      • marshal

        • 函数

      • 重命名属性

        • attribute

      from flask_restful import Resource, reqparse, marshal_with, fields, marshal
      
      from App.models import Book, Author
      
      app_fields = {
          "ststus":fields.Integer(default=2200), # default 设置默认值
          "msg": fields.String,
          "b_name":fields.String(attribute="b_name") # 重命名 指定映射到book(b_name)"斗罗大陆
      }  # 格式化
      
      
      author_fields = {
          "name":fields.String,
          "age":fields.Integer,
          "sex":fields.String
      }
      
      book_fields = {
          "name":fields.String(attribute="b_name"),
          "price":fields.Integer(attribute="b_price"),
          "author":fields.Nested(author_fields, attribute="b_author")
      }
      
      class AppResource(Resource):
      
          parser = reqparse.RequestParser()
          parser.add_argument("token", required=True,help="请提供Token")  # help  约定参数错误提示  required=True 参数默认不是必须的 想要添加必须的必须为True
          
          parser.add_argument("token", dest="auth", help="请提供Token")  # dest  更改获取方式 会替代默认的键值token  代码隐藏技术
          
          parser.add_argument("hobby", action="append")    # 如果你要接受一个键有多个值的话,你可以传入 action='append'  列表
      
          parser.add_argument("csrftoken",location="cookies") # location 指定参数的来源
          parser.add_argument("csrftoken",location=["cookies", "args"], action="append") # location 支持从多个位置那值加
      
      
      
          @marshal_with(app_fields, envelope="dada")  # marshal_with() 装饰器将会应用到由 resource_fields 描述的转换。格式化
          def get(self):
      
              args = self.parser.parse_args()
              print(args)
              # return {"msg":"app ok"}
      
              # return Book(b_name="CookBook",b_price=110)
      
              # books = [Book(b_name="斗罗大陆",b_price=110), Book(b_name="斗破苍穹",b_price=200)]
              #
              # return books
              # return marshal(books, app_fields, envelope="dada")  # 可以不写 @marshal_with(app_fields, envelope="dada")装饰器 可以用函数marshal来实现功能 其实它的内部就是这个函数
      
      
              data = {
                  "data":Book(b_name="算法导论", b_price=100,b_author=Author(name="zpc",age=12,sex="男"))
              }
      
              return marshal(data, author_fields)
      

      models.py

      class Book:
      
          def __init__(self, b_name, b_price,b_author):
              self.b_name = b_name
              self.b_price = b_price
              self.b_author = b_author
      
      class Author():
      
          def __init__(self,name, age, sex):
              self.naem = name
              self.age = age
              self.sex =sex
      

       

    赋值过程

    • var = value

    • id获取栈地址

    • 赋值先分配栈,再分配堆,栈里存放堆地址

    • 静态存储区

      • -5到256

     

    copy

    • copy

      • 只复制第一层

    • deepcopy

      • 逐层复制 递归

        往往你会为你编写的每个资源编写不同的解析器。这样做的问题就是如果解析器具有共同的参数。

        不是重写,你可以编写一个包含所有共享参数的父解析器接着使用 copy() 扩充它。

        你也可以使用 replace_argument() 覆盖父级的任何参数,或者使用 remove_argument() 完全删除参数。

    from flask.ext.restful import RequestParser
    
    parser = RequestParser()
    parser.add_argument('foo', type=int)
    
    parser_copy = parser.copy()
    parser_copy.add_argument('bar', type=int)
    
    # 解析器拷贝有" foo "和" bar "
    
    parser_copy.replace_argument('foo', type=str, required=True, location='json')
    # 现在foo'是json中必需的str,而不是定义的intd
    #  由原来的解析器
    
    parser_copy.remove_argument('foo')
    # 解析器拷贝不再有“foo”参数
    

     

    six

    • 兼容

      • python2.6开始兼容

     

    用户权限

    • 权限分配

      • 多表权限

        • 理解简单

          • 写起来麻烦

        • 用户表

        • 权限表

        • 用户权限表(关系表)

        • 用户组

        • 用户用户组表(关系表)

        • 用户组权限表(关系表)

        • 权限组表

        • 权限组权限表(关系表)

        • 用户权限组表(关系表)

        • 用户组权限组表(关系表)

      • 单一字段代表权限

        • 值越大权限越高

      • 单一字段代表权限

        • 每个权限是独立的

          • 二进制

        • Linux

          • rwx

            • r 4 100

            • w 2 010

            • x 1 001

          • 5 有没有读权限?

            • 5 & 4 = 101 & 100 = 100

            • 5 & 2 = 101 & 010 = 000

     

    homework

    • 设计token生成策略

      • 啥时候生成

      • 长什么样

    • 博客只有登陆的用户才能创建

      • 创建直接和当前登陆的用户进行级联

  • 相关阅读:
    CVPR-2021-Papers
    caffe中使用多个GPU的方法
    大道至简!深度解读CVPR2021论文RepVGG
    195上的rknn
    RKNN1.6下载路径
    基于深度学习的2D和3D仿射变换配准
    涵盖18+ SOTA GAN实现,开源工程StudioGAN火了
    基于opencv实战眼睛控制鼠标
    S7-200SMART PLC与变频器MODBUS RTU通讯与SMART LINE系列屏控制(案例三)
    Java异常处理学习
  • 原文地址:https://www.cnblogs.com/quietzpc/p/11967677.html
Copyright © 2011-2022 走看看