带参数的Web2py控制器?

10
我正在使用Web2py框架构建一个应用程序...我不想使用请求对象来获取所有的查询字符串参数,而是想使用命名参数构建我的控制器,让路由器将查询字符串(或表单数据)字典解包到命名参数中并调用我的控制器。
因此,我希望控制器方法为:
create_user():

我会使用全局的request()对象并查找vars列表...但我更喜欢拥有

create_user(first_name, last_name, email):

就像我在其他MVC平台上看到的一样。

这在Web2py中已经可能了吗?还是有插件可以完成它?或者我需要自己添加?

3个回答

12

不行。正如书中所述,形如以下的URL:

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

映射到应用程序(文件夹)a,控制器(文件)c.py,函数f,并且额外的参数必须从请求对象中解包。

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

此外,web2py特别将没有参数的函数识别为有效的控制器函数。据我所知,这与Django相反,Django将至少有一个参数的函数视为有效的控制器函数。


谢谢...我一直在通过试错来解决这个问题。如果有一些选项可以根据你想要的工作方式来改变行为,那就太好了。 - Nicholas Franceschina
在使用@service修饰的函数中,上述内容并不适用。当控制器函数带有参数时,使用该装饰器可以是有效的。虽然这不是完全符合OP场景,但可能为他的问题提供了另一种解决方案;请参见我下面的答案。 - Chris Johnson
是的,书中给出的链接是 http://127.0.0.1:8000/a/c/f.html/x/y/z?p=1&q=2,但我使用了参数 **dist(request.vars)**。这样做是否不好的实践? - Robin Gomez

2

我可以

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

请注意,姓名和电子邮件地址中可能包含路径信息(web2py在验证时非常挑剔,只允许使用 [\w\-\.] 字符)不允许的字符。


嘿,太酷了!我是Python的新手...所以没有意识到这种初始化方式是可能的。谢谢! - Nicholas Franceschina

1

在web2py控制器中,有一种情况可以使用参数。当控制器函数有@service装饰器时,可以根据服务类型使用参数,例如:

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

这种方法适用于控制器函数实际上是API而不是生成Web视图的方式。您可以通过并行定义Web视图和API样式函数,并使Web视图调用API函数来确保视图和控制器之间具有良好的分离性,从而实现一些很好的功能。
根据您选择在Web客户端/JavaScript、Web2py视图和Web2py控制器之间分配责任的方式,将控制器函数设置为真正的API(带有可选参数)可能比在Web视图样式控制器中构建参数解包逻辑更有意义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接