3
一個金字塔查看調用在它的最簡單的形式可以寫成:金字塔:視圖可以接受一個或兩個參數嗎?
def myview(request):
pass
另一種形式是接受另一個參數 - 上下文:
def myview(context, request):
pass
如何金字塔視圖查找機械知道視圖可調用是否接受上下文?
一個金字塔查看調用在它的最簡單的形式可以寫成:金字塔:視圖可以接受一個或兩個參數嗎?
def myview(request):
pass
另一種形式是接受另一個參數 - 上下文:
def myview(context, request):
pass
如何金字塔視圖查找機械知道視圖可調用是否接受上下文?
金字塔檢查使用inspect
模塊(特別是.getargspec()
呼叫在requestonly()
function視圖:
def requestonly(view, attr=None):
ismethod = False
if attr is None:
attr = '__call__'
if inspect.isroutine(view):
fn = view
elif inspect.isclass(view):
try:
fn = view.__init__
except AttributeError:
return False
ismethod = hasattr(fn, '__call__')
else:
try:
fn = getattr(view, attr)
except AttributeError:
return False
try:
argspec = inspect.getargspec(fn)
except TypeError:
return False
args = argspec[0]
if hasattr(fn, im_func) or ismethod:
# it's an instance method (or unbound method on py2)
if not args:
return False
args = args[1:]
if not args:
return False
if len(args) == 1:
return True
defaults = argspec[3]
if defaults is None:
defaults =()
if args[0] == 'request':
if len(args) - len(defaults) == 1:
return True
return False
的代碼的其餘部分然後調節代碼路徑省略上下文如果視圖不接受
你可以鏈接到Pyramid github源代碼發生什麼情況嗎?(https://github.com/Pylons/pyramid/tree/master/pyramid) – 2013-03-09 19:45:23
可能在這裏:https://github.com/Pylons/金字塔/ blob /主/金字塔/配置/ views.py – treecoder 2013-03-09 19:50:10
謝謝。因此,添加一條路線將運行檢查(就像@Martijn指出的那樣),然後將視圖'包裝'成一個標準化的調用,並通過'DefaultViewMapper'將它存儲在註冊表中。 'router.py'(https://github.com/Pylons/pyramid/blob/master/pyramid/router.py)具有'Router.handle_request'方法,它調用映射(標準化)請求和兩個參數'response = view_callable(context,request)'。 我實際上總是對這個過程如何完成感興趣。很高興他們通過DefaultViewMapper標準化來優化檢查。 – 2013-03-09 19:57:22