django框架之基礎學習
阿新 • • 發佈:2022-12-08
目錄
web框架本質上可以看成是一個功能強大的socket服務端,使用者的瀏覽器可以看成是擁有視覺化介面的socket客戶端。兩者通過網路請求實現資料互動,學者們也可以從架構層面上先簡單的將Web框架看做是對前端、資料庫的全方位整合
- 純手擼web框架
- 基於wsgiref模組
- 程式碼封裝優化
- 動靜態網頁
- jinja模板
- 前端、後端、資料庫三者聯動
- python主流web框架
- Django簡介
- Django基本使用
- django app的概念
- django的主要目錄結構
- django小白必會的三板斧
web框架本質上可以看成是一個功能強大的socket服務端,使用者的瀏覽器可以看成是擁有視覺化介面的socket客戶端。兩者通過網路請求實現資料互動,學者們也可以從架構層面上先簡單的將Web框架看做是對前端、資料庫的全方位整合
純手擼web框架
1.web框架的本質 理解1:連線前端與資料庫的中間介質 理解2:socket服務端 2.手寫web框架 1.編寫socket服務端程式碼 2.瀏覽器訪問響應無效>>>:HTTP協議 3.根據網址字尾的不同獲取不同的頁面內容 4.想辦法獲取到使用者輸入的字尾>>>:請求資料 5.請求首行 GET /login HTTP/1.1 GET請求 朝別人索要資料 POST請求 朝別人提交資料 6.處理請求資料獲取網址字尾 """ 問題: 1.socket程式碼過於重複 2.針對請求資料處理繁瑣 3.字尾匹配邏輯過於low """ 程式碼展示: import socket server = socket.socket() # TCP UDP server.bind(('127.0.0.1', 8080)) # IP PORT server.listen(5) # 半連線池 while True: sock, address = server.accept() # 等待連線 data = sock.recv(1024) # 位元組(bytes) # print(data.decode('utf8')) # 解碼列印 sock.send(b'HTTP/1.1 200 OK\r\n\r\n') data_str = data.decode('utf8') # 先轉換成字串 target_url = data_str.split(' ')[1] # 按照空格切割字串並取索引1對應的資料 # print(target_url) # /index /login /reg if target_url == '/index': # sock.send(b'index page') with open(r'myhtml01.html','rb') as f: sock.send(f.read()) elif target_url == '/login': sock.send(b'login page') else: sock.send(b'home page!')
基於wsgiref模組
內建模板 很多web框架底層使用的模組 功能1:封裝了socket程式碼 功能2:處理了請求資料 1.固定程式碼啟動服務 2.檢視處理之後的request大字典 3.根據不同的網址字尾返回不同的內容>>>:研究大字典鍵值對 4.立刻解決上述純手擼的兩個問題 5.針對最後一個問題程式碼如何優化 from wsgiref.simple_server import make_server def run(request, response): """ :param request: 請求相關資料 :param response: 響應相關資料 :return: 返回給客戶端的真實資料 """ response('200 OK', []) # 固定格式 不用管它 # print(request) 是一個處理之後的大字典 path_info = request.get('PATH_INFO') if path_info == '/index': return [b'index'] elif path_info == '/login': return [b'login'] return [b'hello wsgiref module'] if __name__ == '__main__': server = make_server('127.0.0.1', 8080, run) # 實時監聽127.0.0.1:8080 一旦有請求過來自動給第三個引數加括號並傳引數呼叫 server.serve_forever() # 啟動服務端
程式碼封裝優化
1.網址字尾的匹配問題
2.每個字尾匹配成功後執行的程式碼有多有少
麵條拌 函式版 模組版
3.將分支的程式碼封裝成一個個函式
4.將網址字尾與函式名做對應關係
5.獲取網址字尾迴圈匹配
6.如果想新增功能只需要先寫函式再新增一個對應關係即可
7.根據不同的功能拆分不同的py檔案
views.py 儲存核心業務邏輯(功能函式)
urls.py 儲存網址字尾與函式名的對應關係
templates目錄 儲存html頁面檔案
8.為了使函式體程式碼中業務邏輯有更多的資料可用
將request大字典傳給這個函式(可用不可用但是不能不傳)
動靜態網頁
動態網頁 頁面資料來源於後端,也是需要資料庫的參與 靜態網頁 頁面資料直接寫死 1.訪問某個網址字尾,後端程式碼獲取當前時間,並將該時間傳到html檔案上再返回給瀏覽器展示給使用者看 讀取html內容(字串型別) 然後利用字串替換 最後再返回給瀏覽器 2.將字典傳遞給頁面內容,並且在頁面上海可以通過類似於後端的操作方式操作該資料 模板語法>>>:jinja2 3.jinja2模板功能闡述: 支援將資料傳遞到html頁面並提供近似於後端的處理方式簡單快捷的操作資料
jinja模板
pip3 install jinja2
from jinja2 import Template
def get_dict_func(request):
user_dict = {'name': 'jason', 'age': 18, 'person_list': ['阿珍', '阿強', '阿香', '阿紅']}
with open(r'templates/get_dict_page.html', 'r', encoding='utf8') as f:
data = f.read()
temp_obj = Template(data) # 將頁面資料交給模板處理
res = temp_obj.render({'d1': user_dict}) # 給頁面傳了一個 變數名是d1值是字典資料的資料
return res
<p>{{ d1 }}</p>
<p>{{ d1.name }}</p>
<p>{{ d1['age'] }}</p>
<p>{{ d1.get('person_list') }}</p>
前端、後端、資料庫三者聯動
1.前端瀏覽器訪問get_user 後端連線資料庫查詢use表中所有的資料 傳遞到某個html頁面 弄弄好樣式 再發送給瀏覽器展示
{% for user_dict in user_data_list %}
<tr>
<td>{{ user_dict.id }}</td>
<td>{{ user_dict.name }}</td>
<td>{{ user_dict.age }}</td>
</tr>
{% endfor %}
python主流web框架
1.Django
優點:大而全,自身自帶的功能元件非常的多,類似於航空母艦
2.flask
優點:小而精,自身自帶的功能元件非常的,類似於遊騎兵,幾乎所有的功能都需要依賴於第三方模板
缺點:過於依賴第三方模板,有時候更新容易出現跟第三方模板不相容的現象
3.tornado
非同步非阻塞,速度極快,效率極高甚至可以充當遊戲服務端
非同步:任務在提交以後不原地等待,繼續執行其他任務,如果有結果返回接收就行
非阻塞:就緒態,執行態
其他的框架:sanic、factapi
Django簡介
1.版本問題
Django1.X:同步 1.11
Django2.X:同步 2.2
Django3.X:非同步 3.2
Django4.X:非同步 4.2
注意:版本之間的差異其實不大,主要是添加了額外的功能
2.執行Django注意事項
1.Django專案中所有的檔名目錄名不要出現中文
2.計算機名稱儘量也不要出現中文
3.一個pycharm儘量就是一個完整的專案(不要巢狀,不要疊加)
4.不同版本python直譯器與不同版本的Django可能會出現小問題
Django基本使用
1.下載
pip3 install django 預設最新版本
pip3 install django版本號 指定版本
pip3 install django==2.2.22
pip下載模組會自動解決依賴問題(會把關聯需要用到的模組一起下了)
2.驗證
django-admin
3.常見命令
1.建立django專案
django-admin startproject 專案名
2.啟動django專案
cd 專案名 切換到該目錄下
python38 manage.py runserver ip:port(ip和埠可以不寫)
4.pycharm啟動自動建立django專案
會自動建立templates資料夾,但是配置檔案中可能會報錯
os.path.join(BASE_DIR,'templates')
django app的概念
django類似於是一所大學,app類似於大學裡面的各個學院
django裡面的app類似於某個具體的功能模組
user app 所有使用者相關的都寫在user app下
goods app 所有商品相關的寫在goods app下
命令列建立應用
python38 manage.py startapp 應用名
pycharm
新建django專案可以預設建立一個,並且自動註冊
"""
建立的app一定要去settings.py中註冊
INSTALLED_APPS = [
'app01.apps.App01Config',
'app02'
]
"""
django的主要目錄結構
django專案目錄名
django專案同名目錄
settings.py 配置檔案
urls.py 儲存網址字尾與函式名對應關係(不嚴謹)
wsgi.py wsgiref閘道器檔案
db.sqlites3檔案 django自帶的小型資料庫(專案啟動之後才會出現)
manage.py 入口檔案(命令提供)
應用目錄
migrations目錄 儲存資料庫相關記錄
admin.py django內建的admin後臺管理功能
apps.py 註冊app相關
models.py 與資料庫打交道的(非常重要)
tests.py 測試檔案
views.py 儲存功能函式(不嚴謹)
templates目錄 儲存html檔案(命令列不會自動建立,pycharm會,但是需要在配置檔案中配置路徑)
"""
重要名詞講解:
網址字尾 路由
函式 檢視函式
類 檢視類
urls.py 路由層
views.py 檢視層
models.py 模型層
templates 模板層
"""
django小白必會的三板斧
from django.shortcuts import render, HttpResponse, redirect
HttpResponse 返回字串型別的資料
render 返回html頁面並且支援傳值
redirrct 重定向