Python後臺開發(第一章: 路由與模板)

CSDN學院發表於2020-01-11

Python後臺開發(第一章: 路由與模板)

1 Web原理介紹

在這裡插入圖片描述

在這裡插入圖片描述

Django可以更快地構建更好的Web應用程式並減少程式碼。

Django官方網址:https://www.djangoproject.com/

2 Django環境搭建和入門案例

2.1 環境搭建

程式碼部分:

pip install django==2.2 
pip install pillow

2.2 環境搭建步驟

2.2.1 建立專案

2.2.1.1第一種方式

在這裡插入圖片描述

注:

  1. 使用的Pycharm必須是專業版(社群版有很多功能不支援,例如資料庫視覺化)
  2. 選擇Python環境直譯器在第一週環境搭建中有講述

2.2.1.2 第二種方法

從命令列cd到您要儲存程式碼的目錄,然後執行以下命令:

django-admin startproject myweb

在這裡插入圖片描述

注:

使用上述命令需要將django的bin目錄新增到環境變數中,如:C:\Users\admin\AppData\Roaming\Python\Python36\site-packages\django\bin

2.2.2 專案結構

在這裡插入圖片描述

  • manage.py:一個命令列實用程式,可以讓您以各種方式與此Django專案進行互動。你可以閱讀所有的細節
    manage.py在Django的管理和manage.py
  • web_1入門案例/目錄是您的專案的實際Python包。它的名字是您需要用來匯入其中的任何內容的Python包名稱(例如myweb.urls)。
  • web_1入門案例/init.py:一個空的檔案,告訴Python這個目錄應該被認為是一個Python包。
  • web_1入門案例/settings.py:此Django專案的設定/配置。Django設定會告訴你所有關於設定的工作原理。
  • web_1入門案例/urls.py:該Django專案的URL宣告;您的Django動力網站的“目錄”。
  • web_1入門案例/wsgi.py:WSGI相容的Web伺服器為您的專案提供服務的入口點。

2.2.3 建立app

要建立您的應用程式,請確保您與目錄位於同一目錄,manage.py 並鍵入以下命令:

python manage.py startapp myapp 

注:若當前環境中有兩個python環境,可使用python3或python3命令來呼叫3的環境,如:

python3 manage.py startapp myapp

)]

2.2.4 載入app

在settings的INSTALLED_APPS中載入建立的新應用:

在這裡插入圖片描述

注:

  1. 新增的時候注意格式 ,後邊一定要跟上逗號,保持列表的格式.
  2. 2種新增的方式,效果相同,使用任意一種即可.

2.2.5 執行伺服器

執行以下命令:

要建立您的應用程式,請確保您與目錄位於同一目錄,manage.py 並鍵入以下命令:

python manage.py runserver`

注:若當前環境中有兩個python環境,可使用python3或python3.6命令來呼叫3.6的環境,如

python3 manage.py runserver

預設情況下,該runserver命令在埠8000的內部IP上啟動開發伺服器。當然也可以指定埠開啟服務,如8080埠:

python manage.py runserver 8080

如果要更改伺服器的IP,請將其與埠一起傳遞。例如:

python manage.py runserver 0.0.0.0:8000

在這裡插入圖片描述

2.2.6 簡單demo的實現

  • 我們來寫第一個檢視。開啟檔案myapp/views.py 並放入以下Python程式碼:
from django.http import HttpResponse 
def index(request):     
	return HttpResponse("Hello, world. You're at the myapp index.") 

  • 這是Django中最簡單的檢視。要呼叫檢視,我們需要將其對映到一個路由,要在myapp目錄中建立一個名為urls.py。應用目錄應該如下所示

這是Django中最簡單的檢視。要呼叫檢視,我們需要將其對映到一個路由,要在myapp目錄中建立一個名為urls.py。應用目錄應該如下所示

  • 在myapp/urls.py檔案中包含以下程式碼:
from django.urls import path 
from . import views 
urlpatterns = [ 
    path(r'', views.index, name='index'),
] 

  • 下一步是將主路由檔案程式碼指向myapp.urls模組。 在myweb/urls.py新增一條匯入檔案從 django.urls裡面匯入path()和include()這兩個方法
from django.contrib import admin
from django.urls import path,include 
urlpatterns = [ 
    path(r'\^admin/', admin.site.urls), 
    path(r'\^myapp/', include('myapp.urls')),
]

注:

  • 其中include()函式允許引用其他的子路由檔案,請注意,該include()函式的正規表示式沒有$(字串匹配字元),而是尾部的斜槓。 每當Django遇到時include(),它會排除與該點匹配的任何部分,並將剩餘的字串傳送到子路由進行進一步處理。
  • include()使即插即用的URL變得容易。只要在傳遞引數為 myapp.urls 即可
  • include()可以一直使用, admin.site.urls是唯一的例外。
  • 現在已將index檢視連線到URLconf中。讓它驗證它的工作,執行以下命令:
python manage.py runserve

在這裡插入圖片描述

3 基本路由對映與名稱空間

3.1 基本路由對映

3.1.1 概念

就像Django所支撐網站的目錄。它的本質是URL與要為該URL呼叫的檢視函式之間的對映表;你就是以這種方式告訴Django,對於這個URL呼叫這段程式碼,對於那個URL呼叫那段程式碼。

3.1.2 主路由與子路由的對映配置例項

在這裡插入圖片描述

3.2 處理器命名

3.2.1 概念

處理器命名即定義url的name值,就是給該url起的別名,在檢視檔案和前端模板中可以使用 name值進行快捷呼叫.

3.2.2 基礎格式

myapp中的urls.py中:

from django.urls import path 
from .import views
urlpattern=[ 
    path('',views.index_handler,name='index') 
]

3.2.3 命名例項

在這裡插入圖片描述

3.2.4 呼叫例項

在這裡插入圖片描述

在這裡插入圖片描述

3.3 名稱空間

3.3.1 概念

名稱空間的作用是,當一個專案中存在多個應用時,為了防止處理器的name值衝突,所以引入了名稱空間的使用.

3.3.2 原理圖

在這裡插入圖片描述

3.3.3 基本格式

path('user/',include(('[urls.py的地址]','[app的名字]'),namespace='[名稱空間]'))

3.3.4 例項

path('user/',include(('myapp.urls','myapp'),namespace='user')) 

注: 加入名稱空間後 ,在檢視和模板層快捷呼叫處理器name值時,呼叫方式為:

namespace: name.

如下圖:

在這裡插入圖片描述

4 正則路由對映引數的傳遞和接收

4.1 manage.py啟動專案

  • 開啟manage.py檔案,CTRL+SHIFT+F10快捷鍵啟動manage.py檔案
  • 點選Edit Configurations,
  • 在Parameters的輸入框輸入:runserver 8000

如下圖:

在這裡插入圖片描述

  • 切換到manage.py檔案,CTRL+SHIFT+F10啟動服務

在這裡插入圖片描述

4.2 正則引數傳遞與接收

4.2.1 path和re_path

  • 函式path()具有四個引數,兩個必須引數:route 和 view,兩個可選引數:kwargs 和name。即路由和檢視是必填引數,
    • rout 引數:route 是一個匹配URL的準則。準則不會匹配GET和POST域名和引數。例如,處理請求https://www.baidu.com/image/時,嘗試匹配image/處理請求https://www.example.com/myapp/?page=3時,也只會嘗試匹配 myapp/。
    • view引數:當 Django找到了一個匹配的準則,就會呼叫這個特定的檢視函式,並傳入一個HttpRequest物件作為第一個引數,被“捕獲”的引數以關鍵字引數的形式傳入。
    • kwargs:任意個關鍵字引數可以作為一個字典傳遞給目標檢視函式。
    • name:為你的URL取名能使你在 Django 的任意地方唯一地引用它,尤其是在模板中
  • 注:re_path和path的作用都是一樣的。只不過re_path是在寫url的時候可以用正規表示式,功能更加強大,如果用到正規表示式,則必須使用
    re_path

4.2.2 django-path函式原始碼

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-FCkyJHpx-1575277751579)(image/2aae16fa3ddbc073c7931f5a552df25f.png)]

4.2.3 使用例項

  • 匯入re_path與re_path的使用:

在這裡插入圖片描述

  • 處理器接收:

在這裡插入圖片描述

  • 正規表示式
表示式 說明
. 除了\n和\r的所有字元
\d 數字
\D 非數字
\w 數字字母和下劃線
\W 非數字字母和下劃線
\s 空格(包括製表符、換頁符等)
* 出現次數>=0 + 出現次數>=1
{n} 出現次數=n
{n,m} m >= 出現次數 >= n
^ 以開頭
$ 以結尾

5 反向解析處理器

5.1 導包方式

from django.shortcuts import reverse 

5.2 有參,無參處理器的使用方法

5.2.1 無參

格式: reverse('[命名]') 例項: reverse("user:index") 

5.2.2 有參

格式: reverse('[命名]',args=(傳遞引數1, [傳遞引數2]... ...) 
例項: reverse("user:re",args=("123",))

5.3 程式碼例項

  1. 配置檢視檔案.

在這裡插入圖片描述

  1. 配置url.py:

在這裡插入圖片描述

  1. 執行測試

在這裡插入圖片描述

  1. 在反向解析的過程之中 可能碰到下面的錯誤資訊:
gbk' codec can't decode byte 0xa6 in position 9737: illegal multibytesequence

參考連結: https://blog.csdn.net/yixiaotian1993/article/details/89190213

6 Request物件與Response物件

6.1 Request和Response

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-pVWiLx2x-1575277751584)(image/21a600dec791767728abc849bd2ab4c9.png)]

Django伺服器收到請求後,會自動建立一個Request物件,匹配URLconf中對應的view方法,並將這個Request物件作為第一個引數傳遞給view方法。而view方法會經過一系列操作之後,返回一個Response物件,返回給客戶端

6.2 Request物件

6.2.1 概念

Django中的Request物件本質是HttpRequest,django將請求報文中的請求行、首部資訊、內容主體封裝成HttpRequest類中的屬性,當URLconf檔案匹配到使用者輸入的路徑後,會呼叫對應的view函式,並將 HttpRequest物件 作為第一個引數傳入該函式.

6.2.2 構成引數

關鍵字 說明
method 返回請求的方式(GET|POST)
path 返回頁面的路徑(不包括域名)
META 封裝請求頭的資料 (REMOTE_ADDR:客戶端的IP地址 CONTENT_TYPE:請求正文的MIME型別)
GET 封裝GET請求資料的QueryDict物件
POST 封裝POST請求資料的QueryDict物件
FILES 封裝上傳檔案資料
COOKIES 封裝請求的cookies,類似字典的物件
session 可以讀寫的類似字典的物件

注:

  • GET會把資料放在url中,在url中可以顯示出傳遞的資料格式和內容
  • POST會把資料加密封裝在header中,在url請求中不會攜帶資料.

6.2.3 程式碼例項

  • views.py檔案

在這裡插入圖片描述

  • 測試執行

在這裡插入圖片描述

6.3 Response物件

6.3.1 HttpResponse

6.3.1.1 概念

HttpResponse物件由我們手動建立,我們設計的每一個檢視都需要例項化,填充和返回一個HttpResponse,也就是函式的return的值。

6.3.1.2 基礎格式

HttpResponse( content="【響應體】", content_type="【MIME型別】", status="【狀態碼】" )

6.3.1.3 MIME型別

MIME型別 解釋
text/html HTML
text/plain 普通文字
application/json Json

6.3.1.4 狀態碼

狀態碼 解釋
200 請求成功
400 客戶端請求語法錯誤
403 伺服器拒絕請求

6.3.1.5 程式碼例項

在這裡插入圖片描述

在這裡插入圖片描述

6.3.2 JsonResponse:

6.3.2.1 概念

JsonResponse 是 HttpResponse 的子類.

6.3.2.2 子類和父類的區別

  • JsonResponse 預設 Content-Type 型別為 application/json
  • HttpResponse 預設為 application/text
  • JsonResponse 只能序列化字典格式,不能序列化字串,且前端不用反序列化

6.3.2.3 基礎格式

程式碼部分:

 from django.http import JsonResponse 
    def json_handler(request): 
        return JsonResponse( {"edu":"CSDN"}, course":"Python"}, )

注:JsonResponse接收字典只接受字典格式

當字典中出現中文,需要加入json_dumps_params={“ensure_ascii”:False}

例如:

 def json_handler(request): 
        return JsonResponse( {"edu":"CSDN"}, course":"Python"}, 
                             json_dumps_params={"ensure_ascii":False})

6.3.2.4 程式碼例項

在這裡插入圖片描述

在這裡插入圖片描述

6.4 重定向

6.4.1 概念

當檢視函式處理完成一個邏輯後,不需要向客戶端呈現資料,而是轉回到其它頁面(可以理解為呼叫其它的檢視函式) 通俗理解為:檢視轉向檢視,即一個檢視跳轉到另一個檢視.而不是直接返回到模板html.

6.4.2 基礎格式

例如:

from django.shortcuts import redirect
def redirect_handler(request): 
    return redirect("/user") # 重定向到使用者首頁 

# 通過reverse配合重定向 
from django.shortcuts import reverse 
def redirect_handler(request):
    return redirect(reverse("user:index")) # 重定向到使用者首頁

注:這裡使用到的 user:index 就是上邊提到的名稱空間和處理器命名的結合案例.

6.4.3 程式碼例項

在這裡插入圖片描述

在這裡插入圖片描述

在這裡插入圖片描述

7 Django-模板層

7.1 模板原理

7.1.1 模板語言

如圖所示,HTML被直接硬編碼在Python程式碼之中.儘管這種技術便於解釋檢視是如何工作的,但直接將HTML硬編碼到你的檢視裡卻並不符合我們的鬆耦合原則這樣寫有幾處缺點:

[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片儲存下來直接上傳(img-zcxFDE0C-1575277751592)(image/1dd5827605a396936c12e727162f677f.png)]

  • 對頁面設計進行的任何改變都必須對Python程式碼進行相應的修改
  • Python程式碼編寫和HTML設計是兩項不同的工作,大多數專業的網站開發環境都將他們分配給不同的程式人員來完成
  • 程式設計師編寫Python程式碼和設計人員製作網頁模板兩項工作同時進行的效率是最高的,遠勝於讓一個人等待另一個人完成.
  • 基於這些原因,將頁面的設計和Python的程式碼分離開會更乾淨簡潔,容易維護.我們可以使用Django的模板系統(Template System)來實現這種模式

7.1.2 模板基礎知識

模板是一個文字,用於分離文件的表現形式和內容.模板定義了佔位符%,以及各種顯示的基本邏輯,稱作:模板標籤.讓我們從一個簡單的例子模板開始

在這裡插入圖片描述

  • 該模板是一段新增了些許變數和模板標籤的基礎HTML.讓我們逐步分析一下:
    • 第6行用兩個大括號括起來的文字(例如{{ person_name}})稱為變數(variable).這意味著在此處插入指定變數的值
    • 第21行,被大括號和百分號包圍的文字(例如{% if ordered_warranty%})是模板標籤(templatetag).標籤(tag)定義比較明確,即:僅通知模板系統完成某些工作的標籤
    • 第16行for標籤類似Python的for語句,可讓你迴圈訪問序列裡的每一個項,21行的if標籤,用來執行邏輯判斷
  • Django模板含有很多內建的tags和filters,我們將陸續進行學習

7.1.3 模板系統

在terminal的終端輸入命令python manage.py shell啟動互動介面。直接建立一個Template並且直接例項化,注意在這裡啟動的是Django的shell互動介面,不是Python的互動介面.這裡的執行機制是Python先執行manage.py,然後Django搜尋DJANGO_SETTINGS_MODULE環境變數,它被設定在’books.settings’檔案中,如圖所示:

在這裡插入圖片描述

進行如下操作:

>>> from django.template import Template 
>>> t = Template('My name is {{ name }}.') 
>>> print(t)

你將會看到下面的內容

在這裡插入圖片描述

注:0x00000000041153C8每次都會不一樣,這沒什麼關係;這只是Python執行時Template物件的ID.

7.1.4 模板渲染

當你建立一個Template物件,模板系統在內部編譯這個模板到內部格式,並做優化,做好渲染的準備

一旦你建立一個Template物件,你可以用context來傳遞資料給它.一個context是一系列變數和它們值的集合。

在這裡插入圖片描述

7.2 模板元件

7.2.1 模板引擎配置

  • 模板引擎使用該TEMPLATES設定進行配置。這是一個配置列表,每個引擎一個。
  • 預設值為空。在 settings.py由所產生的startproject命令定義一個更有用的值:
  • 在做下面模板配置的同時,也要在專案的根目錄下建立一個templates目錄
  • 專案目錄下的settings.py配置檔案新增TEMPLATES中的DIRS配置:

在這裡插入圖片描述

7.2.2 模板語法—變數

  • 語法: { { var } }
  • 當模版引擎遇到一個變數,將計算這個變數,然後將結果輸出
  • 變數名必須由字母、數字、下劃線(不能以下劃線開頭)和點組成
  • 當模版引擎遇到點("."),會按照下列順序查詢:
    • 字典查詢,例如:foo[“bar”]
    • 屬性或方法查詢,例如:foo.bar
    • 數字索引查詢,例如:foo[bar]
  • 如果變數不存在, 模版系統將插入’’ (空字串)
  • 在模板中呼叫方法時不能傳遞引數
  • {# … #}是模板語法中的註釋
  • 變數的呼叫方式
# 傳遞引數的構建: 
context = { "key1":"value1", "key2":["value1","value2"], "key3":{ "key3_1":"value3_1", "key3_2":"value3_2", } } 
#引數的呼叫方式: {# 1.普通值獲取 #} {{ key1 }} {# 2.列表值獲取 #} {{ key2.0}} {{ key2.1 }} {# 3.字典值獲取 #} {{ key3.key3_1 }} {{ key3.key3_2 }}

7.2.3 模板語法—標籤

  1. include:載入模板並以標籤內的引數渲染,例如: { % include “base/index.html” % }
  2. url:反向解析 :
# 分兩種情況: 
# 主路由中存在namespace名稱空間 
#1 不需要額外傳參的檢視函式:
{% url "[namespace]:[name]" %} 
#2 需要傳參的檢視函式: 
{% url "[namespace]:[name]" [傳遞的引數]%}

#主路由中沒有namespace名稱空間 
#1 不需要額外傳參的檢視函式: 
{% url "[name]" %} 
#2 需要傳參的檢視函式: 
{% url "[name]" [傳遞的引數]%}

  1. csrf_token:這個標籤用於跨站請求偽造保護, 例如:{ % csrf_token % }

7.2.4 模板語法—過濾器

7.2.4.1概念

模板過濾器是模板中對傳遞過來的資料進行修飾,再進行顯示,在變數被顯示前修改它的值的一個簡單方法.過濾器使用的是管道字元,

7.2.4.2 語法

單個過濾器: {{ 變數|過濾器關鍵字:引數 }} 
多個過濾器配合: {{ 變數|過濾器1|過濾器2 }} 
例如: { {  name|lower  } },表示將變數name的值變為小寫輸出 

注:

  • 使用管道符號 (|)來應用過濾器
  • 通過使用過濾器來改變變數的計算結果
  • 關閉HTML自動轉義
  • 如果沒有引數傳遞,可以不寫
  • 過濾管道可以被套接,一個過濾器管道的輸出又可以作為下一個管道的輸入,如此下去.下面的例子實現查詢列表的第一個元素並將其轉化為大寫.例如:{{my_list|first|upper }}
關鍵字 說明
safe 禁止HTML轉義
length 長度
date 日期(Y-m-d H:i:s)
default 預設值(變數|default:預設值)
upper 轉大寫
lower 轉小寫
關鍵字 說明
safe 禁止HTML轉義

7.2.5 模板語法–繼承與複用

7.2.5.1 模板繼承

  • 模板繼承可以減少頁面內容的重複定義,實現頁面內容的重用
  • 典型應用:網站的頭部、尾部是一樣的,這些內容可以定義在父模板中,子模板不需要重複定義
  • extends繼承:繼承,寫在模板檔案的第一行
  • 語法: {% extends “【父模板路徑】” %}

例項:

{ % block block_name % } 
	這裡可以定義預設值 如果不定義預設值,則表示空字串 
{ % endblock % }

7.2.5.2 模板複用

  • block標籤:在父模板中預留區域,在子模板中填充
  • 語法:
{% block [程式碼塊名稱] %} 
	... ... 
{% endblock %} 


注:呼叫父模板中的程式碼:{{ block.supper }}

  • 例項:定義子模板index.html
{ % extends "base.html" % }
	在子模板中使用block填充預留區域 
{ % block block_name % } 
	實際填充內容 
{ % endblock % }

注:

  • 不能在一個模版中定義多個相同名字的block標籤
  • 子模版不必定義全部父模版中的blocks,如果子模版沒有定義block,則使用了父模版中的預設值
  • 使用可以獲取父模板中block的內容
  • 為了更好的可讀性,可以給endblock標籤一個名字

7.2.6 模板語法—迴圈與判斷

  • 迴圈:

    • 語法

      { % for ... in ... % } 迴圈邏輯 { % endfor % }
      
      
    • 例項

    #1.定義引數 
    context = { "hobbys":["Python","Java","C"] } 
    #2.進行迴圈 
    {% for hobby in hobbys %} 
    愛好:{{ hobby }}<br/>
    {% endfor %}
    
    

    注: {{ 用於輸出變數 }} {% 命令語句 %}

  • 判斷

語法:

{ % if ... % } 
	邏輯1 
{ % elif ... % } 
	邏輯2
{ % else % } 
	邏輯3 
{ % endif % } 

相關文章