python web的flask项目代码管理
timey小先生 2021-10-17 06:31:15阅读 954 技术、flask、python、web

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 导入