繁体   English   中英

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

[英]What am I doing wrong with bottlepy + AngularJS + HTTP POST request

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

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

XMLHttpRequest无法加载http:// localhost:8080 / category / new 所请求的资源上没有“ Access-Control-Allow-Origin”标头。 因此,不允许访问源' 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

嗯,问题似乎是即使是有钩子的瓶装HTTPResponse也不会发送标头。

因此,我创建了变通办法以继续工作。 希望有更好的方法。

因此,我基本上创建了2种新方法:

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。 例如

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM