Web2py 控制器如何接收参数?
我正在用Web2py框架开发一个应用程序……我不想每次都使用请求对象来获取所有的查询字符串参数,而是希望能用命名参数来构建我的控制器,让路由器自动把查询字符串(或者表单数据)中的内容拆分成这些命名参数,然后调用我的控制器。
所以,我不想用下面这种控制器方法:
create_user():
在这里,我需要使用全局的request()对象,并查看变量列表……我更希望能有下面这种方式:
create_user(first_name, last_name, email):
就像我在其他MVC平台上看到的那样。
在Web2py中,这种方式已经可以实现吗?或者有没有相关的插件?还是说我需要自己添加这个功能?
3 个回答
在某些情况下,web2py的控制器可以使用参数。当一个控制器函数带有@service这个装饰器时,就可以根据服务类型使用参数,比如:
@service.jsonrpc
def somefunction(a=None, b='default'):
## whatever
这种方法适用于当一个控制器函数实际上是一个API,而不是用来生成网页视图的情况。你可以很方便地同时定义网页视图和API风格的函数,并让网页视图调用这些API函数,这样可以确保视图和控制器之间有很好的分离。
根据你选择如何在网页客户端/JavaScript、web2py视图和web2py控制器之间分配职责,使用真正的API控制器函数(带可选参数)可能更有意义,而不是在网页视图风格的控制器中构建参数拆解的逻辑。
我这样做了
def create_user():
try:
first_name, last_name, email = request.args[:3]
except:
redirect('some_error_page')
但是要注意,first_name(名字)、last_name(姓氏)和email(邮箱)可能包含一些在路径信息中不被允许的字符(web2py在验证时比较严格,只允许使用[\w\-\.]这些字符)。
不可以。正如在这本书中所说,像这样的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认为有效的控制器函数至少要有一个参数。