我们在web2py上的restfull web服务中遇到了跨源资源共享(CORS)实现的一些问题。
我们尝试在web2py的服务器端实现CORS,如下所示:(https://groups.google.com/forum/#!msg/web2py/kSUtyNcUQGI/qfiIqfUiWLwJ)
我们将以下内容添加到models / 0.py中,(在控制器中实际的restfull api处理程序之前更新响应头)
===============================
if request.env.http_origin:
response.headers['Access-Control-Allow-Origin'] = request.env.http_origin
response.headers['Access-Control-Allow-Origin'] = "*"
response.headers['Access-Control-Allow-Credentials'] = 'true'
response.headers['Access-Control-Max-Age'] = 86400
if request.env.request_method == 'OPTIONS':
if request.env.http_access_control_request_method:
print request.env.http_access_control_request_method
response.headers['Access-Control-Allow-Methods'] = request.env.http_access_control_request_method
if request.env.http_access_control_request_headers:
response.headers['Access-Control-Allow-Headers'] = request.env.http_access_control_request_headers
==========================
RESTful POST& GET现在正在运作 但PUT和DELETE不是因为预检http OPTIONS请求被web2py拒绝为“400 BAD REQUEST”
例如,当使用来自本地网页的ajax调用调用restful webservice时, 我们在NetBeans日志中收到以下错误消息。
无法加载资源:服务器响应状态为400 (BAD REQUEST)(10:46:36:182 |错误,网络)at 127.0.0.1:8000/test/default/api/entries/2.json无法加载资源:来源localhost:8383不被允许 访问控制允许来源。 (10:46:36:183 |错误,网络)at 127.0.0.1:8000/test/default /api/entries/2.json XMLHttpRequest无法加载127.0.0.1:8000/test/default /api/entries/2.json。起源 Access-Control-Allow-Origin不允许localhost:8383。 (10:46:36:183 |错误,javascript)在www / page / test.html
答案 0 :(得分:0)
您可以添加以下行:
response [“Access-Control-Allow-Methods”] =“POST,GET,OPTIONS”
答案 1 :(得分:0)
这是一个非常古老的问题,但我设法解决了完全相同的问题。就我而言,问题出在控制器上;我必须在任何操作之前添加以下包装器:
def CORS(f):
"""
Enables CORS for any action
"""
def wrapper(*args, **kwds):
if request.env.http_origin and request.env.request_method == 'OPTIONS':
response.view = 'generic.json'
return dict()
return f(*args, **kwds)
return wrapper
然后在你的控制器中写一下
@CORS
def whatever():
do_stuff
return dict(stuff)