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(降级)