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

本文记录了一次使用Flex与Python在Google App Engine (GAE) 上进行交互的实验过程。实验中遇到了非数字端口的问题,并探讨了解决方案,包括使用urlfetch替代socket。此外,还讨论了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就不行了呢?在网上查了好久,看到如下链接:[url]http://groups.google.co.jp/group/google-appengine/browse_thread/thread/07f418a36888c937[/url]
其中提到
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文件复制过来以后还是这个问题。


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

以后要多关注关注CPyUG了,真的好强啊。
【源码免费下载链接】:https://renmaiwang.cn/s/r77kj 这篇文档主要介绍的是基于STM32微控制器使用CAN(Controller Area Network)通信协议进行M3508电机的角度串级闭环控制。CAN通信是一种高效、可靠的多主通信网络,广泛应用于汽车电子、工业自动化等领域,这里它被用来连接和控制电机。STM32是一款由意法半导体公司(STMicroelectronics)生产的高性能微控制器,广泛应用于各种嵌入式系统,尤其在控制领域。它的强大性能和丰富的外设接口使其成为实现电机控制的理想选择。在本例程中,STM32作为主控制器,负责接收和发送CAN消息,从而控制M3508电机。M3508电机是一种高功率密度的电动机,常用于无人机、机器人和其他需要精确速度和位置控制的应用。闭环控制是确保电机稳定运行和高效能的关键,它通过反馈信号(如电机转速或位置)调整输入(如电流或电压),以减少误差并实现精确控制。PID(比例-积分-微分)控制器是闭环控制系统中的核心部分。在这个例程中,PID算法被用于处理从电机传感器获取的反馈数据,调整电机的转速和位置。PID控制器通过比例项(P)快速响应误差,积分项(I)消除稳态误差,微分项(D)预测未来误差趋势,以平滑控制过程。CAN通信协议允许设备之间高效地交换数据,其报文结构紧凑,抗干扰性强,适合在恶劣环境中工作。在本例程中,STM32通过CAN接口与M3508电机驱动板(通常称为A板)通信,发送设定值和接收反馈数据。A板上的电机驱动电路将这些数字信号转化为电机所需的电流和电压变化。这个压缩包文件可能包含了以下内容:STM32的CAN配置代码、PID控制器的实现代码、电机控制逻辑代码以及可能的测试脚本。学习者可以通过阅读这些代码来理解如何设置CAN接口,如何编写PID算法,以及如何根据反馈进行电机控制。这个例程提
【源码免费下载链接】:https://renmaiwang.cn/s/z5cyb 在Android系统中,快捷方式是一种方便用户快速启动应用或跳转至特定功能的方式。随着不同手机厂商对Android系统的定制,各个品牌如华为、小米、OPPO、vivo等可能有自己的快捷方式实现。为了确保应用能够正常创建和使用快捷方式,开发者需要对这些设备进行特定的权限检查。本篇文章将详细介绍如何在Android中进行快捷方式权限的判断,并针对华为、小米、OPPO、vivo等主流品牌提供相应的判断策略。我们需要理解Android系统中的快捷方式API。在Android 7.1及以上版本,系统提供了`ShortcutManager`接口,用于管理应用的动态快捷方式。通过`ShortcutManager`,开发者可以添加、更新或删除快捷方式。然而,创建快捷方式可能需要特定的权限,例如`MANAGE_SHORTCUTS`。对于某些品牌,如华为,还需要额外的权限设置或者服务注册。在`checkUtil.java`这个工具类中,通常会包含一系列针对不同品牌设备的检查方法。例如:1. **华为设备**:华为设备可能会要求应用在`AndroidManifest.xml`中声明`com.huawei.systemmanager.optimize.permission.PERMISSION_OPTIMIZE`权限,并且可能需要在运行时检查是否开启"智能管理器"(或类似功能)的后台清理限制。2. **小米设备**:小米设备通常需要在`Settings -> Additional settings -> Permissions -> Autostart`中允许应用自启动,以便快捷方式能正常工作。工具类中可能包含一个方法,用于检测并提示用户打开这个设置。3. **OPPO和vivo设备**:这两个品牌的设备也有自己的应
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值