LBForum最新进展
八 3, 2010 vicalloy的庄家, 编程
LBForum是我用python(django)开发的一个开源的论坛系统。
更多的信息可以参考我以前写的博客 发布一个Django的论坛系统LBForum(开源、带演示)。
最近LBForum也终于有了一位活跃用户,也非常感谢他给我提出了不少改进的意见。他们是一个游戏汉化组织,网址是 http://bbs.tuidao.org/ 。
LBForum现在主要具备的功能有:
- 论坛分类,分版块
- 发帖,回帖
- BBCode支持
- 使用AJAX实现附件上传、编辑
- i18n支持,根据用户浏览器的语言自动显示对应的界面(目前支持英文和中文)。
- 使用django admin提供论坛管理功能,实现对帖子的删除、修改、移动、设置置顶帖、关闭主题
- 最新的功能更新参考 History
在我看来LBForum在功能方面已基本完善,对于LBForum以后的发展,目前还没有什么比较详细的计划。目前最缺的可能还是文档,只是一直没有什么动力去完善。功能方面也有些想做的,不过也是因为缺乏动力所以没太动手。
文档
- 针对虚拟主机的部署文档以及相关脚本。python/ROR的web项目都存在部署麻烦的问题。对开发人员而言都够折腾了,普通用户基本上就可以直接放弃了。完善的部署文档,只少可以给用户们一个尝试的勇气。
- 针对已有项目的集成文档。LBForum是以整站形式设计的。作为一个独立项目部署会比较容易,但和其他项目整合的时候和普通的app相比就要显得更麻烦些了。有了项目集成文档他们会觉得,原来要集成LBForum是这么简单的。
- app说明,代码导航。方便二次开发的用户对代码的理解。
功能
- 可视化的编辑器。最初规划的时候就有这个东西,不过因为一直没想明白这东西要在界面上怎么摆,所以一直迟迟没有动手。
- 搜索功能。discuz等的搜索可选项太多,太过复杂。我可能会用Whoosh之类的东西做个全文搜索。只是如果论坛资源还不够丰富的话,搜索功能其实就是个摆设。
- 积分系统。目前的大多论坛都会有自己的积分系统。我感觉将积分系统作为一个独立的app可能会比较好些。积分系统不一定要仅限于论坛,可以有多种的积分途径。参考了一下discuz的积分系统,发现者东西如果要真正做好还是挺费工夫的。
- 站内消息。对现成的第三方app不是太满意,不过有些懒得自己写。
Tags: lbforum
发布一个Django的论坛系统LBForum(开源、带演示)
二 26, 2010 vicalloy的庄家, 编程
简介
LBForum 用django开发的论坛系统,演示地址为:http://vik.haoluobo.com/lbforum/
项目的地址为:http://github.com/vicalloy/LBForum
界面部分抄的 FluxBB(一个开源的PHP论坛 http://fluxbb.org/ )。
虽然Django写的论坛也不少,不过还真没什么好用的。
大多Django论坛都是独立的app,而且不少还缺模板,想我这样有经验的Django用户要跑起来都觉得麻烦,其他普通用户就更别说了。
LBForum主要注重部署的方便性和易用性,功能方面目前还比较简单。
LBForum一开始就是以整站的形式提供,所以以LBForum做为基础项目进行二次开发是很容易的。
同时LBForum的开发尽量遵照Django可复用app原则,因此即使需要将LBForum做为独立的app集成到其他项目也并不会太难。
主要功能
目前功能还比较简单,而且还有些小问题有待修正。
- 论坛分类,分版块
- 发帖,回帖
- BBCode支持
- 置顶贴
- 使用django admin提供论坛管理功能
用开发服务器把LBForum跑起来
- 先把代码down下来。LBForum托管在github上,http://github.com/vicalloy/LBForum 。如果你没有安装git,你可以直接用界面右上方的download
source功能下载代码。 - 运行\scripts\create_lbforum_env.py初始化lbforum的python虚拟环境。该脚本会自动创建一个python的虚拟环境并使用easy_install安装对应的依赖包,同时将一些依赖包解压到对应的目录中。
注:django使用的是svn版本,所以机器上必须要安装有SVN,不然脚本会运行失败。如果因为由于svn的问题导致脚本运行失败,可以运行lbforum_env.bat进入lbforum环境,手动安装django的svn版本。 - 环境初始化好后,运行lbforum_env.bat进入lbforum环境
- 运行%mg% syncdb初始化数据库
- 运行%mg% runserver启动django开发服务器
- 进入admin,创建论坛分类和版块
- 进入版块发帖
LBForum的目录结构说明
|+lbforum_env/#lbforum运行的python虚拟环境,运行create_lbforum_env.py后自动创建
|+requirements/#lbforum用的第三方库和app,运行的时候会将该目录加到python路径
|~scripts/#工程相关脚本
| |-create_lbforum_env.py#初始化python虚拟环境,并自动安装easy_install/django依赖库
| |-helper.py#提供其他脚本所需的辅助函数
| `-lbforum_env.bat*#启动lbforum运行的虚拟环境及,并为lbforum的manage.py提供快捷方式%mg%,比如初始化数据库%mg%
syncdb
|~sites/#站点配置/模板/静态文件
| `~default/#默认站点
| |+static/#静态资源文件,如css等
| |+templates/#Django模板目录
| |+templates_plus/#Django模板目录,用户将自己重写过的目标放到该目录
| `-……
|~src/#django的app目录
| |+account/#account相关app。具体站点通常会对用户中心进行定制,所以该app在实际应用中很可能需要针对实际情况进行修改。
| |+djangohelper/#一些django的辅助函数等,
| |+lbforum/#lbforum的主app,论坛功能都在改app中
| |+lbregistration/#registration app的lbforum扩展,主要去掉邮件地址认证功能
| |+onlineuser/#显示在线用户的app(可复用的django app,可脱离lbforum单独使用)
| `+simpleavatar/#头像功能的app(可复用的django app,可脱离lbforum单独使用,依赖djangohelper)
|+tools/#工程用到的辅助工具,目前只有一个virtualenv的脚本
注:
- 由于计划在以后做i18n,所以目前只提供英文界面
- django的错误提示是显示在字段后面,fluxbb的错误全部都显示在表单前面。由于模板没有调好,所以目前按照fluxbb的方式显示错误,所以错误显示有些不太正常。
- bbcode的输入框本想做成自适应大小的,不过也调得有些问题,所以现在输入框的大小固定。
- 文档… ,感觉好难写-_-,目前文档不全(项目中没有带任何的文档),日后补上。
- 应用程序的目录结构主要查看pinax
- simpleavatar模块部分代码来自django-avatar
- 依赖包除用easy_install在线安装的外,尽量使用zip包的方式附带在项目中,减少安装依赖包的困难。
- 远程部署脚本计划使用fabric,但fabric本身安装比较麻烦,所暂未处理。
- 项目最早放在googlecode,不过感觉github的功能更强些,所以移了过去。
url_helper简化Django的url配置
六 9, 2009 vicalloy的庄家, 编程
django的url采用正则表达式进行配置,虽然强大却也广为诟病。反对者们认为django的url配置过于繁琐,且不支持默认的路由功能。
我倒觉得还好,只是如果觉得不爽,为什么不自己小小的hack一下,反正也就几行代码的事。
在这个背景下,我整了这个url_helper,利用url_helper可以简化配置和实现url的默认路由。所谓的url_helper其实就只有url_helper.py一个文件,使用的时候只想要import就可以。
url_helper的具体用法请参考具体的例子:
下面对使用方法做个简单的说明。
url的默认路由
from url_helper import execute, url_ import views urlpatterns += patterns('', url(r'^(?P<urls>.*)', execute, {'views': views}), )
在urls.py里增加如下配置,其中views为需要进行路由的views模块。url的规则为 /action/param1/param2/…/ 。
例如:
#/edit/4/ def edit(request, n="id"): html = """ edit object: %s""" % n return HttpResponse(html)
在没有指定action的时候默认使用的action为index。
提供函数url_简化url配置
仿照ROR的做法,参数用”:”标识。
例如:
url_(r’/space/:username/:tag/’, views.url_), 对应的django url配置为url(r’^space/(?P<username>[^/]+)/(?P<tag>[^/]+)/$’, views.url_),
#url_(r’/space/:username/:tag/’, views.url_), #/space/vicalloy/just/ def url_(request, username, tag): html = """ username: %s <br/> tag: %s""" % (username, tag) return HttpResponse(html)
url_helper的完整代码
就如前面说的,代码非常少。不过实际应用的话,应当还需要做一些扩展。
#!/usr/bin/env python # -*- coding: UTF-8 -*- from django import http from django.conf.urls.defaults import url import re def execute(request, urls, views): """ urls [methodName/]param1/param2/.../ methodName default index """ def get_method(views, methodName): try: return getattr(views, methodName) except Exception, e: return None method = None params = [e for e in urls.split("/") if e] params.reverse() if params: method = get_method(views, params.pop()) if not method: method = get_method(views, 'index') if not method: raise http.Http404('The requested admin page does not exist.') return method(request, *params) def url_(*args,**dic): regex = args[0] if regex[0] == "/": regex = regex[1:] regex = '^' + regex regex = regex + '$' regex = re.sub(":[^/]+", lambda matchobj: "(?P<%s>[^/]+)" % matchobj.group(0)[1:], regex) return url(regex, *args[1:], **dic)
Tags: django
DPress演示站点开放
五 30, 2009 vicalloy的庄家
今天部署了一个dpress的演示站点。
http://vik.haoluobo.com/dpress/
http://vik.haoluobo.com/dpress/admin 用户名:vicalloy 密码:vicalloy
感觉django的部署还是太麻烦…
Tags: dpress
DPress-Django开发的Blog
五 29, 2009 vicalloy的庄家
用Django做Blog实在是太过简单,所以在网上可以轻易的找到大量用django实现的Blog,DPress就是其中一个。
本想用这个项目做Django最佳实践的教程,不过发现自己实在是不擅长这个。此外该项目花费的时间比预期的要多出不少,以至到后期挺没耐心,功能方面也因此大幅缩水。
目前DPress的基础功能已经完成,文档方面我会在晚些时候补上。
有兴趣的朋友可以将代码下回来看看。如果要使用Django自己服务器启动起来非常容易。
- 使用SVN把代码下回来 http://dpress.googlecode.com/svn/trunk/ 。
- 运行 \trunk\scripts\init.bat 完成一些必要的初始化(复制静态文件到相关目录)。
- 运行 \trunk\site\dpress\scripts\syncdb.bat 初始化数据库。
- 运行 \trunk\site\dpress\scripts\runserver.bat 启动服务。
- 访问 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的(他也是偷别人的)。

初次尝试翻译较长的文章
五 13, 2009 vicalloy的庄家
以前也翻译过一些东西,不过都是非常短的文字。今天在网上看到一篇关于unladen swallow(Google的python实现)的文章,于是尝试对其进行翻译。
翻译东西确实不是一件容易的事。外文文章要读懂很容易,你只想要关注其中的重点即可,对于一些不重要的地方即使你没读懂也没关系。在翻译的时候你很容易的就会陷入了原作者的语言习惯,但外文和中文的语言习惯还是有很大的差别。其中语言习惯的差别不仅仅表现在句式结构上,还会贯穿在整片文字的语言组织上。所以如果你是按句翻译,那不管你如何组织语言,依旧会读起来很拗口。
除技术因素外,翻译还是一个很考验耐心的活。一篇可以在几分钟内读完的文章翻译起来得花几个小时。
虽然翻译得比较糟糕(自己都不想再读一遍),不过总算翻译完了,如果哪天有空就再休整一下,至少不要读得这么恶心。
Tags: python, unladen swallow, 翻译
Django资源大全
四 18, 2009 vicalloy的庄家
在wiki上整理了一个关于django的页面,将一些我认为比较有用的信息都列在了上面。
应当说这个页面的第一期工作已经完成了,以后将继续更新。
Tags: django
农历0.2.1发布(Yahoo Widgets)
三 18, 2009 vicalloy的庄家
昨天收到网友的邮件说我做的农历插件无法使用。但我自己测试却没有发现啥问题。于是在自己的虚拟机里测试了下,还真无法工作了。
检查代码发现里面有runCommand(‘cal’),这样的代码。去查了下,发现cal是linux查看日历的命令。估计是新版本的yahoo widgets去掉了相关命令的支持。重新下载了个yahoo官方的日历组件,将runCommand(‘cal’)用新版yahoo插件中相关代码替换后我的widget终于又可以正常工作了。
我的这个农历组件已经发布两年多了(看截图:-),直到现在才有人给我反馈(不过,我也不知道从啥时候开始出问题),看来这东西还真没几个人用。
Tags: chinese calendar, yahoo widgets, 农历
[Django]增强的创建app的命令
三 2, 2009 vicalloy的庄家, 编程
简介
虽然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)。
- 运行\hidjango\scripts\create_app.bat。根据提示输入app的名称,如blog。
- 打开\hidjango\settings.py,在app列表里添加 hidjango.blog 。
- 运行\hidjango\scripts\syncdb.bat,初始化数据库。
- 修改\hidjango\urls.py,添加app的映射 (r’^', include(‘hidjango.blog.urls’)), 。
- 运行\hidjango\scripts\runserver.bat启动开发服务器。
- 在浏览器输入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
Tags: django create_app
整了个在线将reStructuredText转成html的东西
一 5, 2009 vicalloy的庄家
现在不少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)
Tags: python, reST, reStructuredText
