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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Django知识总结(一)

發布時間:2023/12/2 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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(會話跟蹤)

常用的會話跟蹤技術是cookiesession

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

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

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

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

contentType

類型:String

默認值: "application/x-www-form-urlencoded"。發送信息至服務器時內容編碼類型。

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

dataType

類型:String

預期服務器返回的數據類型。如果不指定,jQuery 將自動根據 HTTP MIME 信息來智能判斷,比如 XML MIME 類型就被識別為 XML。在 1.4 中,JSON 就會生成一個 JavaScript 對象,而 script 則會執行這個腳本。隨后服務器端返回的數據會根據這個值解析后,傳遞給回調函數。可用值:

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

?

詳見: http://www.w3school.com.cn/jquery/ajax_ajax.asp

※ HTML <form> 標簽的 enctype 屬性

enctype 屬性規定在發送到服務器之前應該如何對表單數據進行編碼。

默認地,表單數據會編碼為 "application/x-www-form-urlencoded"。就是說,在發送到服務器之前,所有字符都會進行編碼(空格轉換為 "+" 加號,特殊符號轉換為 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:在發送前編碼所有字符(默認)

② multipart/form-data:不對字符編碼。用表單上傳文件時, 必須使用該值。

③ text/plain:空格轉換為 "+" 加號,但不對特殊字符編碼。

?

狀態碼

1XX:信息性狀態碼

2XX:成功狀態碼,200表示請求成功, 一般用于GETPOST請求

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

[請求體]

案例:

?

tcphttp的區別和聯系

傳輸層的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.pyINSTALLED_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通過filtertags把數據渲染到模板上

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.GETHttpRequest.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對象的屬性:

methodGETPOSTCOOKIESsessionfilesuserbodypath

① 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() 區分它們,像這樣:

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

※ HttpResponse.user 只有當Django 啟用AuthenticationMiddleware 中間件時才可用。

※ AUTH_USER_MODELsettings.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.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自動創建的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: 關閉

例如:

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

// 創建一個cookie并設置cookie的有效路徑:

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

?

● JsonResponse對象

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

JsonResponseHttpResponse的子類,專門用來生成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字符串,進行匹配時不包括getpost請求的域名、端口和參數

?

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傳遞到includeurls中進行進一步匹配。

?

再如:

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 %}

####art.html <h1>{{ day }}</h1> <a href="{% url 'app01-art' %}">點擊</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')) #在視圖函數中對url進行反向解析 return HttpResponse("OK")

?

還有一種url解析方案了解即可: 在更高層次處理model實例時,可以使用get_absolute_url()方法

?

● url的命名空間

為各url起別名時要根據不同用途進行名稱上的區別,但當各應用很多,通過路由分發,各應用中的urls難免會有重復,因此要名稱空間,根據不同的應用建立不同的命名空間,否則當各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應用的urls.py文件 from django.conf.urls import url from app01 import views

?

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

?

# app02應用的urls.py文件 from django.conf.urls import url from app02 import views

?

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

?

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

?

# 情況2: app02的視圖函數中反向解析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")

?

?

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。