2010-06-09 77 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视图样式控制器中运行逻辑。