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生成策略

    • 啥时候生成

    • 长什么样

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

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

原文地址:https://www.cnblogs.com/quietzpc/p/11967677.html