Web2py 控制器如何接收参数?

10 投票
3 回答
10565 浏览
提问于 2025-04-15 23:43

我正在用Web2py框架开发一个应用程序……我不想每次都使用请求对象来获取所有的查询字符串参数,而是希望能用命名参数来构建我的控制器,让路由器自动把查询字符串(或者表单数据)中的内容拆分成这些命名参数,然后调用我的控制器。

所以,我不想用下面这种控制器方法:

create_user():

在这里,我需要使用全局的request()对象,并查看变量列表……我更希望能有下面这种方式:

create_user(first_name, last_name, email):

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

在Web2py中,这种方式已经可以实现吗?或者有没有相关的插件?还是说我需要自己添加这个功能?

3 个回答

1

在某些情况下,web2py的控制器可以使用参数。当一个控制器函数带有@service这个装饰器时,就可以根据服务类型使用参数,比如:

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

这种方法适用于当一个控制器函数实际上是一个API,而不是用来生成网页视图的情况。你可以很方便地同时定义网页视图和API风格的函数,并让网页视图调用这些API函数,这样可以确保视图和控制器之间有很好的分离。

根据你选择如何在网页客户端/JavaScript、web2py视图和web2py控制器之间分配职责,使用真正的API控制器函数(带可选参数)可能更有意义,而不是在网页视图风格的控制器中构建参数拆解的逻辑。

2

我这样做了

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

但是要注意,first_name(名字)、last_name(姓氏)和email(邮箱)可能包含一些在路径信息中不被允许的字符(web2py在验证时比较严格,只允许使用[\w\-\.]这些字符)。

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认为有效的控制器函数至少要有一个参数。

撰写回答