搭建个人博客是一直就有的想法. 最近一边学习 Django Tutorial, 一边照猫画虎, 折腾了一个. 本来非常头痛的样式问题, 恰好看到了 luoshao23/blogproj, 果断 fork 过来, 写了一点后端代码, 过程中参考了 laike9m/My_Blog, 在此非常感谢两位.

搭建的思路其实比较简单 (毕竟是站在前人的肩膀上 @@). Django app 遵循 Model-Template-View 设计原则, Model 是存储和操作的数据模型, Template 是显示模板, View 用来接受并回应请求, 对于博客来说就是把文章和相关内容填写到模板里去.

admin ModelFormhtml_file FileFieldsave_modelValueError: I/O operation on closed fileModelFormrequest.FILEModelFormoriginal_file

然后是图片的存储和显示. 我希望在写作时不需要考虑图片的重名和 url, 所以在文章内链接图片的时候, 只在当前文章的关联图片里查找 包含 给定名称的图片, 因为 django 会对上传的重名图片自动加一个后缀, 这样就可以避免链接到错误图片或着找不到图片.

model.py
python manage.py migrate
python manage.py makemigrations
python manage.py migrate
migrations/xxx__auto__XXXX.py

最后整个博客的文件结构大概这样:

├── blog
│   ├── admin.py
│   ├── apps.py
│   ├── feeds.py
│   ├── __init__.py
│   ├── models.py
│   ├── search_indexes.py
│   ├── static
│   │   └── blog
│   ├── templatetags
│   │   ├── blog_tags.py
│   │   └── __init__.py
│   ├── tests.py
│   ├── urls.py
│   ├── views.py
│   └── whoosh_cn_backend.py
├── blogproj
│   ├── __init__.py
│   ├── settings.py
│   ├── urls.py
│   └── wsgi.py
├── collected_static
│   ├── admin
│   └── blog
├── comments
│   ├── admin.py
│   ├── apps.py
│   ├── forms.py
│   ├── __init__.py
│   ├── models.py
│   ├── tests.py
│   ├── urls.py
│   └── views.py
├── db.sqlite3
├── manage.py
├── README.md
├── requirements.txt
└── templates
    ├── base.html
    ├── blog
    │   ├── about.html
    │   ├── blog.html
    │   ├── contact.html
    │   ├── detail.html
    │   └── index.html
    └── search
    ├── indexes
    │   └── blog
    │       └── post_text.txt
    └── search.html
部署
python manager.py check --deploy

其他的设置参照了 digitalocean Tutorial: How To Set Up Django with Postgres, Nginx, and Gunicorn on Ubuntu 16.04, 创建 postgres 用户, 配置 gunicorn 和 nginx.

/etc/postgresql//main/pg_hba.confpeermd5
# "local" is for Unix domain socket connections only
local   all             all                                     peer
/etc/systemd/system/gunicorn.servicegunicorn.serviceEnvironment
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=user
Group=www-data
Environment="Environment Variables"
WorkingDirectory=/path/to/blogproj
ExecStart=/path/to/gunicorn --access-logfile - --workers 3 --bind unix:/path/to/blogproj/blogproj.sock blogproj.wsgi:application

[Install]
WantedBy=multi-user.target
gunicorn.service
sudo systemctl daemon-reload
sudo systemctl enable gunicorn
sudo systemctl start gunicorn
blogproj.conf
server {
    listen 80;
    server_name ip_or_domain_name;

    location = favicon.ico {access_log off; log_not_found off; }
    location /static/ { alias /path/to/blogproj/collected_static/; }
    location / {
    include proxy_params;
    proxy_pass http://unix:/path/to/blogproj/blogproj.sock;
    }
}
blogproj.conf/etc/nginx/sites-enabled/
sudo ln -s -T /path/to/blogproj.conf /etc/nginx/sites-enabled/blogproj.conf
sudo systemctl restart nginx
小结

根据 luoshao23/blogproj 尝试使用 Python Django 搭建了博客, 并利用 gunicorn 和 nginx 部署在 VPS 上;简单地了解了网站接收和响应请求的过程. 开始好好地写博客吧!