Flask 系列之 優化項目結構
- 2020 年 1 月 16 日
- 筆記
說明
- 作業系統:Windows 10
- Python 版本:3.7x
- 虛擬環境管理器:virtualenv
- 程式碼編輯器:VS Code
實驗目標
完善環境配置,添加 異常請求 處理
實現
400、404 和 500 處理
首先,在 todolistapptemplateserrors
目錄下創建一個 400.html 文件,示例程式碼如下所示:
{% extends 'base.html' %} {% block content %} <div class="text-center animated fadeInDown"> <h1>400</h1> <h3> 錯誤請求!! !</h3> <div> <a href="{{ url_for('index') }}">返回首頁</a> </div> </div> {% endblock %}
在 todolistapptemplateserrors
目錄下創建一個 404.html 文件,示例程式碼如下所示:
{% extends 'base.html' %} {% block content %} <div class="text-center animated fadeInDown"> <h1>404</h1> <h3> 頁面未能夠找到!! !</h3> <div> 抱歉,頁面好像去火星啦! </div> </div> {% endblock %}
在 todolistapptemplateserrors
目錄下創建一個 500.html 文件,示例程式碼如下所示:
{% extends 'base.html' %} {% block content %} <div class="text-center animated fadeInDown"> <h1>500</h1> <h3> 內部異常!! !</h3> <div> <a href="{{ url_for('index') }}">返回首頁</a> </div> </div> {% endblock %}
接著,在 todolistapp
目錄下創建 errors.py 文件,,註冊 400、 404 、500 路由處理函數,示例程式碼如下所示:
from flask import render_template from app import app @app.errorhandler(400) def bad_request(e): return render_template('errors/400.html'), 400 @app.errorhandler(404) def page_not_found(e): return render_template('errors/404.html'), 404 @app.errorhandler(500) def internal_server_error(e): return render_template('errors/500.html'), 500
添加 CLI
在 todolistapp
目錄下創建 commands.py 文件,示例程式碼如下所示:
import click from app import app, db from app.models import User, Thing @app.cli.command() @click.option('--drop', is_flag=True, help='Create after drop.') def initdb(drop): if drop: db.drop_all() db.create_all() print("Initialized database.") @app.cli.command() @click.option('--username', prompt=True, help='The username used to login.') @click.option('--email', prompt=True, help='The email used to Identity.') @click.option('--password', prompt=True, hide_input=True, confirmation_prompt=True, help='The password used to login.') def admin(username, email, password): db.create_all() user = User.query.first() if user: print("Updating user...") user.name = username user.email = email user.generate_password_hash(password) else: print("Creating user...") user = User(name="hippieZhou") user.email = email user.generate_password_hash(password) db.session.add(user) db.session.commit() print('Done.')
此時,可以將 VS Code 的終端卻換至該項目根目錄下,可執行上面我們自定義的相關目錄,如下圖所示:

使用前需要先進入到 app 中,具體可參考 下面的
todolistapp__init__.py
程式碼。
完善 Config 配置
首先,修改 todolistconfig.py
文件,示例程式碼如下所示:
import os basedir = os.path.abspath(os.path.dirname(__file__)) class Config(object): SQLALCHEMY_TRACK_MODIFICATIONS = False SECRET_KEY = "you will never known it." class DevelpmentConfig(Config): DEBUG = True SQLALCHEMY_DATABASE_URI = os.environ.get( 'DEV_DATABASE_URL') or 'sqlite:///' + os.path.join(basedir, 'todo.sqlite') class ProductionConfig(Config): DEBUG = False SQLALCHEMY_DATABASE_URI = os.environ.get( 'SQLALCHEMY_DATABASE_URI') or 'mysql+pymysql://root:[email protected]:3306/todo' config = { 'development': DevelpmentConfig, 'production': ProductionConfig }
接著,修改 todolistapp__init__.py
文件,示例程式碼如下所示:
from flask import Flask from flask_bootstrap import Bootstrap from flask_sqlalchemy import SQLAlchemy from flask_login import LoginManager from config import config app = Flask(__name__) app.config.from_object(config['development']) bootstrap = Bootstrap(app) db = SQLAlchemy(app) login_manager = LoginManager(app) login_manager.login_view = 'login' login_manager.login_message = '你必須登陸後才能訪問該頁面' login_manager.login_message_category = "info" @login_manager.user_loader def load_user(user_id): from app.models import User user = User.query.get(int(user_id)) return user @app.context_processor def inject_user(): from app.models import User user = User.query.first() return dict(user=user) from app import views, errors,commands
最後,修改 todolistmanage.py
文件,示例程式碼如下所示:
from app import app if __name__ == "__main__": app.run(debug=True, host='0.0.0.0', port=5000)
自此,我們的項目結構和程式碼已經進一步完善了,完整項目結構如下圖所示:

最後,我們可以在 Shell 窗口中執行 flask run 命令即可將我們的網站運行起來。