日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django知识总结(一)

發(fā)布時間:2023/12/2 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Django知识总结(一) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

有關(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ù)是cookiesession

cookie是在客戶端記錄用戶信息的鍵值對

session是在服務(wù)器端記錄用戶信息的鍵值對

現(xiàn)在一些輕量級的web庫,用的是加密的cookie,不需要session

pythontornado框架就沒有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 AjaxContent-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":

contentType

類型:String

默認(rèn)值: "application/x-www-form-urlencoded"。發(fā)送信息至服務(wù)器時內(nèi)容編碼類型。

默認(rèn)值適合大多數(shù)情況。如果你明確地傳遞了一個 content-type $.ajax() 那么它必定會發(fā)送給服務(wù)器(即使沒有數(shù)據(jù)要發(fā)送)。

dataType

類型:String

預(yù)期服務(wù)器返回的數(shù)據(jù)類型。如果不指定,jQuery 將自動根據(jù) HTTP MIME 信息來智能判斷,比如 XML MIME 類型就被識別為 XML。在 1.4 中,JSON 就會生成一個 JavaScript 對象,而 script 則會執(zhí)行這個腳本。隨后服務(wù)器端返回的數(shù)據(jù)會根據(jù)這個值解析后,傳遞給回調(diào)函數(shù)??捎弥?/span>:

  • "xml": 返回 XML 文檔,可用 jQuery 處理。
  • "html": 返回純文本 HTML 信息;包含的 script 標(biāo)簽會在插入 dom 時執(zhí)行。
  • "script": 返回純文本 JavaScript 代碼。不會自動緩存結(jié)果。除非設(shè)置了 "cache" 參數(shù)。注意:在遠(yuǎn)程請求時(不在同一個域下),所有 POST 請求都將轉(zhuǎn)為 GET 請求。(因?yàn)閷⑹褂?/span> DOM script標(biāo)簽來加載)
  • "json": 返回 JSON 數(shù)據(jù)
  • "jsonp": JSONP 格式。使用 JSONP 形式調(diào)用函數(shù)時,如 "myurl?callback=?" jQuery 將自動替換 ? 為正確的函數(shù)名,以執(zhí)行回調(diào)函數(shù)。
  • "text": 返回純文本字符串

?

詳見: 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 值)。

<form action="form_action.asp" enctype="text/plain">

<p>First name: <input type="text" name="fname" /></p>

<p>Last name: <input type="text" name="lname" /></p>

<input type="submit" value="Submit" />

</form>

?

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表示請求成功, 一般用于GETPOST請求

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

[請求體]

案例:

?

tcphttp的區(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.pyINSTALLED_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通過filtertags把數(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.GETHttpRequest.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對象的屬性:

methodGET、POST、COOKIESsession、filesuser、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ū)分它們,像這樣:

if request.user.is_authenticated(): # Do something for logged-in users. else: # Do something for anonymous users.

※ HttpResponse.user 只有當(dāng)Django 啟用AuthenticationMiddleware 中間件時才可用。

※ AUTH_USER_MODELsettings.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.body的形式:

b'name=Arroz'

?

HttpRequest.POST的形式:

<QuerySet: {'name': ['Arroz']}> # 更容易取值

?

⑨ HttpRequest.path

一個字符串,表示請求的頁面的完整路徑,不包含域名。

例如:"/music/bands/the_beatles/"

HttpRequest對象的方法:

① HttpRequest.get_host()

② HttpRequest.get_full_path()

print(request.path) # /login/ print(request.get_host()) # 127.0.0.1:8000 print(request.get_full_path()) # /login/?name=Arroz

?

③ 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)閉

例如:

def post(request): res=HttpResponse("OK") print(res.content) # b'ok' print(res.charset) # utf-8 print(res.status_code) # 200 return res

?

?

常用方法

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保存在客戶端的電腦上,所以,JavaScriptjquery也可以操作cookie,例如:

// 創(chuàng)建一個cookie并設(shè)置cookie的有效路徑:

$.cookie('cookieName', 'cookieValue', {expires: 7, path: '/'});

?

● JsonResponse對象

JSON(JavaScript Object Notation) 是一種輕量級的數(shù)據(jù)交換格式,主要用于傳送數(shù)據(jù)。

JsonResponseHttpResponse的子類,專門用來生成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)行匹配時不包括getpost請求的域名、端口和參數(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傳遞到includeurls中進(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 %}

####art.html <h1>{{ day }}</h1> <a href="{% url 'app01-art' %}">點(diǎn)擊</a> #url更改,則模板中的url引用也會隨著更改

?

####urls.py from django.conf.urls import url,includefrom app01 import views urlpatterns = [ url(r'^art/', views.art3, name='app01-art'), ]

?

####views.py def art3(request): return render(request,"art.html",{"day":"abc"})

?

?

Python代碼中,使用django.core.urlresolvers.reverse()方法

####urls.py from django.conf.urls import url,includefrom app01 import views urlpatterns = [ url(r'^art/', views.art3, name='app01-art'), ]

?

####views.py def art3(request): print(reverse('app01-art')) #在視圖函數(shù)中對url進(jìn)行反向解析 return HttpResponse("OK")

?

還有一種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.

# 項目的urls.py from django.conf.urls import url, include from django.contrib import admin

?

urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^app01/', include('app01.urls', namespace="app01")), url(r'^app02/', include("app02.urls", namespace="app02")),]

?

# app01應(yīng)用的urls.py文件 from django.conf.urls import url from app01 import views

?

urlpatterns = [ url(r'^index/', views.index, name="index"), ]

?

# app02應(yīng)用的urls.py文件 from django.conf.urls import url from app02 import views

?

urlpatterns = [ url(r'^index/', views.index, name="index"), ]

?

# 情況1: url標(biāo)記中寫出命名空間: {% url 'app01:index' %}

?

# 情況2: app02的視圖函數(shù)中反向解析app01中的urlapp02中的url from django.shortcuts import render, HttpResponse from django.core.urlresolvers import reverse

?

?

def index(request): print(reverse("app01:index")) # /app01/index/

?

print(reverse("app02:index")) # /app02/index/ return HttpResponse("OK")

?

?

視圖函數(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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。