Python後臺開發(第一章: 路由與模板)
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第一種方式
注:
- 使用的Pycharm必須是專業版(社群版有很多功能不支援,例如資料庫視覺化)
- 選擇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中載入建立的新應用:
注:
- 新增的時候注意格式 ,後邊一定要跟上逗號,保持列表的格式.
- 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 程式碼例項
- 配置檢視檔案.
- 配置url.py:
- 執行測試
- 在反向解析的過程之中 可能碰到下面的錯誤資訊:
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 模板語法—標籤
- include:載入模板並以標籤內的引數渲染,例如: { % include “base/index.html” % }
- url:反向解析 :
# 分兩種情況:
# 主路由中存在namespace名稱空間
#1 不需要額外傳參的檢視函式:
{% url "[namespace]:[name]" %}
#2 需要傳參的檢視函式:
{% url "[namespace]:[name]" [傳遞的引數]%}
#主路由中沒有namespace名稱空間
#1 不需要額外傳參的檢視函式:
{% url "[name]" %}
#2 需要傳參的檢視函式:
{% url "[name]" [傳遞的引數]%}
- 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 % }
相關文章
- Python後臺開發(第一章補充: Web前端技術)PythonWeb前端
- 第一章 Python概述與開發環境安裝Python開發環境
- React 後臺管理模板React
- 後臺模板 (For Laravel 5)Laravel
- Python開發微信公眾號後臺(系列二)Python
- 前端路由與後端路由的思考前端路由後端
- Flutter開發之路由與導航Flutter路由
- 後臺開發 -- 核心技術與應用實踐
- lucms - vue 與 Laravel 開發的後臺管理系統VueLaravel
- Django Admin後臺管理:高效開發與實踐Django
- leacmf通用api開發後臺ACMAPI
- EBCMS核心後臺開發框架框架
- React開發管理後臺0React
- Node + Express 後臺開發 —— 起步Express
- iOS後臺模式開發指南iOS模式
- 後臺開發面試經驗面試
- 急聘Java後臺開發高手!Java
- Python後臺開發(第二章: 模型類實現)Python模型
- Python後臺開發(第三章: Django高階)PythonDjango
- Reactjs前端、Python爬蟲、Nodejs後臺開發招聘React前端Python爬蟲NodeJS
- Flutter開發之導航與路由管理Flutter路由
- pbootcms模板如何修改後臺版權boot
- 網站後臺模板前臺修改?網站後臺的介面如何修改?網站
- 後臺開發:核心技術與應用實踐 -- C++C++
- 微信後臺開發實戰教程
- JAVA後臺開發學習(5)Java
- 騰訊後臺開發面試經驗面試
- 騰訊後臺開發面試總結面試
- 後臺開發 - DPDK引發的圖譜
- Laravel6.0 最新開源後臺系統,整合了大部分常用功能,後臺模板 LayuiLaravelUI
- thinkphp + ace 後臺模板淘寶客網站PHP網站
- 12個免費 Twitter Bootstrap 後臺模板boot
- 免費的Bootstrap管理後臺模板集合boot
- 後臺管理系統vue.js路由Vue.js路由
- 後臺開發-核心技術與應用實踐--TCP協議TCP協議
- python 後端開發面經Python後端
- Python Web開發: 教你如何解放路由管理PythonWeb路由
- 微信後臺開發作業講解