angularJS与web2py:从ng/javascript/html调用python
我正在开发一个应用,使用的是AngularJS(主要在客户端)和web2py(主要在服务器端)。
现在我遇到了一个问题。
在程序的某个环节,我用AngularJS从客户端获取了一些数据,并把这些数据存储在一个AngularJS变量里。我原本打算直接用$http.post把这些数据提交到数据库,但因为跨域问题,这个方法没成功。
现在我想把这些数据(它们是JSON格式)传回web2py,让web2py把这些数据插入到数据库里。(这和提交一个SQLFORM类似)。
有没有办法把这些数据作为参数传给web2py的一个函数,并在JavaScript代码中调用这个函数呢?
我想到的可能方法是:
1) 由于我可以在HTML中用{{}}写Python代码,也可以在JavaScript中写HTML,那么我能不能在JavaScript中用类似 document.write({{python code}})
的方式写Python代码呢?
我试过这个,但无论我写什么HTML,它都会跳转到一个全新的HTML页面。我也试过 document.getElementById('testDiv').write("<p></p>");
,但也不行。
2) 使用ajax,我对ajax不太熟悉,任何示例都会非常感谢!
大家有什么想法吗?
谢谢大家!
2 个回答
好的,让我理清一下你的意思。你是说:
1- 前端用的是 Angular。
2- 后端用的是 Python。
3- 你在 Python 中生成一个 HTML 文档,然后把它发送到浏览器。4- 由于 Python 的模板语言使用 {{}} 作为分隔符,我猜你也把 Angular 的分隔符改了。
不管是用 AJAX 还是刷新页面,你都需要提供一个 Python 的 POST 处理脚本。这个脚本会接收你的数据并更新数据库。如果你打算经常进行 AJAX 的增删改查操作,建议使用 Angular 的 ngResource。如果不想用那么复杂的,可以直接用
$http.post(url,data).success(function(response){})
https://docs.angularjs.org/api/ng/service/$http#post
这里的 URL 就是你表单提交的处理地址。如果你使用表单的话,需要把目标设置为页面中一个隐藏的 iframe,响应内容应该是一个脚本标签,能够获取到与你的控制器相关的作用域,并告诉它操作的结果。这是一种老办法,但在向不支持 CORS 的网站发送信息时很有用。顺便说一下,解决你问题的办法可能就是在直接存储数据到数据库时,只需在你的存储引擎 API 中启用 CORS 头,这样即使来自不同域名的信息也能提交。
经过几个小时的挣扎和无数次的谷歌搜索,我找到了一种解决办法:
主要问题是:数据存储在AngularJS中,但由于跨域问题,AngularJS无法通过API将数据提交到数据库。不过,Web2py可以通过sqlform将数据提交到数据库。
我的做法是:
- 当用户点击提交按钮时,调用'ng-click="submitBtn()"'。这个submitBtn()是ng-controller中的一个函数,它可以访问数据。
- 在submitBtn()中,函数首先通过
- 将数据写入Web2py的sqlform,然后通过
- 点击sqlform的提交按钮。
document.getElementById('inputId').value=$scope.data;
document.getElementById('submitBtn').click();
我花了很多时间才搞清楚Web2py自动生成的sqlform中各个字段的元素ID。找到这些ID的方法是使用浏览器的开发者工具,直接查看源代码。
希望这能帮助到遇到同样问题的人!