2010-06-09 40 views
9

我正在構建一個使用Web2py框架的應用程序......我不想使用請求對象來獲取所有查詢字符串參數,而是我想用命名參數構建我的控制器並讓路由器解包查詢字符串(或表單數據)字典到命名參數中並調用我的控制器。帶參數的Web2py控制器?

所以不是的

create_user(): 

控制器方法在那裏我會使用全局請求()對象,並通過增值經銷商名單看...我寧願而是有

create_user(first_name, last_name, email): 

就像我在其他MVC平臺中看到的一樣。

Web2py已經可以這樣嗎?或者是否有插件?還是我需要自己添加?

回答

11

號如book所述,形式

http://127.0.0.1:8000/a/c/f.html/x/y/z?p=1&q=2 

映射到應用程序(文件夾)a,控制器(文件)c.py,功能f,和附加參數的URL必須從解壓請求對象爲

x, y, z = tuple(request.args) 
p = request.vars['p'] # p=1 
q = request.vars['q'] # q=2 

此外,web2py專門檢測有效的控制器功能,作爲那些沒有參數的功能。 AFAICR,這與Django相反,它將有效的控制器函數檢測爲那些至少有一個參數的函數。

+0

謝謝...我一直在通過試驗和錯誤來弄清楚這一點。如果有一些選項可以改變行爲,這取決於你希望它的工作方式 – 2010-06-09 07:36:40

+0

上述情況在@service裝飾函數中是不正確的。包裝在這個裝飾器中時,帶參數的控制器函數可以是有效的。這不是確切的OP情景,但可以爲他的問題提供替代解決方案;請參閱下面的答案。 – 2013-06-17 14:03:57

+0

yes book是'http://127.0.0.1:8000/a/c/f.html/x/y/z?p = 1&q = 2',但是我得到** dist(request.vars)* *¿是不好的做法? – 2014-05-07 06:00:27

2

我做

def create_user(): 
    try: 
     first_name, last_name, email = request.args[:3] 
    except: 
     redirect('some_error_page') 

但介意名字,姓氏和電子郵件可能含有(驗證時,只有[\ W \ - \]在挑剔的web2py被允許)未在PATH_INFO允許的字符。

+0

嘿,這很酷!我是一個蟒蛇新手......所以沒有意識到有點初始化是可能的。謝謝! – 2010-06-09 18:08:41

1

有一種情況下,web2py控制器可以使用參數。當控制器函數具有@Service裝飾,參數可以被使用,這取決於服務類型,例如:

@service.jsonrpc 
def somefunction(a=None, b='default'): 
    ## whatever 

這種方法是用於在控制器的功能是一個真正的API,而不是一個方式來生成一個網絡視圖。在並行定義Web視圖和API風格的功能方面以及使Web視圖調用API函數方面可以做很多事情,以確保控制器可以很好地分離視圖。

根據您如何選擇在Web客戶端/ javascript,web2py視圖和web2py控制器之間分配職責,可以使控制器功能成爲真正的API(具有可選參數),而不是構建參數 - 在Web視圖樣式控制器中運行邏輯。