1. 程式人生 > >flask-專案結構

flask-專案結構

專案結構

【多檔案 Flask 程式的基本結構】

4 個頂級資料夾:
- app 目錄包含Flask 程式;
- migrations 資料夾包含資料庫遷移指令碼
- tests 目錄包含測試程式碼;
- venv 目錄包含 Python 虛擬環境。

同時還建立了一些新檔案:

  • requirements.txt 列出了所有依賴包,便於在其他電腦中重新生成相同的虛擬環境;
  • config.py 儲存配置;
  • manage.py 用於啟動程式以及其他的程式任務。

配置選項:config.py

程式經常需要設定多個配置。這方面最好的例子就是開發、測試和生產環境要使用不同的資料庫,
這樣才不會彼此影響。

我們使用層次結構的配置類。 config.py 文
件的內容如下所示:

【 config.py】

# coding:utf-8
import os

basedir = os.path.abspath(os.path.dirname(__file__))

# 基類
class Config:
    SECRET_KEY = 'hard to guess string'
    SQLALCHEMY_COMMIT_ON_TEARDOWN = True
    FLASKY_MAIL_SUBJECT_PREFIX = '[Flask]'
    FLASKY_MAIL_SENDER = 'Flask Admin'
FLASKY_ADMIN = 'dimples' @staticmethod def init_app(app): pass # 開發環境 class DevelopmentConfig(Config): DEBUG = True SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data-dev.sqlite') # 測試環境 class TestingConfig(Config): TESTING = True SQLALCHEMY_DATABASE_URI = 'sqlite:///'
+ os.path.join(basedir, 'data-test.sqlite') # 生產環境 class ProductionConfig(Config): SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'data.sqlite') # 設定一個config 字典中,註冊了不同的配置環境 config = { 'development': DevelopmentConfig, 'testing': TestingConfig, 'production': ProductionConfig, 'default': DevelopmentConfig

基類 Config 中包含通用配置,子類分別定義專用的配置,主要是資料庫。在 3 個子類中,
SQLALCHEMY_DATABASE_URI 變數都被指定了不同的值。這樣程式就可在不同的配置環境中執行,每
個環境都使用不同的資料庫。

配置類可以定義 init_app() 類方法,其引數是程式例項。在這個方法中,可以執行對當前環境的
配置初始化。現在,基類 Config 中的 init_app() 方法為空。

程式包:app/

程式包用來儲存程式的所有程式碼、模板和靜態檔案。我們可以把這個包直接稱為 app(應用),
可使用一個程式專用名字。

templates 和 static 資料夾是程式包的一部分,因此這兩個資料夾移到了 app 中。 資料庫模型和電子郵件支援函式也被移到了這個包中,分別儲存為
app/models.py 和 app/email.py。

1.程式工廠函式:app/_init_.py

為了提高測試覆蓋度,必須在不同的配置環境中執行程式。

這個問題的解決方法是延遲建立程式例項, 把建立過程移到可顯式呼叫的工廠函式中。這種方法不
僅可以給指令碼留出配置程式的時間,還能夠建立多個程式例項,這些例項有時在測試中非常有用。
程式的工廠函式在 app 包的構造檔案中定義,如下所示。

【app/init.py】

from flask import Flask
from flask_bootstrap import Bootstrap
from flask_mail import Mail
from flask_sqlalchemy import SQLAlchemy
from config import config

bootstrap = Bootstrap()
mail = Mail()
db = SQLAlchemy()

# 工廠函式
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)
    db.init_app(app)

    #註冊藍本
    from .main import main as main_blueprint
    app.register_blueprint(main_blueprint)

    return app

構造檔案匯入了大多數正在使用的 Flask 擴充套件。由於尚未初始化所需的程式例項,所以沒有初始化
擴充套件, 建立擴充套件類時沒有向建構函式傳入引數。

create_app() 函式就是程式的工廠函式,接受一
個引數,是程式使用的配置名。配置類在 config.py 檔案中定義,其中儲存的配置可以使用 Flask
app.config 配置物件提供的 from_object() 方法直接匯入程式。至於配置物件, 則可以通過名字
從 config 字典中選擇。程式建立並配置好後,就能初始化擴充套件了。在之前建立的擴充套件物件上呼叫
init_app() 可以完成初始化過程。

2. 在藍本中實現程式功能:app/main/_init_.py

轉換成程式工廠函式的操作讓定義路由變複雜了。在單指令碼程式中,程式例項存在於全域性作用域
中, 路由可以直接使用 app.route 修飾器定義。但現在程式在執行時建立,只有呼叫
create_app() 之後才能使用 app.route 修飾器,這時定義路由就太晚了。和路由一樣,自定義的錯誤頁面處理程式也面臨相同的困難,因為錯誤頁面處理程式使用 app.errorhandler 修飾器定
義。

Flask 使用藍本提供了更好的解決方法。 藍本和程式類似,也可以定義路由。不同的是,在藍本中定義的路由處於休眠狀態, 直到藍本註冊到程式上後,路由才真正成為程式的一部分。使用
位於全域性作用域中的藍本時,定義路由的方法幾乎和單指令碼程式一樣。

和程式一樣, 藍本可以在單個檔案中定義,也可使用更結構化的方式在包中的多個模組中建立。為
了獲得最大的靈活性,程式包中建立了一個子包,用於儲存藍本。下面是這個子包的構造檔案,藍
本就創建於此:

【app/main/init.py】

from flask import Blueprint
main = Blueprint('main', __name__)
from . import views, errors

通過例項化一個 Blueprint 類物件可以建立藍本。
這個建構函式有兩個必須指定的引數:藍本的名
字和藍本所在的包或模組。 和程式一樣,大多數情況下第二個引數使用 Python 的name 變數。

程式的路由儲存在包裡的 app/main/views.py 模組中,而錯誤處理程式儲存在
app/main/errors.py 模組中。 匯入這兩個模組就能把路由和錯誤處理程式與藍本關聯起來。注
意,這些模組在 app/main/init.py 指令碼的末尾匯入,這是為了避免迴圈匯入依賴,因為在
views.py 和 errors.py 中還要匯入藍本 main。

藍本在app/init.py的工廠函式 create_app() 中註冊到程式上。

【app/main/errors.py:藍本中的錯誤處理程式】

from flask import render_template
from . import main

@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

在藍本中編寫錯誤處理程式稍有不同,如果使用 errorhandler 修飾器,那麼只有藍本中的錯誤才
能觸發處理程式。要想註冊程式全域性的錯誤處理程式,必須使用 app_errorhandler。

【app/main/views.py:藍本中定義的程式路由】

from flask import render_template, session, redirect, url_for, current_app
from .. import db
from ..models import User
from ..email import send_email
from . import main
from .forms import NameForm

@main.route('/', methods=['GET', 'POST'])
def index():
    form = NameForm()

   if form.validate_on_submit():
        user = User.query.filter_by(username=form.name.data).first()
        if user is None:
            user = User(username=form.name.data)
            db.session.add(user)
            session['known'] = False
            if current_app.config['FLASKY_ADMIN']:
                send_email(current_app.config['FLASKY_ADMIN'], 'New User',
                           'mail/new_user', user=user)
        else:
            session['known'] = True
        session['name'] = form.name.data
        return redirect(url_for('.index'))
    return render_template('index.html',
                           form=form, name=session.get('name'),
                           known=session.get('known', False))

在藍本中編寫檢視函式主要有兩點不同:
- 第一,和前面的錯誤處理程式一樣,路由修飾器由藍本提供;
- 第二, url_for() 函式的用法不同。

url_for() 函式的第一個引數是路由的
端點名, 在程式的路由中,預設為檢視函式的名字。例如,在單指令碼程式中, index() 檢視函式
的 URL 可使用 url_for(‘index’) 獲取。

在藍本中就不一樣了, Flask 會為藍本中的全部端點加上一個名稱空間,這樣就可以在不同的藍本
中使用相同的端點名定義檢視函式, 而不會產生衝突。名稱空間就是藍本的名字(Blueprint 構造
函式的第一個引數),所以檢視函式 index() 註冊的端點名是 main.index,其 URL 使用
url_for(‘main.index’) 獲取。

url_for() 函式還支援一種簡寫的端點形式,在藍本中可以省略藍本名.

例如 url_for(‘.index’)。

在這種寫法中,名稱空間是當前請求所在的藍本。這意味著同一藍本中的重定
向可以使用簡寫形式,但跨藍本的重定向必須使用帶有名稱空間的端點名。

為了完全修改程式的頁面,表單物件也要移到藍本中,保存於 app/main/forms.py 模組。

3. 啟動指令碼:manage.py

頂級資料夾中的 manage.py 檔案用於啟動程式。指令碼內容如下所示

【manage.py】

#!/usr/bin/env python
from app import create_app, db
from flask_script import Manager
from flask_migrate import Migrate, MigrateCommand

app = create_app('default')
manager = Manager(app)
migrate = Migrate(app, db)

manager.add_command('db', MigrateCommand)

if __name__ == '__main__':
    manager.run()

這個指令碼先使用工廠函式建立程式。然後初始化 Flask-Script、 Flask-Migrate。出於便利,指令碼
中加入了#!/usr/bin/env python 宣告,所以在基於 Unix 的作業系統中可以通過 ./manage.py 執行腳
本,而不用使用複雜的 python manage.py。

4. 需求檔案:requirements.txt

程式中必須包含一個 requirements.txt 檔案,用於記錄所有依賴包及其精確的版本號。如果要在
另一臺電腦上重新生成虛擬環境, 這個檔案的重要性就體現出來了,例如部署程式時使用的電腦。
pip 可以使用如下命令自動生成這個檔案:

(venv) $ pip freeze >requirements.txt

安裝或升級包後,最好更新這個檔案。
如果你要建立這個虛擬環境的完全副本,可以建立一個新的虛擬環境,並在其上執行以下命令:

(venv) $ pip install -r requirements.txt

5. 建立資料庫

重組後的程式和單指令碼版本使用不同的資料庫。3種配置環境中的資料庫檔名都不一樣。例如,
在開發環境中,資料庫使用名為data-dev.sqlite 的 SQLite 資料庫。

不管是什麼環境的資料庫,都要在新資料庫中建立資料表。如果使用 Flask-Migrate 跟蹤遷移,可
使用如下命令建立資料表或者升級到最新修訂版本:

(venv) $ python manage.py db upgrade

相關推薦

使用藍圖建立flask專案結構

程式目錄結構 flask/ |-- app/ # 程式包,程式的主體檔案都包含在內 |-- main/ |-- __init__.py |-- views.py |-- errors.py |-- templates/ |-- index.html

一個比較良好的flask專案結構

一個比較良好的flask專案結構   project/     app/                

flask-專案結構

專案結構 【多檔案 Flask 程式的基本結構】 4 個頂級資料夾: - app 目錄包含Flask 程式; - migrations 資料夾包含資料庫遷移指令碼 - tests 目錄包含測試程式碼; - venv 目錄包含 Python 虛

聊聊Flask專案結構(一)——怎麼使用藍圖使專案程式碼模組化

.idea資料夾是Pycharm IDE的快取檔案,這個是我推薦大家使用的IDE manage.py 是啟動服務的檔案,之前我們也把檢視路由放在這個檔案中,這在實戰中是不推薦的,因為如果我們有很多個頁面的話,單個manage.py檔案都會非常的大,管理和維護起

使用Nginx和Gunicorn在伺服器上部署Flask專案

Flask作為一個Web框架雖然自帶Web伺服器,但其Web伺服器主要用於開發階段的測試,在生產環境中應該選擇更專業的Web伺服器。當然在Web框架和Web伺服器之間還需要一個實現了WSGI協議的容器協助Web框架和Web伺服器之間通訊。 常用的WSGI協議容器有Gunicorn和uWSGI,當

flask專案--新聞類專案

1.Flask專案基本設定 資料庫配置-Flask-SQLAlchemy擴充套件使用。 from flask_sqlalchemy import SQLAlchemy class Config(object): “”“專案配置類”"" # 資料庫相關配置 # 使用的資料庫連結地址

Vue筆記——專案結構說明

說明:資料夾=黃色,檔案=綠色 資料夾 說明 包含內容 包含內容說明 build webpa相關配置,或構建指令碼的目錄 build.js 生產環境構建檔案

maven管理平臺專案結構分析

後臺管理平臺專案結構: 1 JAX-WS Web Service(不用,是maven自動生成的) 2 java Resources(最常用,也是maven自動生成的,不是手動建立的) 3 JavaScript Resources(不用,是maven自動生成的,不是手動建立的) 4 Deployed

vue腳手架專案結構

build, config資料夾:webpack配置相關 node_modules資料夾:腳手架所需的依賴也就是npm install安裝的 src資料夾:專案位置 static資料夾:存放第三方靜態資源 .babelrc檔案:babel配置 實現js轉譯 .editorconfig檔案:編輯器的風

Scrapy學習(二)、安裝及專案結構

一、安裝 1、安裝pywin32,下載地址:https://sourceforge.net/projects/pywin32/files/pywin32/ 我選擇的是Build 221,點進去,根據自己電腦的python版本下載對應的版本 下載下來後,直接執行exe檔案,無腦下一步,直至安裝完成

從零開始Vue專案實戰(三)-專案結構

現在在瀏覽器中輸入http://localhost:8083,可以看到初始的“Welcome to Your Vue.js App”頁面了 目錄結構 ├── README.md 專案介紹 ├── index.html 入口頁面 ├── build

Python程式設計:將Flask專案部署到免費伺服器Heroku

官網也給出了步驟,不過需要brew下載客戶端,本文使用github部署,程式碼保持同步 頁面打不開就掛全域性代理 註冊賬號 https://www.heroku.com/ 新建APP https://dashboard.heroku.com/apps 按照以下路徑建立

Vue.js系列之專案結構說明

轉:https://www.jb51.net/article/111658.htm 前言 在上一篇專案搭建文章中,我們已經下載安裝了node環境以及vue-cli,並且已經成功構建了一個vue-cli專案,那麼接下來,我們來梳理一下vue-cli專案的結構。 總體框架 一個

仿有贊後臺+vue+ts+vuecli3.0+elementUi+三期aixo的使用vueX的使用element的引入專案結構的搭建

前言 生病了,沒有及時寫上,各位觀眾老爺抱歉,今天寫上第三期的應該比較乾貨,具體講我們怎麼搭建專案,以及怎麼和後端進行互動,element的引入,vuex在ts改版後的使用方式當前專案demo預覽 游泳健身瞭解一下:githubJQ外掛 技術文件 技術文件會持續更新 內容總結 專案

flask 專案 部署伺服器,package安裝問題(無外網連結)

1.安裝所需的環境/包 1) 在一臺開發機器(有網路,編譯成功)安裝package: pipreqs 語法: pipreqs <專案路徑> 將會到處專案所使用的所有包目錄將會匯出至目錄:requirems.txt 2) 離線下載所有包 pip download -d c:/pack

在Windows下用Apache+wsgi部署python+flask專案

一. 安裝Apache 從http://www.apachelounge.com/download/  下載最近版本的Apache 解壓到D盤下,我的80埠已經被佔用了,所以需要修改配置檔案:D:/Apache24/conf/httpd.conf 找到Define SRVR

vue-cli#2.0專案結構分析

專案結構 build 構建工具相關的目錄 config 配置目錄 dist 通過工具打包生成的最終需要上線的目錄 node_modules 存放本地開發所有的依賴包的目錄 src 原始碼目錄 static 存放圖片等靜態資源的目錄 .babelrc babel是把新的ES語法,編譯

Flask專案小知識

1.make_response # 表示返回響應,引數可以是一個物件,比如圖片,一段html語句 make_response(物件) # 他返回一個response物件,可以設定響應頭資訊 response = make_response(image) # 設定響應頭資訊 respons

Android Studio專案結構

我們建立了一個Android Project,開啟就如下圖所示:  我們選擇Project檢視,就會有以下的專案文件結構:  上面筆者標註的數字是接下來要講解的內容。  我們先來看1:  我們建立Application的時候,要求我們輸入專案名稱,1就

Flask專案實現防止CSRF攻擊的流程

Flask專案實現防止CSRF攻擊的流程 a) 使用 flask_wtf 中 CSRFProtect類,初始化該類並傳入app b) 使用 flask_wtf.csrf模組中的generate_csrf方法生成csrf_token c) 使用請求勾子 after_req