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 命令即可將我們的網站運行起來。