Python 问答网站 ChinaPy “开发”手记

Python问答网站http://www.chinapy.org发布已满一月(上线公告见:中文Python社区ChinaPy上线Beta测试),期间网站程序一直在不停的打补丁,主要因为采用的问答系统OSQA还处于beta阶段,问题比较多,特别是在对中文编码的支持上。现在网站系统和用户都已经比较稳定,是时候兑现我在ChinaPy上线公告中所说的“开发、部署总结稍候将博文以记录之”的诺言了。

细心的人可能也注意到了,本博客标题中的“开发”两个字是打了引号的,因为ChinaPy采用的系统是现成的开源的OSQA和LBForum,我实际并没有做多少开发工作,主要就是将两个系统合并为一体、打补丁和定制网站,因此最多也只能算是二次开发,故这里特意打了一个引号,大家千万不要以为ChinaPy的源代码都是飞龙写的,那样OSQA和LBForum的作者就要吐血了。

虽然上线到现在加起来才一个月,但零零散散发现还是有很多事情值得记一笔的。

ChinaPy网站起因

为什么会筹建ChinaPy呢,原因其实很简单,就是不满意:

  • 不满意豆瓣和邮件群组不支持代码格式和代码高亮,贴代码很是蛋疼。
  • 不满意python-cn邮件群组相对严格的管理方式。
  • 不满意JE(现在的IE),这个不解释。
  • 不满意社区不能比较直接的反映出隐藏在一个个ID后面的人的技术实力。

ChinaPy是不是解决了所有的这些问题呢?当然不是,相反还引发了其它一系列的问题,受OSQA系统的限制,我若要做一些大的改变也是比较困难或者说代价比较高的,因此对ChinaPy我也是很不满意的。

接下来我准备做的一件事情就是根据ChinaPy的用户反馈意见还有我这段时间对ChinaPy的使用和管理经验来打造一个全新的站点GuruStack.com,希望能够让我满意,让更多人满意,当然不可能让所有的人满意,至少JE是不会满意的。关于此,我将在接下来的一篇博客里做详细的说明,本文对此不再展开。

ChinaPy网站定位

初期希望打造成另一个Python社区,但是从后面的反馈来看最有用的就是技术问答部分,因此ChinaPy以后将专注于Python技术问答。

ChinaPy系统选型

ChinaPy聚焦Python,最开始考虑要搭建的内容包括问答、论坛和博客三部分,以问答为主,论坛用于排解用户灌水的压力,而博客用来发布一些站内的信息和组织Python线下活动。

因为是非商业的网站,因此考虑用现成系统来搭建,这样也可以较快速的上线。

问答部分有高仿StackOverflow的OSQA和askbot可用,它们均是基于cnprog的源代码来做的,当时对比相对的觉得OSQA的界面漂亮些,因此虽然OSQA还处于beta阶段但仍然选择了它,目前来看这是第一个错误的决策。

选择论坛程序的时候参考了http://djangopackages.com/grids/g/forums/,最开始我试用了DjangoBB,DjangoBB功能还是很完善的,很适合建设独立的论坛站点。但相对的,DjangoBB体积也比较庞大,光crontab就好几个,系统相对复杂,要和OSQA合并相对难度较大,而本身我对论坛部分的要求也不高,只要能发布一些Python相关的信息和灌灌水即可,最终选择了国人的LBForum来作为论坛程序,LBForum界面清爽、简洁,程序代码结构也相对清晰,和OSQA合并的时候也没有费我太多力气。选择LBForum是一个正确的决策,但现在回过头来看,论坛部分是非常鸡肋的,决定上论坛部分却是又一个失策。

至于博客部分,开始想用子域名搭一个WordPress的,因为WordPress是PHP的,而问答和论坛都是基于Django的,这样博客和主站的用户、Cookie、Session和界面等的统一就是一个问题,后来发现OSQA自带的自定义页面和网站广播一定程度上能满足博客的需求,再加上从用户的调查反馈来看,博客的需求并不强烈,故最后并没有上博客子站点。

ChinaPy网站”开发”

选择了OSQA和LBForum就意味着ChinaPy一个站下要跑两个Django程序,关于这个问题,在python-cn邮件里面刚好也有人问,我做了如下回答:

解决此问题有两种方案可选

  1. 方案一,作为两个独立的子站来运营,不管是子域名还是一个子路径。用nginx反向代理不同子域名的访问到两个独立的子站,或者根目录代理到一个项目,特定的子目录再代理到另外一个项目。
  2. 方案二,以一个项目为主体,另一个项目当一个app插进来,将配置整合到一块,而该app的url全部归到一个子路径下比如/forum/下。

相应的

  1. 方案一部署简单,不需要考虑项目合并的问题,不同子项目跑在不同的数据库上,适合两个项目都很复杂的情况,但需要考虑一些关键数据的同步,比如用户数据和session等。
  2. 方案二整合麻烦,比如middleware得整一起吧,两系统不一定能融合的很好,但是项目公用一个数据库,关键数据易同步,session问题也好解决。目前 http://www.chinapy.org 合并了OSQA和LBForum两个项目,采用的就是这种方式,可以去参考一下代码:https://bitbucket.org/felinx/chinapy,如果当时合的是DjangoBB应该就会采用第一种方式。

除了上面提到的解决方案,代码中还需要将两个系统的登录界面统一为一个,并且在创建用户的时候,两边的用户数据需要初始关联起来,这些具体的实现大家可以去参考源代码https://bitbucket.org/felinx/chinapy

“开发”还有一大部分工作其实是修defect和定制一些需求,比如:最开始可以用中文用户名注册,但带来的问题实在太多,到处要打补丁,而且你还不知道哪里还存在地雷,最后被迫将中文用户名注册的功能关闭了,详细的修了哪些问题,有兴趣的也可以去看看源代码或commit日志。

ChinaPy网站部署

ChinaPy部署在Amazon的EC2上,前端nginx处理静态文件并proxy动态请求给后台的Tornado进程,网站的Django程序是跑在Tornado上的。关于如何在Tornado上跑Django程序,Ben Darnell同学做了一个django-tornado-demo,主要就是这个tornado_main.py文件了。 ChinaPy目前跑在后台的5个独立的Tornado进程上(没有用prefork模式,实际情况是大部分时间都只用得到一个进程),用的就是这个方法,具体入口代码如下:

import os
import sys

from tornado.options import options, define, parse_command_line
import django.core.handlers.wsgi
import tornado.httpserver
import tornado.ioloop
import tornado.web
import tornado.wsgi

sys.path.append(os.path.dirname(os.path.abspath(__file__)))
os.environ['DJANGO_SETTINGS_MODULE'] = "settings"

define('port', type=int, default=8000)

def main():
    parse_command_line()

    wsgi_app = tornado.wsgi.WSGIContainer(
        django.core.handlers.wsgi.WSGIHandler())

    tornado_app = tornado.web.Application(
        [('.*', tornado.web.FallbackHandler, dict(fallback=wsgi_app)),
        ])
    server = tornado.httpserver.HTTPServer(tornado_app)
    server.listen(options.port)
    tornado.ioloop.IOLoop.instance().start()

if __name__ == '__main__':
    main()

有人可能会问,为啥不试试uWSGI?有几个原因:

  • 一是我的EC2上已有Tornado网站,这个也用Tornado跑的话,方便一起管理;
  • 二是系统自带的nginx版本低了,不带uWSGI的支持,需要自己定制安装一个新版的nginx;
  • 三是用Tornado跑,性能还是很不错的。

另外,ChinaPy的部署上还用到了一些技巧,请参考我的相关的博客:

ChinaPy网站推广

ChinaPy网站上线主要在python-cn邮件群组、豆瓣Python小组和ChinaUnix的Python小组等地方推广了下,中间还做了一次问卷调查收集了一些用户反馈意见,目前注册用户有300+,一个月时间在这么窄的一个专业领域算来还是不错,但看一下豆瓣Python小组有1万多用户,这个差距还不是那么一点点。

关于推广有一点必须要说的是,我在JE(现IE)发的跟我的博文中文Python社区ChinaPy上线Beta测试类似的内容则直接导致了我的JE账号被封,我也不申述了,只好跟JE说拜拜。虽然因为之前申请加入python-cn邮件群组屡屡被刷的事,对python-cn我一直持批评态度,但在ChinaPy推广这件事情上,我必须说python-cn比JE还是更有包容心的。

ChinaPy建站收获

ChinaPy建站我个人觉得我最大的收获是认识和“笼络”了一帮热心的Pythoner,比如gastlygemzoomquietalexanderargs等等等等,它们或热心的回答网友的问题,或给网站提出各种意见和建议,虽然我不可能接受或实现全部的这些意见和建议,但我还是要忠心的感谢这些帮助我和ChinaPy成长的人。

同时,通过我的努力我也确实帮助了一些人,当我的答案被人接受为正确答案的时候,这个成就感是很强的,不知道ChinaPy的Pythoners你们有没有类似的感觉?

除了我个人的收获外,我想总还是有人从ChinaPy的Python问答中受益的吧,虽然现在还不多。

总结ChinaPy的建站经验,我相信我的下一个项目可以做得更好,敬请关注我的下一篇博客GuruStack.com专题。

转自:http://feilong.me/2011/04/chinapy-development-summary

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。