隨着功能的添加,路由越來越多,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 <[email protected]>'
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,Document,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
# -*- coding: utf-8 -*-
from flask import Blueprint
#創建藍圖admin
admin = Blueprint('admin', __name__)
#從當前文件夾導入views和errors文件,定義的視圖/路由就會加載。
from . import views,errors
main和course包中的
文件是一樣的創建,注意要把名字改一下。__init__.py
- 每個藍圖的錯誤頁面是一樣的(
errors.py
)
# -*- 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 藍圖框架已經搭建完成,剩下的只需要完成各個模塊的功能路由即可。