2013-03-09 50 views

回答

4

金字塔檢查使用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 

的代碼的其餘部分然後調節代碼路徑省略上下文如果視圖不接受

+1

你可以鏈接到Pyramid github源代碼發生什麼情況嗎?(https://github.com/Pylons/pyramid/tree/master/pyramid) – 2013-03-09 19:45:23

+0

可能在這裏:https://github.com/Pylons/金字塔/ blob /主/金字塔/配置/ views.py – treecoder 2013-03-09 19:50:10

+0

謝謝。因此,添加一條路線將運行檢查(就像@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