Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google app engine AppEngine dev_appserver-urllib2.urlopen问题与本地主机url 更新_Google App Engine_Urllib2_Google App Engine Python - Fatal编程技术网

Google app engine AppEngine dev_appserver-urllib2.urlopen问题与本地主机url 更新

Google app engine AppEngine dev_appserver-urllib2.urlopen问题与本地主机url 更新,google-app-engine,urllib2,google-app-engine-python,Google App Engine,Urllib2,Google App Engine Python,是在2015年7月20日发布的,所以如果您仍然遇到这种情况,您应该能够通过更新来修复它。有关确切问题和解决方案的解释,请参见下面的+jpatokal答案 原始问题 我有一个正在使用的应用程序,在本地开发时遇到了麻烦 我们有一些共享代码,可以使用urllib2.urlopen检查验证服务器上的应用程序。当我在本地开发时,我的应用程序上的404会被拒绝,它会从AppEngine发出请求,但请求在终端上成功了 我在端口localhost:8000上运行appengine,在localhost:8001

是在2015年7月20日发布的,所以如果您仍然遇到这种情况,您应该能够通过更新来修复它。有关确切问题和解决方案的解释,请参见下面的+jpatokal答案

原始问题 我有一个正在使用的应用程序,在本地开发时遇到了麻烦

我们有一些共享代码,可以使用
urllib2.urlopen
检查验证服务器上的应用程序。当我在本地开发时,我的应用程序上的404会被拒绝,它会从AppEngine发出请求,但请求在终端上成功了

我在端口
localhost:8000上运行appengine,在
localhost:8001上运行auth服务器

import urllib2

url = "http://localhost:8001/api/CheckAuthentication/?__client_id=dev&token=c7jl2y3smhzzqabhxnzrlyq5r5sdyjr8&username=amadison&__signature=6IXnj08bAnKoIBvJQUuBG8O1kBuBCWS8655s3DpBQIE="

try:
  r = urllib2.urlopen(url)
  print(r.geturl())
  print(r.read())
except urllib2.HTTPError as e:
  print("got error: {} - {}".format(e.code, e.reason))
这导致AppEngine中出现
get错误:404-未找到

似乎AppEngine正在将架构、主机和端口添加到我试图点击的url的路径部分,因为我在auth服务器上看到的是:

[02/Jul/2015 16:54:16] "GET http://localhost:8001/api/CheckAuthentication/?__client_id=dev&token=c7jl2y3smhzzqabhxnzrlyq5r5sdyjr8&username=amadison&__signature=6IXnj08bAnKoIBvJQUuBG8O1kBuBCWS8655s3DpBQIE= HTTP/1.1" 404 10146
从请求头中,我们可以看到整个方案以及主机和端口作为路径的一部分传递(下面的头部分):

有没有办法不让AppEngine开发服务器在其他端口上劫持对本地主机的请求?还是我没有误解正在发生的事情?在我们的领域不同的生产环境中,一切都很好


提前感谢您的帮助,为我指明了正确的方向。

这是
urlfetch\u stub
实现带来的一个恼人的问题。我不确定是什么gcloudsdk版本引入了它

我已经通过修补gcloudsdk解决了这个问题——直到谷歌这么做。 这意味着这个答案很快就不重要了

  • 查找并打开
    urlfetch\u stub.py
    ,通常可以在
    ~/google cloud sdk/platform/google\u appengine/google/appengine/api/urlfetch\u stub.py上找到

  • 在第380行(取决于版本)附近,查找:

  • full_path=urlparse.urlusplit((协议、主机、路径、查询“”)
    
    并将其替换为:

    full_path = urlparse.urlunsplit(('', '', path, query, ''))
    
    更多信息 您正确地假设问题是路径信息头损坏。连接完成后,将传递此处的
    完整路径

    免责声明 我可能很容易用这个补丁破坏代理请求。因为我希望谷歌能修复它,所以我不会对它太疯狂

    非常清楚地说,此漏洞仅与本地应用程序开发相关-您在生产中不会看到此问题。于2015年7月20日发布,因此如果您仍然遇到此问题,您应该可以通过更新来解决此问题

    下面是发生的事情的简要说明。在1.9.21之前,SDK一直使用相对路径格式化URL获取请求,如下所示:

    GET /test/ HTTP/1.1
    Host: 127.0.0.1:5000
    
    在1.9.22中,为了更好地支持代理,将其更改为绝对路径:

    GET http://127.0.0.1:5000/test/ HTTP/1.1
    Host: 127.0.0.1:5000
    
    根据HTTP/1.1规范,这两种格式都是完全合法的,请参阅。然而,尽管该规范可以追溯到1999年,但显然有相当多的HTTP请求处理程序没有正确解析绝对形式,而只是简单地将路径和主机连接在一起


    因此,为了兼容性,以前的行为已经恢复。(除非您使用的是代理,在这种情况下RFC需要绝对路径。)

    AppEngine在哪里加上“/”?我不确定,我可能会误解正在发生的事情。。。在AppEngine上使用urllib2.urlopen时,上述请求上的
    路径\u INFO
    包含“”。在标准pythonshell中使用urllib2的同一调用只会产生我所期望的
    /api/CheckAuthentication/
    PATH\u INFO
    。我将重新措辞这个问题,我也有同样的问题。似乎只发生在url包含端口的情况下谢谢Josh。。。你知道应用程序引擎团队是否已经提交了一个bug吗?如果没有,我可以继续归档one@Aaron我想卡尔抓到了,我把它贴在谷歌集团。报告两次也无妨?;)谢谢@josh。这是bug链接,希望其他人也能启动它。所以您知道,该错误被标记为WorksAsIntented。事实证明,这与许多服务器错误处理HTTP规范的方式有关。如果您使用UWSGI HTTP,将其放在像NGINX这样的真正HTTP服务器后面将解决问题。我在UWSGI中也有一个打开的bug,@KevinDolan Jani来自谷歌这里:问题#12123已经重新打开,我们计划返回到以前在SDK 1.9.24中使用相对路径的行为。完美,感谢您的解释!我已经更新了上面的问题,指向你的链接和这个答案。哎哟,Stackoverflow-从我身上减去15分,就在Feeeels;)
    GET http://127.0.0.1:5000/test/ HTTP/1.1
    Host: 127.0.0.1:5000