V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
DAOCLOUD
推荐学习书目
Python Cookbook
Using Google App Engine
推荐下载
Latest Google App Engine SDK
其他兼容技术
AppScale
nttdocomo
V2EX  ›  Google App Engine

为什么每几分钟我的请求都会返回空?

  •  
  •   nttdocomo · 2011-02-15 11:12:53 +08:00 · 5377 次点击
    这是一个创建于 5017 天前的主题,其中的信息可能已经有所发展或是发生改变。
    用python在GAE上搭了一个TOP(淘宝开放平台)的代理,返回jsonp格式的数据,但每几分钟(5-10分钟)访问一次,就会出现第一次访问会返回空。本地SDK开发没有问题,上传上去就会出现这种问题。请问为什么呢?

    额热切本地开发没有编码问题,上传到服务器就会出现编码问题!
    10 条回复    1970-01-01 08:00:00 +08:00
    fay
        1
    fay  
       2011-02-15 12:45:45 +08:00
    http读超时,因为间歇性的访问,每次初始时需要建立连接阿,握手阿,慢启动阿,需要的时间较长,之后因为保持着连接的关系,不会出现超时。
    nttdocomo
        2
    nttdocomo  
    OP
       2011-02-15 15:01:52 +08:00
    但我在浏览器看等待响应时间才900ms,GAE控制面板里响应时间也不到一秒?这也算超时?
    nttdocomo
        3
    nttdocomo  
    OP
       2011-02-15 18:01:14 +08:00
    http://python-top.appspot.com/?v=2.0&format=json&api_key=12194636&sercetoCode=sandboxe3c769026106bd2bf2243a7ce&method=taobao.items.get&q=a&callback=jsonp1297763597387

    这是url,每隔几分钟,访问一次,都会返回空白,应该不是超时,因为超时是30秒,我的等待时间还不到一秒
    nttdocomo
        4
    nttdocomo  
    OP
       2011-02-15 21:59:09 +08:00
    最新发现,本地测试也出现这种情况,在每次测试服务器重启的第一个请求!
    keakon
        5
    keakon  
       2011-02-16 01:03:12 +08:00
    @nttdocomo 出现这种情况,一般是main函数没有执行。检查一下有没有写if __name__ == '__main__': main()
    nttdocomo
        6
    nttdocomo  
    OP
       2011-02-16 08:47:51 +08:00
    基本上可以确定,是由于:
    import sys
    reload(sys)
    sys.setdefaultencoding('utf8')

    引起的,但不这样,上传到服务器之后就会出现编码错误!
    nttdocomo
        7
    nttdocomo  
    OP
       2011-02-16 09:02:38 +08:00
    没有上面那段话,当请求中有中文的时候,在服务器端会抛出这个错误
    <pre>Traceback (most recent call last):
    File &quot;/base/python_runtime/python_lib/versions/1/google/appengine/ext/webapp/__init__.py&quot;, line 515, in __call__
    handler.get(*groups)
    File &quot;/base/data/home/apps/python-top/1.348380308848656335/main.py&quot;, line 12, in get
    itemget.fetch()
    File &quot;/base/data/home/apps/python-top/1.348380308848656335/taobaoapi2/base.py&quot;, line 160, in fetch
    self._sign()
    File &quot;/base/data/home/apps/python-top/1.348380308848656335/taobaoapi2/base.py&quot;, line 157, in _sign
    src = sercetCode + ''.join([&quot;%s%s&quot; % (k, v) for k, v in sorted(self.p.items())])
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 0: ordinal not in range(128)
    </pre>
    keakon
        8
    keakon  
       2011-02-16 10:36:33 +08:00
    @nttdocomo 处理中文不需要setdefaultencoding,自己进行decode就行了。
    简单来说,把(k, v) for k, v改成(k.decode('utf8'), v.decode('utf8')) for k, v
    darasion
        9
    darasion  
       2011-02-16 10:57:06 +08:00
    不知道啥原因。

    如果是超时的原因,
    则可以尝试重试。原理是当发生超时异常时,就在except部分重新发出请求(类似递归)。重试次数X每次重试的时间 必须小于等于 一次请求的限制时间。
    nttdocomo
        10
    nttdocomo  
    OP
       2011-02-16 12:52:27 +08:00
    搞定!折腾了两天!
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2735 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 07:16 · PVG 15:16 · LAX 23:16 · JFK 02:16
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.