最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Django中URL視圖函數(shù)的一些高級概念介紹

 更新時間:2015年07月20日 10:14:11   投稿:goldensun  
這篇文章主要介紹了Django中URL視圖函數(shù)的一些高級概念,Django是Python重多人氣框架中最為著名的一個,需要的朋友可以參考下

說到關(guān)于請求方法的分支,讓我們來看一下可以用什么好的方法來實現(xiàn)它。 考慮這個 URLconf/view 設(shè)計:

# urls.py

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
  # ...
  (r'^somepage/$', views.some_page),
  # ...
)

# views.py

from django.http import Http404, HttpResponseRedirect
from django.shortcuts import render_to_response

def some_page(request):
  if request.method == 'POST':
    do_something_for_post()
    return HttpResponseRedirect('/someurl/')
  elif request.method == 'GET':
    do_something_for_get()
    return render_to_response('page.html')
  else:
    raise Http404()

在這個示例中,`` some_page()`` 視圖函數(shù)對`` POST`` 和`` GET`` 這兩種請求方法的處理完全不同。 它們唯一的共同點是共享一個URL地址: `` /somepage/.``正如大家所看到的,在同一個視圖函數(shù)中對`` POST`` 和`` GET`` 進(jìn)行處理是一種很初級也很粗糙的做法。 一個比較好的設(shè)計習(xí)慣應(yīng)該是,用兩個分開的視圖函數(shù)——一個處理`` POST`` 請求,另一個處理`` GET`` 請求,然后在相應(yīng)的地方分別進(jìn)行調(diào)用。

我們可以像這樣做:先寫一個視圖函數(shù)然后由它來具體分派其它的視圖,在之前或之后可以執(zhí)行一些我們自定的程序邏輯。 下邊的示例展示了這個技術(shù)是如何幫我們改進(jìn)前邊那個簡單的`` some_page()`` 視圖的:

# views.py

from django.http import Http404, HttpResponseRedirect
from django.shortcuts import render_to_response

def method_splitter(request, GET=None, POST=None):
  if request.method == 'GET' and GET is not None:
    return GET(request)
  elif request.method == 'POST' and POST is not None:
    return POST(request)
  raise Http404

def some_page_get(request):
  assert request.method == 'GET'
  do_something_for_get()
  return render_to_response('page.html')

def some_page_post(request):
  assert request.method == 'POST'
  do_something_for_post()
  return HttpResponseRedirect('/someurl/')

# urls.py

from django.conf.urls.defaults import *
from mysite import views

urlpatterns = patterns('',
  # ...
  (r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 'POST': views.some_page_post}),
  # ...
)

讓我們從頭看一下代碼是如何工作的:

    我們寫了一個新的視圖,`` method_splitter()`` ,它根據(jù)`` request.method`` 返回的值來調(diào)用相應(yīng)的視圖??梢钥吹剿鼛в袃蓚€關(guān)鍵參數(shù),`` GET`` 和`` POST`` ,也許應(yīng)該是* 視圖函數(shù)* 。如果`` request.method`` 返回`` GET`` ,那它就會自動調(diào)用`` GET`` 視圖。 如果`` request.method`` 返回的是`` POST`` ,那它調(diào)用的就是`` POST`` 視圖。 如果`` request.method`` 返回的是其它值(如:`` HEAD`` ),或者是沒有把`` GET`` 或`` POST`` 提交給此函數(shù),那它就會拋出一個`` Http404`` 錯誤。

    在URLconf中,我們把`` /somepage/`` 指到`` method_splitter()`` 函數(shù),并把視圖函數(shù)額外需要用到的`` GET`` 和`` POST`` 參數(shù)傳遞給它。

    最終,我們把`` some_page()`` 視圖分解到兩個視圖函數(shù)中`` some_page_get()`` 和`` some_page_post()`` 。這比把所有邏輯都擠到一個單一視圖的做法要優(yōu)雅得多。

    注意,在技術(shù)上這些視圖函數(shù)就不用再去檢查`` request.method`` 了,因為`` method_splitter()`` 已經(jīng)替它們做了。 (比如,`` some_page_post()`` 被調(diào)用的時候,我們可以確信`` request.method`` 返回的值是`` post`` 。)當(dāng)然,這樣做不止更安全也能更好的將代碼文檔化,這里我們做了一個假定,就是`` request.method`` 能象我們所期望的那樣工作。

現(xiàn)在我們就擁有了一個不錯的,可以通用的視圖函數(shù)了,里邊封裝著由`` request.method`` 的返回值來分派不同的視圖的程序。關(guān)于`` method_splitter()`` 就不說什么了,當(dāng)然,我們可以把它們重用到其它項目中。

然而,當(dāng)我們做到這一步時,我們?nèi)匀豢梢愿倪M(jìn)`` method_splitter`` 。從代碼我們可以看到,它假設(shè)`` Get`` 和`` POST`` 視圖除了`` request`` 之外不需要任何其他的參數(shù)。那么,假如我們想要使用`` method_splitter`` 與那種會從URL里捕捉字符,或者會接收一些可選參數(shù)的視圖一起工作時該怎么辦呢?

為了實現(xiàn)這個,我們可以使用Python中一個優(yōu)雅的特性 帶星號的可變參數(shù) 我們先展示這些例子,接著再進(jìn)行解釋

def method_splitter(request, *args, **kwargs):
  get_view = kwargs.pop('GET', None)
  post_view = kwargs.pop('POST', None)
  if request.method == 'GET' and get_view is not None:
    return get_view(request, *args, **kwargs)
  elif request.method == 'POST' and post_view is not None:
    return post_view(request, *args, **kwargs)
  raise Http404

這里,我們重構(gòu)method_splitter(),去掉了GET和POST兩個關(guān)鍵字參數(shù),改而支持使用*args和和**kwargs(注意*號) 這是一個Python特性,允許函數(shù)接受動態(tài)的、可變數(shù)量的、參數(shù)名只在運行時可知的參數(shù)。 如果你在函數(shù)定義時,只在參數(shù)前面加一個*號,所有傳遞給函數(shù)的參數(shù)將會保存為一個元組. 如果你在函數(shù)定義時,在參數(shù)前面加兩個*號,所有傳遞給函數(shù)的關(guān)鍵字參數(shù),將會保存為一個字典

例如,對于這個函數(shù)

def foo(*args, **kwargs):
  print "Positional arguments are:"
  print args
  print "Keyword arguments are:"
  print kwargs

看一下它是怎么工作的

>>> foo(1, 2, 3)
Positional arguments are:
(1, 2, 3)
Keyword arguments are:
{}
>>> foo(1, 2, name='Adrian', framework='Django')
Positional arguments are:
(1, 2)
Keyword arguments are:
{'framework': 'Django', 'name': 'Adrian'}

回過頭來看,你能發(fā)現(xiàn)我們用method_splitter()和*args接受**kwargs函數(shù)參數(shù)并把它們傳遞到正確的視圖。any 但是在我們這樣做之前,我們要調(diào)用兩次獲得參數(shù)kwargs.pop()GETPOST,如果它們合法的話。 (我們通過指定pop的缺省值為None,來避免由于一個或者多個關(guān)鍵字缺失帶來的KeyError)

相關(guān)文章

  • Python繪圖之柱形圖繪制詳解

    Python繪圖之柱形圖繪制詳解

    這篇文章主要介紹了Python繪圖之柱形圖繪制詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • pygame學(xué)習(xí)筆記(6):完成一個簡單的游戲

    pygame學(xué)習(xí)筆記(6):完成一個簡單的游戲

    這篇文章主要介紹了pygame學(xué)習(xí)筆記(6):完成一個簡單的游戲,本文綜合了學(xué)習(xí)過的知識,完成一個簡單的游戲開發(fā),是本系列文章的最后一篇,需要的朋友可以參考下
    2015-04-04
  • Python實現(xiàn)批量檢測HTTP服務(wù)的狀態(tài)

    Python實現(xiàn)批量檢測HTTP服務(wù)的狀態(tài)

    本文給大家分享的是一個使用python實現(xiàn)的批量檢測web服務(wù)可用性的腳本代碼,主要功能有測試一組url的可用性(可以包括HTTP狀態(tài)、響應(yīng)時間等)并統(tǒng)計出現(xiàn)不可用情況的次數(shù)和頻率等。
    2016-10-10
  • Python unittest框架操作實例解析

    Python unittest框架操作實例解析

    這篇文章主要介紹了Python unittest框架操作實例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-04-04
  • Django 項目布局方法(值得推薦)

    Django 項目布局方法(值得推薦)

    這篇文章主要介紹了Django 項目布局方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-03-03
  • Python Django實現(xiàn)layui風(fēng)格+django分頁功能的例子

    Python Django實現(xiàn)layui風(fēng)格+django分頁功能的例子

    今天小編就為大家分享一篇Python Django實現(xiàn)layui風(fēng)格+django分頁功能的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-08-08
  • Django+Xadmin構(gòu)建項目的方法步驟

    Django+Xadmin構(gòu)建項目的方法步驟

    這篇文章主要介紹了Django+Xadmin構(gòu)建項目的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-03-03
  • 對Python3之進(jìn)程池與回調(diào)函數(shù)的實例詳解

    對Python3之進(jìn)程池與回調(diào)函數(shù)的實例詳解

    今天小編就為大家分享一篇對Python3之進(jìn)程池與回調(diào)函數(shù)的實例詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01
  • 關(guān)于Python中Inf與Nan的判斷問題詳解

    關(guān)于Python中Inf與Nan的判斷問題詳解

    這篇文章主要介紹了關(guān)于Python中Inf與Nan的判斷問題,文中介紹的很詳細(xì),對大家具有一定的參考價值,有需要的朋友們下面來一起看看吧。
    2017-02-02
  • Python的shutil模塊中文件的復(fù)制操作函數(shù)詳解

    Python的shutil模塊中文件的復(fù)制操作函數(shù)詳解

    shutil被定義為Python中的一個高級的文件操作模塊,擁有比os模塊中更強(qiáng)大的函數(shù),這里我們就來看一下Python的shutil模塊中文件的復(fù)制操作函數(shù)詳解
    2016-07-07

最新評論

黔西| 中超| 贵阳市| 寻甸| 申扎县| 乌拉特中旗| 绥中县| 闸北区| 上犹县| 丰城市| 古田县| 皋兰县| 拉萨市| 宜君县| 双流县| 靖江市| 莱阳市| 增城市| 贡觉县| 泰州市| 纳雍县| 宁安市| 永春县| 安庆市| 漯河市| 闽清县| 灵川县| 工布江达县| 屯昌县| 无棣县| 郑州市| 嘉定区| 绍兴县| 永修县| 阳城县| 收藏| 中阳县| 布尔津县| 湖州市| 靖边县| 武陟县|