在旧博客运行一个学期之后,趁着寒假休闲在家几天赶紧看了看Django把新博客摸了出来。虽然代码总共不过几行(已开源在GitHub),不过用着自己写的东西总是要比用别人写好的要开心啊~

虽然新站和旧站看起来几乎没什么区别,但实际上除了看起来以外几乎可以说完全不同,主要变化有:

  • 抛弃了穷酸的.ml域名,换用可爱的.moe,这才是我的风格嘛~

  • 后端由 LNMP + WordPress 换为了 Nginx + uWSGI + Python-Django, 告别了臃肿的WP和一窍不通的PHP,心情舒畅,从今往后网站才算是全在我自己掌握之中;

  • 数据库管理由 PHPMyAdmin + MySQL换为了Django-ORM + SQLite, 虽然都说不要在建网站的时候用SQLite,不过我觉得就一个小破站也差不多啦;

  • 文章和评论均支持 MarkDown ,享受精致 MarkDown 生活(误),不过用 VSCode + MD 写作总比僵硬地在线写作+有限的 html 标签好多啦;

  • 源站服务器从DO换到了GCP台湾,真是好用的一批,甚至想一口气买三年。

  • CDN由免费版 Cloudflare 换为和 neo喵 py来的pro版Cloudflare,速度上有多大变化没有测试过,但是野卡证书和30条 PageRules 真是美滋滋呀~所有 css 和 img 资源也已经通过PageRules强制缓存。

  • 文章内图片全部使用外部图床(YuSA,瓜瓜作品);

  • 前端直接魔改旧站的 html 和 css 适配Django模板。

大概就这些了。特别鸣谢:

  • [ T-54M ] Ivan Ustinov,在我学习的途中不厌其烦地为我解答一些 zz问题,提出好多宝贵的经验指导。

  • neo喵,带我上了pro版cf的车,即使不知道车还能平稳地开多久,原本的pro版也是我大概一辈子都不敢(没钱)用的。

  • 瓜瓜,超棒的全栈工程瓜,本站的图床提供,以及头像也是由瓜瓜的tg bot倒放循环制作成的。

好啦,那接下来我们就随便聊聊啦。

其实我老早就想要学 Django 了,不过因为上课期间啃 Django 的官方文档,因为空闲时间很零散,总是看一段忘一段,加上官方文档的快速入门部分写的令人一头雾水(这点我后来在逼乎也看到了类似的反馈),就干脆全都留到寒假了。真正开始着手学的时候,参考了好几篇教程,包括 Django-By-Example 等,先从头到尾看了两遍,然后不禁叹了一口气:

Django真尼玛好用呀!

Django的开发流程大概是这样的:

设计数据库模型->编写html模板->编写视图函数->设计url格式

而当我们访问编写好的网页的时候,Django的行为则是这样的:

解析url格式,将各个参数按照我们设计的url对应过去然后传给视图函数->视图函数从数据库读取所需要的数据并将数据处理后传给模板->模板把数据二次加工以后装填后返回给WebServer->WebServer把完整的网页传回给用户

不过,在实际部署时,WebServer我们会选择Nginx, Caddy, Apeche之类的专业软件,这些软件与我们的 Django 是分离的,性能比开发时用的 Django 自带的迷你服务器要好的多,因此我们会将静态的文件都丢给他们处理而不是丢给Django。可是我们也知道 Django 作为 Python 程序,是不能被Nginx直接加载的,因此我们还需要配置一个uWSGI作为Django的WSGI服务器。这样一来,实际的应答流程就要加上:

Nginx收到请求,将其中的静态部分(我们自定义path)和其余部分分离,将其余部分(需要渲染的html本体)丢给uWSGI->uWSGI开始运行Django

写 Django 项目的时候是相当愉悦的,毕竟烦人的数据库交互和请求处理都已经被 Django 封装好了,我们在设计了数据库结构之后只需要填填补补视图层和模板层就好啦。当然,这里指的是当你的需求简单,比如搭建一个博客的时候。对于更加复杂的情况,我没有前端的经验,也没有学前端的打算,因此到时候再说啦,也许会去学flask(

我的模型层设计的非常简单,只有三个博客必备的class, post, catagory和comments,其中comments和主app blog分离开来做成了单独的app。然后到部署的时候才想起来我其实还设计了一个tag来着后面全忘了hh,也省去了我每篇文章想tag的麻烦。

编写视图层的时候相当喜感,我原本以为 markdown 的处理是个难点,已经准备好要啃硬骨头了,结果发现已经有 markdown -> html的python模块了,而且还不止一个,于是选择了一个markdown2import进来事情就解决了hh.

魔改模板层反而是耗费时间最长的部分。直接旧博客的主页和详情页扒下来,挖空可复用的部分做成base.html,然后detail.html和index.html继承base填上文章目录或者文章本体,最后修修补补css到让自己满意的地步。这部分的感想是:Django官网说的真是太对了!

Oh, and one more thing: making human edit XML is sadistic!

再来说一下部署吧。

由于我是用的pipenv 来管理虚拟环境,因此在服务器上部署实际上不是什么难事,一句pipenv install就完事了,然而实际的部署却一波三折。写完了本体以后,登录之前注册域名的服务商Gandi准备搞事,结果发现 诶泥马我域名呢??刚刚还放在这这么大一个域名呢??怎么就不见了??

然后心急火燎不管三七二十一先又买了一次再说,结果这一次也卡在creation一整个晚上不动,于是发工单交流,还好Gandi有台湾分部大家还可以用中文交流,然后得知是因为.moe的注册信息只允许用ASCII字符而我填了汉字导致注册不了(((

这种错误竟然没有在购买的时候检测/提醒,下单付款成功后不是我发工单还不来提醒我,反正我是拉黑啦。

后来是在Namesilo重买了两年,然后用信用卡撸了台gce就开始搞事了。虽然在之后配置uWSGI的时候也遇上了一些坑,等一下把uwsgi的xml和service文件也上传到项目里好啦。

最后,再立一下FLAG列一下接下来想学的东西吧:

  • 用django-rest-framework 写http api

  • 学一下webhook , 如果上面的http api能完成的话可以对接一下

  • MySQL 和 Redis, 数据库这方面我真是还几乎不懂就来做网站了,惭愧惭愧。学完还可以顺便把之前的简陋的机器人重写一下。

  • Pandas等数据处理相关,下学期就会用到

  • 闲着没事就读500 lines or less吧,不读源码写的东西总感觉跟幼儿园作文一样

  • docker文档,这个跟Django一样也是好久以前就说要看了一直没时间,到现在都还是只会用别人写好的docker.