Archive for the 'django' Category

保存/删除前后的额外动作

在Django中,常常会出现这样的情况: 在保存一个对象到数据库中或者从数据库把该对象删除的时候,希望可以执行另外一些附加的操作,
比如:

  1. class Place(models.Model):
  2.         name = models.CharField(maxlength=50)
  3.         address = models.CharField(maxlength=80)
  4.         def save (self):
  5.               self.name = 'hackgou'
  6.               print "Before save"
  7.               super(Place, self).save() #call the 'real' save() method
  8.               print "After save"
  9.         def delete (self)
  10.               self.name = "test"
  11.               super(Place,self).save() #这是在删除么 :P
  12.         def __str__(self)
  13.               return "%s the place" % self.name
  14. >>from djangoTest.oneToOne.models import *
  15. >>>l = Place(None,"Gavin","sichuang")
  16. >>>l
  17. >>>l.save()
  18. Before
  19. save
  20. After save
  21. >>> l.name
  22. 'hackgou'
  23. >>> l = Place.objects.get(name__startswith="QQ")
  24. >>>l
  25. >>> l.delete()
  26. >>> l.name
  27. 'test'
  28. >>>

这好像在玩魔术。

其实这和以前版本中的_save()以及meta中定义_save()来重载Model
的save()一样,只是现在名字和Model中的一样,更加像真正的重载了!

fastCGI方式跑Django

原本想找个支持mod_python的空间来玩玩,但是要么太贵要么速度太慢,终究还是选择了dreamhost,在他上面买了支持python的空间,打算好好玩玩python这个东东,之前看了看上面的环境:

  1. hackgou@runts:~$whereis python 
  2. python: /usr/bin/python /usr/bin/python2.3 /usr/bin/python2.2-popy-config \
  3. /usr/bin/python2.2 /usr/bin/python2.4 /etc/python2.3 /etc\
  4. /python2.4 /etc/python2.2 /usr/lib/python2.3 /usr/lib/python2.2 \
  5. /usr/lib/python2.4 /usr/local/lib/python2.3 /usr/local/lib/python2.\
  6. 2 /usr/local/lib/python2.4 /usr/include/python2.3 /usr/include/python2.2 \
  7. /usr/include/python2.4 /usr/share/man/man1/python.1.gz  

呵呵,够夸张的,从2.2到2.4的版本都有。

还好!fastCGI的支持是知道的,上面的主机对python和perl的支持都是通过FastCGI的方式实现的。以前没有彻底的玩过FastCGI、更别说python的FastCGI了。首先是添加一个Python的FastCGI gateway。虽然dreamhost的wiki上面说使用fcgi.py比较方便,但是后来发现Flup,这也是一个Frame
不光有fastCGI gateway,而且他提供一个类似mod_python的publish的东东,那就用他了:

  1. wget http://www.saddi.com/software/flup/dist/flup-r1968.tar.gz

wget抓来之后。用setup.py安装。/usr/lib/python2.4 咱是没有权限,那就在~/下面建立一个自己的lib-python,作为自己的$PYTHONPATH。

在.bash_prifile里面添加export $PYTHONPATH=$PYTHONPATH:~/lib-python 

OK,开始安装我们自己的lib:

  1. python2.4 setup.py install --install-lib  ~/lib-python/ --install-scripts ~/lib-python/

这样会安装到我自己的lib-python而不是默认的/usr/lib/python2.4/site-packages/。

OK,写个简单的helloworld.py(flup的fcig路径是from flup.server.fcgi import WSGIServer),测试一下flup。OK。通过

然后svn把django的代码也拉到lib-python中去。再按照django的手册创建一个demo,写一个简单的测试app.py。页面是出来了,但是是django报错的东东。还好,聊胜于无。为什么呢?东翻翻、西翻翻,看到木头的文章,他说rewrite后能够成功,但是我还悄悄的去http://www.djangocn.org/django.fcgi看了看,呵呵和我的错误一样。不可能跟这个rewrite有关系的吧,既然如此,那我就添加重写规则吧,一添加,呵呵,果然奏效。

It worked!

页面出来了,不知道为什么rewrite和这个有啥关系,迷糊

update:

如果希望避免export $PYTHONPATH=$PYTHONPATH:~/lib-python 而且也不想添加一堆的path.append(),可以参考:
让easy_install构造自己的py thon小天地


Creative Commons License
This work is licensed under a Creative Commons License.