`
elprup
  • 浏览: 116434 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

GAE使用urllib2.urlopen出现DownloadError的问题

    博客分类:
  • GAE
阅读更多
实验目的:
用flex在GAE上运行python代码
实验器材:
pyamf,FLEX3,Python25,IE,GAE SDK
实验准备:
GAE代码一份,flex代码一份
见下:
python部分
main.py
# -*- coding:utf-8 -*-   
import wsgiref.handlers  
import sys
import urllib2  
from google.appengine.ext import webapp  
from pyamf.remoting.gateway.google import WebAppGateway  
  
class MainPage(webapp.RequestHandler):  
    def get(self):  
        self.response.headers['Content-Type'] = 'text/plain'  
        self.response.out.write('Hello, webapp World!')  
  
def echo(data):
    p=urllib2.urlopen("http://www.sina.com.cn")
    return data
  
services = {  
    'myservice.echo': echo,  
}  
  
def main():  
    application_paths = [('/', WebAppGateway(services)), ('/helloworld', MainPage)]  
    application = webapp.WSGIApplication(application_paths, debug=True)  
    wsgiref.handlers.CGIHandler().run(application)  


flex部分
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init();">
<mx:Script> 
	<![CDATA[ 
	import flash.net.*;
	import mx.controls.Alert;
	
	public function init():void{
		var netConnection:NetConnection = new NetConnection();
		netConnection.connect("http://localhost:8080/");
		var responder:Responder = new Responder(onComplete, onFail);
		netConnection.call("myservice.echo", responder, "Flash talked to PyAMF.  They both say hello.");
	}

	function onComplete(results):void {
		//var my:String = String("我就是中文");
		//var aTemp:Array = results as Array;
		//Alert.show(aTemp.toString());
		trace(results.toString());
		
		//trace(sTemp);
		
		/*for each(var thisResult in results){
        	trace(thisResult.toString());
  		}*/
	}

	function onFail(results):void {
        for each (var thisResult in results){
        	trace( thisResult);
        }
	}
]]> 
</mx:Script>
</mx:Application>




实验步骤:
1.打开CMD,用dev_appserver开启GAE服务器
2.在Flex中运行debug命令

实验问题:
['Traceback (most recent call last):', '  File "c:\\gaedemos\\cake\\pyamf\\remoting\\amf0.py", line 106, in __call__    *args, **kwargs)',
'  File "c:\\gaedemos\\cake\\pyamf\\remoting\\amf0.py", line 59, in _getBody    **kwargs)', '
File "c:\\gaedemos\\cake\\pyamf\\remoting\\gateway\\__init__.py", line 494, in callServiceRequest    return service_request(*args)',
'  File "c:\\gaedemos\\cake\\pyamf\\remoting\\gateway\\__init__.py", line 224, in __call__    return self.service(self.method, args)',
'  File "c:\\gaedemos\\cake\\pyamf\\remoting\\gateway\\__init__.py", line 125, in __call__    return func(*params)', '
File "c:\\gaedemos\\cake\\main.py", line 18, in echo    w.login(url)',
'  File "c:\\gaedemos\\cake\\webspy\\webspy.py", line 42, in login    myHome = urllib2.urlopen(request)',
'  File "C:\\Python25\\lib\\urllib2.py", line 124, in urlopen    return _opener.open(url, data)', ' 
File "C:\\Python25\\lib\\urllib2.py", line 381, in open    response = self._open(req, data)', '
File "C:\\Python25\\lib\\urllib2.py", line 399, in _open    \'_open\', req)', '  File "C:\\Python25\\lib\\urllib2.py", line 360, in _call_chain    result = func(*args)', '
File "C:\\Python25\\lib\\urllib2.py", line 1107, in http_open    return self.do_open(httplib.HTTPConnection, req)',
'  File "C:\\Python25\\lib\\urllib2.py", line 1080, in do_open    r = h.getresponse()', '
File "C:\\Program Files\\Google\\google_appengine\\google\\appengine\\dist\\httplib.py", line 200, in getresponse    self._allow_truncated, self._follow_redirects)', '
File "C:\\Program Files\\Google\\google_appengine\\google\\appengine\\api\\urlfetch.py", line 241, in fetch    return rpc.get_result(allow_truncated)'
, '  File "C:\\Program Files\\Google\\google_appengine\\google\\appengine\\api\\urlfetch.py", line 388, in get_result    self.check_success(allow_truncated)',
'  File "C:\\Program Files\\Google\\google_appengine\\google\\appengine\\api\\urlfetch.py", line 356, in check_success    raise DownloadError(str(e))'
, "DownloadError: ApplicationError: 2 nonnumeric port: ''"]
DownloadError
ApplicationError: 2 nonnumeric port: ''


问题初步分析:
最后给出的结果是非数字端口,于是我想是不是没写端口号啊。加上:80后依旧。python代码在Eclipse+pydev的环境下跑的好好的,怎么到了gae就不行了呢?在网上查了好久,看到如下链接:http://groups.google.co.jp/group/google-appengine/browse_thread/thread/07f418a36888c937
其中提到
This is a known incompatibility in App Engine. The GData APIs send an
absolute URL to the httplib library where it expects a relative one
(since the host and port was specified in the constructor); the Python
httplib handles this properly, but the App Engine replacement
currently does not.
奇怪的是python和GAE不是都用的一样的内核吗?我把python25的httplib文件复制过来以后还是这个问题。


实验小结:
问题期待继续调查。
发现一个解决的方法参见
http://nodex.iteye.com/blog/360733
参考了CPYUG组织,发现这是GAE的一个限制socket的行为,所以不管怎么改都没有用。可以用urlfetch代替,不过还困惑于cookie的处理。
可以参考:
https://groups.google.com/group/python-cn/browse_thread/thread/4b94c4ae8eb8d41c/54f2628668af75a0?lnk=gst&q=urlfetch#54f2628668af75a0

以后要多关注关注CPyUG了,真的好强啊。
0
0
分享到:
评论

相关推荐

    freemarker-gae-pre2.jar包

    FreeMarker是专为实际的一代的 HTML 网页,特别是通过的servlet为基础的应用程序... 但是请注意,我们提供了型的解决方案中使用FreeMarker作为视图组成部分模型2框架(如Struts的) ,这也让你使用JSP的taglibs的模板。

    gae报错:javax.swing.tree.TreeNode is a restricted class的解决办法

    2. **使用Java Agent**:对于一些难以替换的库,可以尝试使用Java Agent工具(如ProGuard)来剥离或混淆不被GAE支持的类。这样,即使原始代码中包含`TreeNode`,GAE也无法识别出来,从而避免错误。 3. **本地开发...

    GAE基本建设教程.doc

    接下来,你需要使用GAE SDK中的`appcfg.py`工具将程序上传到GAE。在命令行中,导航到解压后的GD-cms目录,然后运行以下命令: ``` python appengine_sdk/google_appengine/appcfg.py upload . ``` 根据提示完成...

    IOS应用源码——nevyn-overload-0.3-0-gae3b7f5.zip

    【标题】"IOS应用源码——nevyn-overload-0.3-0-gae3b7f5.zip" 提供的是一份iOS应用的源代码,版本号为0.3,标识符为gae3b7f5。这个压缩包很可能包含了一个完整的iOS项目,开发者可能在其中实现了特定的功能或者用于...

    iOS游戏应用源代码——nevyn-overload-0.3-0-gae3b7f5.zip

    开发者通常会使用这些框架来简化游戏逻辑,处理图形渲染、动画、碰撞检测等问题。 4. **版本控制**:Git是一种分布式版本控制系统,gae3b7f5是Git提交的唯一标识符,通过它可以追踪源代码的历史变更,这对于多人...

    Python库 | appfy.recipe.gae-0.7.1.zip

    2. **Google App Engine (GAE)**:GAE是Google提供的一项平台即服务(PaaS),允许开发者使用Python、Java、Go或Node.js编写Web应用程序,并在Google的基础设施上运行。GAE提供了自动扩展、负载均衡和数据存储等功能...

    freemarker.jar

    camel-freemarker-1.6.4.jar, camel-freemarker-2.8.1.jar, ...freemarker-1.4.1.jar, freemarker-2-3-18.jar, ...freemarker-gae-pre2.jar, freemarker-gae-pre3.jar, freemarker.jar, freemarker2_03.jar

    Python库 | gae_installer-1.9.17.4.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:gae_installer-1.9.17.4.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    PyPI 官网下载 | gae_command-0.1.3.tar.gz

    `gae_command`库的具体功能和使用方法需要查看其文档或源代码才能详细了解。通常,Python库会有一个`README`文件或`docs`目录,其中包含关于如何使用库的信息,包括示例代码、API参考等。对于开发人员来说,理解这些...

    Python库 | gae_installer-1.9.7.2.tar.gz

    资源分类:Python库 所属语言:Python 资源全名:gae_installer-1.9.7.2.tar.gz 资源来源:官方 安装方法:https://lanzao.blog.csdn.net/article/details/101784059

    GAE入门教程.pdf

    通过这个入门教程,你将学会如何使用 GAE 构建一个完整的 web 应用,包括基础的页面显示、用户认证、数据存储、表单处理和应用发布。这个教程覆盖了 GAE 开发的关键概念和技术,是学习 GAE 开发的良好起点。

    GAE入门教程.docx

    GAE 入门教程介绍了如何开始使用 Google App Engine 进行 web 应用开发。教程中提到,通过 GAE,开发者可以快速创建网站应用,直接上传并分享,无需复杂的配置。教程通过创建一个简单的留言本应用来展示 GAE 的主要...

    GAE使用规则

    GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则GAE使用规则

    GAE--java使用入门.doc

    2. 如果使用Eclipse,安装Google插件并使用其创建GAE项目。 3. 获取并安装App Engine Java SDK,如果不在Eclipse中进行,可以下载ZIP文件。 4. 配置并创建你的第一个GAE应用,例如留言簿应用。 通过以上步骤,你将...

    fr.opensagres.poi.xwpf.converter.pdf-2.0.2.jar

    word转PDF 工具jar包;word模板填充字段有点小脾气,字段 需要带前后空格,或者分号/回车符结尾;不然会替换不了(你将模板转为xml文件,打开就知道原因了,可能将你的字段拆开或者加%空格之类的,需要自己main方法...

    2.gae.ipynb

    关于gae的例子,适合初学者对深度强化学习gae的认识和了解

    fr.opensagres.poi.xwpf.converter.7z

    这两个版本号分别表示它们的发布版本,2.0.2和2.0.1,通常更新版本会修复已知问题并引入新的功能。 在Java开发中,Apache POI库是非常关键的工具,特别是在需要与Microsoft Office文档进行交互的场景下。XWPF是...

    maven-gae-plugin-0.9.6.jar

    maven-gae-plugin-0.9.6.jar

    maven-gae-plugin-0.9.5.jar

    maven-gae-plugin-0.9.5.jar

Global site tag (gtag.js) - Google Analytics