Flask项目基本拆分

Flask项目基本拆分

96

垃圾桶边的狗 关注

用到的知识点

Flask四大内置对象

  • request
  • session
  • g
  • app (config)

提升代码复用性

  • 封装函数
  • 装饰器
  • 类继承
  • 钩子函数

钩子函数

  • 中间件一个东西
  • 面向切面编程的切点
- before_request
    Django :process_reqeust
after_request
     Django : process_response
- errorhandler
     Django : processs_exception

插件使用

  • 寻找适合的插件
  • 安装插件
  • 初始化插件
  • 操作插件

工作环境

  • 开发环境
  • 开发工程师使用
  • 测试环境
  • 测试工程师使用
  • 演示环境
  • 给项目经理看
  • 演习使用
  • 线上环境(生产环境)
  • 真实用户使用的环境

流程图

[图片上传失败...(image-8d9a8b-1544252761684)]

项目目录

[图片上传失败...(image-a84813-1544252761684)]

App/init.py
from flask import Flask

from App.extension import init_ext
from App.middleware import load_middleware
from App.settings import envs
from App.views import init_blue

def create_app(env):
    app = Flask(__name__)

    # 初始化App的配置
    app.config.from_object(envs.get(env))

    # 初始化第三方的插件
    init_ext(app=app)

    # 加载中间件
    load_middleware(app=app)

    # 初始化路由系统
    init_blue(app=app)

    return app

App/manage.py
import os

from flask_migrate import MigrateCommand
from flask_script import Manager

from App import create_app

env = os.environ.get("FLASK_PROJECT", "product")

app = create_app(env)

manager = Manager(app=app)
manager.add_command("db", MigrateCommand)

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

App/extension.py
from flask_caching import Cache
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
migrate = Migrate()
cache = Cache(config={
    "CACHE_TYPE": "redis"
})

def init_ext(app):
    db.init_app(app=app)
    migrate.init_app(app=app, db=db)
    cache.init_app(app)

App/settings.py
知识点:

对不同的环境进行分离

def get_db_uri(dbinfo):

    engine = dbinfo.get("ENGINE")
    driver = dbinfo.get("DRIVER")
    user = dbinfo.get("USER")
    password = dbinfo.get("PASSWORD")
    host = dbinfo.get("HOST")
    port = dbinfo.get("PORT")
    name = dbinfo.get("NAME")

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

class Config:

    DEBUG = False

    TESTING = False

    SECRET_KEY = "wertyuiodfghjkl!@#$%^&I(*&^5"

    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevelopConfig(Config):

    DEBUG = True

    dbinfo = {
        "ENGINE": "mysql",
        "DRIVER": "pymysql",
        "USER": "root",
        "PASSWORD": "123456",
        "HOST": "localhost",
        "PORT": "3306",
        "NAME": "FlaskProject1"
    }

    SQLALCHEMY_DATABASE_URI = get_db_uri(dbinfo)

class TestingConfig(Config):

    TESTING = True

class StagingConfig(Config):

    pass

class ProductConfig(Config):

    pass

envs = {
    "develop": DevelopConfig,
    "testing": TestingConfig,
    "staging": StagingConfig,
    "product": ProductConfig,
    "default": DevelopConfig,
}

App/models/init.py
from .sutdent_model import Student
from .teacher_model import Teacher

App/models/student_model.py
知识点:

1.用户密码加密
2.用户密码校验
4.数据自动保存数据库
5.用户权限校验

from werkzeug.security import generate_password_hash, check_password_hash

from App.extension import db

PERMISSION_STUDENT_LEARN = 1
PERMISSION_STUDENT_MANAGE = 2
PERMISSION_STUDENT_USE_PHONE = 4

class Student(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(16), unique=True)
    _s_password = db.Column(db.String(256))
    s_permission = db.Column(db.Integer, default=PERMISSION_STUDENT_LEARN)

    @property
    def s_password(self):
        raise Exception("can't access")

    @s_password.setter
    def s_password(self, password):
        self._s_password = generate_password_hash(password)

    def verify_password(self, password):
        return check_password_hash(self._s_password, password)

    def check_permission(self, permission):
        return self.s_permission & permission == permission

    def save(self):
        try:
            db.session.add(self)
            db.session.commit()
        except Exception as e:
            print(e)
            return False
        else:
            return True

App/views/init.py
from App.views.book_blue import book_blue
from App.views.first_blue import blue
from App.views.student_blue import blue_student

def init_blue(app):
    app.register_blueprint(blueprint=blue)
    app.register_blueprint(blueprint=blue_student)
    app.register_blueprint(blueprint=book_blue)

App/views/login_register.py
>知识点:

uuid生成token唯一值
缓存:对token进行过期时间设置
abort

import uuid

from flask import Blueprint, request, abort, jsonify

from App.extension import cache
from App.models import Student

blue_student = Blueprint("blue_student", __name__, url_prefix='/students')

@blue_student.route("/", methods=["POST", ])
def students():
    action = request.args.get("action")

    username = request.form.get("username")
    password = request.form.get("password")

    if action == "register":

        student = Student()
        student.s_name = username
        student.s_password = password

        if not student.save():
            abort(401)
        return "注册成功"

    elif action == "login":

        # Student.query.filter(Student.s_name.__eq__(username))
        student_list = Student.query.filter(Student.s_name == (username)).all()
        if not student_list:
            abort(404)
        student = student_list[0]

        if not student.verify_password(password):
            abort(401)

        token = uuid.uuid4().hex

        cache.set(token, student.id, timeout=60*60*24)

        data = {
            "msg": "登录成功",
            "token": token
        }

        return jsonify(data)

    else:
        abort(400)

App/views/permission_book.py
知识点

Flask内置对象:g

from flask import Blueprint, request, g

from App.extension import cache
from App.models import Student
from App.models.sutdent_model import PERMISSION_STUDENT_LEARN, PERMISSION_STUDENT_MANAGE

book_blue = Blueprint("book_blue", __name__, url_prefix="/books")

@book_blue.route("/")
def books():

    student = g.user

    if not student.check_permission(PERMISSION_STUDENT_MANAGE):
        return "没有访问本书的权限"

    return "这是你喜欢的书<<算法导论>>,请拿走"

App/middleware.py

知识点:

面向切面编程
中间件
两个概念:切点和切面
切点:可以在那切开
切面:从切点处切开能获得什么
flask内置对象:g
g:可以跨函数使用,将数据传到App/views/permission_book.py
缓存
token

from flask import request, g

from App.extension import cache
from App.models import Student

require_login_list = ["/books/",]

def load_middleware(app):

    @app.before_request
    def before_request():
        path = request.path
        if path in require_login_list:
            token = request.args.get("token")

            if not token:
                return "token 不存在"

            student_id = cache.get(token)

            if not student_id:
                return "id 已过期"

            student = Student.query.get(student_id)

            if not student:
                return "student 已消失"

            g.user = student
            g.auth = token
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容

  • 用到的知识点 Flask四大内置对象requestsessiongapp (config) 提升代码复用性封装函数...
    垃圾桶边的狗阅读 4,880评论 3 4
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 2,984评论 1 3
  • 一、Flask简介 Flask是一个基于python实现的web开发"微"框架。 Flask和Django一样,也...
    仙灵儿阅读 872评论 0 0
  • flask是python的一个web应用框架,django很多人听过,flask比较少见,连创始人一开始写出来只是...
    思而忧阅读 2,942评论 0 5
  • flask 运行流程 creat一个app对象,通过Flask(name)来注册方法,然后run_app 通过fl...
    Colaplusice阅读 1,227评论 0 0