在Python的Django架構中使用通用視圖的方法

來源:互聯網
上載者:User
使用通用視圖的方法是在URLconf檔案中建立配置字典,然後把這些字典作為URLconf元組的第三個成員。

例如,下面是一個呈現靜態“關於”頁面的URLconf:

from django.conf.urls.defaults import *from django.views.generic.simple import direct_to_templateurlpatterns = patterns('',  (r'^about/$', direct_to_template, {    'template': 'about.html'  }))

一眼看上去似乎有點不可思議,不需要編寫代碼的視圖! 它和第八章中的例子完全一樣:direct_to_template視圖僅僅是直接從傳遞過來的額外參數擷取資訊並用於渲染視圖。

因為通用視圖都是標準的視圖函數,我們可以在我們自己的視圖中重用它。 例如,我們擴充 about例子,把映射的URL從 /about//修改到一個靜態渲染 about/.html 。 我們首先修改URL配置以指向新的視圖函數:

from django.conf.urls.defaults import *from django.views.generic.simple import direct_to_template**from mysite.books.views import about_pages**urlpatterns = patterns('',  (r'^about/$', direct_to_template, {    'template': 'about.html'  }),  **(r'^about/(\w+)/$', about_pages),**)

接下來,我們編寫 about_pages 視圖的代碼:

from django.http import Http404from django.template import TemplateDoesNotExistfrom django.views.generic.simple import direct_to_templatedef about_pages(request, page):  try:    return direct_to_template(request, template="about/%s.html" % page)  except TemplateDoesNotExist:    raise Http404()

在這裡我們象使用其他函數一樣使用 direct_to_template 。 因為它返回一個HttpResponse對象,我們只需要簡單的返回它就好了。 這裡唯一有點棘手的事情是要處理找不到模板的情況。 我們不希望一個不存在的模板導致一個服務端錯誤,所以我們捕獲TemplateDoesNotExist異常並且返回404錯誤來作為替代。

這裡有沒有安全性問題?

眼尖的讀者可能已經注意到一個可能的安全性漏洞: 我們直接使用從用戶端瀏覽器得到的資料構造模板名稱(template="about/%s.html" % page )。乍看起來,這像是一個經典的 目錄跨越(directory traversal) 攻擊(詳情請看第20章)。 事實真是這樣嗎?

完全不是。 是的,一個惡意的 page 值可以導致目錄跨越,但是儘管 page 是 從請求的URL中擷取的,但並不是所有的值都會被接受。 這就是URL配置的關鍵所在: 我們使用Regex \w+ 來從URL裡匹配 page ,而 \w 只接受字元和數字。 因此,任何惡意的字元 (例如在這裡是點 . 和正斜線 / )將在URL解析時被拒絕,根本不會傳遞給視圖函數。

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.