1、pycharms 创建项目虚拟环境(方便管理环境), 创建成功后
2、规划项目代码结构,eg: 创建一个demoapp的flask应用。
3、config.py环境配置,后续可以调整开发环境、还是生产环境
import os
basedir = os.path.abspath(os.path.dirname(__file__))
# 类中通用配置
class Config:
SECRET_KEY = "mybolgastringsecret_1996beginning"
SQLALCHEMY_TRACK_MODIFICATIONS = True
WHOOSH_BASE = os.path.join(basedir, 'whoosh_index') # 设置索引文件存放文件夹位置
WTF_CSRF_ENABLED = False
WTF_CSRF_SECRET_KEY = 'obolgtomyself'
@staticmethod
def init_app(app): # 初始化app
pass
DIALECT = 'mysql' # 要用的什么数据库
DRIVER = 'mysqlconnector' # 连接数据库驱动
USERNAME = '' # 用户名
PASSWORD ='' # 密码
HOST = 'localhost' # 服务器
PORT ='3306' # 端口
DATABASE = '' # 数据库名
class DevelopmentConfig(Config): # 开发环境,继承Config模块
DEBUG = True
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST,
PORT, DATABASE)
class TestingConfig(Config): # 测试环境 选择测试型mysql
TESTING = True
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST,
PORT, DATABASE)
class ProductionConFig(Config): # 生产环境, 连接正式mysql
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST,
PORT, DATABASE)
Config = {
'development': DevelopmentConfig,
'testing': TestingConfig,
'production': ProductionConFig,
'default': DevelopmentConfig
}
4、manage.py 初始化管理
"""
命令行管理项目、调整项目环境
"""
from blog_app import create_app, db # 导入实例化app
from flask_script import Manager, Shell
from flask_migrate import Migrate, MigrateCommand
app = create_app('default') # 设定调用的环境 ,跳转到init ,调用create_app
manager = Manager(app)
migrate = Migrate(app, db)
def make_shell_context():
return dict(app=app, db=db)
manager.add_command('shell', Shell(make_context=make_shell_context)) # 增加shell命令行
manager.add_command('db', MigrateCommand) # 增加db 命令行
if __name__ == '__main__':
manager.run()
5、_init_.py初始化文件代码
from flask_sqlalchemy import SQLAlchemy as BaseSQLAlchemy
from flask import Flask
from config import Config
from .extensions import extension_config
from contextlib import contextmanager
# 自定义一个SQLAlchemy继承flask_sqlalchemy的,方便自定义方法!!!
class SQLAlchemy(BaseSQLAlchemy):
# contextmanager装饰器, 上下文管理器, 模块化commit行为
@contextmanager
def commit_db(self):
try:
yield
self.session.commit()
except Exception as e:
# 加入数据库commit提交失败,必须回滚!!!
self.session.rollback()
raise e
db = SQLAlchemy() # db数据库不放在拓展功能
def create_app(config_name):
app = Flask(__name__) # flask类实例化
app.config.from_object(Config[config_name]) # app运行环境配置
Config[config_name].init_app(app) # 执行初始化
db.init_app(app) # db数据库初始化
extension_config(app)
return app
6、extension.py 是应用拓展、加载一些第三方应用
from flask_bootstrap import Bootstrap
from flask_login import LoginManager
bootstrap = Bootstrap() #
login_manager = LoginManager() # 引用登陆管理器、表单功能等
def extension_config(app):
bootstrap.init_app(app)
login_manager.init_app(app=app)
login_manager.login_view = 'main.login' # 视图未授权跳转路由
login_manager.login_message = '请先登陆后在访问'
login_manager.session_protection = 'strong'
注意:flask执行顺序,
A、manage启动后进行初始化flask应用。(类似app = flask(__name__)这段代码, 但由于项目的复杂性,经常需要重构初始化代码 )
B、重构初始化方法create_app , 把config.py环境配置、extensions.py应用拓展, 加载入flask
7、创建数据库字段,进行数据初始化(flask-script、flask-migrate 已经加载完成)
models.py 代码
from . import db
import datetime
from flask_login import UserMixin # 引用包方便login调用*
from .extensions import login_manager
from werkzeug.security import check_password_hash
class User(UserMixin, db.Model): # 继承UserMixin类
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True) # 主键
username = db.Column(db.String(128), unique=True)
password_hash = db.Column(db.String(128), nullable=False)
email = db.Column(db.String(64), unique=True, nullable=False)
is_super = db.Column(db.Boolean, default=False) # 辨认是否为admin
create_time = db.Column(db.DateTime, default=datetime.datetime.now())
# 个性签名
autograph = db.Column(db.String(256))
# 设置默认头像
user_icon = db.Column(db.String(256), default='default.jpg') # 用户头像
user_blog_related = db.relationship('BlogContent', backref='user') # 建立与文章表联系的关系
@property # 明文只读
def password(self):
raise ArithmeticError(u'password密码不可读')
# 验证hash密码是否一致 return 0 ,1
def check_password_hash(self, password):
return check_password_hash(self.password_hash, password) # (密码,文明码)
# 后台显示用户名
def __repr__(self):
return '<User %r>' % self.username
8、在两个应用下创建视图views.py,然后把User模型导入视图中。
9、数据库初始化 ,必须先手动创建数据库。创建完成后在config.py更改数据库对应配置
在pycharms 命令行终端依次输入
python manage.py db init --> 会生成migrations 文件
python manage.py db migrate
python manage.py db upgrade
生成成功后可以在Navicat查看数据库字段
10、导入蓝图管理多个应用(blog、 main两个应用)
首先在create_app配置、蓝图需要初始化加载进flask
其次在对应的__inti_.py 导入蓝图
最后在views导入蓝图即可。
到此flask项目代码架构基本完成, 后续若是需要增加flask-wtfs表单、flask-Login登陆管理、 flask_ckeditor 文本编辑器都在
extensions.py 导入