[英]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.