初始化 flask 环境pip install pipenv mkdir flaskypipenv shellpipenv install flask# 安装插件pipenv install flask-sqlalchemy flask-migrate flask-wtf flask-mail pymysqlmkdir app创建 .env 文件,在使用pipenv的时候会载入.env 文件# .envFLASK_APP=run.pyFLASK_DEBUG = 1app初始化新建初始化文件,使用工厂函数来创建 app 以便后续写unittest的时候,能够动态的传入不同的配置,从而生成 app 实例。# app/init.pyfrom flask import Flask from config import configfrom flask_sqlalchemy import SQLAlchemyfrom flask_mail import Mail# 数据库连接db = SQLAlchemy()# 发送邮件mail = Mail()def create_app(config_name): app = Flask(name) app.config.from_object(config[config_name]) # 初始化各种插件 config[config_name].init_app(app) db.init_app(app) mail.init_app(app) return app配置文件初始化新建config.py# config.py# coding: utf-8import os class Config(object): SECRET_KEY = os.getenv(‘SECRET’) MAIL_SERVER = os.getenv(‘MAIL_SERVER’) MAIL_PORT = os.getenv(“MAIL_PORT”) MAIL_USE_TLS = os.getenv(“MAIL_USE_TLS”) MAIL_USERNAME = os.getenv(“MAIL_USERNAME”) MAIL_PASSWD = os.getenv(“MAIL_PASSWD”) SQLALCHEMY_TRACK_MODIFICATIONS = False def init_app(self): pass class DevConfig(Config): DEBUG = True SQLALCHEMY_DATABASE_URI = os.getenv(“DEV_SQLALCHEMY_DATABASE_URI”) or “mysql+pymysql://root:qwe123@127.0.0.1/flasky"class TestingConfig(Config): Testing = True SQLALCHEMY_DATABASE_URI = os.getenv(“TEST_SQLALCHEMY_DATABASE_URI”) or “mysql+pymysql://root:qwe123@127.0.0.1/flasky"class ProdConfig(Config): SQLALCHEMY_DATABASE_URI = os.getenv(“SQLALCHEMY_DATABASE_URI”) or “mysql+pymysql://root:qwe123@127.0.0.1/flasky"config = { “dev”:DevConfig, “test”:TestingConfig, “prod”:ProdConfig, “default”:DevConfig}添加内容到 .env 文件# .env…SECRET_KEY = 81785a8c-1f9a-4cfb-bc9d-90a8374bbc15 MAIL_SERVER = xxxMAIL_PORT = xxxMAIL_USE_TLS = xxMAIL_USERNAME = testerMAIL_PASSWD = qwe123DEV_SQLALCHEMY_DATABASE_URI= xxxTEST_SQLALCHEMY_DATABASE_URI=xxxSQLALCHEMY_DATABASE_URI = xxx初始化log当应用运行起来的时候,最佳的做法不应该将错误信息直接输出到页面上让用户看到,这样做既不专业,也不安全。最佳的做法是当应用发生错误的时候,应该直接将用户导向 500 页面,然后将发生的错误使用log记录下来供开发进行调查。# app/init.pyfrom logging.handlers import SMTPHandler,RotatingFileHandlerdef create_app(config_name): … if not app.debug: # 记录到文件 if not os.path.exists(’logs’): os.mkdir(’logs’) file_handler = RotatingFileHandler(’logs/flasky.log’,maxBytes=10240,backupCount=10) file_handler.setFormatter(logging.Formatter( ‘%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]’)) file_handler.setLevel(logging.INFO) app.logger.addHandler(file_handler) app.logger.info(‘app start.’) # 发送邮件,可不设置 auth = None if app.config[‘MAIL_USERNAME’] or app.config[‘MAIL_PASSWD’]: auth = (app.config[‘MAIL_USERNAME’],app.config[‘MAIL_PASSWD’]) secure = None if app.config[‘MAIL_USE_SSL’]: secure = () mail_handler = SMTPHandler( mailhost=app.config[‘MAIL_SERVER’], fromaddr=app.config[‘MAIL_USERNAME’], toaddrs=app.config[‘ADMINS’], subject=“flasky Error”, credentials=auth,secure=secure) mail_handler.setLevel(logging.ERROR) app.logger.addHandler(mail_handler)蓝图 / 即插视图使用功能模块来分割蓝图,使用即插视图来分离路由和逻辑处理。方便代码管理。新建 index 文件夹,并添加 init.py 文件# index/init.pyfrom flask import Blueprintindex_bp = Blueprint(“index”,name)from . import views,routes# index/views.pyfrom flask.views import MethodView from flask import render_templateclass Index(MethodView): def get(self): return render_template(“index.html”)# index/routes.pyfrom index import index_bpfrom index.views import Indexindex_bp.add_url_rule(’/’,view_func=Index.as_view(‘index’))# 当需要url_for 的时候,可以使用 index 这个名字 index.index# url_for(‘index.index’) index 可以类比为就是这个函数的名字以上完成了一个蓝图的基本设置。接下来添加蓝图到app实例# app/init.pydef create_app(config_name): … from app.index import index_bp app.register_blueprint(index_bp) … return app测试测试初始化功能是否正常pipenv shellflask run 打开 http://localhost:5000 查看是否存在错误代码地址:https://github.com/TheFifthMa…参考推荐阅读: 《OReilly.Flask.Web.Development.2nd.Edition》