搭建个人博客是一直就有的想法. 最近一边学习 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 上;简单地了解了网站接收和响应请求的过程. 开始好好地写博客吧!