您的位置:首页 > 编程语言 > Python开发

python flask Blueprint搭建

2018-02-11 15:14 435 查看
随着功能的添加,路由越来越多,view层的拆分变成了刚需
蓝图的杀手锏是将你的应用组织成不同的组件,比如把这里的admin,main,course等相关的视图方法分为组件。这时我们可以
创建三个蓝图实现这两个独立的组件。static文件存放的是静态文件,templates是模板。

目录结构



Blueprint

首先是我们项目的配置文件(config.py)
# -*- coding: utf-8 -*-
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config:
    SECRET_KEY = os.environ.get('SECRET_KEY') or 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    FLASKY_MAIL_SUBJECT_PREFIX = '[Flasky]'
    FLASKY_MAIL_SENDER = 'Flasky Admin <flasky@example.com>'
    FLASKY_ADMIN = os.environ.get('FLASKY_ADMIN')
    @staticmethod
    def init_app(app):
        pass

# 开发环境的配置
class DevelopmentConfig(Config):
    DEBUG = True
    MAIL_SERVER = 'smtp.googlemail.com'
    MAIL_PORT = 587
    MAIL_USE_TLS = True
    MAIL_USERNAME = os.environ.get('MAIL_USERNAME')
    MAIL_PASSWORD = os.environ.get('MAIL_PASSWORD')
    SQLALCHEMY_DATABASE_URI = "mysql://root:123456@localhost/flasktestdb"
    RECAPTCHA_PUBLIC_KEY = '6LeYIbsSAAAAACRPIllxA7wvXjIE411PfdB2gt2J'
    RECAPTCHA_PRIVATE_KEY = '6LeYIbsSAAAAAJezaIq3Ft_hSTo0YtyeFG-JgRtu'

# 测试环境的配置
class TestingConfig(Config):
    TESTING = True
    SQLALCHEMY_DATABASE_URI = "mysql://root:123456@localhost/flasktestdb"
    RECAPTCHA_PUBLIC_KEY = '6LeYIbsSAAAAACRPIllxA7wvXjIE411PfdB2gt2J'
    RECAPTCHA_PRIVATE_KEY = '6LeYIbsSAAAAAJezaIq3Ft_hSTo0YtyeFG-JgRtu'

# 生产环境的配置
class ProductionConfig(Config):
    SQLALCHEMY_DATABASE_URI = "mysql://root:123456@localhost/flasktestdb"

    RECAPTCHA_PUBLIC_KEY = '6LeYIbsSAAAAACRPIllxA7wvXjIE411PfdB2gt2J'
    RECAPTCHA_PRIVATE_KEY = '6LeYIbsSAAAAAJezaIq3Ft_hSTo0YtyeFG-JgRtu'

config = {
    'development': DevelopmentConfig,
    'testing': TestingConfig,
    'production': ProductionConfig,
    'default': DevelopmentConfig
}
app应用(
app/__init__.py
)

# -*- coding: utf-8 -*-
from flask import Flask, render_template
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from config import config
from flask_login import LoginManager

bootstrap = Bootstrap()
mail = Mail()
db = SQLAlchemy()
login_manager = LoginManager()
# None basic strong
login_manager.session_protection = "strong"
login_manager.login_view = "main.login"
login_manager.login_message = u'请先登录'
app = Flask(__name__, static_url_path='')

# jquery.tmpl 和 jinja2 模板语法冲突 修改 jinja2的模板语法
app.jinja_env.variable_start_string = '{{ '
app.jinja_env.variable_end_string = ' }}'

def create_app(config_name):
    app.config.from_object(config[config_name])
    config[config_name].init_app(app)
    bootstrap.init_app(app)
    mail.init_app(app)
    db.init_app(app)
    login_manager.init_app(app)
    
# 项目启动时自动创建数据库
    with app.test_request_context():
        from .models import User,Docu
bd28
ment,Video
        db.create_all()

    # 注册main组件的蓝图
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)
    
    # 注册admin组件的蓝图
    from .admin import admin as admin_blueprint
    app.register_blueprint(admin_blueprint)
    
    # 注册course组件的蓝图
    from .course import course as course_blueprint
    app.register_blueprint(course_blueprint)

    return app
app中的models.py 文件是数据库模型,emails.py 是发邮件

运行文件(
manager.py

# -*- coding: utf-8 -*-
import os
from app import create_app, db
from flask_script import Manager,Server

app = create_app(os.getenv('FLASK_CONFIG') or 'default')

manager = Manager(app)
#开启多线程
manager.add_command("runserver", Server(threaded=True))

if __name__ == '__main__':
    manager.run()
admin组件(
admin/
__init__.py

[code]# -*- coding: utf-8 -*-
from flask import Blueprint
#创建蓝图admin
admin = Blueprint('admin', __name__)
#从当前文件夹导入views和errors文件,定义的视图/路由就会加载。
from . import views,errors
main和course包中的
__init__.py
文件是一样的创建,注意要把名字改一下。

每个蓝图的错误页面是一样的(
errors.py

[code]# -*- coding: utf-8 -*-
from flask import render_template
from . import admin

@admin.app_errorhandler(404)
def page_not_found(e):
    return render_template('404.html'), 404

@admin.app_errorhandler(500)
def internal_server_error(e):
    return render_template('500.html'), 500
在错误页面里面只定义了404和500的错误
flask 蓝图框架已经搭建完成,剩下的只需要完成各个模块的功能路由即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: