Flask 最佳實踐(一)

Flask是一個輕量級而強大的Python Web框架,它的簡潔性和靈活性使其成為許多開發者的首選。然而,為了確保項目的可維護性和可擴展性,我們需要遵循一些最佳實踐。本文將探討Flask中一些關鍵的最佳實踐。

1. 項目結構

構建一個清晰的項目結構是確保項目可維護性的第一步。一個典型的Flask項目結構可能如下:

/myflaskapp/venv                    # 虛擬環境目錄/app/main_blueprint      # 主藍圖/templates           # 模板文件目錄/static              # 靜態文件目錄 (CSS, JS, 圖片等)__init__.pyviews.py/auth_blueprint      # 認證藍圖/templates           # 模板文件目錄/static              # 靜態文件目錄 (CSS, JS, 圖片等)__init__.pyviews.py__init__.py          # 應用包初始化config.py            # 配置文件models.py            # 數據庫模型/migrations              # 數據庫遷移腳本/tests              # 單元測試文件config.py                # 項目配置文件manage.py                # 命令行管理腳本requirements.txt         # 依賴列表

通過按功能組織代碼,能夠更容易地定位和修改特定部分的代碼。

2. __init__.py

在Flask項目中,__init__.py 文件通常包含一些初始化和配置的邏輯。這個文件在一個包(即Flask應用)的根目錄中被放置,它用于定義包的初始化邏輯。以下是一些可能在 __init__.py 文件中出現的常見邏輯:

創建Flask應用實例:
__init__.py中,通常會創建Flask應用的實例。這是整個應用的核心,它負責處理請求和響應。

```python
from flask import Flaskapp = Flask(__name__)
```

配置應用:
__init__.py 中設置應用的配置信息,例如數據庫連接、密鑰、調試模式等。

```python
app.config['DEBUG'] = True
app.config['SECRET_KEY'] = 'your_secret_key'
```

注冊藍圖:
如果使用了Flask的藍圖(Blueprint)來組織應用,那可以在 __init__.py 中導入并注冊這些藍圖。

```python
from .views import main_blueprintapp.register_blueprint(main_blueprint)
```

初始化數據庫或其他擴展:
如果使用了數據庫或其他Flask擴展,那可以在 __init__.py 中初始化這些擴展。

```python
from flask_sqlalchemy import SQLAlchemydb = SQLAlchemy(app)
```

定義全局變量或常量:
__init__.py 中可以定義一些全局的變量或常量,以便在整個應用中共享。

```python
MAX_ITEMS_PER_PAGE = 10
```

錯誤處理:
可以在 __init__.py 中定義全局的錯誤處理器,處理應用中可能發生的錯誤。

```python
@app.errorhandler(404)
def page_not_found(error):return render_template('404.html'), 404
```

總體而言,__init__.py 是整個應用的入口點,可以在其中組織和配置應用的基本元素。然而,隨著項目的增長,最好將不同的功能劃分到不同的模塊或文件中,以保持代碼的清晰性和可維護性。

3. 藍圖

Flask藍圖(Blueprint)是一種組織和分隔Flask應用的方式,它允許你將應用劃分為模塊化的組件。使用藍圖,你可以更好地組織代碼、提高可維護性,并支持應用的可擴展性。

藍圖的優勢
  1. 模塊化組織: 藍圖允許你將應用劃分為獨立的模塊,每個模塊可以包含自己的路由、模板、靜態文件等。

  2. 可復用性: 你可以將藍圖定義在一個應用中,然后在其他應用中重復使用,促使代碼重用。

  3. 命名空間隔離: 藍圖允許你使用相同的路由路徑,但在不同的藍圖中。這有助于在大型應用中防止路由沖突。

  4. 延遲綁定: 使用藍圖,你可以在應用對象已經存在后再注冊路由。這對于工廠模式創建應用實例很有用。

藍圖使用實例

步驟1:創建藍圖

# app/index/__init__.pyfrom flask import Blueprintindex_blueprint = Blueprint('index', __name__,url_prefix="/index",template_folder="templates",static_folder="static")from . import views
# app/auth/__init__.pyfrom flask import Blueprintauth_blueprint = Blueprint('auth', __name__)from . import views

步驟2:在藍圖中定義路由

# app/index/views.pyfrom . import index_blueprint@index_blueprint.route('/')
def index():return render_template('index.html')
# auth/views.pyfrom . import auth_blueprint@auth_blueprint.route('/login')
def login():return 'Login page'@auth_blueprint.route('/logout')
def logout():return 'Logout page'

步驟3:創建 Flask 應用和藍圖

# app/__init__.pyfrom flask import Flask
from .index import index_blueprintapp = Flask(__name__)# 注冊藍圖
app.register_blueprint(index_blueprint)
app.register_blueprint(auth_blueprint)

步驟4:使用藍圖中的模板

app/index/templates 目錄下創建一個模板文件,例如 index.html

<!-- app/index/templates/index.html --><!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Main Page</title><link rel="stylesheet" href="{{ url_for('index.static',filename='css/index.css') }}"></head>
<body><h1>Hello, this is the main page!</h1>
</body>
</html>
<!-- app/index/static/css/index.css -->
body{color:red;
}
藍圖嵌套

可以把藍圖注冊到另一個藍圖上

parent = Blueprint('parent', __name__, url_prefix='/parent')
child = Blueprint('child', __name__, url_prefix='/child')
parent.register_blueprint(child)
app.register_blueprint(parent)

子藍圖的名稱會以父藍圖的名稱作為前綴,子藍圖的 URL 也會以父藍圖的 URL 前綴作為前綴。

url_for('parent.child.create')
/parent/child/create

注冊在父藍圖上的請求前鉤子及其他鉤子也會在子藍圖上觸發。如果子藍圖未給某錯誤指定處理函數,會去尋找父藍圖上的錯誤處理函數。

訪問藍圖目錄下的靜態文件

可以把文件夾的路徑傳給藍圖的 static_folder 參數來讓藍圖提供靜態文件,它既可以是絕對路徑,也可以是相對于藍圖路徑的相對路徑:

admin = Blueprint('admin', __name__, static_folder='static')

默認情況下,路徑最右端的部分將作為靜態文件的 URL,可以通過指定 static_url_path 來改變。因為上例中文件夾名稱是 static,所以靜態文件可以通過藍圖的 url_prefix 加上 /static 訪問。比如藍圖的 URL 前綴是 /admin,則靜態文件的 URL 為 /admin/static。

端點的名稱是 blueprint_name.static。可以使用 url_for() 來生成 URL,和應用中的靜態文件夾一樣:

url_for('admin.static', filename='style.css')

然而,如果藍圖沒有 url_prefix 屬性,將不能訪問藍圖中的靜態文件。這是因為這個情況下 URL 會是 /static,而應用級的 /static 路由會優先匹配。和模板文件夾不同,當 Flask 在應用的靜態文件夾中找不到文件時,不會去搜索藍圖的靜態文件夾。

訪問藍圖的模板

如果你想在藍圖中暴露模板文件,你可以給 Blueprint 指定 template_folder 參數:

admin = Blueprint('admin', __name__, template_folder='templates')

對靜態文件來說,路徑可以是絕對路徑,也可以相對于藍圖的資源文件夾。

模板文件夾會被添加到模板的搜索路徑中,但比應用的模板文件夾優先級更低。這樣可以很容易地在應用中覆寫藍圖提供的模板。這也意味著如果不希望藍圖模板被意外覆蓋,需要保證模板的相對路徑與其他藍圖或應用的模板都不相同。如果有多個模板有相同的模板相對路徑,第一個被注冊的藍圖中的模板將被選中。

因此,如果藍圖位于 yourapplication/admin 中,想渲染模板 ‘admin/index.html’ 并且你指定了 template_folder 為 templates,那么必須將模板創建為 yourapplication/admin/templates/admin/index.html。 其中包含一個額外的 admin 是為了防止模板被應用模板文件夾中一個名叫 index.html 的模板文件所覆蓋。

進一步闡明:如果有一個名為 admin 的藍圖,希望渲染藍圖的模板 index.html,最好按照如下方式存放模板文件:

yourpackage/blueprints/admin/templates/admin/index.html__init__.py

當需要使用此模板時,使用 admin/index.html 作為查找模板的名稱。如果在加載模板時遇到任何問題,啟用 EXPLAIN_TEMPLATE_LOADING 配置變量,它可以在每次 reder_template 調用時讓 Flask 打印查找模板的步驟。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/209662.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/209662.shtml
英文地址,請注明出處:http://en.pswp.cn/news/209662.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java實現Socket聊天室

一、網絡編程是什么&#xff1f; 在網絡通信協議下&#xff0c;不同計算機上運行的程序&#xff0c;進行數據傳輸。 應用場景&#xff1a;即時通訊、網游對戰、金融證券、國際貿易、郵件、等等。 不管是什么場景&#xff0c;都是計算機與計算機之間通過網絡進行數據傳輸。 …

軟件測試之接口測試自動化(詳解版)

本著以和大家交流如何實現高效的接口測試為出發點&#xff0c;本文包含了我在接口測試領域的一些方法和心得&#xff0c;希望大家一起討論和分享&#xff0c;內容包括但不僅限于&#xff1a; 服務端接口測試介紹接口測試自動化介紹接口測試自動化實踐關于接口測試自動化的思考…

質量工程化,交付快速化

質量和速度之間權衡讓人很難取舍&#xff0c;而通過推進質量工程&#xff0c;以系統化的方式識別和優化系統痛點&#xff0c;可以幫助團隊構建既快又好的精益軟件生產系統。原文: Quality Engineered, Speed Delivered 所有人都想要更快的速度。 但需要解決復雜問題: 權衡質量會…

Kotlin(十四) 擴展函數和運算符重載

目錄 擴展函數 語法結構 代碼示例 運算符重載 語法結構 一元操作符 二元操作符 數值類型操作符 等于和不等于操作符 比較操作符 調用操作符 擴展函數 語法結構 對于擴張函數的語法結構其實很簡單&#xff0c;你想在那個類中添加擴張函數&#xff0c;那么你就用該類…

6. Zigzag Conversion

按照下標找規律注意leetcode的運行輸出&#xff0c;如果其中一組用例出現死循環&#xff0c;輸出結果會在一個文件&#xff0c;即部分測試用例正確&#xff0c;部分錯誤且出現死循環&#xff0c;則需辨別輸出結果屬于哪一份測試用例 class Solution { public:string convert(s…

(二)五種最新算法(SWO、COA、LSO、GRO、LO)求解無人機路徑規劃MATLAB

一、五種算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;簡介 1、蜘蛛蜂優化算法SWO 蜘蛛蜂優化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;該算法模型雌性蜘蛛蜂的狩獵、筑巢和交配行為&…

w3school學習筆記3(NumPy)

系列文章目錄 文章目錄 系列文章目錄前言一、NumPy簡介二、NumPy入門三、NumPy創建四、NumPy數組索引五、NumPy數組裁切六、NumPy數據類型七、NumPy副本/視圖八、NumPy數據形狀九、NumPy數組重塑十、NumPy數組迭代總結 前言 一、NumPy簡介 1、什么是Numpy&#xff1f; NumPy是…

線上盲盒小程序,開啟互聯網盲盒時代

近年來&#xff0c;盲盒經濟在國內非常火爆&#xff0c;各類盲盒品牌層出不窮&#xff0c;深受國內外年輕人、消費者的喜愛。 目前&#xff0c;根據數據顯示&#xff0c;盲盒市場不僅在線下異常火熱&#xff0c;線上盲盒也是成為了大眾的新選擇。各類電商平臺中盲盒的成交額更…

Esxi7Esxi8設置VMFSL虛擬閃存的大小

Esxi7Esxi8設置VMFSL虛擬閃存的大小 ESXi7,8 默認安裝會分配一個 VMFSL(VMFS-L)(Local VMFS)很大空間(120G), 感覺很浪費, 實際給 8G 就可以了, 最少 6G , 經實驗,給2G沒法安裝 . Esxi7是虛擬閃存的 修改的方法是: 在安裝時修改 設置 autoPartitionOSDataSize8192 在cdromBoo…

快捷切換raw頁面到repo頁面-Raw2Repo插件

Raw2Repo By Rick &#x1f4d6;快捷切換代碼托管平臺raw頁面到repo頁面 &#x1f517;github鏈接 https://github.com/rickhqh/Raw2Repo ?Features 功能&#xff1a; ?單擊 Raw2Repo 插件按鈕&#xff0c;即可跳轉到相應的代碼倉庫頁面。?支持 GitHub、Gitee、GitCode …

spring boot整合mybatis進行部門管理管理的增刪改查

部門列表查詢&#xff1a; 功能實現&#xff1a; 需求&#xff1a;查詢數據庫表中的所有部門數據&#xff0c;展示在頁面上。 準備工作&#xff1a; 準備數據庫表dept&#xff08;部門表&#xff09;&#xff0c;實體類Dept。在項目中引入mybatis的起步依賴&#xff0c;mysql的…

【ET8】1.ET8入門-運行指南

主要學習網址 論壇地址為&#xff1a;https://et-framework.cn Git地址為&#xff1a;GitHub - egametang/ET: Unity3D Client And C# Server Framework 官方QQ群 : 474643097 項目檢出 檢出項目切換到release8.0分支 GitHub地址&#xff1a;GitHub - egametang/ET: Unity…

[足式機器人]Part2 Dr. CAN學習筆記-數學基礎Ch0-5Laplace Transform of Convolution卷積的拉普拉斯變換

本文僅供學習使用 本文參考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN學習筆記-數學基礎Ch0-5Laplace Transform of Convolution卷積的拉普拉斯變換 Laplace Transform : X ( s ) L [ x ( t ) ] ∫ 0 ∞ x ( t ) e ? s t d t X\left( s \right) \mathcal{L} \left[ x\lef…

基于Swin_Transformer的圖像超分辨率系統

1.研究背景與意義 項目參考AAAI Association for the Advancement of Artificial Intelligence 研究背景與意義 隨著科技的不斷發展&#xff0c;圖像超分辨率技術在計算機視覺領域中變得越來越重要。圖像超分辨率是指通過使用計算機算法將低分辨率圖像轉換為高分辨率圖像的過…

AI:91-基于深度學習的手寫數學表達式識別

?? 本文選自專欄:人工智能領域200例教程專欄 從基礎到實踐,深入學習。無論你是初學者還是經驗豐富的老手,對于本專欄案例和項目實踐都有參考學習意義。 ??? 每一個案例都附帶有在本地跑過的核心代碼,詳細講解供大家學習,希望可以幫到大家。歡迎訂閱支持,正在不斷更新…

51單片機的時鐘電路與時序以及 復位電路和電源模式

51單片機的時鐘電路與時序以及 復位電路和電源模式 本文主要涉及51單片機的時鐘電路以及相關時序的知識&#xff0c;也講解了了51單片機的復位電路以及電源模式。 文章目錄 51單片機的時鐘電路與時序以及 復位電路和電源模式一、時鐘電路與時序1、 時鐘電路設計1.1 內部時鐘方式…

用stl寫一個自動打分比賽的案例

我們要實現六名選手進行隨機平均分為兩組&#xff0c;先分別淘汰兩組中的最后一名&#xff0c; 再決出第一名。 抽象選手 class player { public:string name;int score; }; 一個選手有名字和分數 首先我們需要vector容器保存選手的編號&#xff0c;便于后續的操作。 再用…

導入PR的視頻畫面是黑屏的怎么辦?

在現代視頻編輯領域中&#xff0c;越來越多的人使用Adobe Premiere Pro來編輯和制作視頻&#xff0c;但是在某些情況下&#xff0c;用戶可能需要透明背景的視頻進行創作&#xff0c;那么如何創作透明背景的視頻呢&#xff1f; 要制作具有透明背景的視頻&#xff0c;我們需要使…

如何贏得并留住訂閱者:12 個必須嘗試的訂閱營銷策略

Netflix、Hubspot、Spotify 和 Slack 都是流行的基于訂閱的服務&#xff0c;您可能每天都會使用它們&#xff0c;無論是工作還是娛樂。這些例子表明&#xff0c;訂閱業務模式深受 SaaS 創業者的青睞。 這種模式的吸引力很容易理解&#xff0c;特別是考慮到訂閱市場預計到 2025…

C //例10.5 有一個磁盤文件,內有一些信息。要求第1次將它的內容顯示在屏幕上,第2次把它復制到另一文件上。

C程序設計 &#xff08;第四版&#xff09; 譚浩強 例10.5 例10.5 有一個磁盤文件&#xff0c;內有一些信息。要求第1次將它的內容顯示在屏幕上&#xff0c;第2次把它復制到另一文件上。 IDE工具&#xff1a;VS2010 Note: 使用不同的IDE工具可能有部分差異。 代碼塊 方法&a…