分类目录归档:vicalloy的庄家

DPress-Django开发的Blog

用Django做Blog实在是太过简单,所以在网上可以轻易的找到大量用django实现的Blog,DPress就是其中一个。

本想用这个项目做Django最佳实践的教程,不过发现自己实在是不擅长这个。此外该项目花费的时间比预期的要多出不少,以至到后期挺没耐心,功能方面也因此大幅缩水。

目前DPress的基础功能已经完成,文档方面我会在晚些时候补上。

有兴趣的朋友可以将代码下回来看看。如果要使用Django自己服务器启动起来非常容易。

  1. 使用SVN把代码下回来 http://dpress.googlecode.com/svn/trunk/
  2. 运行 \trunk\scripts\init.bat 完成一些必要的初始化(复制静态文件到相关目录)。
  3. 运行 \trunk\site\dpress\scripts\syncdb.bat 初始化数据库。
  4. 运行 \trunk\site\dpress\scripts\runserver.bat 启动服务。
  5. 访问 http://127.0.0.1:8000/admin/ 在管理后台添加日志。

DPress本着以最少的代价完成最多工作的原则,能不造轮子的地方就不造轮子。

  • Blog的编辑功能完全交给admin处理。
  • 使用filebrowser对admin扩展,实现对文件的管理。
  • 使用django-tinymce,实现html的可视化编辑。
  • 文章的Tag功能使用django-tagging实现。
  • comments功能使用django.contrib.comments。
  • Blog本身也大量“借鉴”了pinax的blog组件。
  • Blog支持使用书写格式有Markdown、Textile、普通文本,html(支持可视化编辑)、reStructuredText(当然,你需要安装有相关的库)。

对Blog应用来说,一般都会有较高的个性化要求。换肤基本上成了必备功能。很遗憾,这方面是django的软肋。换肤需要创建新的模板,并需要修改配置文件,指定使用新模板。好的方面是,DPress的模板在我优化过后,还是比较简单,改起来还算方便的。

虽然在开始DPress之前就计划的很好,本以为很容易就可以搞定,但事与愿违开发过程中遇中还是遇到了一些麻烦。

Pinax中的Blog组件使用threadedcomments来增加评论支持。在评论内容填写不完整时,会转到它自定义的页面。我认为这是一个挺不友好的设置,尝试修正无果。切换到django.contrib.comments后问题则更糟,不但评论出错会跳到自定义页面,即使评论成功了不会转到评论页面,而是给出一个评论成功的提示。最后没办法,还是自己将添加评论的代码给写了一遍。

此外在模板方面也折腾掉了大量的时间。模板的本身也是程序中重要的一环,但不少的可重用app都没有带任何模板,而且也缺乏模板方面的范例。在我看来,这也是django的第三方app普遍不太好用的重要原因之一。

下面上张图吧,模板的样式,是偷的朋友BLOG的(他也是偷别人的)。

初次尝试翻译较长的文章

以前也翻译过一些东西,不过都是非常短的文字。今天在网上看到一篇关于unladen swallow(Google的python实现)的文章,于是尝试对其进行翻译。

翻译东西确实不是一件容易的事。外文文章要读懂很容易,你只想要关注其中的重点即可,对于一些不重要的地方即使你没读懂也没关系。在翻译的时候你很容易的就会陷入了原作者的语言习惯,但外文和中文的语言习惯还是有很大的差别。其中语言习惯的差别不仅仅表现在句式结构上,还会贯穿在整片文字的语言组织上。所以如果你是按句翻译,那不管你如何组织语言,依旧会读起来很拗口。

除技术因素外,翻译还是一个很考验耐心的活。一篇可以在几分钟内读完的文章翻译起来得花几个小时。

虽然翻译得比较糟糕(自己都不想再读一遍),不过总算翻译完了,如果哪天有空就再休整一下,至少不要读得这么恶心。

unladen swallow: 加速Python

农历0.2.1发布(Yahoo Widgets)

昨天收到网友的邮件说我做的农历插件无法使用。但我自己测试却没有发现啥问题。于是在自己的虚拟机里测试了下,还真无法工作了。

检查代码发现里面有runCommand(‘cal’),这样的代码。去查了下,发现cal是linux查看日历的命令。估计是新版本的yahoo widgets去掉了相关命令的支持。重新下载了个yahoo官方的日历组件,将runCommand(‘cal’)用新版yahoo插件中相关代码替换后我的widget终于又可以正常工作了。

我的这个农历组件已经发布两年多了(看截图:-),直到现在才有人给我反馈(不过,我也不知道从啥时候开始出问题),看来这东西还真没几个人用。

下载

农历截图

[Django]增强的创建app的命令

简介

下载地址

虽然django的admin漂亮的实现了CRUD,不过在有时候admin并不是这么好用。然后开始进行手写CRUD,接着发现自己又陷入了重复操作中。相比而言Ruby自动生成的添加删除功能就好不少,你生成的基础框架是可以扩展的。

为了减少手动书写CRUD的工作量,我写了一个扩展的startapp command。使用这个命令会自动生成 list/new/edit 的操作和html文件(这样修改起来就方便多了)。

使用说明

如需要在其他工程使用该命令,只需要将项目中的django_extensions文件夹复制到其他工程的app目录,并在settings.py里把django_extensions添加到app列表里。该扩展命令为create_app,使用方法和django官方的startapp一致(如:manage.py create_app blog)。

命令演示

为了方便演示,该扩展命令包含了一个演示工程(hidjango)。下面的步骤是windows平台(因为用了几个bat)。

  1. 运行\hidjango\scripts\create_app.bat。根据提示输入app的名称,如blog。
  2. 打开\hidjango\settings.py,在app列表里添加 hidjango.blog 。
  3. 运行\hidjango\scripts\syncdb.bat,初始化数据库。
  4. 修改\hidjango\urls.py,添加app的映射 (r’^’, include(‘hidjango.blog.urls’)),
  5. 运行\hidjango\scripts\runserver.bat启动开发服务器。
  6. 在浏览器输入http://127.0.0.1:7000/访问页面,并可以实现完整的添加删除操作。

注:

  • command的py代码大部分都是从django-command-extensions(http://code.google.com/p/django-command-extensions)里复制过来的,我只做了少部分的修改。
  • 该命令还比较简单,还有很多可以扩展的地方。比如app_name不一定和model_name相同等。

模板文件预览:

/django_extensions/conf/app_template/
|~templates/
| `~{{ app_name }}/
|   |-base.html
|   |-edit.html
|   |-list.html
|   `-new.html
|~templatetags/
| `-__init__.py
|-__init__.py
|-admin.py
|-forms.py
|-models.py
|-tests.py
|-urls.py
`-views.py

整了个在线将reStructuredText转成html的东西

现在不少python程序都是用reStructuredText写文档。
比较郁闷的是有部分文档都只提供了reStructuredText的源文件,没有转换好的html文件。
感觉自己每次手动转比较麻烦,于是花了点时间写了个在线的。
将reStructuredText文件贴进去,提交后就可以看到转好的页面了。

现在还有点问题,sphinx对reStructuredText进行了扩展。
对包含了sphinx标签的会处理出错(谁知道怎么忽略错误?)。
地址是 http://rest.haoluobo.com/

程序的代码可是非常的少,主要代码就是下面几行。

#!/usr/bin/env python
# -*- coding: UTF-8 -*-
from django.http import HttpResponse
from docutils.core import publish_string

def index(request):
   html = """
<html>
       <head></head>
       <body>
       <form action="" method="post">
           <textarea name="rest" cols="60" rows="20" onfocus="this.value=”"></textarea>
           <br/>
           <input type="submit" value="提交"/>
       </form>
   </body>
</html>
   """
   if request.POST:
       html = publish_string(request.POST[‘rest’], writer_name=’html’)
   return HttpResponse(html)

老照片的演示站点重新开放

今天在服务器上将老照片给部署好了,关闭许久的老照片终于再次开放了。
由于使用mod_rewrite似乎有些问题,我将静态问题统一放在了另一个域名下,但这却引出了一些其他问题。以前写程序的时候没有注意到静态文件的问题,直接将静态文件的位置给写死了,此外还有部分其他问题。不过修正后终于跑起来了。
在经过上次的修正后,依旧存在部分css兼容性的问题。不管了,至少大多页面看上去还是正常的。
http://lzpian.haoluobo.com/

GoogleCode上的SpringSide2vik项目建好了

本想将代码先整理下,不过似乎也没多少整理的必要。为项目新添加了netbeans的项目配置文件,这样使用netbeans的用户也可以方便的打开工程了。另外还做了个简单的视频演示,空间太烂,似乎要花挺久才能下载完。
项目地址:http://code.google.com/p/springside2vik/
视频演示:http://vik.haoluobo.com/static/springside2vik/springside2vik.htm

完成对老照片的调整,Django版本升级到1.0

今天完成了对老照片的调整,将Django的版本升级到了1.0。1.0版本的Django相比以前版本相比最大的变化就是那个newforms了。不过好在我在newforms出来不久就直接切换过去了,这次升级只需要在import的时候将newforms改成forms就可以。
admin也是0.96到1.0变化比较大的。不过老照片本来就不太依赖admin,所以我只修改了admin的url映射部分,保证admin后台可以正常打开。以后如果需要用到admin,再对admin部分进行调整。
由于我需要对用户上传的图片进行编辑,因此没有使用Django默认的上传处理。文件上传的变动给我带来了不少麻烦。以前从request.files里取出的文件是个map,但在新版本中变成了一个对象。这个对象虽然提供了files的相关接口,但却又不全,导致PIL无法正常处理。为此我增加了一个临时文件。先将用户上传的文件保存到临时文件再进行处理。在网上看到有用户遇到了和我同样的问题,不知Django在日后的版本中是否会修正。
至于目录的调整,我将那个碍眼的apps给去掉,把所有的文件放到oldphoto这个包下。
此外对项目的配置文件做了一些调整,将默认的数据库改为sqlite,保证程序可以在不做任何设置的情况下直接用manage.py runserver跑起来。
最后再将项目地址贴一下:
http://code.google.com/p/oldphoto/
将项目从SVN中取下后,依次运行scripts目录里的syncdb.bat、runserver.bat就可以跑起来了。当然,那些有些必备的环境还是需要的,python(>=2.4)+django(>=1.0)+PIL。

后记

本来休整工作还包括部分重构以及i18n等,不过在完成Django的升级后就开始没多少兴趣了。由于代码比较老,里面不少东西在现在看来都有更好的处理方式,如果全部都改工作量有点大,只是改部分打打补丁又没多少意思。或许那天重新写个自己看得顺眼点的新项目。

对自己开源的项目进行休整

和大多不负责任的开源作者一样,我都是将代码发布后就不怎么打理了。不过想来既然博客和wiki重新开张,就顺道将以前开源的项目给打理打理吧。
目前的计划主要将老照片SpringSide2–++调整下。

老照片

老照片是我刚开始使用django时做的一个项目。由于刚开始学习django,里面有不少在现在看来非常糟糕的处理。打算将那些非常糟糕的处理给改掉,其他一些一般糟糕的就算了。目前想到要做的主要有:

  • 重新调整目录结构。
  • 实现Django 0.96迁移到 1.0,修正迁移中产生的问题。
  • 把那些糟糕处理改优雅点。

SpringSide2–++

SpringSide2–++是我在SpringSide2基础上重新定制过的一个项目。在我看来定制过后易用性增加了不少,而且提供了一个还成的代码生成器,对于简单对象只需要将该对象的Model写完就可以自动生成完整的CRUD。目前计划的调整有。

  • 这个项目以前是以zip包的形式发布的,打算调整后放到googlecode上。
  • SpringSide–++这个名字现在看来似乎有些怪异,这次修正的时候顺便想个好听点的名字。
  • 写一些IDE环境初始化的脚本呢,帮助用户用IDE打开后不需做任何配置就可以直接跑起来。
  • 界面美化(我觉得现在的界面有点丑)。
  • 录制个简单的视频教程帮助推广:-)。