1. 程式人生 > 實用技巧 >Django Web框架

Django Web框架

Django框架的介紹

  • 2005年釋出,採用Python語言編寫的開源web框架

  • 早期的時候Django主做新聞和內容管理的

  • 一個重量級的 Python Web框架,Django 配備了常用的大部分元件

    1. 基本配置
    2. 路由系統
    3. 原生HTML模板系統
    4. 檢視 view
    5. Model模型,資料庫連線和ORM資料庫管理
    6. 中介軟體
    7. Cookie & Seesion
    8. 分頁
    9. 資料庫後臺管理系統admin
  • Django的用途

    • 網站後端開發
    • 微信公眾號、微信小程式等後臺開發
    • 基於HTTP/HTTPS協議的後臺伺服器開發
      • 線上語音/影象識別伺服器
      • 線上第三方身份驗證伺服器等
  • Django的版本

    • 最新版本:2.2.x
    • 當前教學版本:1.11.8
  • Django的官網

Django的安裝

  • 檢視已安裝的版本

    >>> import django
    >>> print(django.VERSION)
    (1, 11, 8, 'final', 0)
    
  • 安裝

    1. 線上安裝
      • $ sudo pip3 install django 安裝django的最新版本
      • $ sudo pip3 install django[==版本] 安裝django的指定版本
      • 如:
        • $ sudo pip3 install django==1.11.8
    2. 離線安裝
      • 下載安裝包:
      • 安裝離線包
        • $ tar -xvf Django-1.11.8.tar.gz
        • $ cd Django-1.11.8
        • $ sudo python3 setup.py install
    3. 用wheel離線安裝
      • 下載安裝包:
        • pip3 download -d /home/tarena/django_packs django==1.11.8
      • 安裝離線包
        • $ pip3 install Django-1.11.8.whl
  • Django的解除安裝

  • $ pip3 uninstall django

  • Django 的開發環境

    • Django 1.11.x 支援 Python 2.7, 3.4, 3.5 和 3.6(長期支援版本 LTS)
    • 注: Django 1.11.x 不支援 Python 3.7

Django框架開發

建立專案的指令

  • $ django-admin startproject 專案名稱

  • 如:

    • $ django-admin startproject mysite1
  • 執行

    $ cd mysite1
    $ python3 manage.py runserver
    # 或
    $ python3 manage.py runserver 5000  # 指定只能本機使用127.0.0.1的5000埠訪問本機
    

Django專案的目錄結構

  • 示例:

    $ django-admin startproject mysite1
    $ tree mysite1/
    mysite1/
    ├── manage.py
    └── mysite1
        ├── __init__.py
        ├── settings.py
        ├── urls.py
        └── wsgi.py
    
    1 directory, 5 files
    
  • 專案目錄結構解析:

    • manage.py

      • 此檔案是專案管理的主程式,在開發階段用於管理整個專案的開發執行的調式
      • manage.py 包含專案管理的子命令, 如:
        • python3 manage.py runserver 啟動服務
        • python3 manage.py startapp 建立應用
        • python3 manage.py migrate 資料庫遷移
        • ...
    • mysite1 專案包資料夾

      • 專案包的主資料夾(預設與專案名稱一致)
      1. __init__.py
        • 包初始化檔案,當此專案包被匯入(import)時此檔案會自動執行
      2. wsgi.py
        • WSGI 即 Web Server Gateway Interface
        • WEB服務閘道器介面的配置檔案,僅部署專案時使用
      3. urls.py
        • 專案的基礎路由配置檔案,所有的動態路徑必須先走該檔案進行匹配
      4. settings.py
        • Django專案的配置檔案, 此配置檔案中的一些全域性變數將為Django框架的執行傳遞一些引數
        • setting.py 配置檔案,啟動服務時自動呼叫,
        • 此配置檔案中也可以定義一些自定義的變數用於作用全域性作用域的資料傳遞
  • settings.py 檔案介紹

    https://docs.djangoproject.com/en/1.11/ref/settings/

    1. BASE_DIR

      • 用於綁定當前專案的絕對路徑(動態計算出來的), 所有檔案都可以依懶此路徑
    2. DEBUG

      • 用於配置Django專案的啟用模式, 取值:
        1. True 表示開發環境中使用 除錯模式(用於開發中)
        2. False 表示當前專案執行在生產環境中(不啟用除錯)
    3. ALLOWED_HOSTS

      • 設定允許訪問到本專案的網路地址列表,取值:

        1. [] 空列表,表示只有請求頭中host為127.0.0.1, localhost能訪問本專案
        2. ['*'],表示任何請求頭的host都能訪問到當前專案
        3. ['192.168.1.3', '127.0.0.1'] 表示只有當前兩個host頭的值能訪問當前專案
        • 注意:
          • 如果要在區域網其它主機也能訪問此主機,啟動方式應使用如下模式:
      • python3 manage.py runserver 0.0.0.0:5000 # 指定網路裝置所有主機都可以通過5000埠訪問(需加ALLOWED_HOSTS = ['*'])

    4. INSTALLED_APPS

      • 指定當前專案中安裝的應用列表
    5. MIDDLEWARE

      • 用於註冊中介軟體
    6. TEMPLATES

      • 用於指定模板的配置資訊
    7. DATABASES

      • 用於指定資料庫的配置資訊
    8. LANGUAGE_CODE

      • 用於指定語言配置
      • 取值:
        • 英文 : "en-us"
        • 中文 : "zh-Hans"
    9. TIME_ZONE

      • 用於指定當前伺服器端時區
      • 取值:
        • 世界標準時間: "UTC"
        • 中國時區 : "Asia/Shanghai"
    10. ROOT_URLCONF

      • 用於配置根級 url 配置 'mysite1.urls'
      • 如:
        • ROOT_URLCONF = 'mysite1.urls'

    注: 此模組可以通過 from django.conf import settings 匯入和使用

URL 介紹

  • url 即統一資源定位符 Uniform Resource Locator

  • 作用:

    • 用來表示網際網路上某個資源的地址。
  • 說明:

    • 網際網路上的每個檔案都有一個唯一的URL,它包含的資訊指出檔案的位置以及瀏覽器應該怎麼處理它。
  • URL的一般語法格式為:

    protocol :// hostname[:port] / path [?query][#fragment]
    
  • 如:

    http://tts.tmooc.cn/video/showVideo?menuId=657421&version=AID201908#subject
    
  • 說明:

    • protocol(協議)

      • http 通過 HTTP 訪問該資源。 格式 HTTP://
      • https 通過安全的 HTTPS 訪問該資源。 格式 HTTPS://
      • file 資源是本地計算機上的檔案。格式: file:///
      • ...
    • hostname(主機名)

      • 是指存放資源的伺服器的域名系統(DNS) 主機名、域名 或 IP 地址。
    • port(埠號)

      • 整數,可選,省略時使用方案的預設埠;
      • 各種傳輸協議都有預設的埠號,如http的預設埠為80。
    • path(路由地址)

      • 由零或多個“/”符號隔開的字串,一般用來表示主機上的一個目錄或檔案地址。路由地址決定了伺服器端如何處理這個請求
    • query(查詢)

      • 可選,用於給動態網頁傳遞引數,可有多個引數,用“&”符號隔開,每個引數的名和值用“=”符號隔開。
    • fragment(資訊片斷)

      • 字串,用於指定網路資源中的片斷。例如一個網頁中有多個名詞解釋,可使用fragment直接定位到某一名詞解釋。
    • 注: [] 代表其中的內容可省略

檢視函式(view)

  • 檢視函式是用於接收一個瀏覽器請求並通過HttpResponse物件返回資料的函式。此函式可以接收瀏覽器請求並根據業務邏輯返回相應的內容給瀏覽器

  • 檢視處理的函式的語法格式:

    def xxx_view(request[, 其它引數...]):
        return HttpResponse物件
    
  • 引數:

    • request用於繫結HttpRequest物件,通過此物件可以獲取瀏覽器的引數和資料
  • 示例:

    • 檢視處理函式 views.py

      # file : <專案名>/views.py
      from django.http import HttpResponse
      def page1_view(request):
          html = "<h1>這是第1個頁面</h1>"
          return HttpResponse(html)
      

Django 中的路由配置

  • settings.py 中的ROOT_URLCONF 指定了主路由配置列表urlpatterns的檔案位置

  • urls.py 主路由配置檔案

    # file : <專案名>/urls.py
    urlpatterns = [
        url(r'^admin/', admin.site.urls),
        ...  # 此處配置主路由
    ]
    

    urlpatterns 是一個路由-檢視函式對映關的列表,此列表的對映關係由url函式來確定

  1. url() 函式

    • 用於描述路由與檢視函式的對應關係
    • 模組
      • from django.conf.urls import url
    • 語法:
      • url(regex, views, name=None)
      • 引數:
        1. regex: 字串型別,匹配的請求路徑,允許是正則表示式
        2. views: 指定路徑所對應的檢視處理函式的名稱
        3. name: 為地址起別名,在模板中地址反向解析時使用

    每個正則表示式前面的r表示'\'不轉義的原始字串

  • 練習

帶有分組的路由和檢視函式

帶有命名分組的路由和檢視函式

HTTP協議的請求和響應

  • 請求是指瀏覽器端通過HTTP協議傳送給伺服器端的資料
  • 響應是指伺服器端接收到請求後做相應的處理後再回復給瀏覽器端的資料

HTTP 請求

  • 根據HTTP標準,HTTP請求可以使用多種請求方法。

  • HTTP1.0定義了三種請求方法: GET, POST 和 HEAD方法(最常用)

  • HTTP1.1新增了五種請求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。

  • HTTP1.1 請求詳述

    序號 方法 描述
    1 GET 請求指定的頁面資訊,並返回實體主體。
    2 HEAD 類似於get請求,只不過返回的響應中沒有具體的內容,用於獲取報頭
    3 POST 向指定資源提交資料進行處理請求(例如提交表單或者上傳檔案)。資料被包含在請求體中。POST請求可能會導致新的資源的建立和/或已有資源的修改。
    4 PUT 從客戶端向伺服器傳送的資料取代指定的文件的內容。
    5 DELETE 請求伺服器刪除指定的頁面。
    6 CONNECT HTTP/1.1協議中預留給能夠將連線改為管道方式的代理伺服器。
    7 OPTIONS 允許客戶端檢視伺服器的效能。
    8 TRACE 回顯伺服器收到的請求,主要用於測試或診斷。
  • HttpRequest物件

    • 檢視函式的第一個引數是HttpRequest物件
    • 伺服器接收到http協議的請求後,會根據請求資料報文建立HttpRequest物件
    • HttpRequest屬性
      • path_info: URL字串
      • method:字串,表示HTTP請求方法,常用值:'GET'、'POST'
      • encoding:字串,表示提交的資料的編碼方式
        • 如果為None則表示使用瀏覽器的預設設定,一般為'utf-8'
        • 這個屬性是可寫的,可以通過修改它來修改訪問表單資料使用的編碼,接下來對屬性的任何訪問將使用新的encoding值
      • GET:QueryDict查詢字典的物件,包含get請求方式的所有資料
      • POST:QueryDict查詢字典的物件,包含post請求方式的所有資料
      • FILES:類似於字典的物件,包含所有的上傳檔案資訊
      • COOKIES:Python字典,包含所有的cookie,鍵和值都為字串
      • session:似於字典的物件,表示當前的會話,
      • body: 字串,請求體的內容(POST或PUT)
      • environ: 字串,客戶端執行的環境變數資訊
      • scheme : 請求協議('http'/'https')
      • request.get_full_path() : 請求的完整路徑
      • request.get_host() : 請求的主機
      • request.META : 請求中的元資料(訊息頭)
        • request.META['REMOTE_ADDR'] : 客戶端IP地址

HTTP 響應

  • 當瀏覽者訪問一個網頁時,瀏覽者的瀏覽器會向網頁所在伺服器發出請求。當瀏覽器接收並顯示網頁前,此網頁所在的伺服器會返回一個包含HTTP狀態碼的資訊頭用以響應瀏覽器的請求。

  • HTTP狀態碼的英文為HTTP Status Code。

  • 下面是常見的HTTP狀態碼:

    • 200 - 請求成功
    • 301 - 資源(網頁等)被永久轉移到其它URL
    • 404 - 請求的資源(網頁等)不存在
    • 500 - 內部伺服器錯誤
  • HTTP狀態碼分類

    • HTTP狀態碼由三個十進位制數字組成,第一個十進位制數字定義了狀態碼的型別,後兩個數字沒有分類的作用。HTTP狀態碼共分為5種類型:

      分類 分類描述
      1** 資訊,伺服器收到請求,需要請求者繼續執行操作
      2** 成功,操作被成功接收並處理
      3** 重定向,需要進一步的操作以完成請求
      4** 客戶端錯誤,請求包含語法錯誤或無法完成請求
      5** 伺服器錯誤,伺服器在處理請求的過程中發生了錯誤
  • Django中的響應物件HttpResponse:

    • 建構函式格式:

      • HttpResponse(content=響應體, content_type=響應體資料型別, status=狀態碼)
    • 作用:

      • 向客戶端瀏覽器返回響應,同時攜帶響應體內容
    • 引數:

      • content:表示返回的內容。

      • status_code:返回的HTTP響應狀態碼(預設為200)。

      • content_type:指定返回資料的的MIME型別(預設為"text/html")。瀏覽器會根據這個屬性,來顯示資料。如果是text/html,那麼就會解析這個字串,如果text/plain,那麼就會顯示一個純文字。

        • 常用的Content-Type如下:
          • 'text/html'(預設的,html檔案)
          • 'text/plain'(純文字)
          • 'text/css'(css檔案)
          • 'text/javascript'(js檔案)
          • 'multipart/form-data'(檔案提交)
          • 'application/json'(json傳輸)
        • 'application/xml'(xml檔案)

        注: 關鍵字MIME(Multipurpose Internet Mail Extensions)是指多用途網際網路郵件擴充套件型別。

  • HttpResponse 子類

    型別 作用 狀態碼
    HttpResponseRedirect 重定響 302
    HttpResponseNotModified 未修改 304
    HttpResponseBadRequest 錯誤請求 400
    HttpResponseNotFound 沒有對應的資源 404
    HttpResponseForbidden 請求被禁止 403
    HttpResponseServerError 伺服器錯誤 500

GET方式傳參

  • GET請求方式中可以通過查詢字串(Query String)將資料傳遞給伺服器

  • URL 格式: xxx?引數名1=值1&引數名2=值2...

    • 如: http://127.0.0.1:8000/page1?a=100&b=200
  • 伺服器端接收引數

    1. 判斷 request.method 的值判斷請求方式是否是get請求

      if request.method == 'GET':
          處理GET請求時的業務邏輯
      else:
          處理其它請求的業務邏輯
      
    2. 獲取客戶端請求GET請求提交的資料

      1. 語法

        request.GET['引數名']  # QueryDict
        request.GET.get('引數名','預設值')
        request.GET.getlist('引數名')
        # mypage?a=100&b=200&c=300&b=400
        # request.GET=QueryDict({'a':['100'], 'b':['200','400'], 'c':['300']})
        # a = request.GET['a']
        # b = request.GET['b']  # Error
        
        
        
      2. 能夠產生get請求方式的場合

        1. 位址列手動輸入, 如: http://127.0.0.1:8000/mypage?a=100&b=200

        2. <a href="地址?引數=值&引數=值">

        3. form表單中的method為get

          <form method='get' action="/user/login">
              姓名:<input type="text" name="uname">
          </form>
          

一般查詢字串的大小會受到瀏覽器的的限制(不建議超過2048位元組)

POST傳遞引數

  • 客戶端通過表單等POST請求將資料傳遞給伺服器端,如:
<form method='post' action="/login">
    姓名:<input type="text" name="username">
    <input type='submit' value='登陸'>
</form>
  • 伺服器端接收引數

    • 通過 request.method 來判斷是否為POST請求,如:
    if request.method == 'POST':
        處理POST請求的資料並響應
    else:
        處理非POST 請求的響應
    
  • 使用post方式接收客戶端資料

    1. 方法
    request.POST['引數名']  # request.POST 繫結QueryDict
    request.POST.get('引數名','')
    request.POST.getlist('引數名')
    
  • 取消csrf驗證,否則Django將會拒絕客戶端發來的POST請求

    • 取消 csrf 驗證

      • 刪除 settings.py 中 MIDDLEWARE 中的 CsrfViewsMiddleWare 的中介軟體
      MIDDLEWARE = [
          ...
          # 'django.middleware.csrf.CsrfViewMiddleware',
          ...
      ]
      

form 表單的name屬性

  • 在form表單控制元件提交資料時,會自動搜尋本表單控制元件內部的子標籤的name屬性及相應的值,再將這些名字和值以鍵-值對的形式提交給action指定的伺服器相關位置

  • 在form內能自動蒐集到的name屬性的標籤的控制元件有

    <input name='xxx'>
    <select name='yyy'></select>
    <textarea name='zzz'></textarea>
    
    • 如:
    <form action="/page1" method="POST">
        <input name="title" type="text" value="請輸入">
        <select name="gender">
            <option value=1>男</option>
            <option value=0>女</option>
        </select>
        <textarea name="comment" rows="5" cols="10">附言...</textarea>
        <input type="submit" value="提交">
    </form>