程序目录结构
flask/
|-- app/ # 程序包,程序的主体文件都包含在内
|-- main/
|-- __init__.py
|-- views.py
|-- errors.py
|-- templates/
|-- index.html
|-- static/
|-- __init__.py
|--config.py # 配置选项
|--manage.py # 程序启动脚本
|--requirements.txt # 需求文件
配置选项
# 程序的配置
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 = os.environ.get('DEV_DATABASE_URL') or \
'sqllite:///' + os.path.join(basedir, 'data-dev.sqlite')
class ProductionConfig(Config):
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data.sqlite')
class TestingConfig(Config):
TESTING = True
SQLALCHEMY_DATABASE_URI = os.environ.get('TEST_DATABASE_URL') or \
'sqlite:///' + os.path.join(basedir, 'data-test.sqlite')
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_moment import Moment
from config import config
bootstrap = Bootstrap()
mail = Mail()
moment = Moment()
def create_app(config_name):
'''程序的工厂函数'''
app = Flask(__name__)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
# 初始化扩展
bootstrap.init_app(app)
mail.init_app(app)
moment.init_app(app)
# 注册蓝本
from .main import main as main_blueprint
app.register_blueprint(main_blueprint)
return app
创建蓝本
app/main/__init__.py
# -*- coding: utf-8 -*-
# 创建蓝本
from flask import Blueprint
main = Blueprint('main', __name__)
from . import views, errors
定义蓝本中的路由
app/main/views.py
# -*- coding: utf-8 -*-
# 蓝本中定义的程序路由
from datetime import datetime
from flask import render_template, session, redirect, url_for
from . import main
@main.route('/', methods=['GET', 'POST'])
return "hello world"
定义蓝本中的错误处理程序
app/main/errors.py
# -*- coding: utf-8 -*-
# 蓝本中的错误处理程序
from flask import render_template
from . import main
# 如果使用 errorhandler 修饰器,那么只有蓝本中的
# 错误才能触发处理程序。要想注册程序全局的错误处理程序,必须使用 app_errorhandler
@main.app_errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@main.app_errorhandler(500)
def internal_server_error(e):
return render_template('500.html'), 500
启动脚本
manage.py
# -*- coding: utf-8 -*-
# 启动脚本
import os
from app import create_app
app = create_app(os.getenv('FLASK_CONFIG') or 'default')
if __name__ == '__main__':
app.run()
需求文件
程序中必须包含一个 requirements.txt 文件,用于记录所有依赖包及其精确的版本号。如果
要在另一台电脑上重新生成虚拟环境, 这个文件的重要性就体现出来了,例如部署程序时
使用的电脑。 pip 可以使用如下命令自动生成这个文件:
(venv) $ pip freeze >requirements.txt
文章完结
@快乐是一切