Flask.2

Flask 拆分文件

FlaskWork 为工程文件

  • __init__.py
from flask import Flask

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

def create_app(env):

    # 创建Flask对象
    app = Flask(__name__)

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

    # 初始化扩展库,加载扩展库
    init_ext(app)

    # 初始化路由 加载路由
    init_blue(app)

    return app

 

  • extension.py(扩展库)
from flask_migrate import Migrate
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy()
migrate = Migrate()

def init_ext(app):
    db.init_app(app)
    migrate.init_app(app, db)
  • settings.py(一般配置四套环境:开发环境、测试环境、演示环境、生产环境)
def get_db_uri(dbinfo):
    database = dbinfo.get("DATABASE")
    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(database,driver,user,password,host,port,name)


class Config:
    DEBUG = False
    TESTING = False
    SECRET_KEY = "zbczbc"
    SQLALCHEMY_TRACK_MODIFICATIONS = False

class DevelopConfig(Config):
    DEBUG = True
    dbinfo = {
        "DATABASE":"mysql",
        "DRIVER":"pymysql",
        "USER":"root",
        "PASSWORD":"your password",
        "HOST":"127.0.0.1",
        "PORT":"3306",
        "NAME":"FlaskWork"
    }
    SQLALCHEMY_DATABASE_URI = get_db_uri(dbinfo)


class TestingConfig(Config):
    TESTING = True
    dbinfo = {
        "DATABASE":"mysql",
        "DRIVER":"pymysql",
        "USER":"root",
        "PASSWORD":"your password",
        "HOST":"127.0.0.1",
        "PORT":"3306",
        "NAME":"FlaskWork"
    }
    SQLALCHEMY_DATABASE_URI = get_db_uri(dbinfo)


class StagingConfig(Config):
    dbinfo = {
        "DATABASE": "mysql",
        "DRIVER": "pymysql",
        "USER": "root",
        "PASSWORD": "your password",
        "HOST": "127.0.0.1",
        "PORT": "3306",
        "NAME": "FlaskWork"
    }
    SQLALCHEMY_DATABASE_URI = get_db_uri(dbinfo)


class ProductConfig(Config):
    dbinfo = {
        "DATABASE": "mysql",
        "DRIVER": "pymysql",
        "USER": "root",
        "PASSWORD": "your password",
        "HOST": "127.0.0.1",
        "PORT": "3306",
        "NAME": "FlaskWork"
    }
    SQLALCHEMY_DATABASE_URI = get_db_uri(dbinfo)

envs = {
    "develop": DevelopConfig,
    "testing": TestingConfig,
    "staging": StagingConfig,
    "product": ProductConfig,
    "default": ProductConfig
}
  • views.py(视图函数(FlaskWork))
from Movies.views import movies_blue
from Users.views import users_blue

def init_blue(app):
    app.register_blueprint(blueprint=users_blue)
    app.register_blueprint(blueprint=movies_blue)

Users

  • models.py
from FlaskWork.extension import db
from common.models import BaseModel

class User(BaseModel):

    name = db.Column(db.String(32), unique=True)
    password = db.Column(db.String(256))
    email = db.Column(db.String(128), unique=True)
    icon = db.Column(db.String(256), nullable=True)

    def check_password(self,password):
        return self.password == password
  • views.py(简单的实现用户注册)
#蓝图
users_blue = Blueprint("users_blue",__name__,url_prefix="/users")

@users_blue.route('/register/',methods=["GET","POST"])
def register():
    if request.method == "GET":
        return render_template('register.html')
    elif request.method == "POST":
        username = request.form.get("username")
        password = request.form.get("password")
        password1 = request.form.get("conpassword")
        email = request.form.get("email")
        icon = request.files.get("icon")

        users = User.query.filter(User.name.__eq__(username)).all()

        if users:
            return "该用户已存在"

        if password != password1:
            return "两次密码输入不一致"

        path = None
        if icon:
            try:
                ext = "." + icon.filename.split(".")[-1]
            except Exception as e:
                ext = ".jpg"

            path = "/static/icons/" + username + ext
            save_path = "/Users/elema/Desktop/python1903/Day04/FlaskHomework/static/icons/" + username + ext
            icon.save(save_path)

        user = User(name=username, password=password, email=email, icon=path)


        if user.save():
            return redirect(url_for('users_blue.login'))
        else:
            return "注册失败"

manage.py(管理者)

import os

from flask_migrate import MigrateCommand
from flask_script import Manager

from FlaskWork import create_app

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

app = create_app(env)

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


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

migrations(为迁移文件,可以和数据库进行映射)

 

扩展库

  • 迁移
    • 可以自动将模型变成数据库中的表
  • 实现
    • flask-migrate
  • 使用过程
    • 安装  
      • pip install flask-migrate  
    • 配置
      • 绑定app和db
      • 创建一个Migrate对象,传递app和db进去
    • 具体使用
      • 首次使用需要初始化
        • python manage.py db init
      • 如果模型有变更,生成迁移文件
        • python manage.py db migrate 
      • 将迁移文件映射到数据库中
        • python manage.py db upgrade(升级)
        • 后悔药
        • python manage.py db downgrade(降级) 

 

posted @ 2019-05-24 17:16  百超  阅读(304)  评论(0编辑  收藏  举报