python web框架篇:views視圖函數
Django請求的生命周期是怎樣的?
簡單地說,通過URL對應關系匹配 ->找到對應的函數(或者類)->返回字符串(或者讀取Html之後返回渲染的字符串)
解剖起來如下:
1. 當用戶在瀏覽器中輸入url時,瀏覽器會生成請求頭和請求體發給服務端,請求頭和請求體中會包含瀏覽器的動作(action),這個動作通常為get或者post,體現在url之中.
2. url經過Django中的wsgi,再經過Django的中間件,最後url到過路由映射表,在路由中一條一條進行匹配,,一旦其中一條匹配成功就執行對應的視圖函數,後面的路由就不再繼續匹配了.
3. 視圖函數根據客戶端的請求查詢相應的數據.返回給Django,然後Django把客戶端想要的數據做為一個字符串返回給客戶端.
4. 客戶端瀏覽器接收到返回的數據,經過渲染後顯示給用戶.
1. 路由系統
為了給一個應用設計URL,你需要創建一個Python 模塊,通常稱為URLconf(URL configuration)。這個模塊是純粹的Python 代碼,包含URL 模式(簡單的正則表達式)到Python 函數(你的視圖)的簡單映射。因為它是純粹的Python 代碼,它可以動態構造。
URL配置(URLconf)就像Django 所支撐網站的目錄。它的本質是URL模式以及要為該URL模式調用的視圖函數之間的映射表;以這種方式告訴Django,對於這個URL調用這段代碼,對於那個URL調用那段代碼
urlpatterns = [ url(正則表達式, views視圖函數,參數,別名), ] 參數說明: 一個正則表達式字符串 一個可調用對象,通常為一個視圖函數或一個指定視圖函數路徑的字符串 可選的要傳遞給視圖函數的默認參數(字典形式) 一個可選的name參數from django.conf.urls import url from . import views urlpatterns = [ url(r‘^articles/2003/$‘, views.special_case_2003),#1、單一路由對應 url(r‘^articles/([0-9]{4})/$‘, views.year_archive),#2、基於正則的路由 url(r‘^manage/(?P<name>\w*)‘, views.manage,{‘id‘:333}),#3、添加額外的參數 url(r‘^index/(\d*)‘, views.index, name=‘h2‘),#4、為路由映射設置名稱
設置名稱之後,可以在不同的地方調用,如:
from django.conf.urls import url from . import views urlpatterns = [ #... url(r‘^articles/([0-9]{4})/$‘, views.year_archive, name=‘news-year-archive‘), #... ]
模板中使用生成URL
<a href="{% url ‘news-year-archive‘ 2012 %}">2012 Archive</a> <ul> {% for yearvar in year_list %} <li><a href="{% url ‘news-year-archive‘ yearvar %}">{{ yearvar }} Archive</a></li> {% endfor %} </ul>
函數中使用生成URL
from django.core.urlresolvers import reverse from django.http import HttpResponseRedirect def redirect_to_year(request): # ... year = 2006 # ... return HttpResponseRedirect(reverse(‘news-year-archive‘, args=(year,)))
Model中使用獲取URL 自定義get_absolute_url() 方法
2. views函數
http請求中產生兩個核心對象:
http請求:HttpRequest對象
http響應:HttpResponse對象
2.1 HttpRequest對象的屬性和方法:
path:個字符串,表示請求的頁面的完整路徑,不包含域名。
例如:"/music/bands/the_beatles/"
HttpRequest.path_info
在某些Web 服務器配置下,主機名後的URL 部分被分成腳本前綴部分和路徑信息部分。path_info 屬性將始終包含路徑信息部分,不論使用的Web 服務器是什麽。使用它代替path 可以讓代碼在測試和開發環境中更容易地切換。
例如,如果應用的WSGIScriptAlias 設置為"/minfo",那麽當path 是"/minfo/music/bands/the_beatles/" 時path_info 將是"/music/bands/the_beatles/"。
method:請求中使用的HTTP方法的字符串表示。全大寫表示。
GET:包含所有HTTPGET參數的類字典對象
POST:包含所有HTTPPOST參數的類字典對象
例如
ifreq.method=="GET":
do_something()
elseif req.method=="POST":
do_something_else()
服務器收到空的POST請求的情況也是可能發生的,也就是說,表單form通過HTTPPOST方法提交請求,但是表單中可能沒有數據,因此不能使用ifreq.POST來判斷是否使用了HTTPPOST方法;應該使用ifreq.method=="POST"
COOKIES:包含所有cookies的標準Python字典對象;keys和values都是字符串。
FILES:包含所有上傳文件的類字典對象;FILES中的每一個Key都是<inputtype="file"name=""/>標簽中
name屬性的值,FILES中的每一個value同時也是一個標準的python字典對象,包含下面三個Keys:
filename:上傳文件名,用字符串表示
content_type:上傳文件的ContentType
content:上傳文件的原始內容
user:是一個django.contrib.auth.models.User對象,代表當前登陸的用戶。如果訪問用戶當前
沒有登陸,user將被初始化為django.contrib.auth.models.AnonymousUser的實例。你
可以通過user的is_authenticated()方法來辨別用戶是否登陸:
ifreq.user.is_authenticated();只有激活Django中的AuthenticationMiddleware
時該屬性才可用
session:唯一可讀寫的屬性,代表當前會話的字典對象;自己有激活Django中的session支持時該屬性才可用。
HttpRequest.META
1 HttpRequest.META 2 一個標準的Python 字典,包含所有的HTTP 頭部。具體的頭部信息取決於客戶端和服務器,下面是一些示例: 3 4 CONTENT_LENGTH —— 請求的正文的長度(是一個字符串)。 5 CONTENT_TYPE —— 請求的正文的MIME 類型。 6 HTTP_ACCEPT —— 響應可接收的Content-Type。 7 HTTP_ACCEPT_ENCODING —— 響應可接收的編碼。 8 HTTP_ACCEPT_LANGUAGE —— 響應可接收的語言。 9 HTTP_HOST —— 客服端發送的HTTP Host 頭部。 10 HTTP_REFERER —— Referring 頁面。 11 HTTP_USER_AGENT —— 客戶端的user-agent 字符串。 12 QUERY_STRING —— 單個字符串形式的查詢字符串(未解析過的形式)。 13 REMOTE_ADDR —— 客戶端的IP 地址。 14 REMOTE_HOST —— 客戶端的主機名。 15 REMOTE_USER —— 服務器認證後的用戶。 16 REQUEST_METHOD —— 一個字符串,例如"GET" 或"POST"。 17 SERVER_NAME —— 服務器的主機名。 18 SERVER_PORT —— 服務器的端口(是一個字符串)。View Code
HttpRequest.get_full_path()
返回path,如果可以將加上查詢字符串。
例如:"/music/bands/the_beatles/?print=true"
,比如:http://127.0.0.1:8000/index33/?name=123,
QueryDict.getlist(key, default)以Python 列表形式返回所請求的鍵的數據。如果鍵不存在並且沒有提供默認值,則返回空列表。它保證返回的是某種類型的列表,除非默認值不是列表。
2.2 HttpResponse對象:
對於HttpRequest對象來說,是由django自動創建的,但是,HttpResponse對象就必須我們自己創建。每個view請求處理方法必須返回一個HttpResponse對象。
HttpResponse類在django.http.HttpResponse
在HttpResponse對象上擴展的常用方法:
1)傳遞字符串:典型的應用是傳遞一個字符串作為頁面的內容到HttpResponse 構造函數:
from django.http import HttpResponse response = HttpResponse("Here‘s the text of the Web page.") response = HttpResponse("Text only, please.", content_type="text/plain")
2)傳遞叠代器
最後你可以傳遞給HttpResponse 一個叠代器而不是字符串. HttpResponse 將立即處理這個叠代器, 把它的內容存成字符串,並丟棄它
如果你需要從叠代器到客戶端的數據數據流的形式響應, 你必須用StreamingHttpResponse 類代替;.
3)頁面跳轉: redirect(
"路徑"
)
4)render
from django.shortcuts import render render(request, template_name, context=None, content_type=None, status=None, using=None)
結合一個給定的模板和一個給定的上下文字典,並返回一個渲染後的 HttpResponse 對象。
通俗的講就是把context的內容, 加載進templates中定義的文件, 並通過瀏覽器渲染呈現.
request: 是一個固定參數, 沒什麽好講的。 template_name: templates 中定義的文件, 要註意路徑名. 比如‘templates\polls\index.html‘, 參數就要寫‘polls\index.html’ context: 要傳入文件中用於渲染呈現的數據, 默認是字典格式 content_type: 生成的文檔要使用的MIME 類型。默認為DEFAULT_CONTENT_TYPE 設置的值。 status: http的響應代碼,默認是200. using: 用於加載模板使用的模板引擎的名稱。
一旦你創建一個 Template 對象,你可以用 context 來傳遞數據給它。 一個context 是一系列變量和它們值的集合。
context 在 Django 裏表現為 Context 類,在 django.template 模塊裏。它的構造函數帶有一個可選的參數: 一個字典映射變量和它們的值。 調用 Template 對象 的 render() 方法並傳遞 context 來填充模板:
>>> from django.template import Context, Template >>> t = Template(‘My name is {{ name }}.‘) >>> c = Context({‘name‘: ‘greg‘}) >>> t.render(c) u‘My name is greg.‘
python web框架篇:views視圖函數