I'm 赵一开, a developer.

Get in touch:

LicenseCC-BY 京ICP备17068969号

如何写一个树洞

 本文已被标记为过时

文中提到的相关信息可能已经发生了很大的变化,请谨慎以本篇文章的内容作为参考做任何事情。

其实这篇文章的标题应该大概是“一个简单的网页应用是如何搞出来的”, 因为之前有好几个同学问过我类似的问题,而且根据贵系的培养方案不知道要到 猴年马月才能了解相关内容,于是以简单的树洞为例写一下。 这不是一个教程,因为省略了太多细节,只是说明一下整个应用是怎么回事, 需要准备什么东西,我认为这样的入门有时候占用了我们太多的搜索时间。

域名和服务器

树洞的域名thutreehole.tk是从dot.tk免费申请的,也可以购买收费的域名(.com, .net等), 价格约每年十美元。域名只是一个名称,需要将其指向运行着网站的服务器的IP地址,没有服务器的话可以使用 自己在寝室的电脑,国外一般配置的虚拟服务器的价格大概是每月十美元左右。

服务器端

服务器端就是要接受用户的浏览器发送过来的请求,对其进行处理,返回相应的页面。 服务器端可以用各种语言写,可以选择使用各种不同的框架(库),比如我使用Python上的Django。

先准备数据库(在Django中为Model),记录发布者的IP和时间:

class ContentModel(models.Model):
    ip = models.CharField(max_length=20, db_index=True)
    time = models.DateTimeField(db_index=True)

然后就是处理请求的过程:

def index(request):
    ipaddr = request.META.get('REMOTE_ADDR', '')
    if request.method == 'POST':
        _content = request.POST.get('content', '')
        if not checkIP(ipaddr):
            messages.error(request, MSG['IP_NOT_VALID'])
        elif not (len(_content) < 120 and len(_content) > 5):
            messages.error(request, MSG['CONTENT_TOO_LONG'])
        elif ContentModel.objects.filter(ip=ipaddr, time__range=\
                (datetime.now()-timedelta(minutes=30), datetime.now())).count() > 0:
            messages.error(request, MSG['TOO_MANY_TIMES'])
        else:
            new_content = ContentModel(ip=ipaddr, 
                    time=datetime.now())
            new_content.save()
            try:
                postStatu(_content, ContentModel.objects.count())
            except RuntimeError:
                messages.error(request, MSG['PUBLISH_ERROR'])
                logging.error('Error in ' + str(ContentModel.objects.count()))
            else:
                messages.success(request, MSG['PUBLISH_OK'])
    return render_to_response('index.html', \
            context_instance=RequestContext(request))

代码很简单,不需要解释。 另外再写一个checkIPpostStatu(可以参考小黄鸡代码),就搞定了。

页面

上一段代码的最后返回了index.html,就是用户看到的页面,关键内容如下:

然后

然后就...写完了..总时间不用超过一个小时...

UPDATE: Fork Me On Github