通用視圖
1. 前言
回想一下,在Django中view層起到的作用是相當于controller的角色,在view中實施的
動作,一般是取得請求參數,再從model中得到數據,再通過數據創建模板,返回相應
響應對象。但在一些比較通用的功能中,比如顯示對象列表,顯示某對象信息,如果反復
寫這么多流程的代碼,也是一件浪費時間的事,在這里,Django同樣給我們提供了類似的
"shortcut"捷徑--通用視圖。
2. 使用通用視圖
使用通用視圖的方法就是在urls.py這個路徑配置文件中進行,創建字典配置信息,然后
傳入patterns里的元組的第三個參數(extra-parameter),下面來看一個簡單的例子:
from django.conf.urls.defaults import *from django.views.generic.simple import direct_to_templateurlpatterns = patterns('', url(r'^about/$', direct_to_template, {'template': 'about.html'}),)
運行結果:
可以看到,沒有view的代碼,也可以直接運行。在這里direct_to_template,這個方法
,傳入第三個參數,然后直接進行渲染。
同時因為direct_to_template是一個函數,我們又可以把它放在view中,下面把
上面的例子改成匹配about/*,任意子網頁。
#urls.pyfrom django.conf.urls.defaults import *from django.views.generic.simple import direct_to_templatefrom mysite.books.views import about_pagesurlpatterns = patterns('', (r'^about/$', direct_to_template, { 'template': 'about.html' }), (r'^about/(/w+)/$', about_pages),)# view.pyfrom django.http import Http404from django.template import TemplateDoesNotExistfrom django.views.generic.simple import direct_to_template#由正則匹配的參數def about_pages(request, page): try: return direct_to_template(request, template="about/%s.html" % page)#返回的HttpResponse except TemplateDoesNotExist: raise Http404()
運行結果:
安全問題的題外話
上面的例子中,有一個潛在的安全問題,比較容易被忽略。那就是template="about/%s.html" % page這
句,這樣構造路徑容易被名為directory traversal的手段攻擊,簡單的說就是利用"../"這樣的返回父目錄的
路徑操作,去訪問原本不應該被訪問到的服務器上的文件,又被稱為dot dot slash攻擊。比如
使用"http://www.cnblogs.com/../etc/passwd"路徑的話,有可能就能讀取到服務器上的passwd這個文件,從而獲取到
關鍵密碼。
發布這篇博文的時候,cnblogs會把連續的"../"轉義成"http://www.cnblogs.com",難道是在防止
新聞熱點
疑難解答