如何将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>
控制器示例:
def index():
return dict()
def my_action():
#retrieve passed variable
#handle the variable
#...
redirect(URL('index'))
答案 0 :(得分:4)
您可以进行Ajax调用:
<script>
function myFunction();{
var value = calculateValue();
ajax('{{=URL('default', 'my_action')}}' + '?value=' + value, [], ':eval');
}
</script>
返回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代码计算的值。您最好的选择是专注于对输入数据进行服务器端验证,或将计算结果移至服务器(尽管可能是计算基于某些输入,这些输入最终必须来自浏览器,因此需要以某种方式进行验证)。