【问题标题】:How to use request.vars in web2py?如何在 web2py 中使用 request.vars?
【发布时间】:2015-01-15 23:48:38
【问题描述】:

我试图了解 request.vars 在 web2py 中的工作原理。我将不胜感激。

def one():
    x = 5
    return dict(x=x)

如果我想在另一个函数中获取变量 x 的值,我应该使用 request.vars 吗?我尝试过这种方式,但当然,它没有用:

def two():
    y = request.vars.x
    return locals() 

【问题讨论】:

  • 假设函数 onetwo 是控制器中的操作,那么它们是完全独立的(即,每个都将通过单独的 HTTP 请求调用)——所以你不会访问返回从一个到另一个的价值。如果你解释一下你真正想做的事情可能会有所帮助。
  • @Anthony 非常感谢!我想在函数二中使用 x 的值。(即,假设在函数一中,x = a + b,我可以在视图一 {{=x}} 中显示它。然后在函数二中我需要得到x 的值,我想将此值添加到 c,这将是函数二中定义的变量,所以这就是函数二的样子:d = c +(来自函数一的 x 的值,这就是我试图传递给函数二),然后我想在视图二中显示这个 {{=d}}
  • @Anthony 我知道我可以在函数二中再次定义 a、b 和 x,然后它会起作用,但我认为可能有一种方法可以做到这一点而不必再次定义相同的变量在功能二中。

标签: web2py


【解决方案1】:

由于您的问题不是 如何 这样做,而是关于了解什么 request.vars ,我将添加以下内容: (来自:http://web2py.com/books/default/chapter/29/04/the-core#Dispatching)- 大约 50 行以下...

web2py 映射表单的 GET/POST 请求:

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

函数 f in 应用程序a中的控制器“c.py”,它存储URL参数 在请求变量中如下:

request.args = ['x', 'y', 'z'] 和:

request.vars = {'p':1, 'q':2} 和:

request.application = 'a' request.controller = 'c' request.function = 'f' 在上面的例子中,

所以,为了回答您的问题,request.vars 的内容只是用于调用控制器函数的 URL 中查询参数的内容

【讨论】:

  • 更准确地说,URL查询字符串中的变量在request.get_vars中。通过 POST 请求提交的变量位于 request.post_vars 中。而request.vars 存储request.get_varsrequest.post_vars(如果相同的变量名出现在两者中,则其值将存储在request.vars 的列表中)。
  • 感谢@Anthony 的澄清
  • 更准确地说,如果输入包含重复的字段,例如http://localhost:8000/a/c/f?favorite_color=red&favorite_color=yellow,则request.get_vars['favorite_color'] 将已经是一个列表。同样适用于post_vars
【解决方案2】:

request.vars 包含在 HTTP 请求(通常是从提交表单派生的 GET 或 POST 请求)正文中传递的参数。

在您的示例中,一旦定义了 x,您就可以在将 x 传递给名为 value 的变量时从一重定向到二:

redirect(URL('two', vars=dict(value=x)))

然后你可以通过request.vars['value']访问x的值。

这里的文档中有一些额外的细节:http://web2py.com/books/default/chapter/29/04/the-core#request

【讨论】:

  • 虽然您的回答有效,但我仍有问题。我可以将 x 的值传递给函数二,但如果我尝试使用该值和函数二中的另一个变量进行计算,如下所示:z = request.vars['value'] y = 5, and r = z + y,我收到此错误消息:TypeError: unsupported operand type(s) for +: 'int' and 'str' 你能帮我解决这个问题,或者我应该为此发布一个新问题吗?
  • z= int(request.vars ['value']) ?
  • @datasci谢谢datasci,这行得通!非常感谢!
  • 虽然one 操作确实可以重定向到two 并在查询字符串中传递一个值,但尚不清楚为什么要这样做。如果one 所做的所有操作都重定向到two 操作(即one 实际上从不返回任何内容),那么单独的操作就没有意义了。你不妨让它成为一个单一的动作。如果您需要操作 one 来返回 HTML 页面,然后在后续步骤中访问操作 two 页面,您应该使用 session 或嵌入在页面 one 中的链接,如 here 所述.
【解决方案3】:

根据您描述的工作流程,使用session 存储x 的值可能最有意义。

在控制器中:

def one():
    session.x = 5
    return dict()

def two():
    y = session.x
    return locals() 

在 one.html 视图中(以及在任何其他操作的视图中,包括two):

{{=session.x}}

使用会话存储在不同的 HTTP 请求期间需要由不同控制器操作访问的值。 request.vars 只是在单个 HTTP 请求期间捕获 URL 查询字符串或 POST 请求正文中传递的值。

如果用户从操作one 到操作two 的方式是单击one 页面上的链接,则另一种选择是将x 的值包含在链接URL 的查询字符串中.

在控制器中:

def one():
    x = 5
    return dict(x=x)

在 one.html 视图中:

{{=x}}
<a href="{{=URL('two', vars=dict(x=x))}}">Go to two</a>

然后当用户单击该链接时,在two 函数中,x 的值将在request.vars.x 中可用(尽管如果通过其他方式访问two 页面,request.vars.x 将为空)。请注意,这种方法不太安全,因为有人可以请求two URL 并在查询字符串中传递x 的任意值。通过使用会话,您可以确保x 的值不能被更改。

【讨论】:

  • 非常感谢。你是对的,从某种意义上说使用会话更好,会话页面two可以直接访问,否则只能从页面one中的链接访问,正如你所说,x的值如果我使用会话,则无法更改。因此,这绝对是更好的方法。非常感谢您的帮助。我已经将另一个答案标记为最佳答案,它实际上回答了我最初的问题,但您的回答更进一步,为我的问题提供了更好的解决方案。所以我不知道该怎么办,我应该改变正确的答案标记?
  • 你好 Anthony 我试图将我的应用程序中的代码更改为会话解决方案,但 x 是一个浮点数,无论出于何种原因,它似乎存在一个问题:不支持的操作数类型 - : 'int' 和 'NoneType'
  • 看来浮动不是问题。在我的应用程序session.x = a + b 中的操作one 中,a 和b 是来自操作one 的变量,它们都是浮动的。在行动two 我这样做float(session.x) 这在我传递变量时有效,但在我尝试会话时似乎不起作用,我收到此错误:float() 参数必须是字符串或数字
  • 类似session.x 的声音可能尚未定义,在这种情况下,session.x 将返回None。不看代码很难说。
  • 如果session.x 定义为int 或float,一切正常,但如果session.x= 定义为存储int 或float 的变量,则不起作用。例如:在行动one h、g 和 t 是存储 int 或 float 的变量。 h 是这样定义的错误:float() 参数必须是字符串或数字
猜你喜欢
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 2012-07-04
  • 2011-07-17
  • 1970-01-01
  • 1970-01-01
  • 2018-11-15
  • 2013-03-08
相关资源
最近更新 更多