angularJS与web2py:从ng/javascript/html调用python

1 投票
2 回答
2518 浏览
提问于 2025-04-18 06:36

我正在开发一个应用,使用的是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

好的,让我理清一下你的意思。你是说:

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 头,这样即使来自不同域名的信息也能提交。

0

经过几个小时的挣扎和无数次的谷歌搜索,我找到了一种解决办法:

主要问题是:数据存储在AngularJS中,但由于跨域问题,AngularJS无法通过API将数据提交到数据库。不过,Web2py可以通过sqlform将数据提交到数据库。

我的做法是:

  1. 当用户点击提交按钮时,调用'ng-click="submitBtn()"'。这个submitBtn()是ng-controller中的一个函数,它可以访问数据。
  2. 在submitBtn()中,函数首先通过
  3. document.getElementById('inputId').value=$scope.data;
    
  4. 将数据写入Web2py的sqlform,然后通过
  5. document.getElementById('submitBtn').click();
    
  6. 点击sqlform的提交按钮。

我花了很多时间才搞清楚Web2py自动生成的sqlform中各个字段的元素ID。找到这些ID的方法是使用浏览器的开发者工具,直接查看源代码。

希望这能帮助到遇到同样问题的人!

撰写回答