Flask 是一種輕量級的 Python Web 框架,它的設計目標是將項目的復雜度保持在最低,同時提供必要的工具和插件以完成 Web 項目開發。
Flask 的主要特點如下:
- **微框架**:Flask 提供了基礎的 Web 項目功能,例如路由管理和請求處理,但并沒有包括數據庫抽象層、表單驗證等復雜功能。這意味著 Flask 很輕量,而且非常適合新手上手學習。
- **靈活和可擴展**:盡管 Flask 的核心功能非常有限,但它可以通過擴展(extensions)來提供更豐富的功能,如用戶認證、表單驗證、對象關系映射(ORM)等。你可以根據項目需求選擇使用這些擴展。
- **RESTful 請求分發**:Flask 內建的 URL 路由系統支持 RESTful 風格的 URL,使得你的 Web 服務可以很好地適應現代 Web 應用。
- **Jinja2模板**:Flask 默認的模板引擎是 Jinja2,它提供了豐富的功能來動態生成 HTML。
- **Werkzeug WSGI 工具箱**:Flask 使用 Werkzeug 作為它的 WSGI 工具箱和服務器,這個工具箱包含了 HTTP 協議的很多實用功能。
## Flask 是內置了Web Server 嗎
是的,Flask是一種微型的Web框架,它內置了一個基于Werkzeug的開發Web服務器。在Flask應用程序中,你可以通過調用app.run()方法來啟動這個內置的Web服務器。
下面是一個啟動內置Web服務器的Flask應用程序的示例:
python
Copy code
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello, World!'
if __name__ == '__main__':
app.run()
請注意,盡管Flask內置的Web服務器用于開發和測試是非常方便的,但在生產環境中不建議使用。原因是,這個服務器只是一個簡單的、單線程的服務器,沒法處理大量的并發請求。在生產環境中,你通常會使用像Gunicorn或uWSGI這樣的WSGI服務器,可能還會配合一個反向代理,例如Nginx。
## Werkzeug 是內置服務器嗎
Werkzeug不是一個完整的web服務器,而是一個WSGI (Web Server Gateway Interface)的工具包或者Utility Library。它提供了一些用于HTTP和WSGI處理的函數和類,可以幫助開發人員構建他們自己的框架或服務器。
然而,Werkzeug確實提供了一個簡單的開發服務器,可以運行WSGI應用,但這通常僅在開發環境中使用。這個開發服務器是Flask用來創建其內置web服務器的基礎。
這里有一段簡單的通過Werkzeug創建一個WSGI application的Python代碼:
python
Copy code
from werkzeug.wrappers import Request, Response
def application(environ, start_response):
request = Request(environ)
text = 'Hello, %s!' % request.args.get('name', 'World')
response = Response(text, mimetype='text/plain')
return response(environ, start_response)
if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, application)
在這個例子中,run_simple函數啟動了Werkzeug提供的開發服務器,'application'函數則是我們自定義的WSGI應用程序。
同樣地,雖然你可以用Werkzeug的這個開發服務器來運行你的WSGI應用,但是在生產環境中,你一般需要使用像Gunicorn或uWSGI這樣的WSGI服務器,可能還會加上像Nginx這樣的反向代理。Werkzeug的開發服務器并不適合處理大量并發請求。
## Werkzeug
Werkzeug 是一個 Python 的 WSGI(Web Server Gateway Interface)工具庫,理解為一種 Web 應用程序庫或簡單的Web框架也是可以的。它不僅實現了全面的 WSGI 規范,還提供了許多方便開發人員創建 Web 服務的功能和底層工具。其中就包括請求和響應對象,URL 路由,模板引擎掛鉤,以及一個強大的交互式調試系統。
一些主要的 Python Web 框架,像 Flask,都建立在 Werkzeug 之上。
以下是一段簡單的使用 Werkzeug 庫的代碼:
python
Copy code
from werkzeug.wrappers import Request, Response
def application(environ, start_response):
request = Request(environ)
text = 'Hello, %s!' % request.args.get('name', 'World')
response = Response(text, mimetype='text/plain')
return response(environ, start_response)
if __name__ == '__main__':
from werkzeug.serving import run_simple
run_simple('localhost', 4000, application)
這段代碼中,application 函數就是一個基礎的 WSGI 應用。通過 Werkzeug 提供的 Request 類可以方便地解析請求參數。同時 Response 類提供一個方便的方式來創建 WSGI 響應。run_simple 函數則可以啟動一個簡單的 WSGI HTTP 服務器。
Werkzeug 庫的主要優勢在于其靈活性和模塊化設計,這使你能夠選擇你需要的部分并自行組合,創建出適合你需求的 Web 應用。
## Werkzeug vs 內置Tomcat 服務器
雖然Werkzeug和內置的Tomcat在某些方面有相似性(它們都可以作為開發服務器做開發測試),但是它們之間還是存在顯著的差異:
語言:Werkzeug是用Python編寫的,通常用于Python web開發,支持WSGI標準。而Tomcat是用Java編寫的,用于運行Java Servlet和JSP頁面。
功能:Tomcat是一個完整的Web服務器和Servlet容器,不僅可以用作開發測試,還含有許多生產環境所需的功能,如安全管理、負載均衡等。而Werkzeug主要是Python的WSGI工具庫,含有一個開發服務器,主要用于開發和調試,不建議在生產環境中使用。
標準:Werkzeug被設計為遵循WSGI(Web Server Gateway Interface)標準,Python的一種Web服務標準。而Tomcat遵循的是Java的Servlet和JSP規范。
所以,可以說,Werkzeug的目標是為Python Web開發者提供一個輕量級的解決方案,而Tomcat更多地面向企業級Java Web應用的開發和部署。
下面的表格可以更直觀地對比這兩者:
Werkzeug Tomcat
語言 Python Java
規范 遵循WSGI標準 遵循Servlet/JSP規范
功能 WSGI工具庫,含有開發服務器 完整的Web服務器和Servlet容器
使用場景 主要用于開發和調試 用于開發測試,也包含許多生產環境所需的功能
## WSGI
WSGI,全稱為Web Server Gateway Interface,是Python應用程序或框架和Web服務器之間的一種接口標準。它定義了如何讓web服務器和Python應用程序進行通信。
在WSGI模型中,Web服務器只需知道如何將請求傳遞給WSGI應用,并知道如何將應用的響應發送回客戶端。而WSGI應用的實現則可能會極其復雜,包括路由、模板渲染、處理表單數據、與數據庫交互等,并且這些實現對于Web服務器來說是透明的。
下面是一個最簡單的WSGI應用的示例:
python
Copy code
def simple_app(environ, start_response):
"""Simplest possible application object"""
status = '200 OK'
response_headers = [('Content-type', 'text/plain')]
start_response(status, response_headers)
return ['Hello world!\n']
# The if __name__ == '__main__': check ensures this code is only run if
# the file is started as a standalone server, not if the module is imported
if __name__ == '__main__':
# Installing the WSGI application as the default application for
# the Python WSGI server 'wsgiref'.
from wsgiref.simple_server import make_server
srv = make_server('localhost', 8080, simple_app)
srv.serve_forever()
在這個示例中,simple_app就是一個WSGI應用。它接受兩個參數:environ是一個環境變量的字典,包含了CGI style的環境變量;start_response是一個回調函數,用于設定HTTP響應的狀態和頭部。這個WSGI應用返回的是一個字節串的列表,對于Web服務器來說,這些字節串就是響應的主體。
然而在實際開發中,手動創建WSGI應用非常枯燥且低效,因此一般我們使用Web框架如Flask或Django,這些框架都包裝了WSGI應用,并提供了方便的工具和API,使我們能專注于編寫業務邏輯,而無需過多關心WSGI的細節。
## Flask 基本語法
Flask 框架的基礎語法非常簡單。下面是一些主要語法和概念:
1. 導入 Flask 模塊:
```python
from flask import Flask
```
2. 創建 Flask Web 服務器實例:
```python
app = Flask(__name__)
```
這里,`__name__` 是一個特殊的內置 Python 變量,它代表當前模塊的名字。
3. 定義一個路由:
```python
@app.route('/')
```
這里, `'/'` 是 URL 的路徑。這個裝飾器告訴 Flask,當用戶訪問 `'/'`(即首頁)時,應該執行下面的函數。
4. 定義一個視圖函數:
```python
def hello():
return "Hello, World!"
```
這個函數被稱為“視圖函數”,它返回的字符串將作為 HTTP 響應發送給客戶端。
5. 啟動 Flask 內置的 Web 服務器:
```python
if __name__ == "__main__":
app.run()
```
這段代碼告訴 Python,如果你運行這個腳本(而不是從其他腳本導入它),則啟動 Web 服務器。
這個完整的 Flask 應用程序如下:
```python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!"
if __name__ == "__main__":
app.run()
```
這就是 Flask 的基本語法。然后你可以添加更多的路由和視圖函數,或者使用 Flask 的其他功能(如模板、會話管理、錯誤處理等)來擴展你的應用。
## Flask 進階開發
當你已經熟悉了 Flask 的基礎用法后,可以開始進入更加高級的 Flask 開發。以下是一些你可能會用到的主題和技術:
1. **大型 Flask 應用架構**
在大型 Flask 應用中,你可能需要模塊化你的代碼以保持其可管理性。這通常涉及到使用 Flask 的 “藍圖” (Blueprints),可以讓你在多個模塊中組織你的路由和視圖函數。
2. **數據庫處理**
Flask 不包括數據庫訪問能力,但通過 Flask-SQLAlchemy 擴展提供了 ORM (對象-關系映射) 功能。學習如何定義模型、進行數據庫遷移,以及使用 SQLAlchemy 的查詢接口,都是高級 Flask 開發的關鍵。
3. **用戶身份驗證和授權**
如何處理用戶登錄、權限檢查、賬戶管理等往往在 Flask 開發中非常重要。Flask-Login 和 Flask-Security 擴展都是很好的工具。
4. **表單處理**
Flask-WTF 和 WTForms 提供了創建和驗證 Web 表單的功能。
5. **RESTful API**
如果你打算使用 Flask 創建一個 RESTful API,那么 Flask-RESTful 擴展是一個很好的開始。
6. **測試**
學習如何使用 Python 的 unittest 模塊針對你的 Flask 應用編寫單元測試。
7. **部署**
Flask 應用可以使用多種方式進行部署,包括傳統的 WSGI 服務器,如 Gunicorn 或 uWSGI,也包括更現代的方式,例如 Docker 容器和云服務平臺。
8. **性能優化**
學習如何使用緩存、數據庫優化、HTTP 壓縮等技術來提升你 Flask 應用的性能。
## 示例
以下是一個最簡單的 Flask 應用程序例子:
```python
from flask import Flask
app = Flask(__name__)
@app.route('/')
def home():
return "Hello, World!"
if __name__ == '__main__':
app.run(debug=True)
```
在這個例子中,`@app.route('/')` 是 Flask 的路由裝飾器,定義了當用戶訪問網站的根 (`/`) 路徑時,應該調用哪個函數(在本例中是 `home` 函數)。這個函數返回的字符串將作為 HTTP 響應發送給客戶端。
注意這個文件命名 不能是 flask.py, 可以是app.py 等
- 前言
- 1.入門篇
- Python介紹
- 安裝與使用
- Python開發利器之VS Code
- 模塊安裝
- 命令行
- 一次Python無法安裝模塊的問題探索與解決之旅
- 命令運行
- Conda
- 下載地址
- 2.基礎篇
- 基礎語法
- 輸入與輸出
- with as的用法
- 注釋
- Python命令行參數
- 編碼
- 變量類型
- 列表遍歷
- 運算符
- 表達式語句
- 條件
- 循環
- 日期和時間
- 函數
- 高級語法
- @符號-裝飾器
- 模塊和包
- name
- init.py
- 錯誤和異常
- 面向對象
- 3.專題篇
- 常用功能
- Python 字符串連接
- python web
- Python CGI編程
- Python OAuth2
- 認證 Flask-HTTPAuth
- 常用命令
- 內置函數
- dir()
- print(f)
- 標準模塊
- sys
- pickle-數據序列化
- os
- IO(輸入輸出)
- 鍵盤輸入
- 文件讀寫
- 測試
- Python測試框架之pytest快速入門
- pytest-bdd快速示例和問題解決
- 基于pytest-bdd的項目目錄結構和命名規范
- python BDD 的相關概念
- Behave介紹和快速示例
- Python BDD之Behave測試報告
- Python BDD 框架比較之 pytest-bdd vs behave
- pytest進階
- Flask + pytest測試
- 參考網址
- pytest-bdd進階
- hehave進階
- 測試路徑
- python + selunium
- HTML 根據多層CSS 查找元素
- 等待執行
- 使用text 查找 span
- pytest如何在控制臺輸出
- 4.問題篇
- pip pip3 及區別
- TypeError: can only concatenate str (not "NoneType") to str
- 5.實戰篇
- matplotlib-繪圖包
- 導入類
- 命名規范
- 模塊查找
- 6.進階篇
- Flask
- Flask介紹
- Flask擴展模塊
- Flask-Login
- 問題
- Jinja2
- Flask-RESTful
- Flask-JWT-Extended
- WSGI
- Flask-SQLAlchemy
- 部署
- Flask VS Django
- Flask Web
- Flask + Vue
- Flask實戰
- Flask 標準目錄結構
- Blueprints
- 參考
- FastAPI 測試
- https 證書 Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate