亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > Python > 正文

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

2020-01-04 18:01:52
字體:
來源:轉載
供稿:網友
這篇文章主要介紹了Django中URL視圖函數的一些高級概念,Django是Python重多人氣框架中最為著名的一個,需要的朋友可以參考下
說到關于請求方法的分支,讓我們來看一下可以用什么好的方法來實現它。 考慮這個 URLconf/view 設計:
 
  1. # urls.py 
  2.  
  3. from django.conf.urls.defaults import * 
  4. from mysite import views 
  5.  
  6. urlpatterns = patterns(''
  7.   # ... 
  8.   (r'^somepage/$', views.some_page), 
  9.   # ... 
  10.  
  11. # views.py 
  12.  
  13. from django.http import Http404, HttpResponseRedirect 
  14. from django.shortcuts import render_to_response 
  15.  
  16. def some_page(request): 
  17.   if request.method == 'POST'
  18.     do_something_for_post() 
  19.     return HttpResponseRedirect('/someurl/'
  20.   elif request.method == 'GET'
  21.     do_something_for_get() 
  22.     return render_to_response('page.html'
  23.   else
  24.     raise Http404() 


在這個示例中,`` some_page()`` 視圖函數對`` POST`` 和`` GET`` 這兩種請求方法的處理完全不同。 它們唯一的共同點是共享一個URL地址: `` /somepage/.``正如大家所看到的,在同一個視圖函數中對`` POST`` 和`` GET`` 進行處理是一種很初級也很粗糙的做法。 一個比較好的設計習慣應該是,用兩個分開的視圖函數——一個處理`` POST`` 請求,另一個處理`` GET`` 請求,然后在相應的地方分別進行調用。
我們可以像這樣做:先寫一個視圖函數然后由它來具體分派其它的視圖,在之前或之后可以執行一些我們自定的程序邏輯。 下邊的示例展示了這個技術是如何幫我們改進前邊那個簡單的`` some_page()`` 視圖的:
 
  1. # views.py 
  2.  
  3. from django.http import Http404, HttpResponseRedirect 
  4. from django.shortcuts import render_to_response 
  5.  
  6. def method_splitter(request, GET=None, POST=None): 
  7.   if request.method == 'GET' and GET is not None: 
  8.     return GET(request) 
  9.   elif request.method == 'POST' and POST is not None: 
  10.     return POST(request) 
  11.   raise Http404 
  12.  
  13. def some_page_get(request): 
  14.   assert request.method == 'GET' 
  15.   do_something_for_get() 
  16.   return render_to_response('page.html'
  17.  
  18. def some_page_post(request): 
  19.   assert request.method == 'POST' 
  20.   do_something_for_post() 
  21.   return HttpResponseRedirect('/someurl/'
  22.  
  23. # urls.py 
  24.  
  25. from django.conf.urls.defaults import * 
  26. from mysite import views 
  27.  
  28. urlpatterns = patterns(''
  29.   # ... 
  30.   (r'^somepage/$', views.method_splitter, {'GET': views.some_page_get, 'POST': views.some_page_post}), 
  31.   # ... 

讓我們從頭看一下代碼是如何工作的:
    我們寫了一個新的視圖,`` method_splitter()`` ,它根據`` request.method`` 返回的值來調用相應的視圖??梢钥吹剿鼛в袃蓚€關鍵參數,`` GET`` 和`` POST`` ,也許應該是* 視圖函數* 。如果`` request.method`` 返回`` GET`` ,那它就會自動調用`` GET`` 視圖。 如果`` request.method`` 返回的是`` POST`` ,那它調用的就是`` POST`` 視圖。 如果`` request.method`` 返回的是其它值(如:`` HEAD`` ),或者是沒有把`` GET`` 或`` POST`` 提交給此函數,那它就會拋出一個`` Http404`` 錯誤。
    在URLconf中,我們把`` /somepage/`` 指到`` method_splitter()`` 函數,并把視圖函數額外需要用到的`` GET`` 和`` POST`` 參數傳遞給它。
    最終,我們把`` some_page()`` 視圖分解到兩個視圖函數中`` some_page_get()`` 和`` some_page_post()`` 。這比把所有邏輯都擠到一個單一視圖的做法要優雅得多。
    注意,在技術上這些視圖函數就不用再去檢查`` request.method`` 了,因為`` method_splitter()`` 已經替它們做了。 (比如,`` some_page_post()`` 被調用的時候,我們可以確信`` request.method`` 返回的值是`` post`` 。)當然,這樣做不止更安全也能更好的將代碼文檔化,這里我們做了一個假定,就是`` request.method`` 能象我們所期望的那樣工作。
現在我們就擁有了一個不錯的,可以通用的視圖函數了,里邊封裝著由`` request.method`` 的返回值來分派不同的視圖的程序。關于`` method_splitter()`` 就不說什么了,當然,我們可以把它們重用到其它項目中。
然而,當我們做到這一步時,我們仍然可以改進`` method_splitter`` 。從代碼我們可以看到,它假設`` Get`` 和`` POST`` 視圖除了`` request`` 之外不需要任何其他的參數。那么,假如我們想要使用`` method_splitter`` 與那種會從URL里捕捉字符,或者會接收一些可選參數的視圖一起工作時該怎么辦呢?
為了實現這個,我們可以使用Python中一個優雅的特性 帶星號的可變參數 我們先展示這些例子,接著再進行解釋
 
  1. def method_splitter(request, *args, **kwargs): 
  2.   get_view = kwargs.pop('GET', None) 
  3.   post_view = kwargs.pop('POST', None) 
  4.   if request.method == 'GET' and get_view is not None: 
  5.     return get_view(request, *args, **kwargs) 
  6.   elif request.method == 'POST' and post_view is not None: 
  7.     return post_view(request, *args, **kwargs) 
  8.   raise Http404 

這里,我們重構method_splitter(),去掉了GET和POST兩個關鍵字參數,改而支持使用*args和和**kwargs(注意*號) 這是一個Python特性,允許函數接受動態的、可變數量的、參數名只在運行時可知的參數。 如果你在函數定義時,只在參數前面加一個*號,所有傳遞給函數的參數將會保存為一個元組. 如果你在函數定義時,在參數前面加兩個*號,所有傳遞給函數的關鍵字參數,將會保存為一個字典
例如,對于這個函數
 
  1. def foo(*args, **kwargs): 
  2.   print "Positional arguments are:" 
  3.   print args 
  4.   print "Keyword arguments are:" 
  5.   print kwargs 


看一下它是怎么工作的
 
  1. >>> foo(1, 2, 3) 
  2. Positional arguments are: 
  3. (1, 2, 3) 
  4. Keyword arguments are: 
  5. {} 
  6. >>> foo(1, 2, name='Adrian', framework='Django'
  7. Positional arguments are: 
  8. (1, 2) 
  9. Keyword arguments are: 
  10. {'framework''Django''name''Adrian'


回過頭來看,你能發現我們用method_splitter()和*args接受**kwargs函數參數并把它們傳遞到正確的視圖。any 但是在我們這樣做之前,我們要調用兩次獲得參數kwargs.pop()GETPOST,如果它們合法的話。 (我們通過指定pop的缺省值為None,來避免由于一個或者多個關鍵字缺失帶來的KeyError)
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文字幕久久| 国产免费一区二区三区在线观看| 69国产精品成人在线播放| 久久国产精品久久久久| 亚洲欧美在线x视频| 97超级碰在线看视频免费在线看| 欧美二区乱c黑人| 青青精品视频播放| 欧美国产日本在线| 久久免费视频这里只有精品| 一本色道久久88综合日韩精品| 欧美激情亚洲激情| 亚洲国产精品人久久电影| 日本一区二区三区四区视频| 亚洲女人被黑人巨大进入al| 成人在线精品视频| 57pao国产精品一区| 在线看欧美日韩| 国产精品久久视频| 亚洲经典中文字幕| 色播久久人人爽人人爽人人片视av| 成人天堂噜噜噜| 亚洲视频在线观看| 色噜噜狠狠狠综合曰曰曰88av| 国产亚洲视频在线| 久久天堂av综合合色| 国产成人极品视频| 中日韩美女免费视频网址在线观看| 欧美在线激情视频| 福利二区91精品bt7086| 欧美激情区在线播放| 亚洲视频视频在线| 亚洲日本成人网| 国产日韩综合一区二区性色av| 亚洲精品av在线| 国产在线视频不卡| 欧美黑人xxxx| 国产一区视频在线播放| 亚洲最大中文字幕| 日本欧美一级片| 伊人久久免费视频| 欧美大尺度在线观看| www.精品av.com| 成人福利在线观看| 亚洲美女av黄| 欧美夫妻性生活视频| 欧美日韩中文字幕在线视频| 欧美日韩国产成人高清视频| 亚洲久久久久久久久久久| 黄色精品一区二区| 国产视频亚洲精品| 久久综合免费视频影院| 日韩国产精品视频| 欧洲成人在线视频| 在线观看成人黄色| 欧美理论电影在线播放| 亚洲欧美一区二区激情| 亚洲综合日韩中文字幕v在线| 成人网在线视频| 日韩视频中文字幕| 97精品一区二区三区| 啪一啪鲁一鲁2019在线视频| 日本免费一区二区三区视频观看| 97超级碰碰碰久久久| 国产在线拍偷自揄拍精品| 亚洲电影免费观看高清完整版在线观看| 91在线视频九色| 精品无人国产偷自产在线| 亚洲性69xxxbbb| 欧美综合在线第二页| 亚洲国产精品成人一区二区| 97在线观看视频国产| 日产精品久久久一区二区福利| 欧美在线视频在线播放完整版免费观看| 日本亚洲欧美三级| 亚洲已满18点击进入在线看片| 亚洲第一精品夜夜躁人人躁| 国产69久久精品成人看| 成人精品一区二区三区电影免费| 深夜福利亚洲导航| 懂色aⅴ精品一区二区三区蜜月| 欧美视频不卡中文| 国产精品久久久久91| 亚洲影影院av| 日韩av影片在线观看| 精品国产精品三级精品av网址| 亚洲欧美成人精品| 在线观看视频99| 久久精品电影一区二区| 视频在线观看一区二区| 九色精品美女在线| 精品中文字幕视频| 国产精品自产拍在线观看中文| 激情懂色av一区av二区av| 96精品久久久久中文字幕| 国产精品高潮在线| 国产亚洲欧美另类中文| 91美女片黄在线观看游戏| 美女福利视频一区| 97成人精品区在线播放| 2019国产精品自在线拍国产不卡| 久久91亚洲精品中文字幕奶水| 日韩欧美国产免费播放| 日韩国产在线看| 国产精品视频白浆免费视频| 国产这里只有精品| 欧美精品情趣视频| 日韩精品中文字幕久久臀| 欧美精品第一页在线播放| 中文字幕日韩精品在线| 日韩在线高清视频| 欧美国产一区二区三区| 久久成年人视频| 日韩欧美亚洲综合| 一区二区欧美亚洲| 国产成人av网址| 欧美国产第一页| 亚洲一区二区三区在线免费观看| 成人亚洲综合色就1024| 日韩一区二区三区国产| 91在线中文字幕| 国产成人精品网站| 欧美日韩在线观看视频小说| 亚洲精品久久久久久久久久久久| 国产精品久久久久久久久| 亚洲欧美日韩精品| 国产精品v日韩精品| 久久久久久国产三级电影| 国产91露脸中文字幕在线| 国产精品xxxxx| 成人精品久久av网站| 欧美午夜视频一区二区| 青草热久免费精品视频| 97香蕉久久超级碰碰高清版| 亚洲欧美日韩国产精品| 91精品国产网站| 日韩欧美在线视频观看| 国产精品吹潮在线观看| 国产成人精品一区二区三区| 国产视频精品在线| 黄色精品一区二区| 欧美性xxxx| 亚洲激情免费观看| 久热精品在线视频| 日韩欧美成人网| 国产日产亚洲精品| 91人人爽人人爽人人精88v| 色噜噜狠狠狠综合曰曰曰88av| 精品久久久久久久久久| 最近2019好看的中文字幕免费| 欧美黄色三级网站| 欧美整片在线观看| 久久精品99久久香蕉国产色戒| 亚洲已满18点击进入在线看片| 久久久精品中文字幕| 国产精品偷伦免费视频观看的| 中文字幕日韩高清| 黑人巨大精品欧美一区二区| 日本免费久久高清视频| 久久香蕉国产线看观看网| 7777精品久久久久久| 日韩欧美精品免费在线| 亚洲欧美中文字幕在线一区| 亚洲免费人成在线视频观看|