PUT请求不使用web2py?

时间:2013-09-19 03:56:49

标签: python web2py

我们在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

2 个答案:

答案 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)