Django知识总结(一)
壹 ● 有關http協議
一 ● 全稱
| 超文本傳輸協議(HyperText Transfer Protocol) |
?
二 ● 協議
| 雙方遵循的規范 http協議是屬于應用層的協議(還有ftp, smtp等), 即瀏覽器請求消息和服務器響應消息的一系列規則 |
?
三 ● http協議的特性
| http是無狀態、無連接的協議(stateless, connectionless protocol)的 |
| http協議不具備保存之前發送過的請求或響應的功能-- 服務器中沒有保存客戶端的狀態,客戶端必須每次帶上自己的狀態去請求服務器 |
?
四 ● ※ 為什么http是無狀態協議的?
| ① TCP協議是基于連接和三次握手的,雖然具有可靠性, 但具有一定的缺陷。但試想一下,普通的C/S架構軟件, 頂多上千個Client同時連接,而對于B/S架構的網站, 十萬人同時在線也是很平常的事兒。 如果十萬個客戶端和服務器一直保持連接狀態,那服務器如何滿足承載呢? ? ② 基于上述問題,http協議應運而生。 基于TCP的可靠性連接,瀏覽器發出請求之后,服務器端立即關閉連接、釋放資源。 這樣既保證了資源可用,也吸取了TCP的可靠性的優點。 因此,通常說http協議是"無狀態"的。 |
?
五 ● ※ 保持http連接狀態的技術--session tracking(會話跟蹤)
| 常用的會話跟蹤技術是cookie與session cookie是在客戶端記錄用戶信息的鍵值對 session是在服務器端記錄用戶信息的鍵值對 |
| 現在一些輕量級的web庫,用的是加密的cookie,不需要session。 python的tornado框架就沒有session,只有加密的cookie。 |
?
六 ● http消息
1 ● 瀏覽器發出的請求消息(request)
| 請求首行 status-line 請求頭 request headers \r\n\r\n空行 請求體 request body(例如, 用戶名, 密碼) ? 也就是: [請求方法] [URL] [http協議版本] [頭字段1]: 值1 [頭字段2]: 值2 ? [請求體] |
| ※ GET有沒有請求體? 一般來說, GET請求沒有請求體, 但也可以有, 詳見: https://unmi.cc/why-http-get-cannot-sent-data-with-reuqest-body/ ? ※ 請求頭的頭字段包括Content-Type, User-Agent, Cookie, Accept-Language等, 詳見: https://www.cnblogs.com/jiangxiaobo/p/5499488.html |
?
※ GET請求和POST請求的區別
| 1, ① GET請求一般通過 URL 以 Query Parameter 的形式來發送數據, 例如: https://www.douban.com/group/explore?tag=%E6%97%85%E8%A1%8C () ② GET 請求長度限制為1K; ③ GET 請求可被緩存 ? 2, ① POST 請求一般通過消息體發送數據, 例如: ② POST 請求對數據長度沒有限制 ③ POST 請求不會被緩存 |
| ※ GET請求的其它特征: GET 請求保留在瀏覽器歷史記錄中 GET 請求可被收藏為書簽 GET 請求不應在處理敏感數據時使用 GET 請求只應當用于取回數據 ? ※ POST請求的其它特征: POST 請求不會保留在瀏覽器歷史記錄中 POST 不能被收藏為書簽 ? ※ 其他 HTTP 請求方法(了解) HEAD: 與 GET 相同,但只返回 HTTP 報頭,不返回文檔主體。 PUT: 上傳指定的 URI 表示。 DELETE: 刪除指定資源。 OPTIONS: 返回服務器支持的 HTTP 方法。 CONNECT: 把請求連接轉換到透明的 TCP/IP 通道。 |
?
※ 請求消息案例
| GET請求消息: ? POST請求消息: ? ※ 請求頭可以有cookie, 例如: |
?
※ HttpRequest & HttpResponse中常見的四種ContentType/的POST 提交數據方式對應的四種常見Content-Type取值
| ※ Content-Type又叫Mime-Type(Multipurpose Internet Mail Extensions--多用途互聯網郵件擴展類型) ※ HTTP Content-type的總表: http://tool.oschina.net/commons/ | ||
| application/x-www-form-urlencoded
這應該是最常見的 POST 提交數據的方式了。瀏覽器的原生 form 表單,如果不設置 enctype 屬性,那么默認以 application/x-www-form-urlencoded 方式提交數據。請求類似于下面這樣(無關的請求頭在本文中都省略掉了): ? POST http://www.example.com HTTP/1.1 Content-Type: application/x-www-form-urlencoded;charset=utf-8? title=test&sub%5B%5D=1&sub%5B%5D=2&sub%5B%5D=3? 首先,Content-Type 被指定為 application/x-www-form-urlencoded;其次,提交的數據按照 key1=val1&key2=val2 的方式進行編碼,key 和 val 都進行了 URL 轉碼。大部分服務端語言都對這種方式有很好的支持。 很多時候,我們用 Ajax 提交數據時,也是使用這種方式。例如 JQuery 和 QWrap 的 Ajax,Content-Type 默認值都是「application/x-www-form-urlencoded;charset=utf-8」。? ② multipart/form-data ③ application/json ④ text/xml | ||
注意:
① Content-Type一般只存在于POST方法中,因為GET方法請求參數都會被編碼到url后面,所以在GET方法中加Content-ype是無用的。 ② 如果使用的是POST方式,并且數據是由from表單提交,那么就必須把content-Type設為application/x-www-form-urlencoded(也可以不指定Content-Type, 因為Content-Type默認是application/x-www-form-urlencoded),否則后臺是無法接收到數據的。 ③ HTTP請求消息和響應消息的數據類型都是Content-Type; 不過, 在jQuery ajax中, 發送至服務器的數據類型寫作"contentType", 服務器返回的數據類型寫作"dataType":
? 詳見: http://www.w3school.com.cn/jquery/ajax_ajax.asp | ||
| ※ HTML <form> 標簽的 enctype 屬性 enctype 屬性規定在發送到服務器之前應該如何對表單數據進行編碼。 默認地,表單數據會編碼為 "application/x-www-form-urlencoded"。就是說,在發送到服務器之前,所有字符都會進行編碼(空格轉換為 "+" 加號,特殊符號轉換為 ASCII HEX 值)。
? enctype 屬性的值: ① application/x-www-form-urlencoded:在發送前編碼所有字符(默認) ② multipart/form-data:不對字符編碼。用表單上傳文件時, 必須使用該值。 ③ text/plain:空格轉換為 "+" 加號,但不對特殊字符編碼。 |
?
※ 狀態碼
| 1XX:信息性狀態碼 2XX:成功狀態碼,200表示請求成功, 一般用于GET與POST請求 3XX:重定向狀態碼 4XX:客戶端錯誤狀態碼,404表示沒有找到請求的資源 5XX:服務器端錯誤狀態碼,500表示內部錯誤 |
| 詳見: http://www.runoob.com/http/http-status-codes.html |
?
?
2● 服務器發出的響應消息(response)
| 響應首行status-line 響應頭 request headers \r\n\r\n 空行 響應體 response body ? 也就是: [http協議版本] [狀態碼] [描述信息] [頭字段1]: 值1 [頭字段2]: 值2 /r/n/r/n [請求體] |
| 案例: |
?
七 ● tcp和http的區別和聯系
| 傳輸層的TCP是基于網絡層的IP協議的, 而應用層的HTTP協議又是基于傳輸層的TCP協議的, 而Socket本身不算是協議,它只是提供了一些使用TCP/UDP編程的接口,例如create(),listen(),connect(),accept(),send(),read()和write()等等 |
| 兩種網絡構架: ① C/S架構--例如安卓手機上的原生APP ② B/S架構--例如安卓手機上的Web APP |
?
八 ● web應用涉及的過程
| 一個請求/處理/響應的過程: ① 瀏覽器先向服務器發送請求 ② 服務器接收到請求后,做相應的處理,然后封裝好響應報文,再回送給瀏覽器 ③ 瀏覽器拿到響應報文后,再通過瀏覽器引擎去渲染網頁(其實就是字符串替換),解析DOM樹 ④ javascript引擎解析并執行腳本操作,插件去干插件該干的事兒 詳見: http://kb.cnblogs.com/page/129756/ |
?
九 ● web應用的本質
| 一個socket服務端→用戶的瀏覽器其實就是一個socket客戶端 |
?
十 ● HTTP通信傳輸過程
?
●
| ? |
?
?
?
貳 ● MVC
● 定義
| ※ MVC框架的核心思想--解耦 ① m表示model,負責與數據庫進行交互 最底下的一層→是核心的"模型層"(Model),也就是程序需要操作的數據或信息→ 用于封裝與應用程序的業務邏輯相關的數據以及對數據的處理方法。"Model"有對數據直接訪問的權力,例如對數據庫的訪問。 ? ② v表示view,用于向用戶展示結果 最上面的一層→是直接面向最終用戶的"視圖層"(View)→是提供給用戶的操作界面,是程序的外殼。 ? ③ c表示controller,是核心,負責處理請求、獲取數據、返回結果 中間的一層→是"控制層"(Controller),它根據用戶從"視圖層"輸入的指令,選取"模型層"中的數據, 然后對其進行相應的操作,產生最終結果。 |
?
●
| ? |
?
?
叁 ● MTV
一 ● 定義
| ※ 在django, 控制器接收用戶輸入的部分由框架自行處理, 所以django更關注的是模型(model), 模板(template)和視圖(view) ① m表示model,負責與數據庫進行交互 ② v表示view,是核心,負責處理請求、獲取數據、返回結果 ③ t表示template,負責呈現內容到瀏覽器 |
| 三者的關系: 視圖函數, 使得模型類和模板銜接起來. |
?
二 ● 前端和后端進行數據交互的3種方式
| 1, a標簽 2, form表單 3, ajax |
| 以form的驗證思路為例: 前端:提交form表單 后臺:創建form類,當請求到來時,先匹配,匹配出正確和錯誤信息。 |
?
?
肆 ● Django框架執行流程圖
| 1, 客戶端的瀏覽器發起一個url請求; 2, 路由配置(URLconf)根據URL匹配view.py里對應的視圖函數, 當有緩存頁面的時候直接返回內容。 3, 視圖函數執行所請求的操作, 通常包括從Models里讀取數據; 4, Models將數據返回給視圖; 5, 視圖將要展示的數據返回給template模板. |
?
?
伍 ● Django的安裝
| # pip 安裝 pip install Django==1.10 # 克隆下載最新版本 git clone https://github.com/django/django.git # 導入django模塊 >>> import django >>> print(django.get_version()) 1.10 |
?
陸 ● Django的基本命令
| # 查看django版本 $ python -m django --version
? # 創建項目,名為mysite $ django-admin startproject mysite? # 啟動django $ python manage.py runserver $ python manage.py runserver 8080 $ python manage.py runserver 0.0.0.0:8000? # 創建應用程序,確保和 manage.py 是同一目錄 $ python manage.py startapp polls # 在setting.py的INSTALLED_APPS列表里添加"polls"? # admin創建管理員用戶 $ python manage.py createsuperuser |
| python manger.py makemigrations 將model層轉換為migration遷移文件--建立migrations目錄,并記錄下你所有的關于modes.py的改動,例如0001_initial.py, ? python manger.py migrate 執行新版本的遷移文件,并更新數據庫, 生成表 |
?
柒 ● Django項目結構
| 命令: django-admin startproject helloDjango2 python manage.py startapp blog 目錄結構如下圖: |
| manage.py:一個命令行工具,可以使你用多種方式對Django項目進行交互 內層的目錄:項目的真正的Python包 __init __.py:一個空文件,它告訴Python這個目錄應該被看做一個Python包 settings.py:項目的配置 urls.py:項目的URL聲明 wsgi.py:項目與WSGI兼容的Web服務器入口, 部署到ngix服務器上需要使用到的 |
?
● Django的處理流程/生命周期
| 1.用戶通過瀏覽器發送HTTP請求, 然后Django創建一個包含請求元數據的 HttpRequest對象 2. HttpRequest對象到達各個中間件,中間件對HttpRequest對象做預處理或者直接返回HttpResponse對象 3.若未返回HttpResponse對象,HttpRequest對象會到達URLconf路由,找到對應視圖(view)函數 4.視圖函數做相應的預處理或直接返回HttpResponse對象或HttpResponse子類對象. 5.視圖函數可以選擇性的通過Models訪問底層的數據 6.視圖函數將數據返回給Django的模板系統,templates通過filter或tags把數據渲染到模板上 7.模板被渲染之后, Django將它作為 HttpResponse對象返回到瀏覽器, 然后展示給用戶. |
| ※ 幫助理解Django的處理流程的幾段話: ① Django將請求報文中的請求行、首部信息、內容主體封裝成 HttpRequest 類中的屬性。除了session外的所有屬性都應該認為是只讀 ② 一般視圖函數約定俗成地使用 request(而不是HttpRequest) 作為形參來承接這個對象。 ③ 上述流程中最主要的幾個部分分別是:Middleware(每一個中間件是一個類,包括request, view, exception, response),URLConf(url映射關系),Template(模板系統) ④ 當一個頁面被請示時,Django創建一個包含請求元數據的 HttpRequest 對象。然后Django調入合適的視圖,把 HttpRequest 作為視圖函數的第一個參數傳入, 每個視圖要負責返回一個 HttpResponse 對象或HttpResponse子類對象。 ? ⑤ 常用的HttpRequest屬性有HttpRequest.GET和HttpRequest.POST, 詳見: https://www.cnblogs.com/scolia/archive/2016/07/01/5633351.html ⑥ Django框架處理流程的核心在于中間件(middleware),Django所有的請求、響應都由中間件來完成 ⑦ Middleware是"設計模式"里的Decorator(裝飾器)。 |
?
●
| ? |
?
●
| ? |
?
?
捌 ● 視圖(函數)(V)
一 ● 定義
| 視圖函數(或視圖)是一個接受 Web 請求并返回 Web 響應的 Python 函數或類。 ? ※ 該響應可以是一份網頁的 HTML 內容、一次重定向、一條 404 錯誤、一份 XML 文檔、一幅圖片,或其它任何東西。 ? 視圖函數是存放應用邏輯的地方。它將從你之前創建的模型中獲取數據,并將它傳遞給模板。 |
?
二 ● FBV & CBV
| 基于函數的view,叫作FBV (function-based view)。 基于類的view,叫作CBV (class-based view)。 |
| # FBV 寫法 # urls.py url(r'^login/$',views.login, name="login"), ? # views.py def login(request): if request.method == "POST": print(request.POST)? return render(request,"login.html")? # HTML <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>登錄頁面</title> </head> <body> <form action="{% url 'login' %}"method="post" enctype="multipart/form-data"> <input type="text" name="user2"> <input type="file" name="file"> <input type="submit" value="提交"> </form> </body> </html> |
| # CBV 寫法 # urls.py url(r'^login/$',views.Login.as_view(), name="login"), ? # views.py from django.views import View class Login(View): # 類首字母大寫 def get(self,request): return render(request,"login.html") def post(self,request): print(request.POST) return HttpResponse("OK") |
?
●
| ? |
?
?
三 ● HttpRequest對象 & HttpResponse對象
| 當一個頁面被請示時,Django創建一個包含請求元數據的HttpRequest 對象; 然后Django調入合適的視圖,把 HttpRequest 作為視圖函數的第一個參數傳入; 每個視圖要負責返回一個HttpResponse對象或HttpResponse子類對象。 |
| 詳見: http://python.usyiyi.cn/translate/django_182/ref/request-response.html |
?
四 ● HttpRequest對象
| HttpRequest 表示來自某客戶端的一個單獨的HTTP請求。 HttpRequest實例的屬性包含了關于此次請求的大多數重要信息;除了session外的所有屬性都應該認為是只讀的。 | ||
| 需要記住的HttpRequest對象的屬性: method、GET、POST、COOKIES、session、files、user、body、path | ||
| ① HttpRequest.method 一個字符串,表示請求使用的HTTP 方法。必須使用大寫。例如: if request.method == 'GET': do_something() elif request.method == 'POST': do_something_else()※ form 的 method="post" (post必須小寫), 但是request.method=="POST"和request.POST中的POST又必須大寫. ? ② HttpRequest.GET 一個類似于字典的對象(django.http.QueryDict類的實例),包含HTTP GET 的所有參數 ? ③ HttpRequest.POST 一個包含所有給定的HTTP POST參數的類字典對象(django.http.QueryDict類的實例),提供了包含表單數據的請求。 如果需要訪問請求中的原始或非表單數據,可以使用HttpRequest.body 屬性。 ? POST 請求可以帶有空的POST 字典 —— 如果通過HTTP POST 方法請求一個表單但是沒有包含表單數據的話。因此,不應該使用if request.POST 來檢查使用的是否是POST 方法;應該使用if request.method == "POST"。 ? 注意:POST 不包含上傳的文件信息。參見FILES。 ? ④ HttpRequest.COOKIES 一個標準的Python 字典,包含所有的cookie。鍵和值都為字符串。 request.COOKIES['sessionid'] # 獲取 request.COOKIES.get('sessionid', None) # 獲取 ? ※對COOKIES的設置通過HttpResponse對象的set_cookie()方法來完成 ? ⑤ HttpRequest.session 一個既可讀又可寫(只有session可寫)的類似于字典的對象,表示當前的會話。只有當Django 啟用會話的支持時才可用。 fav_color = request.session['fav_color'] #get request.session['fav_color'] = 'blue' #set del request.session['fav_color'] #del 'fav_color' in request.session #contains fav_color = request.session.get('fav_color', 'red') #get fav_color = request.session.pop('fav_color') # pop ? ? ⑥ HttpRequest.FILES 一個類似于字典的對象,包含所有的上傳文件。 FILES 中的每個鍵為<input type="file" name="" /> 中的name。 ? 注意,FILES 只有在請求的方法為POST 且提交的<form> 帶有enctype="multipart/form-data" 的情況下才會包含數據。否則,FILES 將為一個空的類似于字典的對象。 ? ⑦ HttpRequest.user 一個AUTH_USER_MODEL(驗證用戶模型)類型的對象,表示當前登錄的用戶。如果用戶當前沒有登錄,user 將設置為django.contrib.auth.models.AnonymousUser 的一個實例。你可以通過is_authenticated() 區分它們,像這樣:
※ HttpResponse.user 只有當Django 啟用AuthenticationMiddleware 中間件時才可用。 ※ AUTH_USER_MODEL在settings.py中設置, 例如 AUTH_USER_MODEL = "blog.UserInfo" # 覆蓋默認的User模型, # 注意:UserInfo表繼承了AbstractUser,需要在settings 中寫入:AUTH_USER_MODEL ="應用名.UserInfo"? ⑧ HttpRequest.body 一個字符串,代表請求報文的主體。在處理非 HTTP 報文時非常有用,例如:二進制圖片、XML,Json等。 但是,如果要處理表單數據的時候,推薦還是使用 HttpRequest.POST 。 另外,我們還可以用 python 的類文件方法去操作它,詳情參考 HttpRequest.read() 。
? ⑨ HttpRequest.path 一個字符串,表示請求的頁面的完整路徑,不包含域名。 例如:"/music/bands/the_beatles/" | ||
| HttpRequest對象的方法: ① HttpRequest.get_host() ② HttpRequest.get_full_path()
? ③ HttpRequest.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None) ④ HttpRequest.is_secure() ⑤ HttpRequest.is_ajax() |
?
五 ● HttpResponse對象
| 與由Django自動創建的HttpRequest對象相比,HttpResponse對象是我們的職責范圍了。我們寫的每個視圖都需要實例化,填充和返回一個HttpResponse對象或HttpResponse子類對象。 ? ※ 下面兩個引入的HttpResponse類是一樣的 from django.http import HttpResponse from django.shortcuts import render, HttpResponse, redirect | |
| ① 傳遞字符串 from django.http import HttpResponse response = HttpResponse("Here's the text of the Web page.") # 實例化 response = HttpResponse("Text only, please.", content_type="text/plain")? ② 設置或刪除響應頭信息 response = HttpResponse() response['Content-Type'] = 'text/html; charset=UTF-8'? del response['Content-Type']? ③ 常用屬性 HttpResponse.content: 響應內容, bytes格式 HttpResponse.charset: 響應內容的編碼 HttpResponse.status_code: 響應的狀態碼 HttpResponse.streaming: 這個屬性永遠為假,一般用于中間件 HttpResponse.closed: 關閉 例如:
? ? ④常用方法 HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False) # 設置一個cookie ? HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=True) # 設置加密的cookie(加鹽的cookie) ? HttpResponse.delete_cookie(key, path='/', domain=None) #刪除Cookie與給定鍵。 ? ※參數說明: key, # 鍵 value='', # 值 max_age=None, # 超時時間 expires=None, # 超時時間(IE requires expires, so set it if hasn't been already.) path='/', # Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁面訪問 domain=None, # Cookie生效的域名 secure=False, # 采用https傳輸 httponly=False # 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋) ? ※由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie,例如: // 創建一個cookie并設置cookie的有效路徑: $.cookie('cookieName', 'cookieValue', {expires: 7, path: '/'}); |
?
六 ● JsonResponse對象
| JSON(JavaScript Object Notation) 是一種輕量級的數據交換格式,主要用于傳送數據。 JsonResponse是HttpResponse的子類,專門用來生成JSON編碼的response。 |
| from django.http import JsonResponse
? response = JsonResponse({'foo': 'bar'}) print(response.content) # b'{"foo": "bar"}'? # 默認只能傳遞字典類型,如果要傳遞非字典類型需要設置一下safe關鍵字參數。 response = JsonResponse([1, 2, 3], safe=False) |
?
●
| ? |
?
?
玖 ● URLconf, 路由配置 (作為V的一部分)
| ※ router, 路由, 安排路線的人 ※ 請求的url被看做是一個普通的python字符串,進行匹配時不包括get或post請求的域名、端口和參數 ? urlpatterns = [] #里面存放著一個個url()對象 / 一個個url映射元素 / 一條條的路由映射關系. ? url()函數 url(正則表達式, view視圖函數,參數[可選],別名[可選]) 例如: url(r'^archive-summary/(\d{4})/$', archive, {'summary': True}, "arch-summary"), ? 參數說明: 參數: 可選的、要傳遞給視圖函數的默認參數(字典形式) ? ※ 被圓括號包圍的正則表達式組(group)會捕獲URL 中的值并作為位置參數傳遞給視圖函數。 |
?
?
一 ● url()函數的兩種語法
| 語法一:url(正則,'view函數') 指定正則和視圖的對應關系 在應用內部創建urls.py文件,指定請求地址與視圖的對應關系 說明1:正則部分推薦使用r,表示字符串不轉義,這樣在正則表達式中使用\只寫一個就可以 說明2:不能在開始加反斜杠,推薦在結束加反斜杠 ? 語法二:url(正則,include('應用.urls')) 把每個應用的 URL 寫在它們各自的 urls.py 配置文件里,然后在項目文件下的 urls.py 里用 include() 函數引用: 例如: url(r'^violet/',?include('violet.urls')),? #這里引入應用?violet?下的?urls.py?配置文件; 以violet/開頭的url被轉接到violet.urls.py文件, django會把url字符串前面被正則表達式匹配到的r'^violet/'砍掉(chop off),剩下的string傳遞到include的urls中進行進一步匹配。? 再如: url(r'^admin/', include(admin.site.urls)) |
?
二 ● url映射(mapping)的解析
| ? 補充: ① url請求樣式也叫作"url"標簽 ② url標簽也可以寫成: {% url 'user_detail' user.id %}, 此時url元素的第一個參數應該是r'^user/detail/([0-9]+)/$', /user/detail/1 ③ 如果url匹配時攜帶參數(例如上面的有名分組"(?P<pk>[0-9]+)"), 那么,在匹配到視圖時就需要傳入一個參數(例如上面user_detail函數的參數"pk"), 在頁面中的url反向解析,也要傳入對應參數(例如上面url標簽中的"pk=user.id") ? ※ 有名分組和無名分組的案例: 無名分組: # url(r'^articls/(\d{4})/(\d{2})$', views.archive3,), # archive2(request,2000,11) 有名分組: # url(r'^articls/(?P<y>\d{4})/(?P<m>\d{2})$', views.archive4,), # archive2(request,y=2000,m=11) | ||
| URL的映射的解析有兩種: ① 一般的url解析: 由客戶端的瀏覽器發起一個url請求,Django根據URLconf,把url中的參數捕獲,調用相應的視圖,獲取相應的數據,然后返回給客戶端顯示. () ② url反向解析:通過一個視圖的別名,加上一些參數和值(如果有的話),逆向獲取相應的URL通過url的別名, 可以自動更新而不用遍歷項目的源代碼來搜索并替換過期的URL;(url反向解析也叫url逆向解析,url逆向匹配,url的逆向查閱,等) ? Django提供了不同的層級的url反向向解析處理工具: ① 在模板templates中,使用url標記,如:{% url 'user_detail' pk=user.id %}
? ② 在Python代碼中,使用django.core.urlresolvers.reverse()方法
? ※ 還有一種url解析方案了解即可: 在更高層次處理model實例時,可以使用get_absolute_url()方法 |
?
三 ● url的命名空間
| 為各url起別名時要根據不同用途進行名稱上的區別,但當各應用很多,通過路由分發,各應用中的urls難免會有重復,因此要名稱空間,根據不同的應用建立不同的命名空間,否則當各url中有重名的,就只會找到最后一個加載的url.
? |
?
四 ● 視圖函數的3種返回值
| from django.shortcuts import render, HttpResponse, redirect |
| 1, render(request, template_name, context=None, content_type=None, status=None, using=None) # 返回HttpResponse對象 例如: a, return?render(request,?'user/user_detail.html',?{'data':?user}) b, now=datetime.datetime.now() html="<html><body>現在時刻:<h1>%s.</h1></body></html>" %now return HttpResponse(html) ? ① request: 是一個固定參數。 ② template_name: templates 中定義的文件, 要注意路徑名. 比如'templates\polls\index.html', 參數就要寫'polls\index.html' ③ context: 后臺返回給瀏覽器的、用于渲染的數據, 是字典格式,例如上面發的{'data':?user}, data是自定義的指針名字, 它會被index.html引用(不是user_list) ④ status: 為響應狀態代碼, 默認值為200 ⑤ using: 用于加載模板使用的模板引擎的名稱。 |
| 2, HttpResponse(content= ' ', mimetype=DEFAULT_CONTENT_TYPE) # 返回HttpResponse對象 # content是字符串格式, mimetype指明的是消息內容類型,例如: a, return HttpResponse("登陸成功") ? b, res = {" success": False, "error": ""} return HttpRepsponse(json.dumps(res), mimetype="application/json") ? c, from django.http import HttpResponse import datetime ? def current_datetime(request): now = datetime.datetime.now() html = "<html><body>It is now %s.</body></html>" % now return HttpResponse(html) ? d, django下載文件, 詳見: http://blog.csdn.net/w6299702/article/details/38777165 response = HttpResponse(readFile(filepath_),content_type='APPLICATION/OCTET-STREAM') #設定文件頭,這種設定可以讓任意文件都能正確下載,而且已知文本文件不是本地打開 response['Content-Disposition'] = 'attachment; filename='+filename_.encode('utf-8') + filetype_.encode('utf-8') #設定傳輸給客戶端的文件名稱 response['Content-Length'] = os.path.getsize(filepath_) #傳輸給客戶端的文件大小 |
| 3, redirect(to, permanent=False, *args, **kwargs) # 返回HttpResponseRedirect對象(HttpResponse的子類對象) # 默認情況下,為臨時重定向;通過 permanent=True 設置永久重定向, 例如: a, 傳遞一個視圖的名稱 def my_view(request): ... return redirect('some-view-name', foo='bar')? b, 傳遞要重定向到的一個具體的網址 def my_view(request): ... return redirect('/some/url/')? c, 傳遞一個完整的網址 def my_view(request): ... return redirect('http://example.com/') |
| ※ 自Django1.3開始, render()方法是render_to_response的一個嶄新的快捷方式,前者會自動使用RequestContext, 而后者必須coding出來,這是最明顯的區別,當然前者更簡潔。 ? return render(request, 'blog_add.html', {'blog': blog, 'form': form, 'id': id, 'tag': tag}) return render_to_response('blog_add.html',{'blog': blog, 'form': form, 'id': id, 'tag': tag}, context_instance=RequestContext(request)) ? ※ locals()用法:locals()可以直接將函數中所有的變量全部傳給模板。當然這可能會傳遞一些多余的參數,有點浪費內存的可能。例如: return render(request, 'blog_add.html',locals()) |
轉載于:https://www.cnblogs.com/ArrozZhu/p/8463864.html
總結
以上是生活随笔為你收集整理的Django知识总结(一)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 平行线的性质教学设计一等奖
- 下一篇: 64位内核第二讲,进程保护之对象钩子