我对瓶装+ AngularJS + HTTP POST请求做错了什么

时间:2015-08-03 10:46:16

标签: python angularjs cors bottle

我尝试使用Bottlepy创建简单的Restful API并使用AngularJS创建客户端。

我的问题是,当我从Angular客户端发送表单时,帖子将会变为低谷,一切都已完成,但结果仍然落在js方面的.error(数据)函数中,因为:

  

XMLHttpRequest无法加载http://localhost:8080/category/new。没有   '访问控制允许来源'标题出现在请求的上   资源。起源' http://localhost:8081'因此是不允许的   访问。

这是我的python API代码:

@route('/category/new', method=['OPTIONS', 'POST'])
def new_category():
    print request.forms.keys()
    if "name" in request.forms:
        name = request.forms.get('name')
        _name = db.query(Category).filter_by(name=name).first()
        if _name:
            return HTTPResponse(status=409)
        c = Category(name)
        print name
        if not c.validate():
            try:
                db.add(c)
                db.commit()
                return HTTPResponse(status=200)
            except Exception as err:
                traceback.print_exc()
                return HTTPResponse(status=500)
        return HTTPResponse(status=406)
    return HTTPResponse(status=400)

我也启用了这样的CORS:

@hook('after_request')
def enable_cors():
    print "Tried to enable cors"
    response.headers['Access-Control-Allow-Origin'] = '*'
    response.headers['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT'
    response.headers['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'

这是我的angularjs服务:

function addCategory(categoryName){
        var payload = $.param({name: categoryName});
        return $http({
                    method: 'POST',
                    url: apiBaseUrl+'category/new',
                    data: payload,
                    headers: { 'Content-Type': 'application/x-www-form-urlencoded' }
        })
        .success(function(data){
            return data;
        })
        .error(function(data){
            alert("Something went wrong");
            return data;
        });
   }

我知道为什么会出现Access-ControlAllow-Origin错误?

在API日志中,一切似乎都很顺利:

['name']
fourth
Tried to enable cors
10.0.2.2 - - [03/Aug/2015 10:44:02] "POST /category/new HTTP/1.1" 200 0

1 个答案:

答案 0 :(得分:0)

啊,问题似乎是即使使用钩子,bothpy HTTPResponse也不会发送标题。

所以我创建了解决方法来继续我的工作。希望有更好的方法。

所以我基本上创建了两种新方法:

def set_cors(response):
    response['Access-Control-Allow-Origin'] = '*'
    response['Access-Control-Allow-Methods'] = 'POST, GET, OPTIONS, PUT'
    response['Access-Control-Allow-Headers'] = 'Origin, X-Requested-With, Content-Type, Accept'

def setHTTPResponse(status, body=None):
    response = None
    if body != None:
        response = HTTPResponse(status=status, body=body)
    else:
        response = HTTPResponse(status=status)
    set_cors(response)
    return response

然后替换每个返回HTTPResponse以返回setHTTPResponse。 e.g。

- return HTTPResponse(status=200)
+ return setHTTPResponse(status=200)