• Stars
    star
    209
  • Rank 187,222 (Top 4 %)
  • Language
    HTML
  • Created almost 11 years ago
  • Updated 10 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

My Django Blog

这篇文章将简单地描述一下博客的搭建过程。博客源代码见这里
首先要感谢stevelosh, 博客的基本设计参考了他的博客,来源于stevelosh.com 这篇文章。
博客从2013.8开始搭建,暑假主要处于学习阶段,学期途中插空写了一点,2014寒假把基本框架完成了。
对于想基于代码学习/搭建博客的行为,本人不能够更欢迎,但是请至少做到:
在运行之前修改settings.py,再不济,请至少把这里的email替换成你自己的email

ADMINS = (
    # ('Your Name', '[email protected]'),
    ('laike9m', '[email protected]'),
)

否则,你的代码运行时的出错信息将被发送到我的邮箱,不利于你进行调试,也给我带来极大困扰。不胜感激!!

之前忘记提到,由于我一开始就使用 Py3,所以代码在很多地方都是 Py2 不兼容的,比如某位 fork 了代码的同学发现不能成功创建文章。排查了一下错误,发现是因为My_Blog/css3two_blog/models.py中有这么一段代码:

if type(self.body) == bytes:  # sometimes body is str sometimes bytes...
     data = self.body
elif type(self.body) == str:
     data = self.body.encode('utf-8')

在 Py3里面,这么写就 cover 了self.body的所有可能情况, data 肯定会被赋值。但是那位同学发现data最后是未定义的,为什么呢?因为他用的是 Py2,所以bodyunicode,自然不行。
所以建议是,直接采用 Py3 来运行我的 blog,或者 fork 一份然后做一些 Py2 compatible 的修改(我也不知道哪些地方要改)。

设计

在博客搭建之初,我就决定要尽可能少写前端代码。最简单的方法自然是使用CMS。实际上有不少使用Django的CMS,比如最著名的django CMS。不过调研一番之后发现一个问题:没有一个支持Python 3。考虑到博客里必然有一堆Unicode字符,我还是希望能用Python 3的,所以就放弃了CMS。
(2014.6.25 EDIT: 目前发现django CMS已经能支持Python3.4了,至少3.0.2版本以及更新的都可以。参见3.0.2 release
好在马上找到了替代品:HTML模版。最后使用了css3templates 里面的一个模板。模板基本只包含HTML/CSS/JS代码,这正是我需要的东西,因为后端本来就是想从零开始写的。

文件路径结构

用Django建网站,staticmedia 到底怎么放置?这个问题没有标准答案,反正我没有用 STATICFILES_DIRS,也就是把所有static files都放在了appname/static/appname 里面。这样的好处是文件结构比较清晰,坏处是如果app多了同样的文件可能要存很多份,会减慢网站加载速度。下面是我的文件夹结构,供参考,文件均未列出:

my_blog
├─media
│  ├─content
│  │  └─BlogPost
│  │      ├─2009
│  │      ├─2013
│  │      ├─2014
│  │      └─images
│  └─files
├─My_Blog
│  ├─css3two_blog
│  │  ├─migrations
│  │  ├─static
│  │  │  └─css3two_blog
│  │  │      ├─documentation
│  │  │      ├─fonts
│  │  │      ├─images
│  │  │      └─js
│  │  └─templates
│  │    └─css3two_blog
│  ├─mytemplatetags
│  │  └─templatetags
│  ├─my_blog
│  └─templates
│      └─admin
└─static
    ├─admin
    │  ├─css
    │  ├─img
    │  │  └─gis
    │  └─js
    │     └─admin
    └─css3two_blog
        ├─documentation
        ├─fonts
        ├─images
        └─js

画这个东西的时候才知道Windows/Linux下有个命令叫 [tree][tree],大好评!
注意在开发的时候,my_blog/static 里面可以不放东西,只要 DEBUG=True 就行。如果要接受文件上传,那么在 urlpatterns 后面添加:

+ static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

实际部署时该怎么来就怎么来。
有一个 app 叫做 mytemplatetags,它是专门用来装 custom template tags/filters 的,参见 [官方文档:Custom template tags and filters][customtag]. [tree]:http://stackoverflow.com/questions/347551/what-tool-to-use-to-draw-file-tree-diagram [customtag]:https://docs.djangoproject.com/en/1.6/howto/custom-template-tags/

主机

在哪里买主机是个需要好好思考的问题。使用VPS的话,可选择的范围很大。但是第一次建网站,没什么经验,怕配置不好。更重要的是用VPS不够短平快,而我希望博客能尽快投入使用。然后就查到了WebFaction。虽然我并不想做广告,但真的向大家推荐这个主机服务,尤其是怕麻烦的人。Webfaction是个PaaS服务,支持许多语言/框架,而且服务很完善,不论是在它的 Q&A Community 提问还是open a ticket,工作人员的解答都很迅速。虽然是美国的主机(也可以选东南亚的),但是国内访问速度不错。至于其它选择,外国人用 heroku 的比较多。国内主机不太了解,SAE 据说不错。 (UPDATE: 现在我已经用了两年多 DigitalOcean,感觉还是非常不错的,参见《决定转投 DigitalOcean》)

版本控制

显然是Git+Github,没什么好说的。印象深刻的是有一次在主机上玩火敲了这个命令 find . -not -name 'xxx' | xargs rm,结果大家都懂。还好WebFaction重建一个Django app就是点击几下的事情,代码又在Github上,所以很容易就恢复了。
还有,settings.py 这个文件最好ignore掉,因为部署和开发在设置上差异很大,所以这个文件在本地和服务器上需要保存不同的版本。顺便分享一下 .gitignore 吧:

.pydevproject
.project
.settings/*
db.sqlite3
css3two_blog/migrations/*
css3two_blog/static/css3two_blog/css/unused/*
*.pyc

为什么settings.py没有包含在内呢?这个问题比较复杂,在我的另一篇文章 [Django Best Practice: How to deal with settings.py in Git][settings] 里面有详细讲述。 [settings]:http://www.laike9m.com/blog/django-best-practice-how-to-deal-with-settingspy-in-git,27/

使用Markdown

这是跟stevelosh学的,而且似乎越来越多的个人博客都在这么做。我的每一篇文章都是用markdown写的,然后渲染成html。关于如何渲染有不同的做法,一开始尝试了pygments + django markup,虽然可以实现代码高亮不过样式比较难看。目前采用的方法是把markdown文本发送给Github API,得到 gfm 格式的html。需要注意的是得到的 html 是没有样式的,所以又在网上找了别人写的 gfm 的 css,添加到页面里,显示出来的页面就和 Github 的 README 差不多了。
这部分的工作有一定难度,需要设计出一套 markdown 和 html 文件的保存机制,并且能正常应对 admin 界面中的修改/删除操作。具体可见 models.pyadmin.py

其它

  1. 使用 south 来应对 Model 的变更
  2. 尽量把逻辑放在 modelsviews 来完成,因为Django的 templates 实在很难用
  3. 虽然用了 HTML 模版,但是在前端仍然花了很多时间
  4. 博客完全可以用 Hyde 搭建,这样加载起来能快一些

> 初版:2014-2-5 > EDIT:2014-2-20 加入**文件路径结构**小节,增补其它小节内容 > EDIT:2014-6-25 django CMS 已经支持 Python3.4 > EDIT:2014-8-29 强调了博客只支持 Py3

More Repositories

1

Cyberbrain

Python debugging, redefined.
Python
2,507
star
2

pdir2

Pretty dir() printing with joy🍺
Python
1,325
star
3

Python-Type-Challenges

Master Python typing (type hints) with interactive online exercises!
Python
435
star
4

PyPunchP2P

Python实现NAT穿透+STUN+TURN+P2P聊天 | Python P2P chat
Python
428
star
5

Cyberbrain-Deprecated

[Deprecation] This project has been deprecated. Development moved to github.com/laike9m/Cyberbrain
Python
166
star
6

ezcf

Import configuration file for Pythonista
Python
159
star
7

zhihu-card

用卡片在个人网站上展示知乎账户
CSS
121
star
8

rsshub-zhihu-helper

如果你希望通过 RSSHub 浏览知乎,那么这个项目或许可以帮到你。
Python
70
star
9

Bad-Apple-Console

ASCII Art: Bad 🍎 in Windows console
C++
41
star
10

logseq-chatgpt

Talk to ChatGPT directly from Logseq
JavaScript
34
star
11

f

Log to a file without modifying code, with just one line 📝
Python
19
star
12

split_p

漫画图片分割 | split images for manga reading
Python
12
star
13

peerjs-with-nodewebkit-tutorial

How to integrate PeerJs into node-webkit/NW.js app
JavaScript
11
star
14

all_in_utf8

Recursively find and convert files to utf8 encoding
Python
5
star
15

VideoChat

elgg video chat plugin / elgg 视频通话插件
PHP
4
star
16

learn_socket

Learn Python socket programming
Python
3
star
17

CU_login

ChinaUnicom 自动登录断线重连
Python
3
star
18

logseq-twitter-sync

JavaScript
2
star
19

MusicService

读取mp3生成markdown格式的音乐列表
Python
2
star
20

Xylect

TypeScript
2
star
21

DataMining

DataMining Project
Python
1
star
22

spk_cmp2methods

compare 2 methods of speaker change detection
Python
1
star
23

h2-playground

Python
1
star
24

mysite1

My Django Project,consisting of my personal blog and the Mike Hilbert's tutorial things
Python
1
star
25

train

Python
1
star
26

Algorithm_homework_code

Python
1
star
27

pipAlwaysLatest

A wrapper around pip, install/generate requirements with the latest version
Python
1
star
28

Slides

HTML
1
star
29

cyberbrain-examples

Python
1
star
30

DumpRenrenPosts2Markdown

人人日志导出工具/Dump Renren Posts to Markdown
Python
1
star