1. 程式人生 > 其它 >django 01 web框架推導與django介紹

django 01 web框架推導與django介紹

web框架推導

# 1.web框架是基於網際網路的web服務端
     連線前端與資料庫的中間介質
# 2.學習web框架必備知識:
     1.socket服務端程式碼
     2.HTTP協>>>:四大特性
# 3.web框架可以根據路由的不同請求不同內容
     路由指的是web開發中根據url分配到對應的處理程式
# 4.請求方式:
     get         朝服務端索要資料
     post        超服務端提交資料
# 5.手寫的web框架缺點
    1.socket程式碼過於重複
    2.針對請求資料格式的處理複雜且重複
    
3.針對不同路由的匹配太low了 # 6.程式碼
 import socket

 server = socket.socket()
 server.bind(('127.0.0.1',8080))
 server.listen(5)

 while True:
     sock, address = server.accept()
     data = sock.recv(1024)
     sock.send(b'HTTP/1.1 200 OK\r\n\r\nhello this is my wed')
     target_url = data.decode('utf8').split(' '
)[1] if target_url == '/index': sock.send(b'index view') elif target_url == '/login': sock.send(b'login view') else: sock.send(b'404 error')


基於wsgiref模組改進

# 1.wsgiref模組介紹
    wsgiref模組內部封裝了socket程式碼對請求資料的處理
# 2.模組的匯入
    from wsgiref.simple_server import make_server
# 3.封裝後的程式碼
from wsgiref.simple_server import make_server

def run(request, response):
    """
    :param request:  請求資料
    :param response: 響應資料
    :return: 返回給客戶端的資料
    """
    print(request)
    response('200 OK', [])   # 固定程式碼無需掌握
    return [b'hello big baby']

if __name__ == '__main__':
    # 任何訪問127.0.0.1:8080的請求都會給第三個引數加括號呼叫
    server = make_server('127.0.0.1', 8080, run)  
    server.serve_forever()     # 永久啟動
# 4.缺點分析
    - 後續如果新增新的網頁不便於管理,將程式碼進行封裝優化按照軟體開發目錄規範管理    
    - 程式碼:
from wsgiref.simple_server import make_server

def index(request):
    return 'index'
def login(request):
    return 'login'
def error(request):
    return '404 not found'

urls = (
    ('/index',index),
    ('/login',login),
)
def run(request, response):
    """
    :param request:  請求資料
    :param response: 響應資料
    :return: 返回給客戶端的資料
    """
    response('200 OK', [])  # 固定程式碼無需掌握
    target_path = request.get('PATH_INFO')

    func_name = None
    for url_tp in urls:   #   ('/index',index),
        if url_tp[0] == target_path:
            func_name = url_tp[1]    # 儲存匹配到的函式嗎,方便後續呼叫
            break    # 一旦匹配到內容直接結束for迴圈
    # for迴圈結束後需要判斷func_name是否還為空,
    if func_name:
        res = func_name(request)
    else:
        res = error(request)
    return [res.encode('utf8')]    # 統一編碼處理,函式返回字串操作更簡單

if __name__ == '__main__':
    # 任何訪問127.0.0.1:8080的請求都會給第三個引數加括號呼叫
    server = make_server('127.0.0.1', 8080, run)
    server.serve_forever()     # 永久啟動
# 5.軟開管理規範
  - 根據py檔案中功能的不同劃分到不同的py檔案(模組化)
    urls.py              對應關係
    views.py          功能函式
    start.py          啟動檔案
    templates資料夾   儲存html

動靜態網頁

# 1.動態網頁
   頁面上的資料是動態獲取的,來自後端傳入
# 2.靜態網頁
   頁面的資料是死的,需要修改原始碼才能修改資料
# 3.通過後端程式碼實現前端展示後端所寫內容
   1.通過檔案讀寫,在前端設定字串型別,在後端將字串進行替換
   2.將字典傳遞給頁面內容,在頁面上通過jinja2模組模板語法對其進行操作

jinja2模板語法

# 1.jinja2模組下載
     pip3 install jinja2   
# 2.使用jinja2實現後端字典資料傳遞給前端,並且拿到其中一個鍵或值
  - 後端程式碼:
  from jinja2 import Template

  def get_dict(request):
      user_dict = {'id': 1, 'name': 'tom', 'age': 18, 'hobby': ['ring', 'run']}
      with open(r'templates/my01.html','r',encoding='utf8') as f:
          data = f.read()
      temp =Template(data)
      res = temp.render(data=user_dict) # 將字典傳遞給html頁面,頁面通過data就能獲取
      return res
  - 前端html內的:
    <p>{{ data }}}</p>
    
# 3.jinja2模板語法(前端操作後端)
  - 1.字典取值(四種方式)
<h1>{{ data }}</h1>
<h1>{{ data['name'] }}</h1>
<h1>{{ data.get('pwd') }}</h1>
<h1>{{ data.hobby }}</h1> 
2.資料庫表單展示
{% for user in user_data %}
  <tr>
      <td>{{ user.id }}</td>
      <td>{{ user.name }}</td>
      <td>{{ user.age }}</td>
  </tr>
{% endfor %}

前後端與資料庫聯動

# 步驟 
  1.前端瀏覽器訪問get_user 
  2.後端連線資料庫查詢use表中所有的資料 
  3.後端將資料傳遞到某個html頁面
  4.前端弄好樣式,再發送給瀏覽器展示
{% 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框架
    非同步非阻塞框架 該框架快到可以作為遊戲伺服器
  缺陷:上手難度是三者最高的

# 4.fastapi框架、sanic框架、...
    最近流行的

django簡介

# 1.版本問題
  1.X:同步        1.11
  2.X:同步        2.2
  3.X:非同步        3.2
     """無論使用什麼版本都可以 區別不大"""

# 2.啟動注意事項
  - 1.計算機名稱儘量不要有中文
  - 2.專案中所有的py檔名儘量不要用中文
  - 3.不同版本的python直譯器配合不同版本的django,會有一些報錯
     """仔細查詢一下報錯資訊,裡面會提示你是哪個py檔案裡面的程式碼出錯,找到那一行程式碼,把逗號刪除即可"""
  - 4.一個pycharm視窗只允許有一個專案 不要做專案的巢狀

django使用

# 1.下載
    pip3 install django                   預設最新版
    pip3 install django==版本號            指定版本
    pip3 install django==2.2.22
          pip下載模組會自動解決依賴問題(會把關聯需要用到的模組一起下了)

# 2.驗證django是否下載成功
    cmd終端輸入django-admin

# 3.cmd命令操作
    - 1.建立django專案
        django-admin startproject 專案名
    - 2.啟動django專案
        1.先切換到專案目錄下        cd 專案名
        2.執行啟動目錄             python38 manage.py runserver ip:port
                                     #  ip:port 本機可不寫
    - 3.訪問django服務端
        瀏覽器直接訪問     
    - 4.建立app應用
        python38 manage.py startapp 應用名
        """
           django框架類似於是一個空殼子 給你提供所需的資源,至於到底要寫哪些功能 需要通過建立app來劃分
        eg:django初始專案可以看成是一所大學,app就相當於是大學裡面的各個學院
        """     
# 4.pycharm操作(new project>>>django(滑鼠控制))
     在啟動django專案的時候,一定要確保一個埠只有一個專案。

# 5.命令列與pycharm操作的區別
     - 1.命令列不會自動建立templates資料夾
     - 2.命令列不會在配置檔案編寫關於templates資料夾的配置
         """'DIRS': [os.path.join(BASE_DIR, 'templates')]"""
     - 3.pycharm自動建立的第一個應用會自動註冊到配置檔案中
     - 4.針對db.sqlite3檔案不用去在乎它有沒有建立 只要運行了django會自動出來

django目錄結構

# 1. 專案同名資料夾
      1. __init__.py              很少用 主要做一些冷門配置
      2. settings.py              專案配置檔案
      3. urls.py                  對應關係(目前簡單的理解:網址字尾跟函式名)
      4. wsgi.py                  django服務 基本不用
      5. manage.py                django入口檔案
# 2. templates資料夾               儲存專案所需的html檔案
# 3. 應用名資料夾(可以有多個)
      1. migrations資料夾          orm相關(資料庫打交道的記錄)
      2.__init__.py               很少用主要做一些冷門配置
      3.admin.py                  django自帶的後臺管理
      4.apps.py                   建立應用之後用於應用的註冊
      5.models.py                 儲存與資料庫表相關的類
      6.tests.py                  自帶的測試檔案
      7.views.py                  儲存業務相關的邏輯程式碼(函式、類)
# 4.db.sqlite3                    自帶的小型資料庫

# 5.重要知識
urls.py           路由層
views.py          檢視層
templates         模板層
models.py         模型層
# 6.匯入方式
from django.template import Template, TemplateDoesNotExist  
   """django一般會自己建立該模組,建議缺什麼補什麼"""

django三板斧

# 1.匯入
from django.shortcuts import render,HttpResponse,redirect

"""
HttpResponse          返回字串型別的資料
render                返回html頁面並且支援傳值
redirect              重定向
"""