月度归档:2012年09月

pyramid_blogr安装测试文档(失败)

下载地址:

https://github.com/Pylons/pyramid_blogr

建立虚拟环境,然后解开包后,

按照上面提示的:

  • cd <directory containing this file>
  • $venv/bin/python setup.py develop
  • $venv/bin/initialize_pyramid_blogr_db development.ini
  • $venv/bin/pserve development.ini

结果在python setup.py develop这步报错:

README = open(os.path.join(here, ‘README.RST’)).read()
IOError: [Errno 2] No such file or directory: ‘/home/skywalk/tmp/Pylons-pyramid_blogr-81d74f1/README.RST’

发现原来目录是README.rst,于是cp README.rst README.RST

在initialize_pyramid_blogr_db development.ini这步报错:

File “build/bdist.linux-x86_64/egg/sqlalchemy/dialects/sqlite/pysqlite.py”, line 281, in dbapi
ImportError: No module named pysqlite2

晕,原来它还在用sqlite2啊,这我就没法整了啊。sqlite2根本就没法装了。

正式开始转投pyramid下

昨天仔细看了下pylons官网说明,发现pylons框架搁置中,怪不得很少看到有人关于pylons的讨论。估计是Pylons小组的人是集中精力做一件事情了。

 

py3下,用easy_install安装pyramid,报错,说啥字节不是ansi码啥的…提错误信息如下:

File “/home8/xxxx/py3env/lib/python3.2/encodings/ascii.py”, line 26, in decode
return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xc3 in position 3800: ordinal not in range(128)

最终是到官网,通过下载pyramid的软件包,手工安装好的。具体如下:

下载页面:http://www.pylonsproject.org/projects/pyramid/download

下载地址:https://github.com/Pylons/pyramid/tarball/master

tar -xzvf master 解包,然后使用

 python setup.py develop 安装 

ps:pip安装也是报错的。

 

下一步就是在bluehost虚拟主机中测试了。先建立一个pyramid项目:

pcreate -s starter ai1

cd ai1

python setup.py  develop

测试一下:python setup.py test -q

 

———————————————————————-
Ran 1 test in 0.006s

OK

常规打服务:

pserve development.ini

Starting server in PID 31468.
serving on http://0.0.0.0:6543

2012.9.21:

昨天为了测试安装pyramid,将bluehost下的pylons环境都搞坏了。今天把pylons环境弄好,结果pyramid竟然也好了,太高兴了!

为了pyramid在bluehost虚拟主机下运行,我参考pylons里的文档,写的如下:

#!/home8/xxxx/py3env/bin/python
# -*- coding:utf-8 -*-
# Filename: py3.py
import cgitb; cgitb.enable()
import sys
from paste.deploy import loadapp
import wsgiref.handlers
sys.path = [‘/home8/xxxx/ai1/’] + sys.path

wsgi_app = loadapp(‘config:/home8/xxxx/ai1/development.ini’)
wsgiref.handlers.CGIHandler().run(wsgi_app)

 

2012.9.22日:

今天碰到新问题,又测试py3.py文件,发现报错:

A server error occurred.  Please contact the administrator.
通过google搜索,发现国内有一个朋友也碰到这个问题,但是没有解决。在搜索未果后,我手工debug:
1 先进入pythohn3,import pyramid,未报错,证明没问题
2 在命令行下,pserve development.ini ,结果报错:

raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: Paster ,我到python3命令行里,import paster,报错:

Traceback (most recent call last):
File “<stdin>”, line 1, in <module>
ImportError: No module named paster

这样确实是有问题的。因为在bluehost里的py3.py文件里,我就是靠paster驱动的。

于是easy_install paster,报错。然后pip install paster,paster安装ok了。

在用pserve development.ini测试,报错为:

for prot in protocol_options] or ‘(no entry points)’))))
TypeError: sequence item 0: expected str instance, dict_keys found

暂时先解决到这里。休息,休息一下。

现在问题很奇怪,如果我先刷新一下pyt.py页面,那么py3.py页面就可以打开一次。再刷,又报错。

到处找解决方案,也没有找到。不过看pyramid手册,发现这么一段操作例子:

http://docs.pylonsproject.org/projects/pyramid_cookbook/en/latest/pylons/intro.html

# Prepare virtual Python environment.

$ cd ~/workspace
$ virtualenv myvenv
$ source myvenv/bin/activate
(myvenv)$ pip install 'Pyramid>=1.3'

# Create a Pyramid "alchemy" application and run it.

(myvenv)$ pcreate -s alchemy PyramidApp
(myvenv)$ cd PyramidApp
(myvenv)$ pip install -e .
(myvenv)$ initialize_PyramidApp_db development.ini
(myvenv)$ pserve development.ini
Starting server in PID 3871.
serving on http://0.0.0.0:6543
呵呵,这里有pip install -e . 这么一句。敲入这么一句,再刷新,乌拉!pyramid 正常运行啦!

pylons代转发网页小程序

有一个需求,想让自己的vps代转发网页,以实现更好的从互联网学习的目的。于是想到了用pylons框架来做。

 

基本构思就是建立一个controller 比如叫hello,然后用urllib获取页面,再转发过来。

两个模板文件:

root@win:~/win/win/templates# ls
base.html form.html
root@win:~/win/win/templates# cat base.html
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

<title>formdemo</title>
</head>
<body>
${next.body()}
</body>
</html>
root@win:~/win/win/templates# cat form.html
<%inherit file=’/base.html’/>
<h1>enter your web address</h1>

<form name=”test” method=”get” action=”/hello/ag2″ >
<p>website address: <input type=”text” name=”webadd”/></p>
<input type=”submit” name=”submit” value=”Submit”/>
</form>
root@win:~/win/win/templates#

controller文件:

#!/usr/bin/python.
# -*- coding: UTF-8 -*-
import logging
import cgitb; cgitb.enable()
from urllib2 import urlopen
from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from win.lib.base import BaseController, render

log = logging.getLogger(__name__)

class HelloController(BaseController):

def index(self):
# Return a rendered template
#return render(‘/hello.mako’)
# or, return a string
return ‘Hello World’
def ag(self):
return render(‘/form.html’)
def ag1(self):
#agh=u’http://win.airoot.org/hello/ag1?’
#ag=agh+webad
#doc=urlopen(webad).read()
#return doc
return “hello 2″
def ag2(self):
return ‘hello ag2′

现在第一步已经实现了,就是可以转发单一页面。

 

碰到的问题是:

1 有个组件报unicode错,让我很摸不着头脑,通过修改hello.py文件,把很多语句都注释了还是报错。其间还发生修改代码页面不改变的问题,真头疼。

最终重新安装了最新了的python2.7,用go-pylons.py文件创建了env环境,再尝试的时候,没有报错。所以问题应该出在一些组件版本上。

 

9.15日:

代码改动了一下

import logging
from urllib2 import urlopen
from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from sky.lib.base import BaseController, render

log = logging.getLogger(__name__)

class HelloController(BaseController):

def index(self):
# Return a rendered template
#return render(‘/hello.mako’)
# or, return a string
return ‘Hello World’
def ag(self):
return render(‘/form.html’)
def ag1(self):
webad=request.params[‘webadd’]
agh=u’http://win.airoot.org:5002/hello/ag1?’
ag=agh+webad
doc=urlopen(webad).read()
return doc.replace(‘<a href=”‘,'<a href=”http://win.airoot.org:5002/hello/ag1?webadd=’)
#return “hello 2″

pylons 代转发网页小程序

有一个需求,想让自己的vps代转发网页,以实现更好的从互联网学习的目的。于是想到了用pylons框架来做。

 

基本构思就是建立一个controller 比如叫hello,然后用urllib获取页面,再转发过来。

两个模板文件:

root@win:~/win/win/templates# ls
base.html form.html
root@win:~/win/win/templates# cat base.html
<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

<title>formdemo</title>
</head>
<body>
${next.body()}
</body>
</html>
root@win:~/win/win/templates# cat form.html
<%inherit file=’/base.html’/>
<h1>enter your web address</h1>

<form name=”test” method=”get” action=”/hello/ag2″ >
<p>website address: <input type=”text” name=”webadd”/></p>
<input type=”submit” name=”submit” value=”Submit”/>
</form>
root@win:~/win/win/templates#

controller文件:

#!/usr/bin/python.
# -*- coding: UTF-8 -*-
import logging
import cgitb; cgitb.enable()
from urllib2 import urlopen
from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from win.lib.base import BaseController, render

log = logging.getLogger(__name__)

class HelloController(BaseController):

def index(self):
# Return a rendered template
#return render(‘/hello.mako’)
# or, return a string
return ‘Hello World’
def ag(self):
return render(‘/form.html’)
def ag1(self):
#agh=u’http://win.airoot.org/hello/ag1?’
#ag=agh+webad
#doc=urlopen(webad).read()
#return doc
return “hello 2″
def ag2(self):
return ‘hello ag2′

现在第一步已经实现了,就是可以转发单一页面。

 

碰到的问题是:

1 有个组件报unicode错,让我很摸不着头脑,通过修改hello.py文件,把很多语句都注释了还是报错。其间还发生修改代码页面不改变的问题,真头疼。

最终重新安装了最新了的python2.7,用go-pylons.py文件创建了env环境,再尝试的时候,没有报错。所以问题应该出在一些组件版本上。

 

9.15日:

代码改动了一下

import logging
from urllib2 import urlopen
from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from sky.lib.base import BaseController, render

log = logging.getLogger(__name__)

class HelloController(BaseController):

def index(self):
# Return a rendered template
#return render(‘/hello.mako’)
# or, return a string
return ‘Hello World’
def ag(self):
return render(‘/form.html’)
def ag1(self):
webad=request.params[‘webadd’]
agh=u’http://win.airoot.org:5002/hello/ag1?’
ag=agh+webad
doc=urlopen(webad).read()
return doc.replace(‘<a href=”‘,'<a href=”http://win.airoot.org:5002/hello/ag1?webadd=’)
#return “hello 2″

pylons数据库学习

首先学到python有个数据库的DB-API 驱动。比如postgreSQL的是psycopg2,正好前几天有朋友聊起这个,说没有安装成功。当时我easy_install了一下,也是报错。

 

今天到其官方网站看安装说明,http://initd.org/psycopg/install/

发现用easy_install的时候,也需要python_dev被装上。于是apt-get install python_dev ,然后在easy_install psycopg2 ,就顺利的装上了。

 

db-api驱动为:psycopg2 mysqldb pysqlite pyodbc informixdb 等,根据名字就能知道他们对应的数据库了。

 

安装sqlite数据库程序 apt-get install sqlite3 。安装完成后可以用sqlite3命令进去。也可以直接用sqlite3 test.db创建数据库,当然事实上用sqlalchemy连接sqlite3的时候,会自动创建数据库,所以并不需要在命令行那样做。

 

sqlalchemy介绍:

http://www.ibm.com/developerworks/cn/aix/library/au-sqlalchemy/

http://gashero.yeax.com/?p=6#sqlalchemy

官网:http://www.sqlalchemy.org/

 

SQLAlchemy学习

发现还是要在官网上,学起来最顺利

>>> sqlalchemy.__version__
‘0.7.8’
>>> engine=create_engine(‘sqlite:///:memory:’,echo=True)

>>> engine.execute(‘select 1′).scalar
2012-09-04 15:19:22,081 INFO sqlalchemy.engine.base.Engine select 1
2012-09-04 15:19:22,081 INFO sqlalchemy.engine.base.Engine ()
<bound method ResultProxy.scalar of <sqlalchemy.engine.base.ResultProxy object at 0x16569110>>

定义一个mapper映射?

>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base=declarative_base()

创建一个类

class User(Base):

__tablename__ = ‘users1′
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return “<User(‘%s’,’%s’, ‘%s’)>” % (self.name, self.fullname, self.password)

>>> User.__table__
Table(‘users1′, MetaData(bind=None), Column(‘id’, Integer(), table=<users1>, primary_key=True, nullable=False), Column(‘name’, String(), table=<users1>), Column(‘fullname’, String(), table=<users1>), Column(‘password’, String(), table=<users1>), schema=None)

 

>>> User.__mapper__
<Mapper at 0x168a3d90; User>

后面出错了,因为我前面用的是user1,而手册里用的是user

>>> Base.metadata.create_all(engine)
PRAGMA table_info(“users”) () CREATE TABLE users ( id INTEGER NOT NULL, name VARCHAR, fullname VARCHAR, password VARCHAR, PRIMARY KEY (id) ) () COMMIT

pylons 数据库学习

首先学到python有个数据库的DB-API 驱动。比如postgreSQL的是psycopg2,正好前几天有朋友聊起这个,说没有安装成功。当时我easy_install了一下,也是报错。

 

今天到其官方网站看安装说明,http://initd.org/psycopg/install/

发现用easy_install的时候,也需要python_dev被装上。于是apt-get install python_dev ,然后在easy_install psycopg2 ,就顺利的装上了。

 

db-api驱动为:psycopg2 mysqldb pysqlite pyodbc informixdb 等,根据名字就能知道他们对应的数据库了。

 

安装sqlite数据库程序 apt-get install sqlite3 。安装完成后可以用sqlite3命令进去。也可以直接用sqlite3 test.db创建数据库,当然事实上用sqlalchemy连接sqlite3的时候,会自动创建数据库,所以并不需要在命令行那样做。

 

sqlalchemy介绍:

http://www.ibm.com/developerworks/cn/aix/library/au-sqlalchemy/

http://gashero.yeax.com/?p=6#sqlalchemy

官网:http://www.sqlalchemy.org/

 

SQLAlchemy学习

发现还是要在官网上,学起来最顺利

>>> sqlalchemy.__version__
‘0.7.8’
>>> engine=create_engine(‘sqlite:///:memory:’,echo=True)

>>> engine.execute(‘select 1′).scalar
2012-09-04 15:19:22,081 INFO sqlalchemy.engine.base.Engine select 1
2012-09-04 15:19:22,081 INFO sqlalchemy.engine.base.Engine ()
<bound method ResultProxy.scalar of <sqlalchemy.engine.base.ResultProxy object at 0x16569110>>

定义一个mapper映射?

>>> from sqlalchemy.ext.declarative import declarative_base
>>> Base=declarative_base()

创建一个类

class User(Base):

__tablename__ = ‘users1′
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return “<User(‘%s’,’%s’, ‘%s’)>” % (self.name, self.fullname, self.password)

>>> User.__table__
Table(‘users1′, MetaData(bind=None), Column(‘id’, Integer(), table=<users1>, primary_key=True, nullable=False), Column(‘name’, String(), table=<users1>), Column(‘fullname’, String(), table=<users1>), Column(‘password’, String(), table=<users1>), schema=None)

 

>>> User.__mapper__
<Mapper at 0x168a3d90; User>

后面出错了,因为我前面用的是user1,而手册里用的是user

>>> Base.metadata.create_all(engine)
PRAGMA table_info(“users”) () CREATE TABLE users ( id INTEGER NOT NULL, name VARCHAR, fullname VARCHAR, password VARCHAR, PRIMARY KEY (id) ) () COMMIT

Pylons validate学习实验

base.html代码:

<html>
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />

<title>formdemo</title>
</head>
<body>
${next.body()}
</body>
</html>

 

simpleform.html代码:

<%inherit file=’/base.html’/>
<h1>enter your email address</h1>

<form name=”test” method=”get” action=”/formtest/submit” >
<p>email address: <input type=”text” name=”email”/></p>
<p>date: <input type=’text’ name=”date”/></p>
<input type=”submit” name=”submit” value=”Submit”/>
</form>

 

formtest.py代码:(缩进全没有了,真悲惨…)

import logging
import formencode
#from formencode.validators import DateConverter
from pylons import request, response, session, tmpl_context as c, url
from pylons.controllers.util import abort, redirect

from formdemo.lib.base import BaseController, render

from pylons.decorators import validate

log = logging.getLogger(__name__)

#class UKDateConverter(DateConverter):
# month_style=’dd/mm/yyyy’

class EmailForm(formencode.Schema):
allow_extra_fields=True
filter_extra_fields=True
email=formencode.validators.Email(net_empty=True)
date=formencode.validators.DateConverter(not_empty=True)
class FormtestController(BaseController):

def index(self):
# Return a rendered template
#return render(‘/formtest.mako’)
# or, return a string
1,1 Top
#return render(‘/formtest.mako’)
# or, return a string
return ‘Hello World’
def form(self):
return render(‘/simpleform.html’)

@validate(schema=EmailForm(), form=’form’,post_only=False, on_get=True)
def submit(self):
#return ‘your email is : %s’ % request.params[’email’]
return ‘Your email is : %s and the date selected was %r. ‘ % (self.form_result[’email’],self.form_result[‘date’],)

 

测试了一下,pylons里面的validate真的很好用,很强大。下一个问题,就是validate里提示的文字,怎么改成中文的,是否可以通过国际化做到,还是要到模块代码里去手工改…

 

效果如下:

email address: The domain portion of the email address is invalid (the portion after the @: gmail)

date: That month only has 29 days