CORS应用程序内引擎应用程序(python)

CORS应用程序内引擎应用程序(python),python,ajax,google-app-engine,cross-domain,cors,Python,Ajax,Google App Engine,Cross Domain,Cors,我正在尝试在app engine中的两个应用程序之间执行x域请求。一方面,我有我的API,另一方面,我有我的“客户端应用程序”。我读了很多关于CORS的书;我想我知道它是如何工作的,问题来了:它不工作。简单请求有效,但当我尝试执行非简单请求(使用凭据)时,问题就出现了。我有以下代码来处理标题并允许CORS: try: _origin = self.request.headers['Origin'] except: _origin = "http://myapp" self.res

我正在尝试在app engine中的两个应用程序之间执行x域请求。一方面,我有我的API,另一方面,我有我的“客户端应用程序”。我读了很多关于CORS的书;我想我知道它是如何工作的,问题来了:它不工作。简单请求有效,但当我尝试执行非简单请求(使用凭据)时,问题就出现了。我有以下代码来处理标题并允许CORS:

try:
    _origin = self.request.headers['Origin']
except:
    _origin = "http://myapp"
self.response.headers.add_header("Access-Control-Allow-Origin", _origin)
self.response.headers.add_header("Access-Control-Allow-Methods", "GET, POST, OPTIONS")
self.response.headers.add_header("Access-Control-Allow-Credentials", "true")
self.response.headers.add_header("Access-Control-Allow-Headers", "origin, x-requested-with, content-type, accept")
self.response.headers.add_header('Content-Type', 'application/json')
self.response.out.write( json.dumps( _response ) )
编辑:我正在同一个域下处理两个应用程序(http://app1.domain.com 及)

由于我不能使用通配符进行凭证传输请求,因此我检测到源代码,并在该域的每个请求中设置允许源代码。在我的客户端应用程序中,我有以下代码来发出http请求:

jQuery.extend( {
postJSON: function ( _url, _data, _callback) {
    $.ajax({
        cache: false,
        crossDomain: true,
        url: _url,
        data: _data,
        type: 'POST',
        dataType: 'json',
        xhrFields: {
           withCredentials: true
        },
        headers : {
            "x-requested-with" : "XMLHttpRequest"
        },
        success: _callback,
        error: function() {
            _msg = "<strong>Error: </strong> Error en la petición HTTP (nivel de protocolo).";
            _error( _msg );
        }
    });
}
这是选项请求和响应:

Request URL:http://myapi/method
Request Method:OPTIONS
Status Code:200 OK

Request Headers
Accept:*/*
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.3
Accept-Encoding:gzip,deflate,sdch
Accept-Language:es-ES,es;q=0.8
Access-Control-Request-Headers:origin, x-requested-with, content-type, accept
Access-Control-Request-Method:POST
Connection:keep-alive
Host:myapi
Origin:http://myapp
Referer:http://myapp/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11

Response Headersview source
Access-Control-Allow-Credentials:true
Access-Control-Allow-Headers:origin, x-requested-with, content-type, accept
Access-Control-Allow-Methods:GET, POST, OPTIONS
Access-Control-Allow-Origin:http://myapp
Cache-Control:no-cache
Content-Encoding:gzip
Content-Length:114
Content-Type:application/json
Content-Type:text/html; charset=utf-8
Date:Fri, 16 Nov 2012 11:31:40 GMT
Server:Google Frontend
Vary:Accept-Encoding
这是HTTP POST请求:

    Accept:application/json, text/javascript, */*; q=0.01
Content-Type:application/json; charset=UTF-8
Origin:http://myapp
Referer:http://myapp
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_8_2) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11
x-requested-with:XMLHttpRequest
但当浏览器尝试执行POST请求时,失败:

XMLHttpRequest cannot load http://myapi/method/. Origin http://myapp is not allowed by Access-Control-Allow-Origin.
有什么想法吗?我被这个问题弄疯了。。。在选项http请求中我必须做什么?也许我处理得不对…:-/


提前感谢。

我刚刚在谷歌API上遇到了同样的错误。由于只有3或4天,所有对Google API的CORS请求如果包含x-request-with:XMLHttpRequest头,就会失败,从而导致“访问控制允许源不允许源[…]的错误。它一直工作到最后几天

应用程序引擎CORS请求可能也有相同的问题。尝试删除以下行:

headers : {
        "x-requested-with" : "XMLHttpRequest"
    },

我找到了解决办法!!它是如此简单;我觉得有点傻。。。如果您查看代码,您将在一些方法处理程序之前看到一些装饰程序。这就是问题所在:有时我会通过装饰器将内容发送到浏览器。并且此内容没有Allow Control-*标题。这就是为什么它有时失败,有时不失败的原因(当装饰者回答时失败)


我已经在所有发送内容的装饰器中配置了标题,它工作得很好:-)。谢谢大家的帮助,真的

您是否在请求处理程序上定义了get、post和options方法?您可以将请求处理程序代码添加到您的问题中吗?是的@AaronHampton,这里有处理程序的代码;-)谢谢您是否能够提供POST请求的响应?是否确实在选项和POST请求上都设置了Access Control Allow-*标头?何时设置标头?在“共同点”中?如果是的话,你能提供“common.\u responseJSON”的代码吗?有两件事:(1)sub与否,没关系。它们是不同的领域。就这样。(2) 您可以删除“origin,content-type,accept”-它们是简单的标题,总是允许/存在的,特别是CORS的“origin”。(3) 将访问控制允许原点设置为“h”ttp://myapp.appspot.com“目前,我们还没有一个简化的条件,看看是否可行。(4) 还有“访问控制最大年龄”来缓存飞行前请求。另外,你确定协议匹配吗?e、 你总是使用http或https。谢谢你提供的信息!!这不是问题,因为我已经分析了飞行前的请求,服务器说“好的,你可以做请求”。我的意思是,我发送,我希望收到这个字段。不管怎样,我已经试过了,但还是不起作用。。。我快疯了!我读了几遍才意识到我犯了同样的错误!谢谢
headers : {
        "x-requested-with" : "XMLHttpRequest"
    },