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