日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

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

系統(tǒng) 1696 0

使用通用視圖的方法是在URLconf文件中創(chuàng)建配置字典,然后把這些字典作為URLconf元組的第三個(gè)成員。

例如,下面是一個(gè)呈現(xiàn)靜態(tài)“關(guān)于”頁(yè)面的URLconf:

            
from django.conf.urls.defaults import *
from django.views.generic.simple import direct_to_template

urlpatterns = patterns('',
  (r'^about/$', direct_to_template, {
    'template': 'about.html'
  })
)


          

一眼看上去似乎有點(diǎn)不可思議,不需要編寫(xiě)代碼的視圖! 它和第八章中的例子完全一樣:direct_to_template視圖僅僅是直接從傳遞過(guò)來(lái)的額外參數(shù)獲取信息并用于渲染視圖。

因?yàn)橥ㄓ靡晥D都是標(biāo)準(zhǔn)的視圖函數(shù),我們可以在我們自己的視圖中重用它。 例如,我們擴(kuò)展 about例子,把映射的URL從 /about//修改到一個(gè)靜態(tài)渲染 about/.html 。 我們首先修改URL配置以指向新的視圖函數(shù):

            
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),**
)


          

接下來(lái),我們編寫(xiě) about_pages 視圖的代碼:

            
from django.http import Http404
from django.template import TemplateDoesNotExist
from django.views.generic.simple import direct_to_template

def about_pages(request, page):
  try:
    return direct_to_template(request, template="about/%s.html" % page)
  except TemplateDoesNotExist:
    raise Http404()


          

在這里我們象使用其他函數(shù)一樣使用 direct_to_template 。 因?yàn)樗祷匾粋€(gè)HttpResponse對(duì)象,我們只需要簡(jiǎn)單的返回它就好了。 這里唯一有點(diǎn)棘手的事情是要處理找不到模板的情況。 我們不希望一個(gè)不存在的模板導(dǎo)致一個(gè)服務(wù)端錯(cuò)誤,所以我們捕獲TemplateDoesNotExist異常并且返回404錯(cuò)誤來(lái)作為替代。

這里有沒(méi)有安全性問(wèn)題?

眼尖的讀者可能已經(jīng)注意到一個(gè)可能的安全漏洞: 我們直接使用從客戶端瀏覽器得到的數(shù)據(jù)構(gòu)造模板名稱(template="about/%s.html" % page )。乍看起來(lái),這像是一個(gè)經(jīng)典的 目錄跨越(directory traversal) 攻擊(詳情請(qǐng)看第20章)。 事實(shí)真是這樣嗎?

完全不是。 是的,一個(gè)惡意的 page 值可以導(dǎo)致目錄跨越,但是盡管 page 是 從請(qǐng)求的URL中獲取的,但并不是所有的值都會(huì)被接受。 這就是URL配置的關(guān)鍵所在: 我們使用正則表達(dá)式 \w+ 來(lái)從URL里匹配 page ,而 \w 只接受字符和數(shù)字。 因此,任何惡意的字符 (例如在這里是點(diǎn) . 和正斜線 / )將在URL解析時(shí)被拒絕,根本不會(huì)傳遞給視圖函數(shù)。


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 阜康市| 奉贤区| 溆浦县| 海安县| 穆棱市| 阜城县| 牡丹江市| 陆良县| 安吉县| 崇义县| 德保县| 金阳县| 榆社县| 建湖县| 栾川县| 兰溪市| 林芝县| 怀仁县| 陇南市| 措勤县| 靖西县| 兰坪| 剑阁县| 仙居县| 西昌市| 乌恰县| 远安县| 石景山区| 万宁市| 时尚| 灵璧县| 博白县| 家居| 搜索| 轮台县| 湛江市| 子洲县| 宁蒗| 峨边| 夏河县| 安龙县|