我尝试使用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
答案 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)