gpt4 book ai didi

python - App Engine 应用程序中的 CORS(python)

转载 作者:太空宇宙 更新时间:2023-11-03 11:08:21 26 4
gpt4 key购买 nike

我正在尝试在 App Engine 中的 2 个应用程序之间执行 x 域请求。一方面,我有我的 API,另一方面我有我的“客户端应用程序”。我已经阅读了很多关于 CORS 的文章;我想我知道它是如何工作的,问题来了:它不起作用。简单请求有效,但是当我尝试执行非简单请求(使用凭据)时出现问题。我有这段代码来处理 header 并允许 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://app2.domain.com)下使用这两个应用程序。

由于我无法将通配符用于带有凭据传输的请求,因此我检测了 Origin 并在该域的每个请求中设置了 Allow-Origin。在我的客户端应用程序中,我有以下代码来发出 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 );
}
});
}

});

为了处理请求,我有这些方法:

@decorators.notAllowed
def get(self):
pass

@decorators.isNotLogged
@decorators.language
def post(self):
common._responseJSON( self, CU._doLogin( self ) )

def options(self):
common._responseJSON( self, CU._doLogin( self ) )

这是 OPTIONS 请求和响应:

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.

有什么想法吗?我对这个问题感到疯狂......我必须在 OPTIONS http 请求中做什么?也许我没有以正确的方式处理它...... :-/

提前致谢。

最佳答案

我找到了解决方案!!很简单;我觉得有点愚蠢......如果你看代码,你会在一些方法处理程序之前看到一些装饰器。这就是问题所在:有时我通过装饰器将内容发送到浏览器。并且此内容没有 Allow-Control-* header 。这就是有时失败有时不失败的原因(装饰器回复时失败)

我已经在所有发送内容的装饰器中配置了 header 并且工作正常:-)。非常感谢大家的帮助!

关于python - App Engine 应用程序中的 CORS(python),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13415817/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com