"""
web框架:將前端、資料庫整合到一起的基於網際網路傳輸的python程式碼
web框架也可以簡單的理解為是軟體開發架構裡面的'服務端'
"""
# 1.搭建簡易版本服務端
socket模組
# 2.遵循HTTP協議
四大特性、資料格式、響應狀態碼
# 3.基於不同的字尾響應不同的內容
如何獲取使用者輸入的url字尾>>>:HTTP請求資料
/favicon.ico直接忽略 不影響判斷
利用字串切割和索引取值獲取相應資料
import socket server = socket.socket() server.bind(('127.0.0.1', 8888)) server.listen(5) while True: sock, addr = server.accept() data = sock.recv(1024) data_str = data.decode('utf8') sock.send(b'HTTP1.1 200 OK\r\n\r\n') current_path = data_str.split(' ')[1] if current_path == '/login': sock.send(b'hello login!') elif current_path == '/register': sock.send(b'hello register') else: sock.send(b'404 error')
"""
上述框架缺陷:
1.服務端起始程式碼過於重複
2.針對HTTP請求資料沒有完善的處理方式
3.併發量問題
"""
from wsgiref import simple_server def run(request, response): response('200 OK', []) current_path = request.get('PATH_INFO') if current_path == '/login': return [b'hello login html'] elif current_path == '/register': return [b'hello register html'] return [b'404 error'] if __name__ == '__main__': server = simple_server.make_server('127.0.0.1', 8888, run) server.serve_forever()
1.如果網站很多 是不是就是以為的新增elif 2.每個分支下的功能根據業務邏輯的不同可能會比較複雜 """上述兩個問題需要做優化處理""" 將匹配和功能封裝成 元組和函式 """所有的程式碼全部放在一個py檔案過於冗餘 不便於後期管理維護""" 根據功能的不同拆分成不同的py檔案 urls.py 對應關係的儲存 views.py 業務邏輯的編寫 # 以後要想新增功能 只需要在urls.py中新增對應關係 view.py中編寫函式 """業務函式的程式碼中 可能會頻繁的使用到不同的html頁面""" 為了避免檔案型別的混亂 單獨開設一個資料夾儲存所有的html檔案 templates資料夾 儲存專案所需的html檔案 """專案中的html檔案 也有可能需要用到css、js、第三方框架檔案""" html所學的css、js、第三方框架程式碼都是寫完之後很少做改動的檔案 所以可以統一存放在某個資料夾下 static資料夾 儲存專案所需的'靜態檔案'
動靜態網頁
靜態網頁 頁面上的資料是直接寫死的 萬年不變 eg:上述專案中編寫的 error.html func.html 動態網頁 頁面上的資料是通過程式碼動態獲取的 實時可變 eg: 1.頁面上展示當前時間(後端獲取傳遞給前端介面) 2.頁面上展示資料庫資料(後端連結資料庫查詢資料再傳遞給頁面) 案例1: 頁面上展示當前時間 def get_time(request): # 1.獲取當前時間 import time c_time = time.strftime('%Y-%m-%d %X') # 2.讀取html檔案 with open(r'templates/get_time.html','r',encoding='utf8') as f: data = f.read() # 3.思考:如何給字串新增一些額外的字串資料>>>:字串替換 new_data = data.replace('asdaksdjal',c_time) return new_data 案例2: 將字典傳遞給頁面 並且在頁面上 還可以使用字典的操作方法 jinja2模板語法
# 第三方模組 pip3 install jinja2 # 功能介紹 在編寫前後端不分離專案的時候 可以使用該模組提供的模板語法簡單快速的在html頁面是使用類似於後端的程式碼語法運算元據 # 模板語法 '''目前只做簡單瞭解 後面都會詳細的講!!!''' temp_obj.render({'user':user_dict,'new_list':new_list}) <p>{{ user }}</p> <p>{{ user.name }}</p> <p>{{ user['pwd'] }}</p> <p>{{ user.get('hobby') }}</p> {% for i in new_list %} <span>元素:{{ i }}</span> {% endfor %} # 獲取資料庫中的資料展示到前端頁面 還是用的上述模板語法
參考群內截圖:僅限於我們自己編寫的web框架(真正的框架其實跟這個差不多) urls.py 字尾與函式名對應關係 ('/index',register) 字尾專業名詞稱之為'路由' 函式名專業名詞稱之為'檢視函式' urls.py專業名詞稱之為'路由層' views.py 專門編寫業務邏輯程式碼 可以是函式 也可以是類 函式專業名詞稱之為'檢視函式' 類專業名詞稱之為'檢視類' views.py專業名詞稱之為'檢視層' templates資料夾 專門儲存html檔案 html檔案專業名詞稱之為'模板檔案' templates資料夾專業名詞稱之為'模板層'
django 大而全 自帶的功能非常的多 但是有時候會略顯笨重 類似於'航空母艦' flask 小而精 自帶的功能非常的少 但是第三方模組非常的多 類似於'遊騎兵' # flask的第三方模組加到一起甚至比django還多 並且也越來越像django # flask由於過多的依賴於第三方模組 有時候也會受制於第三方模組 tornado 非同步非阻塞框架 速度極快 甚至可以用於充當遊戲伺服器 # 還有一些佔比較小 但是也很厲害的框架 fastapi、sanic...... """ 框架的核心邏輯幾乎是一致的 我們在學習的時候只需要先學會一種 之後就可以觸類旁通 但是需要強調的是:千萬不用同時學習!!! """
# 版本問題 django3.X:預設支援非同步功能 django2.X:預設不支援非同步 django1.X:預設不支援非同步 ''' 我們學習的時候 可以基於django1.11.X版本 與2.X功能幾乎一致 3.X僅僅是多了一個功能(並且該功能目前還不完善 半成品!!!) ''' django1.11.X LTS 2018年釋出 django2.2.X LTS 2020年釋出 # 之前使用的是1.11 有些新專案逐步過渡到2.2 自己私下也研究過3.2 # 啟動問題 django啟動可能報錯的原因 1.計算機名稱不能含有中文 直接修改即可 2.不同版本的直譯器可能會報錯 找到報錯資訊的最後一行提示對應的程式碼 刪除原始檔逗號即可 eg: 直譯器推薦使用python3.6 幾乎不會報錯 直譯器如果是高版本使用django1.11可能會報錯 直譯器如果是低版本使用django2、3也可以報錯 3.專案中所有的檔名稱最好使用英文 4.一個pycharm視窗儘量就是一個完整的專案 不要巢狀 # 下載 pip3 install django==1.11.11 '''如果之前下載了其他版本不用管 自動替換!!!'''
# 驗證是否下載成功 cmd視窗直接輸入django-admin有反應就是成功了 # 命令操作django 1.建立django專案 django-admin startproject 專案名(mysite) 2.啟動django專案 cd 專案名(mysite) python3 manage.py runserver IP:PORT 3.建立app應用 python3 manage.py startapp 應用名(app01) '''命令列無法自動建立模板資料夾 需要自己執行命令建立''' # pycharm操作django 1.new project 選擇django 填寫應用即可 '''pycharm預設會自動幫你建立模板資料夾 並提供建立一個app的功能''' 2.建立更多的app tools run manage.py task 命令自動提示 3.啟動專案 直接點選綠色箭頭 還可以修改埠號 edit configurations
django本身類似於是一個空殼子 真正的功能是由裡面的各個應用決定
django框架相當於是一所大學 應用相當於是大學裡面的各個學院
大學其實是個殼子 負責提供環境
學院才是一個個真正具備特定功能的集合
eg:
使用django寫一個淘寶
淘寶裡面有很多功能模組
我們應該先建立一個空的django專案然後根據功能的不同建立不同的應用
django專案
app01(user)
app02(order)
app03(goods)
app04(backend)
day50_1專案檔名 day50_1同名資料夾 # settings.py 專案配置檔案 # urls.py 路由層 manage.py django入口檔案 很多命令都需要該檔案支援 db.sqlite3 django啟動之後才會生成的檔案 其實就是django自帶的小型資料庫 templates資料夾 模板層 app01應用資料夾 # migrations資料夾 資料遷移記錄(後續講解) # admin.py django自帶的後臺管理(後續講解) # apps.py 用於app的註冊(後續講解) # models.py 專門用於運算元據庫(後續講解 很重要) # views.py 檢視層 """ 建立應用之後 一定要去配置檔案中註冊才能生效 'app01.apps.App01Config' 完整語法 'app01' 簡寫語法 """