pip install pipenv mkdir flasky pipenv shell pipenv install flask # 安裝插件 pipenv install flask-sqlalchemy flask-migrate flask-wtf flask-mail pymysql mkdir app
建立 .env 文件,在使用pipenv的時候會載入.env 文件html
# .env FLASK_APP=run.py FLASK_DEBUG = 1
新建初始化文件,使用工廠函數來建立 app 以便後續寫unittest的時候,可以動態的傳入不一樣的配置,從而生成 app 實例。mysql
# app/__init__.py from flask import Flask from config import config from flask_sqlalchemy import SQLAlchemy from 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.pygit
# config.py # coding: utf-8 import 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 文件github
# .env ... SECRET_KEY = 81785a8c-1f9a-4cfb-bc9d-90a8374bbc15 MAIL_SERVER = xxx MAIL_PORT = xxx MAIL_USE_TLS = xx MAIL_USERNAME = tester MAIL_PASSWD = qwe123 DEV_SQLALCHEMY_DATABASE_URI= xxx TEST_SQLALCHEMY_DATABASE_URI=xxx SQLALCHEMY_DATABASE_URI = xxx
當應用運行起來的時候,最佳的作法不該該將錯誤信息直接輸出到頁面上讓用戶看到,這樣作既不專業,也不安全。最佳的作法是當應用發生錯誤的時候,應該直接將用戶導向 500 頁面,而後將發生的錯誤使用log記錄下來供開發進行調查。sql
# app/__init__.py from logging.handlers import SMTPHandler,RotatingFileHandler def 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 文件shell
# index/__init__.py from flask import Blueprint index_bp = Blueprint("index",__name__) from . import views,routes # index/views.py from flask.views import MethodView from flask import render_template class Index(MethodView): def get(self): return render_template("index.html") # index/routes.py from index import index_bp from index.views import Index index_bp.add_url_rule('/',view_func=Index.as_view('index')) # 當須要url_for 的時候,能夠使用 index 這個名字 index.index # url_for('index.index') index 能夠類比爲就是這個函數的名字
以上完成了一個藍圖的基本設置。接下來添加藍圖到app實例數據庫
# app/__init__.py def create_app(config_name): ... from app.index import index_bp app.register_blueprint(index_bp) ... return app
測試初始化功能是否正常flask
pipenv shell flask run
打開 http://localhost:5000 查看是否存在錯誤安全
代碼地址:https://github.com/TheFifthMa...app
推薦閱讀: 《OReilly.Flask.Web.Development.2nd.Edition》