wsgiref模組、web框架、django框架簡介

末笙發表於2022-05-10

"""
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.併發量問題
"""

基於wsgiref模組

 

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模板語法

 

 

 

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資料夾專業名詞稱之為'模板層'

python主流web框架

django
    大而全 自帶的功能非常的多 但是有時候會略顯笨重
  類似於'航空母艦'
  
flask
    小而精 自帶的功能非常的少 但是第三方模組非常的多
  類似於'遊騎兵'
  # flask的第三方模組加到一起甚至比django還多 並且也越來越像django
  # flask由於過多的依賴於第三方模組 有時候也會受制於第三方模組
  
tornado
    非同步非阻塞框架 速度極快 甚至可以用於充當遊戲伺服器

# 還有一些佔比較小  但是也很厲害的框架
    fastapi、sanic......
  
"""
框架的核心邏輯幾乎是一致的 我們在學習的時候只需要先學會一種
之後就可以觸類旁通 但是需要強調的是:千萬不用同時學習!!!
"""

django框架簡介

# 版本問題
    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
  '''如果之前下載了其他版本不用管 自動替換!!!'''

django基本使用

# 驗證是否下載成功
    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

應用app

django本身類似於是一個空殼子 真正的功能是由裡面的各個應用決定

django框架相當於是一所大學 應用相當於是大學裡面的各個學院
    大學其實是個殼子 負責提供環境 
  學院才是一個個真正具備特定功能的集合

eg:
  使用django寫一個淘寶
      淘寶裡面有很多功能模組
        我們應該先建立一個空的django專案然後根據功能的不同建立不同的應用
          django專案
          app01(user)
          app02(order)
          app03(goods)
          app04(backend)

django主要檔案介紹

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'                                        簡寫語法
"""

 

 

相關文章