Javascript Web2py:将变量从视图传递到控制器

Javascript Web2py:将变量从视图传递到控制器,javascript,python,web2py,Javascript,Python,Web2py,如何将JavaScript变量从视图传递到控制器中的Python?我不想使用request.vars或request.args,因为这将允许用户通过在地址栏中键入操作来为操作提供任意参数 示例视图: <button onclick='myFunction();'>Execute</button> <script> function myFunction();{ var value = calculateValue();

如何将JavaScript变量从视图传递到控制器中的Python?我不想使用
request.vars
request.args
,因为这将允许用户通过在地址栏中键入操作来为操作提供任意参数

示例视图:

<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>
但是,请注意,即使使用此方法,仍有人可以手动请求
/default/my_action?value=some_value
,以向函数发送任意数据(当然,要做到这一点,他们必须具备更高的技术水平,因为上面的URL永远不会出现在浏览器地址栏中供他们观察——他们必须检查您的代码或观察网络流量,以确定提出什么请求)


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

您可以进行Ajax调用:

<script>
    function myFunction();{
        var value = calculateValue();
        ajax('{{=URL('default', 'my_action')}}' + '?value=' + value, [], ':eval');
    }
</script>
但是,请注意,即使使用此方法,仍有人可以手动请求
/default/my_action?value=some_value
,以向函数发送任意数据(当然,要做到这一点,他们必须具备更高的技术水平,因为上面的URL永远不会出现在浏览器地址栏中供他们观察——他们必须检查您的代码或观察网络流量,以确定提出什么请求)


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

查看
args
vars
。它们用于将变量和参数从URL传递到控制器。是的,但正如我所说,它允许用户在地址栏中键入类似的内容:
../default/my_action/50
为my_action提供50的参数。另一种方法是通过aj创建会话ax调用然后重定向到您的
my_action
页面,该页面读取该会话。查看
args
vars
。它们用于将变量和参数从URL传递到控制器。是的,但正如我所说,它允许用户在地址栏中键入类似的内容:
../default/my_action/50
,以提供my_actionn参数为50。另一种方法是通过ajax调用创建会话,然后重定向到读取该会话的
my_action
页面。这做什么?
client_side=True
正常情况下,当
重定向()
函数被调用时,它会向浏览器发送一个303响应,指示它获取一个新的URL。但是,如果您希望在浏览器中替换父页面,对Ajax请求的303响应将不会有帮助,因为它只会导致另一个对新URL的Ajax请求。如果
client_side=True
,则将使用
重定向
ad将一个特殊的响应头发送回浏览器,Javascript将检测该头并强制在窗口/选项卡中加载新URL。因此,重定向是在客户端(通过Javascript)而不是服务器端(通过303响应)进行的。当我运行代码时…我得到一个404未找到…我在控制器中添加了一个函数名“my_action”的定义,该定义不返回任何内容…有任何建议吗?没有看到代码就没有建议。您可能需要创建一个新的问题,并提供更多详细信息。@Anthony ajax请求不应该是
ajax({{=URL)吗('default','my_action')}'+'?value='+value,[],':eval');
这是做什么的?
客户端=True
正常情况下,当
重定向()
函数被调用时,它会向浏览器发送一个303响应,指示它获取一个新的URL。但是,如果您希望在浏览器中替换父页面,对Ajax请求的303响应将不会有帮助,因为它只会导致另一个对新URL的Ajax请求。如果
client_side=True
,则将使用
重定向
ad将一个特殊的响应头发送回浏览器,Javascript将检测该头并强制在窗口/选项卡中加载新URL。因此,重定向是在客户端(通过Javascript)而不是服务器端(通过303响应)进行的。当我运行代码时…我得到一个404未找到…我在控制器中添加了一个函数名“my_action”的定义,该定义不返回任何内容…有任何建议吗?没有看到代码就没有建议。您可能需要创建一个新的问题,并提供更多详细信息。@Anthony ajax请求不应该是
ajax({{=URL)吗('default','my_action')}'+'?value='+value,[],':eval');
def my_action():
    value = request.vars.value
    # handle the variable 
    redirect(URL('index'), client_side=True)