Flask 或 Django 簡介:構建 Web 應用程序
網絡開發領域提供了豐富的工具和框架,而 Python 作為一門多功能的語言,在構建健壯且可擴展的 Web 應用方面脫穎而出。本課程將作為你使用 Python 進行 Web 開發的入門指南,特別聚焦于兩個流行的框架:Flask 和 Django。我們將探討這些框架背后的基本概念,為你創建動態 Web 應用和 RESTful API 奠定基礎。理解這些框架對于將 AI 模型集成到 Web 應用中至關重要,這是全棧 AI 開發的關鍵環節。
Web 框架簡介:Flask 和 Django
Web 框架為構建 Web 應用程序提供結構,簡化了路由、模板和數據庫交互等常見任務。它們提供預構建的組件和工具,使開發者能夠專注于應用程序的獨特功能,而不是重新發明輪子。Flask 和 Django 是兩個最流行的 Python Web 框架,每個都有其自身的優勢和適用場景。
Flask:一個微框架
Flask 通常被描述為一個微框架,因為它只提供了構建 Web 應用所需的必要工具和庫。它輕量級、靈活,并賦予開發者對其使用結構和組件的高度控制。
-
Flask 的主要功能:
- 輕量級和靈活: Flask 的極簡設計允許開發者選擇他們需要的組件,使其非常適合小型項目或具有特定需求的應用。
- 路由:?Flask 的路由系統允許你將 URL 映射到特定的函數,從而輕松定義應用程序的不同端點。
- 模板化: Flask 使用 Jinja2 作為其默認模板引擎,允許您通過在模板中嵌入 Python 代碼來創建動態 HTML 頁面。
- WSGI 兼容性: Flask 是一個符合 WSGI(Web 服務器網關接口)規范的框架,這意味著它可以在多種 Web 服務器上部署。
- 可擴展:?Flask 的擴展系統允許您輕松地為應用程序添加功能,例如數據庫集成、身份驗證等。
示例:?想象一下你正在構建一個簡單的個人網站。Flask 的輕量級特性讓你能夠快速為你的主頁、關于頁面和聯系表單設置路由,而無需承擔大型框架的額外負擔。
反例:?如果你正在構建一個具有復雜用戶管理、訂單處理和產品目錄的大型電子商務平臺,與 Django 相比,Flask 可能需要更多的手動配置和外部庫的集成。
Django:一個功能完備的框架
Django 是一個高級的 Python Web 框架,為構建復雜的 Web 應用程序提供了一套全面的工具和功能。它遵循“開箱即用”的理念,為用戶認證、數據庫管理和表單處理等常見任務提供了內置組件。
-
Django 的主要功能:
- ORM(對象關系映射器):?Django 的 ORM 允許你使用 Python 代碼與數據庫交互,抽象了 SQL 的復雜性。
- 管理界面:?Django 會自動生成一個管理界面,用于管理應用程序的數據,使創建、讀取、更新和刪除記錄變得容易。
- 安全特性:?Django 包含內置的安全特性,例如防范跨站腳本(XSS)、跨站請求偽造(CSRF)和 SQL 注入。
- 模板引擎:?Django 有自己的模板引擎,它類似于 Jinja2,但有一些 Django 特有的功能。
- 可擴展性:?Django 被設計用來處理大量的流量和數據,因此它適合構建可擴展的 Web 應用程序。
示例:?考慮構建一個社交網站。Django 的內置用戶認證、數據庫管理和安全功能將顯著加快開發速度,并為復雜應用程序提供一個堅實的基礎。
反例:?如果你正在創建一個功能簡單、單頁面的應用程序,Django 的豐富功能可能會過于繁瑣,而 Flask 可能是一個更合適的選擇。
在 Flask 和 Django 之間進行選擇
Flask 和 Django 之間的選擇取決于你項目的具體需求。
特性 | Flask | Django |
---|---|---|
尺寸 | 微型框架 | 功能全面的框架 |
學習曲線 | 初始學習更簡單 | 學習曲線更陡峭 |
靈活性 | 高度靈活,更多控制 | 靈活性較低,更具主觀性 |
內置功能 | 極簡,需要更多擴展 | 許多內置功能 |
用例 | 中小型應用程序,API | 大型復雜應用程序,內容管理系統 |
假設場景:?你需要構建一個簡單的 API 端點,從傳感器接收數據并將其存儲在數據庫中。Flask 的簡單性和靈活性使它成為這項任務的理想選擇。你可以快速設置一個路由,使用 SQLAlchemy(我們稍后會介紹)連接到數據庫,并處理數據。
設置開發環境
在開始使用 Flask 或 Django 構建 Web 應用程序之前,你需要設置一個開發環境。這通常涉及安裝 Python、創建虛擬環境以及安裝必要的包。
安裝 Python
如果你還沒有安裝 Python,可以從官方 Python 網站(https://www.python.org/downloads/)下載。確保下載最新版的穩定版 Python 3。
創建虛擬環境
虛擬環境是一個自包含的目錄,其中包含特定的 Python 解釋器以及為特定項目安裝的任何包。這有助于將您項目的依賴項與其他項目以及系統范圍的 Python 安裝隔離開來。
要創建虛擬環境,您可以使用 Python 3 自帶的?venv
?模塊。
python3 -m venv venv
此命令在名為?venv
?的目錄中創建一個虛擬環境。
要激活虛擬環境,請使用以下命令:
-
在 macOS 和 Linux 上:
source venv/bin/activate
-
在 Windows 上:
venv\Scripts\activate
虛擬環境激活后,您的 shell 提示符將帶有環境的名稱作為前綴(例如,(venv)
)。
安裝 Flask 或 Django
虛擬環境激活后,您可以使用 Python 包管理器 pip 安裝 Flask 或 Django。
-
要安裝 Flask:
pip install flask
-
要安裝 Django:
pip install django
構建一個簡單的"Hello, World!"應用程序
讓我們使用 Flask 和 Django 創建一個基本的"Hello, World!"應用程序,以說明每個框架的基本概念。
Flask “你好,世界!”
-
創建一個名為?
app.py
?的文件:from flask import Flaskapp = Flask(__name__)@app.route('/') def hello_world():return 'Hello, World!'if __name__ == '__main__':app.run(debug=True)
解釋:
from flask import Flask
: 從 flask 包中導入 Flask 類。app = Flask(__name__)
: 創建 Flask 類的實例。__name__
?參數是一個特殊的 Python 變量,表示當前模塊的名稱。@app.route('/')
: 這是一個裝飾器,告訴 Flask 哪個 URL 應該觸發我們的函數。在這種情況下,/
?URL(根 URL)將觸發?hello_world()
?函數。def hello_world():
: 當訪問?/
?URL 時,這個函數會被調用。它返回字符串 ‘Hello, World!’,這個字符串將在瀏覽器中顯示。if __name__ == '__main__':
: 這是一個標準的 Python 慣用法,確保只有在腳本直接運行時(而不是作為模塊導入時)才會執行?app.run()
?這一行。app.run(debug=True)
: 啟動 Flask 開發服務器。參數?debug=True
?啟用調試模式,提供有用的錯誤信息,并在你修改代碼時自動重新加載服務器。
-
運行應用程序:
python app.py
這將啟動 Flask 開發服務器。打開你的網頁瀏覽器并前往?
http://127.0.0.1:5000/
(或終端中顯示的地址)。你應該能看到"Hello, World!"消息。
Django “你好,世界!”
-
創建一個新的 Django 項目:
django-admin startproject helloworld cd helloworld
這會創建一個名為?
helloworld
?的新 Django 項目。 -
創建一個新的 Django 應用:
python manage.py startapp hello
這會創建一個名為?
hello
?的新 Django 應用。 -
編輯?
helloworld/settings.py
:在?
INSTALLED_APPS
?列表中添加?'hello'
:INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','hello', # Add this line ]
-
創建一個名為?
hello/views.py
?的文件:from django.http import HttpResponsedef hello_world(request):return HttpResponse("Hello, World!")
解釋:
from django.http import HttpResponse
?: 導入?HttpResponse
?類,該類用于向客戶端發送 HTTP 響應。def hello_world(request):
: 當我們下一步定義的 URL 收到請求時,這個函數會被調用。它接受一個?request
?對象作為參數,該對象包含了關于請求的信息。return HttpResponse("Hello, World!")
?: 這行代碼創建了一個?HttpResponse
?對象,其內容為字符串"Hello, World!",并將其返回。這將作為發送給瀏覽器的響應。
-
創建一個名為?
hello/urls.py
?的文件:from django.urls import path from . import viewsurlpatterns = [path('', views.hello_world, name='hello_world'), ]
解釋:
from django.urls import path
: 導入?path
?函數,該函數用于定義 URL 模式。from . import views
: 從當前目錄(即?hello
?應用)導入?views
?模塊。urlpatterns = [...]
: 這個列表定義了?hello
?應用的 URL 模式。path('', views.hello_world, name='hello_world')
?: 這行代碼定義了一個 URL 模式,將根 URL(''
)映射到?hello_world
?視圖函數,該函數位于?views
?模塊中。name
?參數用于為 URL 模式命名,該名稱可用于在模板和其他代碼部分中引用它。
-
編輯?
helloworld/urls.py
:包含?
hello
?應用的 URLs:from django.contrib import admin from django.urls import include, pathurlpatterns = [path('admin/', admin.site.urls),path('', include('hello.urls')), # Add this line ]
解釋:
from django.urls import include, path
?: 導入?include
?函數,用于包含其他應用中的 URL 模式。path('', include('hello.urls'))
?: 這行代碼包含了在?hello/urls.py
?文件中定義的 URL 模式。這意味著所有以?/
?開頭的 URL 都將由?hello
?應用處理。
-
運行遷移:
python manage.py migrate
此命令應用任何待處理的數據庫遷移。由于我們尚未定義任何模型,這將僅創建默認的 Django 表。
-
運行開發服務器:
python manage.py runserver
這將啟動 Django 開發服務器。打開你的網頁瀏覽器并前往?
http://127.0.0.1:8000/
。你應該能看到"Hello, World!"的消息。
路由和 URL 處理
路由是將 URL 映射到 Web 應用程序中特定函數或視圖的過程。Flask 和 Django 都提供了定義路由和處理 URL 參數的機制。
Flask 路由
在 Flask 中,你使用?@app.route()
?裝飾器來定義路由。該裝飾器以一個 URL 模式作為參數,并將其與一個函數關聯起來。
from flask import Flaskapp = Flask(__name__)@app.route('/')
def index():return 'Index Page'@app.route('/hello')
def hello():return 'Hello, World'@app.route('/user/<username>')
def show_user_profile(username):# show the user profile for that userreturn f'User {username}'@app.route('/post/<int:post_id>')
def show_post(post_id):# show the post with the given id, the id is an integerreturn f'Post {post_id}'
解釋:
@app.route('/')
: 將根 URL(/
)映射到?index()
?函數。@app.route('/hello')
: 將?/hello
URL 映射到?hello()
?函數。@app.route('/user/<username>')
?: 將類似?/user/john
?或?/user/jane
?的 URL 映射到?show_user_profile()
?函數。<username>
?部分是一個變量,將被作為參數傳遞給函數。@app.route('/post/<int:post_id>')
?: 將類似?/post/123
?或?/post/456
?的 URL 映射到?show_post()
?函數。其中?<int:post_id>
?部分是一個變量,它將被作為整數參數傳遞給該函數。而?int:
?部分則指定該變量應為整數。
Django URL 處理
在 Django 中,你使用?urls.py
?文件中的?path()
?函數來定義 URL 模式。path()
?函數接受一個 URL 模式、一個視圖函數和一個可選的名稱作為參數。
from django.urls import path
from . import viewsurlpatterns = [path('', views.index, name='index'),path('hello/', views.hello, name='hello'),path('user/<str:username>/', views.show_user_profile, name='show_user_profile'),path('post/<int:post_id>/', views.show_post, name='show_post'),
]
解釋:
path('', views.index, name='index')
?: 將根 URL(/
)映射到?index
?視圖函數。path('hello/', views.hello, name='hello')
?: 將?/hello/
URL 映射到?hello
?視圖函數。path('user/<str:username>/', views.show_user_profile, name='show_user_profile')
?: 將類似?/user/john/
?或?/user/jane/
?的 URL 映射到?show_user_profile
?視圖函數。其中?<str:username>
?部分是一個變量,將被作為字符串參數傳遞給該函數。path('post/<int:post_id>/', views.show_post, name='show_post')
?: 將類似?/post/123/
?或?/post/456/
?的 URL 映射到?show_post
?視圖函數。?<int:post_id>
?部分是一個變量,它將被作為整數參數傳遞給該函數。
模板化
模板化允許您通過在模板中嵌入 Python 代碼來創建動態 HTML 頁面。Flask 和 Django 都有自己的模板引擎。
Flask 模板(Jinja2)
Flask 使用 Jinja2 作為其默認模板引擎。Jinja2 允許你在模板中使用變量、循環和條件語句。
-
在您的?
templates
?文件與?app.py
?文件相同的目錄下創建一個名為?templates
?的目錄。 -
在?
templates
?目錄下創建一個名為?index.html
?的文件:<!DOCTYPE html> <html> <head><title>Flask Template Example</title> </head> <body><h1>Hello, {{ name }}!</h1><p>Welcome to my website.</p> </body> </html>
解釋:
{{ name }}
: 這是一個 Jinja2 變量,它將被從 Python 代碼中傳遞過來的?name
?變量的值所替換。
-
修改你的?
app.py
?文件:from flask import Flask, render_templateapp = Flask(__name__)@app.route('/template/<name>') def index(name):return render_template('index.html', name=name)if __name__ == '__main__':app.run(debug=True)
解釋:
from flask import Flask, render_template
?: 導入?render_template
?函數,該函數用于渲染 Jinja2 模板。return render_template('index.html', name=name)
?: 這行代碼渲染了?index.html
?模板,并將?name
?變量傳遞給模板。
-
運行應用程序:
python app.py
打開你的網頁瀏覽器并前往?
http://127.0.0.1:5000/template/John
?。你應該能看到 “Hello, John!” 的消息。
Django 模板
Django 有自己的模板引擎,它類似于 Jinja2,但有一些 Django 特有的功能。
-
在你的?
hello
?應用目錄中創建一個名為?templates
?的目錄。 -
在?
templates
?目錄下創建一個名為?index.html
?的文件:<!DOCTYPE html> <html> <head><title>Django Template Example</title> </head> <body><h1>Hello, {{ name }}!</h1><p>Welcome to my website.</p> </body> </html>
解釋:
{{ name }}
: 這是一個 Django 模板變量,它將被從 Python 代碼中傳遞過來的?name
?變量的值所替換。
-
修改你的?
hello/views.py
?文件:from django.shortcuts import renderdef index(request, name):return render(request, 'index.html', {'name': name})
解釋:
from django.shortcuts import render
?: 導入?render
?函數,該函數用于渲染 Django 模板。return render(request, 'index.html', {'name': name})
?: 這行代碼渲染了?index.html
?模板,并將?name
?變量傳遞給模板。
-
修改你的?
hello/urls.py
?文件:from django.urls import path from . import viewsurlpatterns = [path('template/<str:name>/', views.index, name='index'), ]
-
運行開發服務器:
python manage.py runserver
打開你的網頁瀏覽器并前往?
http://127.0.0.1:8000/template/John/
?。你應該能看到 “Hello, John!” 的消息。