洛阳铲的日志

2009年02月17日

appengine中urlfetch的406

Filed under: 生活小札 — HackGou @ 13:36

按照google官方的说法(http://code.google.com/appengine/docs/python/urlfetch/fetchfunction.html#Disallowed_HTTP_Headers)是urlfetch关掉了一些http header: Content-Length Host Referer User-Agent Vary Via X-Forwarded-For
但是在添加Accept-Encoding: zip处理压缩的请求时,会拿到406.究其原因,就是dev appserver中google.appengine.api.urlfetch不仅禁掉了上面那些header、连accept-encoding也一并禁掉了,而在appengine上面这是透明处理的。但是那个dev appserver却没有透明的处理zip的页面。所以dev appserver的并没有完全实现appengine。解决这个问题也不难,dev appserver不支持,那我们就自己做一个支持zip的urlfetch的实现就ok了。 使用的时候如下: ………………………….. if (os.environ[‘SERVER_SOFTWARE’]).find(‘Development’) == -1: #in the appengine box from google.appengine.api import urlfetch else: from common import urlfetch …………………….
这个urlfetch.py:
class Respon(object): content = None status_code = “” headers = {} def fetch(url,headers ={‘Accept-Encoding’:’gzip’}): import urllib2, httplib import os,sys import StringIO sys.path.insert(0,os.environ[‘PROJECT_ROOT’]) request = urllib2.Request(”) respon = Respon() request = urllib2.Request(url) for k,v in headers.iteritems(): request.add_header( k , v) opener = urllib2.build_opener() f = opener.open(request) data= f.read() if (f.headers.get(‘Content-Encoding’,”)).find(‘zip’) == 1 : #zipped import gzip,StringIO compressedstream = StringIO.StringIO(data) gzipper = gzip.GzipFile(fileobj=compressedstream) data = gzipper.read() respon.content = data respon.status_code = str(f.code) respon.headers = dict(f.headers) return respon
这样算是在dev appserver上面透明的处理了zip的页面,而在appengine上面也很好的work。

2009年02月9日

Python was built with Visual Studio 200*

Filed under: 生活小札 — HackGou @ 11:48

用easy_install安装atomisator的时候提示说:
“Python was built with Visual Studio 200*” error:
Python was built with Visual Studio 2003;
extensions must be built with a compiler than can generate compatible binaries.
Visual Studio 2003 was not found on this system.
If you have Cygwin installed, you can try compiling with MingW32, by passing “-c mingw32″ to setup.py.

手动安装atomisator的时候,还是如此错误, 怪了, 看来只有用mingw32了。
mingw32已经有了,不用担心, build的时候指定mingw32:
python setup.py build -c mingw32
但是install的时候还是无法通过。 而且使用python setup.py install -c mingw32的时候,错误依旧。
在: http://eli.thegreenplace.net/2008/06/28/compiling-python-extensions-with-distutils-and-mingw/
说通过替换libpython25.a可以通过。 这个方法在我这儿行不通。
有可能他是ActiveState ,我使用的是Cpython,有可能问题出在这儿。
还有一个可能就是install的不理会-c mingw32的选项。
郁闷的是没有命令行可以指定这个选项。
难道非要VS?没有办法,下载了免费版的Visual Studio 2008 Express。
用d:Program Files\Microsoft Visual Studio 9.0\VC\vcvarsall.bat 设置了环境变量。
再来easy_install-2.5 atomisator 错误依旧。
最后在:http://www.procoders.net/?p=204 找到法子:
修改setup.cfg,增加:
[build]
compiler=mingw32

然后 easy_install-2.5 atomisator 果然漂亮。
不知道在么两行内容,害得我花了老长时间去下那个近2G的VS 2008 Express。 真是不值。
好在后来 easy_install-265 atomisator 的时候看见:
atomisatorfilterslevenshteinLevenshtein.c(4109) : warning C4244: “=”: 从”double”转换到”size_t”,可能丢失数据
atomisatorfilterslevenshteinLevenshtein.c(4146) : warning C4244: “初始化”: 从”double”转换到”size_t”,可能丢失数据
这个很明显是cl干的。 稍微宽了些心。
最后在:http://www.procoders.net/?p=204 的commets里面看见有人说:
python setup.py build -c mingw32 install
和自定义
%HOME%pydistutils.cfg
都是上好的方法。而且这两个方法看起来更加棒。 而且在:
http://docs.python.org/install/index.html#config-syntax
有非常完整的Python模块安装说明。以后在有什么东西装不上,一个地方就是去这儿看看,
而不是满世界无头苍蝇似的乱转

Powered by WordPress