迁移pylonsbook chapter 8到pylons1.0

Pylonsbook的第八章,是一个完整的CRUD程序例子。pylons升级到1.0之后,有一些代码不能正常工作了。

首先查看你使用的各种库的版本:
paster shell development.ini

import pylons
pylons.__version__
import sqlalchemy
sqlalchemy.__version__
import webhelpers
webhelpers.__version__

Pylons 1.0开始鼓励通过继承Base类的声明式ORM(pylonsbook介绍的是pylons 0.9x,sqlalchemy 0.5x,使用mapper的方式)
对pylons1.0,mode/__init__.py中声明model的代码如下:

from sqlalchemy import *
from sqlalchemy.orm import relationship

class PageTag(Base):
    __tablename__ = 'pagetag'
    id = Column('id', Integer, Sequence('pagetag_seq_id', optional=True), primary_key=True)
    pageid = Column('pageid', Integer, ForeignKey('page.id'))
    tagid = Column('tagid', Integer, ForeignKey('tag.id'))

class Page(Base):
    """docstring for Page"""
    __tablename__ = 'page'
    id = Column('id', Integer, Sequence('page_seq_id', optional=True), primary_key=True)
    content = Column('content', Text, nullable=False)
    posted = Column('posted', DateTime, default=now())
    title = Column('title', Unicode(255), default=u'Untitled Page')
    heading = Column('heading', Unicode(255))

    tags = relationship(PageTag, backref='page')
    comments = relationship("Comment", backref='page')

class Tag(Base):
    """docstring for Tag"""
    __tablename__ = 'tag'
    id = Column('id', Integer, Sequence('tag_seq_id', optional=True), primary_key=True)
    name = Column('name', Unicode(20), nullable=False, unique=True)

class Comment(Base):
    __tablename__ = 'comment'
    id = Column('id', Integer, Sequence('comment_seq_id', optional=True), primary_key=True)
    content = Column('content', Text, default=u'')
    name = Column('name', Unicode(255))
    email = Column('email', Unicode(255), nullable=False)
    created = Column('created', TIMESTAMP, default=now())
    pageid = Column(Integer, ForeignKey('page.id'))

init_model 方法的内容也不相同,但是对Session的配置都是在Session.configure里进行。 如果设置autocommit=True,即使设置了autoflush=True仍然需要Session.flush()一下才能把变更写入数据库。否则,则需要显示调用Session.commit()

在写controller的部分,pylonsbook大量用了

page_q = model.meta.Session.query(model.Page)
c.page = page_q.get(int(id))

page_q = model.meta.Session.query(model.Page)
c.page = page_q.filter_by(id=id).first()

在新版本里只需要
c.page=Session.query(model.Page).get(id)
即可。

在模板部分,pylons现在默认不依赖formbuild,所以文中提到的helper方法要额外安装formbuild库。不过这些也可以用过webhelper来实现,在lib/helpers.py里:
from webhelpers.html.tags import *

在field.html中

<p>Heading: ${h.text(
    "heading"
)}
</p>

<p>
Title: ${h.text(
    "title"
)}
</p>

<p>
Content: ${h.textarea(
    "content", cols=40, rows=10
)}
</p>

模板中一个非常常用的方法url_for在pylons1.0里被改为pylons.url,需要修改/lib/helpers.py
from pylons import url

书中所有的重定向都是直接设置response相关属性实现的,实际可以用redirect,结合url:
redirect(url(controller='page', action='view', id=page.id))

分页部分,如果你使用的是sqlalchemy 0.6的话,随pylons 1.0发布的Webhelpers 0.6还不支持 sqlalchemy 0.6的query object,需要手动升级到1.2. (easy_install -U webhelpers)

最后关于flash状态,webhelpers里有一个专门的实现,不过还是不太好用:
http://pylonshq.com/docs/en/1.0/thirdparty/webhelpers/pylonslib/

The post is brought to you by lekhonee v0.7

9月10日运转记

庆祝教师节,今天请假休息出门放松。

线路:
609 -> 其昌栈渡口 -> 秦皇岛路渡口 -> 37 -> 33 -> 金陵西路渡口 -> 东昌路渡口 -> 东川线

609从张江路经金桥路出张江,经过碧云路、云山路、羽山路、源深路、福山路等,连接了浦东几个人口稠密的地区。从张江出发做609可以直达世纪大道、张杨路的浦东医保中心,这些地方之前去过但是都不知道,今天途径才恍然大悟。不过609的缺点就是太绕,尤其是在张江这段简直无语。

其昌栈渡口人不多,极少行人,多数是摩托车电动车。轮渡稍微有点破旧,行人票价0.5元。
20100910039.resized

20100910041.resized
没有带相机,手机拍拍玩。

渡过黄浦江后是浦西的秦皇岛路渡口,附近是4号线大连路车站。从附近坐37路,沿东大名路,经过外白渡铁桥到外滩。
20100910046.resized
像不像这个:http://music.douban.com/subject/2025422/

从外滩坐33路到终点站十六铺码头,问路被告知东门路渡口已经关闭了。只能到附近的金陵西路渡口,金陵西路渡口只有行人票,需要2元,对岸是东昌路渡口。东昌路渡口和东昌路地铁站分别在东昌路的两端,这个比较悲剧。更悲剧的是东川线的起点站很不好找,问了世博志愿者,结果被指的路多走了两站。

东川线经过东方路、浦建路、龙阳路钻进张江,回来比较疲劳,附近的印象就不深了。

The post is brought to you by lekhonee v0.7

Newly designed front page

The last version of my home page was initialized at 2008.9. After two years, the page is completely obsolete, some features were broken due to different reasons. (fanfou.com has been shutdown and twitter was banned).

So I just bring you this:
screenshot_001

The page is extremely simple, without any JavaScript or image. Some CSS3 features have been applied to it, including gradient background, css border radius (also web font will be added when I find a suitable font).

The photo is taken at Expo, outside the Holland Pavilion.

Upgraded to Maverick Meerkat

上周Ubuntu 10.10 Maverick Meerkat beta发布了,本人向来是在Beta版发布的时候更新,然后经历一个月的黑白颠倒最终走向光明走向stable。因为我安装的规模有点大,这次升级总共要下载两千八百多个包,花了我两天的时间。

升级到Meerkat后,由于内核版本变成了2.6.35,原先ath5k网卡的驱动madwifi不能用了。这点一定要有心理准备,好在madwifi已经有了针对2.6.35的分支。可以从madwifi-project网站上下载:
http://snapshots.madwifi-project.org/madwifi-0.9.4-current.tar.gz
然后您可以根据UserGuide上的步骤进行操作:
http://madwifi-project.org/wiki/UserDocs/FirstTimeHowTo
话说我升级了网卡驱动之后无线网路稳定性、速度都有了很明显的提升,对一个饱受无线掉线折磨的人来说,这个太重要了。(我先前使用的驱动是 madwifi-hal-0.10.5.6-r4119)

其他变化包括:

  • 主题多了橙色元素
  • indicator applet增加了几个新的图标
  • tracker applet可以显示出来了 -_-|||
  • Evolution 2.30 工具栏有点变化
  • UpdateManager UI有点变化
  • 多了一个Input Method Switch的图形界面设置
  • Indicator多了network manager

其他更新还要慢慢体会,不过总得来说这次10.10更新不多,恐怕也和GNOME3跳票有关吧。

The post is brought to you by lekhonee v0.7