南京做機(jī)床的公司網(wǎng)站智能優(yōu)化大師下載
【一】基礎(chǔ)知識(shí)點(diǎn)
【1】web框架的本質(zhì)
- Web框架本質(zhì)上可以看成是一個(gè)功能強(qiáng)大的socket服務(wù)端
- 用戶的瀏覽器可以看成是擁有可視化界面的socket客服端
- 兩種通過(guò)網(wǎng)絡(luò)請(qǐng)求實(shí)現(xiàn)數(shù)據(jù)交互
【2】瀏覽器發(fā)送請(qǐng)求
(1)HTTP協(xié)議
- HTTP協(xié)議是超文本傳輸協(xié)議,用于規(guī)定服務(wù)器和瀏覽器之間數(shù)據(jù)交互的格式。
(2)HTTP四大特性
- 基于請(qǐng)求-響應(yīng)模式:客戶端發(fā)送請(qǐng)求,服務(wù)器返回響應(yīng)。
- 基于TCP/IP之上:作用于應(yīng)用層之上的協(xié)議。
- 無(wú)狀態(tài):HTTP協(xié)議本身不保存用戶的信息,每個(gè)請(qǐng)求都是獨(dú)立的。為了記錄用戶狀態(tài),出現(xiàn)了一些技術(shù),如cookie、session和token。
- 無(wú)/短鏈接:HTTP 1.0默認(rèn)使用短鏈接,即請(qǐng)求-響應(yīng)后立即斷開(kāi)連接。HTTP 1.1支持長(zhǎng)鏈接,即雙方建立連接后不會(huì)立即斷開(kāi),如WebSocket。
(3)HTTP協(xié)議格式
- 請(qǐng)求數(shù)據(jù)格式
- 請(qǐng)求首行:標(biāo)識(shí)HTTP協(xié)議和當(dāng)前請(qǐng)求方式。
- 請(qǐng)求頭:多組鍵值對(duì),包含請(qǐng)求的附加信息。
- 空行:用于分隔請(qǐng)求頭和請(qǐng)求體。
- 請(qǐng)求體:并非所有請(qǐng)求都有,主要用于存放POST請(qǐng)求提交的敏感數(shù)據(jù)。
- 響應(yīng)數(shù)據(jù)格式
- 響應(yīng)首行:標(biāo)識(shí)HTTP協(xié)議、當(dāng)前請(qǐng)求方式和響應(yīng)狀態(tài)碼。
- 響應(yīng)頭:多組鍵值對(duì),包含響應(yīng)的附加信息。
- 空行:用于分隔響應(yīng)頭和響應(yīng)體。
- 響應(yīng)體:返回給瀏覽器展示給用戶的數(shù)據(jù)。
(4)狀態(tài)碼
- 1xx信息性狀態(tài)碼:請(qǐng)求已被接收,服務(wù)器正在處理
- 2xx成功狀態(tài)碼:請(qǐng)求已被服務(wù)器接收、理解和處理
- 3xx重定向狀態(tài)碼:表示需要進(jìn)一步操作完成請(qǐng)求,移動(dòng)到了新的URL
- 4xx客戶端錯(cuò)誤狀態(tài)碼:客戶端發(fā)送的請(qǐng)求錯(cuò)誤
- 5xx服務(wù)器錯(cuò)誤狀態(tài)碼:服務(wù)器在處理請(qǐng)求時(shí)發(fā)生了錯(cuò)誤
【3】動(dòng)、靜態(tài)網(wǎng)頁(yè)
(1)靜態(tài)網(wǎng)頁(yè)
-
介紹:
- 靜態(tài)網(wǎng)頁(yè)是指在服務(wù)器上事先準(zhǔn)備好的網(wǎng)頁(yè)文件,其內(nèi)容在用戶訪問(wèn)時(shí)不會(huì)發(fā)生變化。靜態(tài)網(wǎng)頁(yè)通常由HTML、CSS和JavaScript等靜態(tài)資源組成。
-
特點(diǎn):
-
內(nèi)容固定不變:靜態(tài)網(wǎng)頁(yè)的內(nèi)容在服務(wù)器上生成,并在用戶訪問(wèn)時(shí)以相同的形式呈現(xiàn)。
-
簡(jiǎn)單易部署:靜態(tài)網(wǎng)頁(yè)不需要服務(wù)器端的動(dòng)態(tài)處理,部署和維護(hù)相對(duì)簡(jiǎn)單。
-
性能高效:由于沒(méi)有動(dòng)態(tài)處理的開(kāi)銷,靜態(tài)網(wǎng)頁(yè)加載速度較快。
-
-
示例:
- 一個(gè)靜態(tài)網(wǎng)頁(yè)的示例可以是一個(gè)展示公司產(chǎn)品信息的網(wǎng)頁(yè),其中包含公司的介紹、產(chǎn)品列表和聯(lián)系方式等信息。
- 還有錯(cuò)誤頁(yè)面等
error.html
(2)動(dòng)態(tài)網(wǎng)頁(yè)
-
介紹:
- 動(dòng)態(tài)網(wǎng)頁(yè)是指在用戶訪問(wèn)時(shí)通過(guò)服務(wù)器端的動(dòng)態(tài)處理生成的網(wǎng)頁(yè),內(nèi)容可以根據(jù)用戶的請(qǐng)求和其他條件而變化。
-
特點(diǎn):
-
內(nèi)容可變:動(dòng)態(tài)網(wǎng)頁(yè)的內(nèi)容可以根據(jù)用戶的請(qǐng)求、數(shù)據(jù)庫(kù)查詢結(jié)果、用戶狀態(tài)等動(dòng)態(tài)生成。
-
復(fù)雜交互:動(dòng)態(tài)網(wǎng)頁(yè)可以支持更復(fù)雜的用戶交互,如表單提交、數(shù)據(jù)驗(yàn)證、用戶登錄等。
-
數(shù)據(jù)庫(kù)和后端處理:動(dòng)態(tài)網(wǎng)頁(yè)通常需要與數(shù)據(jù)庫(kù)進(jìn)行交互,并由服務(wù)器端的程序處理用戶請(qǐng)求。
-
-
示例:
- 一個(gè)動(dòng)態(tài)網(wǎng)頁(yè)的示例可以是一個(gè)在線商城,用戶可以瀏覽商品、添加到購(gòu)物車、下訂單等操作,而這些操作都需要與服務(wù)器端進(jìn)行交互并動(dòng)態(tài)生成網(wǎng)頁(yè)內(nèi)容。
(3)總結(jié)
- 靜態(tài)網(wǎng)頁(yè)是事先準(zhǔn)備好的內(nèi)容固定的網(wǎng)頁(yè),部署簡(jiǎn)單且加載速度快
- 動(dòng)態(tài)網(wǎng)頁(yè)是根據(jù)用戶請(qǐng)求和服務(wù)器端處理生成的網(wǎng)頁(yè),內(nèi)容可變且支持復(fù)雜的交互操作。
【一】socket服務(wù)端搭建
【1】模板
(1)基礎(chǔ)模板
-
在web中輸入127.0.0.1
-
無(wú)法看任何信息
-
因?yàn)闆](méi)有按照HTTP協(xié)議傳輸內(nèi)容
import socket# 創(chuàng)建socket對(duì)象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 避免重啟后端口被占用
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 監(jiān)聽(tīng)端口
server.bind(("127.0.0.1", 8080))
# 創(chuàng)建半連接池
server.listen(5)while True:# 等待連接conn, addr = server.accept()# 接收數(shù)據(jù)recv_data = conn.recv(1024).decode('utf8')print(f"recv:>>>{recv_data}")# 二級(jí)制數(shù)據(jù)http_data = b"HTTP1.1 200 ok \r\n\r\n"data = b"hello world"# 發(fā)送數(shù)據(jù)conn.send(http_data + data)
(2)web端可以看到信息版
- 按照HTTP協(xié)議格式發(fā)送
- 響應(yīng)首行 響應(yīng)頭 空行 響應(yīng)體
import socket# 創(chuàng)建socket對(duì)象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 避免重啟后端口被占用
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 監(jiān)聽(tīng)端口
server.bind(("127.0.0.1", 8080))
# 創(chuàng)建半連接池
server.listen(5)while True:# 等待連接conn, addr = server.accept()# 接收數(shù)據(jù)recv_data = conn.recv(1024).decode('utf8')print(f"recv:>>>{recv_data}")# 響應(yīng)首行 響應(yīng)頭 空行http_data = b"HTTP1.1 200 ok \r\n\r\n"# 二級(jí)制數(shù)據(jù)send_data = b"hello world"# 發(fā)送數(shù)據(jù)conn.send(http_data + send_data)
【2】任務(wù):接收瀏覽器信息
- 在web中輸入任意字符串
- 在socket中找到這個(gè)字符串
- 示例:127.0.0.1:8080/index
- 拿到index
- 示例:127.0.0.1:8080/home
- 拿到home
- 將服務(wù)端按照空格切分,發(fā)現(xiàn)是第二個(gè)數(shù)據(jù)
- 所以通過(guò)
recv_data.split(' ')[1]
可以拿到
- 所以通過(guò)
import socket# 創(chuàng)建socket對(duì)象
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 避免重啟后端口被占用
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
# 監(jiān)聽(tīng)端口
server.bind(("127.0.0.1", 8080))
# 創(chuàng)建半連接池
server.listen(5)while True:# 等待連接conn, addr = server.accept()# 接收數(shù)據(jù)recv_data = conn.recv(1024).decode('utf8')print(f"recv:>>>{recv_data.split(' ')[1]}")# 響應(yīng)首行 響應(yīng)頭 空行http_data = b"HTTP1.1 200 ok \r\n\r\n"# 二級(jí)制數(shù)據(jù)send_data = b"hello world"# 發(fā)送數(shù)據(jù)conn.send(http_data + send_data)
recv:>>>/
recv:>>>/index
recv:>>>/home
recv:>>>/favicon.ico # 現(xiàn)在不用管
【二】基于wsgiref模塊
- 內(nèi)置模塊
【1】模板
(1)基礎(chǔ)模板
- 訪問(wèn)127.0.0.1:8080
- 便會(huì)返回
hello world
from wsgiref import simple_serverdef run(request, response):""":param request: 請(qǐng)求相關(guān)的數(shù)據(jù):param response: 響應(yīng)相關(guān)的數(shù)據(jù):return: 返回給客戶端的展示數(shù)據(jù)"""# 固定編寫response("200 OK", [])return [b"hello world"]if __name__ == '__main__':# 端口和IPIP = "127.0.0.1"PORT = 8080# 創(chuàng)建服務(wù)端對(duì)象,只要有請(qǐng)求訪問(wèn),便會(huì)執(zhí)行run方法server = simple_server.make_server(IP, PORT, run)server.serve_forever()
(2)任務(wù):根據(jù)請(qǐng)求返回不同信息
- 同理通過(guò)分析
response
- 首先這是一個(gè)字典
- 然后每次瀏覽器請(qǐng)求的后綴在
PATH_INFO
- 所以根據(jù)這個(gè)返回不同信息
from wsgiref import simple_serverdef run(request, response):""":param request: 請(qǐng)求相關(guān)的數(shù)據(jù):param response: 響應(yīng)相關(guān)的數(shù)據(jù):return: 返回給客戶端的展示數(shù)據(jù)"""# 固定編寫response("200 OK", [])# 獲取后綴內(nèi)容get_path = request.get("PATH_INFO")if get_path == "/index":return [b"welcome index"]elif get_path == "/home":return [b"welcome home"]else:return [b"404 error"]if __name__ == '__main__':# 端口和IPIP = "127.0.0.1"PORT = 8080# 創(chuàng)建服務(wù)端對(duì)象,只要有請(qǐng)求訪問(wèn),便會(huì)執(zhí)行run方法server = simple_server.make_server(IP, PORT, run)server.serve_forever()
【2】存在的不足和優(yōu)化
(1)問(wèn)題
- 如果網(wǎng)站很多,那么需要人為的寫很多的
elif
- 每個(gè)分支下的功能根據(jù)業(yè)務(wù)邏輯的不同可能會(huì)比較復(fù)雜的邏輯
(2)函數(shù)和模塊優(yōu)化
- urls
- 后綴與函數(shù)名對(duì)應(yīng)關(guān)系
- (‘/index’,register)
- 后綴專業(yè)名詞稱之為’路由’
- 函數(shù)名專業(yè)名詞稱之為’視圖函數(shù)’
- urls.py專業(yè)名詞稱之為’路由層’
- views
- 專門編寫業(yè)務(wù)邏輯代碼
- 可以是函數(shù) 也可以是類
- 函數(shù)專業(yè)名詞稱之為’視圖函數(shù)’
- 類專業(yè)名詞稱之為’視圖類’
- views.py專業(yè)名詞稱之為’視圖層’
- templates
- 專門存儲(chǔ)html文件
- html文件專業(yè)名詞稱之為’模板文件’
- templates文件夾專業(yè)名詞稱之為’模板層’
- static
- 專門存儲(chǔ)靜態(tài)文件資源
- 頁(yè)面所需css文件、js文件、圖片文件、第三方文件可統(tǒng)稱為’靜態(tài)資源’
項(xiàng)目文件夾
├── server.py // 主應(yīng)用
├── urls.py // 對(duì)應(yīng)關(guān)系的存儲(chǔ)
├── views.py // 業(yè)務(wù)邏輯的編寫
├── templates文件夾 // 存儲(chǔ)項(xiàng)目所需的html文件
│ └── home.html // home頁(yè)面
├── static文件夾 // 存儲(chǔ)項(xiàng)目所需的靜態(tài)文件
│ └── jquery-3.7.1.min.js // jquery框架
│ └── bootstrap-grid.min.css // bootstrap框架
......
(3)示例
- server.py:主應(yīng)用
from wsgiref import simple_server
from urls import urls
from views import errordef run(request, responce):responce('200 OK', []) current_path = request.get("PATH_INFO")func_name = Nonefor url_tuple in urls: # ('/register', register)if current_path == url_tuple[0]:func_name = url_tuple[1]breakif func_name:res = func_name(request)else:res = error(request) return [res.encode('utf8')]if __name__ == '__main__':server = simple_server.make_server('127.0.0.1', 8080, run)server.serve_forever()
- urls:對(duì)應(yīng)關(guān)系的存儲(chǔ)
from views import *urls = (('/home', login),('/index', index),
)
- views:業(yè)務(wù)邏輯代碼
# 功能函數(shù)
def register(request):return 'home'def index(request):return 'index'def error(request):return open(r'static/error.html', 'r', encoding='utf8').read()
- static->error.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width,initial-scale=1.0"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head>
<body><h1>404 Error</h1>
</body>
</html>
【三】基于jinjia2模塊
【1】任務(wù):頁(yè)面顯示當(dāng)前時(shí)間
-
server.py:主應(yīng)用
- 不做任何改變
-
urls:對(duì)應(yīng)關(guān)系的存儲(chǔ)
from views import *urls = (('/show_time', show_time),
)
- views:業(yè)務(wù)邏輯代碼
import timedef show_time(request):now_time = time.strftime("%x %X", time.localtime())return open(r"templates/time.html", 'r', encoding='utf8').read().replace("time", now_time)def error(request):return open(r'static/error.html', 'r', encoding='utf8').read()
- templates->time.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width,initial-scale=1.0"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head>
<body><h1 style="text-align: center">time</h1>
</body>
</html>
【2】jinja2模塊
(1)基礎(chǔ)介紹
Jinja2
是一個(gè)流行的Python模板引擎,它提供了一種靈活而強(qiáng)大的方式來(lái)生成動(dòng)態(tài)內(nèi)容。Jinja2
模板引擎可以用于各種應(yīng)用程序,包括Web開(kāi)發(fā)、生成配置文件、郵件模板等。
(2)特點(diǎn)和使用方法
- 模板語(yǔ)法:
Jinja2
使用一種類似于HTML的模板語(yǔ)法,通過(guò)插入變量、控制流語(yǔ)句和過(guò)濾器等,可以動(dòng)態(tài)生成內(nèi)容。- 例如,使用
{{ variable }}
表示插入變量,{% if condition %}...{% endif %}
表示條件語(yǔ)句,{% for item in collection %}...{% endfor %}
表示循環(huán)語(yǔ)句。
- 模板繼承:
Jinja2
支持模板繼承,可以定義一個(gè)基礎(chǔ)模板,然后在子模板中繼承基礎(chǔ)模板并覆蓋特定的部分。
- 過(guò)濾器和函數(shù):
Jinja2
提供了一些內(nèi)置的過(guò)濾器和函數(shù),用于對(duì)變量進(jìn)行格式化、轉(zhuǎn)換和處理。例如,可以使用{{ variable|filter }}
的語(yǔ)法來(lái)應(yīng)用過(guò)濾器。
- 變量上下文:
- 在渲染模板時(shí),可以通過(guò)向模板引擎提供一個(gè)變量上下文來(lái)傳遞數(shù)據(jù)。
- 上下文可以是一個(gè)字典,其中包含模板中使用的變量和對(duì)應(yīng)的值。
- 擴(kuò)展和自定義:
Jinja2
允許通過(guò)擴(kuò)展和自定義來(lái)增強(qiáng)模板引擎的功能。- 可以編寫自定義的過(guò)濾器、函數(shù)和標(biāo)簽,或者使用現(xiàn)有的擴(kuò)展庫(kù)來(lái)擴(kuò)展
Jinja2
的功能。
【3】使用jinja2模塊
(1)演示
- templates -> show_jinja2.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width,initial-scale=1.0"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head>
<body>
<h1>字典數(shù)據(jù)展示</h1>
<p>{{ user }}</p>
<p>{{ user.name }}</p>
<p>{{ user['pwd'] }}</p>
<p>{{ user.get('hobby') }}</p>
<h1>列表數(shù)據(jù)展示</h1>
<p>{% for i in new_list %}<span>元素:{{ i }}</span>{% endfor %}
</p>
</body>
</html>
- views
import time
from jinja2 import Template# 功能函數(shù)
def show_time(request):now_time = time.strftime("%x %X", time.localtime())return open(r"templates/time.html", 'r', encoding='utf8').read().replace("time", now_time)def show_jinja2(request):user_dict = {"name": "bruce", "age": 18, "hobby": "playing"}new_list = ["aa", "bb", "cc", 11, 22, 33]data = open("templates/show_jinja2.html", 'r', encoding='utf8').read()temp_obj = Template(data)res = temp_obj.render({"user": user_dict, "new_list": new_list})return resdef error(request):return open(r'static/error.html', 'r', encoding='utf8').read()
- urls
from views import *urls = (('/show_time', show_time),('/show_jinja2', show_jinja2),
)
(2)任務(wù):頁(yè)面顯示時(shí)間
- templates->time.html
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title><meta name="viewport" content="width=device-width,initial-scale=1.0"><script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.7.1/jquery.min.js"></script><link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/css/bootstrap.min.css"><script src="https://cdn.bootcdn.net/ajax/libs/twitter-bootstrap/3.4.1/js/bootstrap.min.js"></script></head>
<body><h1 style="text-align: center">{{ time }}</h1>
</body>
</html>
- views
import time
from jinja2 import Template# 功能函數(shù)
def show_time(request):now_time = time.strftime("%x %X", time.localtime())return open(r"templates/time.html", 'r', encoding='utf8').read().replace("time", now_time)def show_time_jinja2(request):now_time = time.strftime("%x %X", time.localtime())data = open(r"templates/time.html", 'r', encoding='utf8').read()temp_obj = Template(data)res = temp_obj.render({"time":now_time})return resdef error(request):return open(r'static/error.html', 'r', encoding='utf8').read()
- urls
from views import *urls = (('/show_time', show_time),('/show_time_jinja2', show_time_jinja2)
)
【四】網(wǎng)絡(luò)框架和MVC架構(gòu)
【1】網(wǎng)絡(luò)框架
- 網(wǎng)絡(luò)框架是一種軟件框架,用于構(gòu)建Web應(yīng)用程序。它提供了一系列工具、庫(kù)和規(guī)范,以簡(jiǎn)化Web開(kāi)發(fā)過(guò)程,包括路由處理、請(qǐng)求處理、模板引擎、數(shù)據(jù)庫(kù)連接等功能。
- 網(wǎng)絡(luò)框架通常提供了一種結(jié)構(gòu)和組織應(yīng)用程序的方式,使得開(kāi)發(fā)者可以更加高效地開(kāi)發(fā)和維護(hù)Web應(yīng)用程序。
- 網(wǎng)絡(luò)框架可以是基于某種編程語(yǔ)言的,如Python的Flask和Django框架,JavaScript的Express框架等。
【2】MVC架構(gòu)
- MVC(Model-View-Controller)是一種常見(jiàn)的軟件設(shè)計(jì)模式,用于組織和分離應(yīng)用程序的邏輯和視圖。
- MVC架構(gòu)將應(yīng)用程序分為三個(gè)核心組件:
- 模型(Model):負(fù)責(zé)處理數(shù)據(jù)和業(yè)務(wù)邏輯。模型通常與數(shù)據(jù)庫(kù)交互,處理數(shù)據(jù)的讀取、寫入和驗(yàn)證等操作。
- 視圖(View):負(fù)責(zé)展示數(shù)據(jù)給用戶,并接收用戶的輸入。視圖通常是用戶界面的一部分,如網(wǎng)頁(yè)、移動(dòng)應(yīng)用程序的界面等。
- 控制器(Controller):負(fù)責(zé)處理用戶的請(qǐng)求,協(xié)調(diào)模型和視圖之間的交互??刂破鹘邮沼脩舻妮斎?#xff0c;根據(jù)業(yè)務(wù)邏輯來(lái)更新模型,并將更新后的數(shù)據(jù)傳遞給視圖進(jìn)行展示。
- MVC架構(gòu)的優(yōu)勢(shì)在于將應(yīng)用程序的不同功能模塊進(jìn)行了分離,使得代碼更加可維護(hù)、可擴(kuò)展和易于測(cè)試。
【3】小結(jié)
- 在Web開(kāi)發(fā)中,網(wǎng)絡(luò)框架通常采用MVC架構(gòu)來(lái)組織應(yīng)用程序的代碼。
- 框架提供了路由處理、請(qǐng)求處理和模板引擎等功能,而開(kāi)發(fā)者則可以按照MVC的思想將應(yīng)用程序的邏輯和視圖進(jìn)行分離,提高開(kāi)發(fā)效率和代碼質(zhì)量。
- 通過(guò)網(wǎng)絡(luò)框架和MVC架構(gòu)的結(jié)合,開(kāi)發(fā)者可以更好地組織和管理Web應(yīng)用程序,并實(shí)現(xiàn)靈活、可擴(kuò)展的應(yīng)用開(kāi)發(fā)。
【五】主流后端框架
【1】Django
(1)介紹
- Django是一個(gè)使用Python編寫的高級(jí)Web應(yīng)用程序框架。它以快速開(kāi)發(fā)和可擴(kuò)展性為目標(biāo),提供了一系列工具和功能,使得構(gòu)建復(fù)雜的Web應(yīng)用程序變得簡(jiǎn)單和高效。
(2)特點(diǎn)
- 完整的功能集:Django提供了許多內(nèi)置的功能和模塊,包括數(shù)據(jù)庫(kù)ORM、表單處理、用戶認(rèn)證、管理界面等。這些功能的集成使得開(kāi)發(fā)者可以更快速地構(gòu)建功能完善的Web應(yīng)用程序,而無(wú)需從頭開(kāi)始編寫大量的代碼。
- 高度可擴(kuò)展:Django采用了松散耦合的設(shè)計(jì),使得開(kāi)發(fā)者可以方便地?cái)U(kuò)展和定制應(yīng)用程序。它支持插件和第三方應(yīng)用的集成,以及自定義模型、視圖和模板等。
- 強(qiáng)大的模板引擎:Django的模板引擎提供了豐富的模板語(yǔ)法和功能,使得開(kāi)發(fā)者可以輕松地生成動(dòng)態(tài)內(nèi)容和處理數(shù)據(jù)。它支持模板繼承、過(guò)濾器、標(biāo)簽等特性,使得模板的重用和組織變得更加簡(jiǎn)單。
- 自動(dòng)化的管理界面:Django自帶了一個(gè)強(qiáng)大的管理界面,可以自動(dòng)生成數(shù)據(jù)庫(kù)管理界面,使得開(kāi)發(fā)者可以方便地管理和操作數(shù)據(jù)。這個(gè)管理界面提供了增刪改查等常見(jiàn)操作的功能,并且可以進(jìn)行自定義擴(kuò)展。
(3)組成結(jié)構(gòu)
- Django的組成結(jié)構(gòu)基于MVC(Model-View-Controller)架構(gòu),但在Django中,通常稱之為MTV(Model-Template-View):
- 模型(Model):模型負(fù)責(zé)處理數(shù)據(jù)和業(yè)務(wù)邏輯。它定義了數(shù)據(jù)模型和數(shù)據(jù)庫(kù)表之間的映射關(guān)系,并提供了對(duì)數(shù)據(jù)的增刪改查等操作。
- 模板(Template):模板負(fù)責(zé)展示數(shù)據(jù)給用戶。它使用Django的模板語(yǔ)言,將數(shù)據(jù)和邏輯結(jié)合起來(lái)生成最終的HTML頁(yè)面。
- 視圖(View):視圖負(fù)責(zé)處理用戶的請(qǐng)求和邏輯處理。它接收用戶的請(qǐng)求,從數(shù)據(jù)庫(kù)中獲取數(shù)據(jù),然后將數(shù)據(jù)傳遞給模板進(jìn)行渲染,并返回生成的HTML頁(yè)面給用戶。
【2】Flask
(1)介紹
- Flask是一個(gè)使用Python編寫的微型Web框架,它以簡(jiǎn)潔和靈活為特點(diǎn)。Flask提供了一些基本的工具和庫(kù),使得構(gòu)建Web應(yīng)用程序變得簡(jiǎn)單和可擴(kuò)展。
(2)特點(diǎn)
- 簡(jiǎn)潔而靈活:Flask的設(shè)計(jì)理念是保持簡(jiǎn)單和可擴(kuò)展性,它提供了一些核心功能,但并沒(méi)有強(qiáng)制性的約束。開(kāi)發(fā)者可以根據(jù)需求自由選擇和集成其他庫(kù)和工具,以滿足特定的應(yīng)用需求。
- 輕量級(jí):Flask是一個(gè)輕量級(jí)的框架,它的核心庫(kù)非常小巧,并且沒(méi)有多余的依賴。這使得Flask在資源消耗和性能方面表現(xiàn)出色,適合構(gòu)建小型和簡(jiǎn)單的Web應(yīng)用程序。
- 易學(xué)易用:Flask的API設(shè)計(jì)簡(jiǎn)單直觀,容易學(xué)習(xí)和使用。它提供了路由處理、請(qǐng)求處理、模板引擎等基本功能,使得開(kāi)發(fā)者可以快速上手并進(jìn)行開(kāi)發(fā)。
- 可擴(kuò)展性:盡管Flask本身是一個(gè)微型框架,但它支持通過(guò)插件和擴(kuò)展來(lái)增加功能。開(kāi)發(fā)者可以根據(jù)需要選擇和集成各種擴(kuò)展,以滿足特定的應(yīng)用需求。
【3】Tornado
(1)介紹
- Tornado是一個(gè)使用Python編寫的高性能Web框架和異步網(wǎng)絡(luò)庫(kù)。它以處理大量并發(fā)連接和高性能為目標(biāo),適用于構(gòu)建高性能的Web應(yīng)用程序和實(shí)時(shí)Web服務(wù)。
(2)特點(diǎn)
- 高性能:Tornado采用了異步的事件驅(qū)動(dòng)編程模型,通過(guò)非阻塞的I/O操作和事件循環(huán)機(jī)制,實(shí)現(xiàn)了高性能的網(wǎng)絡(luò)通信。它可以處理大量的并發(fā)連接,并具有出色的響應(yīng)能力。
- 內(nèi)置異步支持:Tornado內(nèi)置了對(duì)異步編程的支持,包括異步請(qǐng)求處理、異步HTTP客戶端和異步數(shù)據(jù)庫(kù)訪問(wèn)等。這使得開(kāi)發(fā)者可以編寫高效的異步代碼,處理并發(fā)請(qǐng)求和I/O操作。
- 輕量級(jí):Tornado是一個(gè)輕量級(jí)的框架,它的核心庫(kù)非常小巧,并且沒(méi)有多余的依賴。這使得Tornado在資源消耗和性能方面表現(xiàn)出色,適合構(gòu)建高性能的Web應(yīng)用程序。
- WebSocket支持:Tornado提供了對(duì)WebSocket的原生支持,使得開(kāi)發(fā)者可以方便地構(gòu)建實(shí)時(shí)Web應(yīng)用程序和實(shí)時(shí)通信服務(wù)。
【4】FastAPI
(1)介紹
- FastAPI是一個(gè)使用Python編寫的現(xiàn)代化Web框架,它旨在提供高性能和易用性。FastAPI基于Python 3.7+的類型注解和異步編程模型,使得開(kāi)發(fā)者可以快速構(gòu)建高性能的Web API應(yīng)用程序。
(2)特點(diǎn)
- 高性能:FastAPI基于異步編程模型,利用Python 3.7+的類型注解和靜態(tài)類型檢查,實(shí)現(xiàn)了高性能的請(qǐng)求處理。它使用基于Starlette的異步服務(wù)器,能夠處理大量的并發(fā)請(qǐng)求。
- 快速開(kāi)發(fā):FastAPI的設(shè)計(jì)目標(biāo)是提供快速開(kāi)發(fā)的體驗(yàn)。它提供了自動(dòng)生成API文檔、輸入數(shù)據(jù)驗(yàn)證、請(qǐng)求處理等功能,使得開(kāi)發(fā)者可以快速構(gòu)建和部署Web API應(yīng)用程序。
- 類型注解和自動(dòng)文檔:FastAPI利用Python的類型注解,可以自動(dòng)生成API文檔和輸入數(shù)據(jù)驗(yàn)證。開(kāi)發(fā)者可以通過(guò)類型注解定義輸入和輸出的數(shù)據(jù)模型,并自動(dòng)生成交互式的API文檔。
- 異步支持:FastAPI完全支持異步編程,可以處理異步請(qǐng)求和異步操作。它基于Python的協(xié)程和異步IO,能夠處理高并發(fā)和高負(fù)載的請(qǐng)求。