python 视图对象_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 importurlfrom . importviews
urlpatterns=[
url(r'^articles/2003/$', views.special_case_2003),#1、單一路由對應
url(r'^articles/([0-9]{4})/$', views.year_archive),#2、基于正則的路由
url(r'^manage/(?P\w*)', views.manage,{'id':333}),#3、添加額外的參數
url(r'^index/(\d*)', views.index, name='h2'),#4、為路由映射設置名稱
設置名稱之后,可以在不同的地方調用,如:
from django.conf.urls importurlfrom . importviews
urlpatterns=[#...
url(r'^articles/([0-9]{4})/$', views.year_archive, name='news-year-archive'),#...
]
模板中使用生成URL
2012 Archive
- {% for yearvar in year_list %}
 - {{ yearvar }} Archive{% endfor %}
 
函數中使用生成URL
from django.core.urlresolvers importreversefrom django.http importHttpResponseRedirectdefredirect_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都是標簽中
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.META2 一個標準的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 importHttpResponse
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 importrender
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 importContext, Template>>> t = Template('My name is {{ name }}.')>>> c = Context({'name': 'greg'})>>>t.render(c)
u'My name is greg.'
總結
以上是生活随笔為你收集整理的python 视图对象_python web框架篇:views视图函数的全部內容,希望文章能夠幫你解決所遇到的問題。
                            
                        - 上一篇: nbalive怎么和好友对战(NBAli
 - 下一篇: python包括哪些部分_第一部分 Py