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

DiM*_*zio 1 javascript python web2py

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

示例视图:

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

控制器示例:

def index():
    return dict()

def my_action():
    #retrieve passed variable
    #handle the variable 
    #...
    redirect(URL('index'))
Run Code Online (Sandbox Code Playgroud)

Ant*_*ony 5

您可以拨打Ajax电话:

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

一旦返回Ajax响应,随后进行客户端重定向:

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

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

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