1. 程式人生 > >python web框架篇:views視圖函數

python web框架篇:views視圖函數

則表達式 定義 string 給定 語言 lan 模板引擎 rem nag

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)
uMy name is greg.

python web框架篇:views視圖函數