1

我们在 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 Web 服务时,我们在 NetBeans 日志中收到以下错误消息。

加载资源失败:服务器在 127.0.0.1:8000/test/default/api/entries/2.json 响应状态为 400 (BAD REQUEST) (10:46:36:182 | error, network) 失败加载资源:Access-Control-Allow-Origin 不允许 Origin localhost:8383。(10:46:36:183 | 错误,网络)在 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

4

2 回答 2

0

您可以添加以下行:

response["Access-Control-Allow-Methods"] = "POST, GET, OPTIONS"

于 2014-03-06T07:00:02.920 回答
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)
于 2015-04-15T16:02:15.603 回答