POST json数据到Bottle

时间:2014-12-08 06:24:39

标签: javascript python ajax json bottle

我是Bottle的新手,也是Python的新手,我正在尝试创建一个应用程序,每当我点击一个按钮,一个AJAX被激活并将一个json POST到服务器并使用SQLite存储它。

但是,在目前阶段,我正在试图弄清楚如何在服务器中成功接收数据。

在客户端, 我有以下用JavaScript编写的send_data函数。

function send_data(feedback) {
    $.ajax({
        url: "/feedback",
        type: "POST",
        data: JSON.stringify(feedback),
        contentType: "application/json",
        success: function() {
            alert("Feedback successfully stored in the server!");
        },
        error: function() {
            alert("Feedback failed to store back in the server!");
        },          

}

传入的参数feedback看起来像{"id1": 1, "id2": 2}

在服务器端,我有一个feedback.py文件,代码是

from bottle import request, route, run
@route('/feedback', method='POST')

def feedback():
    comments = request.json
    print comments

run(host='localhost', port=8080)

现在,我只是想检查一下我是否收到了数据成功。但每次,当我点击该按钮时,我收到以下错误

Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at http://localhost:8080/feedback. This can be fixed by moving the resource to the same domain or enabling CORS.

OPTIONS http://localhost:8080/feedback [HTTP/1.0 405 Method Not Allowed 2ms]

我不确定是不是因为我没有使用元素<form>。那个按钮在技术上只是一个图像。每次单击该图像时,都会触发send_data()函数。

任何人都可以提供帮助?对此,我真的非常感激。谢谢!

2 个答案:

答案 0 :(得分:0)

您可以通过禁用跨域限制来完成此工作。

在safari中,打开“开发”面板,然后选中“禁用跨域限制”,或使用类似Firefox的浏览器。

答案 1 :(得分:0)

跨源请求受到浏览器的限制,作为一种安全措施。通过设置Access-Control-Allow-Origin标头可以克服这一问题。您可以在服务器代码(Python / bottle)上使用bottle-cors或创建如下装饰器:

def enable_cors(fn):
  def _enable_cors(*args, **kwargs):
      response.headers['Access-Control-Allow-Origin'] = '*'
      response.headers['Access-Control-Allow-Methods'] = 'GET, POST, PUT, OPTIONS'
      response.headers['Access-Control-Allow-Headers'] = 'Origin, Accept, Content-Type, X-Requested-With, X-CSRF-Token'

      if request.method != 'OPTIONS':
          # actual request; reply with the actual response
          return fn(*args, **kwargs)

  return _enable_cors

,然后给出您的示例:

from bottle import request, route, run
@enable_cors
@route('/feedback', method='POST')

def feedback():
    comments = request.json
    print comments

run(host='localhost', port=8080)

请注意,最好允许使用特定来源,而不要使用*

您可以了解有关跨域资源共享(CORS)here

的更多信息