2015-08-20 122 views
1

如何将JavaScript视图中的变量传递给控制器​​中的Python?我不想使用request.varsrequest.args,因为这将允许用户通过在地址栏中输入任意参数来为动作提供参数。Web2py:将视图中的变量传递给控制器​​

实施例视图:

<button onclick='myFunction();'>Execute</button> 
<script> 
    function myFunction();{ 
     var value = calculateValue(); 
     //pass value to my_action 
     window.location = 'my_action'; 
    } 
</script> 

实施例的控制器:一旦Ajax响应是

<script> 
    function myFunction();{ 
     var value = calculateValue(); 
     ajax('{{=URL('default', 'my_action')}}' + '?value=' + value, [], ':eval'); 
    } 
</script> 

随之而来的是客户端重定向:

def index(): 
    return dict() 

def my_action(): 
    #retrieve passed variable 
    #handle the variable 
    #... 
    redirect(URL('index')) 
+0

看着'args'和'vars'。它们用于将变量和参数从URL传递给控制器​​。 –

+0

是的,但正如我所说的,它允许用户在地址栏输入如下内容:'.../default/my_action/50'给my_action一个参数50. – DiMarzio

+0

另一种方法是通过ajax调用创建会话,然后重定向到读取该会话的'my_action'页面。 –

回答

3

你可以使调用Ajax返回:

def my_action(): 
    value = request.vars.value 
    # handle the variable 
    redirect(URL('index'), client_side=True) 

但是,请注意,即使使用这种方法,仍然有人可以手动请求/default/my_action?value=some_value向您的函数发送任意数据(当然,他们必须在技术上有点精通,上面的URL将永远不会出现在浏览器地址栏中供他们观察 - 他们将不得不检查您的代码或观察网络流量以确定要做出什么请求)。

一般来说,如果您在浏览器中计算一个值,然后通过HTTP请求将其提交给服务器,则无法防止知识渊博的攻击者提交一些任意数据,而不是通过您的Javascript计算的值码。最好的办法是专注于对输入数据进行一些服务器端验证,或将计算移动到服务器(尽管可能计算是基于某些最终必须来自浏览器的输入并因此以某种方式进行验证)。

+0

这是做什么用的? 'client_side = True' – DiMarzio

+0

通常,当调用'redirect()'函数时,它会向浏览器发送一个303响应,指示它获取一个新的URL。但是,如果您希望在浏览器中替换父页面,则对Ajax请求的303响应将无济于事,因为它只会导致对新URL发出另一个Ajax请求。使用'client_side = True','redirect'会将一个特殊的响应头发送回浏览器,在这个浏览器中Javascript会检测标题并强制一个新的URL加载到窗口/标签中。所以,重定向发生在客户端(通过Javascript)而不是服务器端(通过303响应)。 – Anthony

+0

当我运行我的代码时......我得到一个404未找到......我在控制器中添加了函数名称“my_action”的定义,它不返回任何内容......任何建议? – fifamaniac04

相关问题