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