1
1
2
2
3
3
<p align =" center " >
4
- <img src =" https://raw.githubusercontent.com/521xueweihan/img/master/hellogithub/logo/readme.gif " />
4
+ <img src =" ./cover.jpg " />
5
5
<br ><strong >HelloDjango-blog-tutorial</strong ><br >
6
6
<strong >完全免费、开源的 HelloDjango 系列教程之博客开发</strong >。<br >
7
7
基于 django 2.2,带你从零开始一步步创建属于自己的博客网站。
8
8
</p >
9
9
10
+
10
11
<p align =" center " >
11
12
<a href =" https://raw.githubusercontent.com/521xueweihan/img/master/hellogithub/logo/weixin.png " ><img src =" https://img.shields.io/badge/Talk-%E5%BE%AE%E4%BF%A1%E7%BE%A4-brightgreen.svg?style=popout-square " alt =" WeiXin " ></a >
12
13
<a href =" https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial/stargazers " ><img src =" https://img.shields.io/github/stars/HelloGitHub-Team/HelloDjango-blog-tutorial.svg?style=popout-square " alt =" GitHub stars " ></a >
13
14
<a href =" https://weibo.com/hellogithub " ><img src =" https://img.shields.io/badge/%E6%96%B0%E6%B5%AA-Weibo-red.svg?style=popout-square " alt =" Sina Weibo " ></a >
14
15
</p >
16
+ ** 特别说明** :本项目不仅仅是教程用的演示项目!我们的目标是开发一个功能完善、测试充分、可用于生产环境的开源博客系统。和其他开源博客系统不同点在于,我们以教程的形式详细记录项目从 0 到 1 的开发过程。
15
17
16
18
## 分支说明
17
19
18
- tutorial 分支为项目的主分支,每一篇教程的代码都和历史提交以及标签一一对应。
19
-
20
- 例如第一篇教程对应第一个 commit,对应标签为 step1,依次类推。
20
+ master 分支为项目的主分支,每一步关键功能的开发都对应一篇详细的教程,并和历史提交以及标签一一对应。例如第一篇教程对应第一个 commit,对应标签为 step1,依次类推。
21
21
22
22
## 资源列表
23
23
24
- - [ 在线演示] ( https://hellodjango-blog-tutorial-demo.zmrenwu.com/ )
25
- - 首发 HelloGitHub 微信公众号,博客同步更新:[ HelloDjango - Django博客教程(第二版)] ( https://zmrenwu.com/courses/hellodjango-blog-tutorial/ )
26
- - 项目前端模板:[ Blog templates] ( https://github.com/zmrenwu/django-blog-tutorial-templates )
24
+ - [ 成品在线预览] ( https://hellodjango-blog-tutorial-demo.zmrenwu.com/ )
25
+ - 教程首发 HelloGitHub 微信公众号和 [ 追梦人物的博客] ( https://www.zmrenwu.com/ ) ,在线学习地址:[ HelloDjango - Django博客教程(第二版)] ( https://zmrenwu.com/courses/hellodjango-blog-tutorial/ )
26
+ - 项目 [ 源码仓库] ( https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial )
27
+ - 项目 [ 前端模板源码仓库] ( https://github.com/zmrenwu/django-blog-tutorial-templates )
27
28
28
29
## 本地运行
29
30
30
- ### Pipenv
31
+ 可以使用 Virtualenv、 Pipenv、Docker 等在本地运行项目,每种方式都只需运行简单的几条命令就可以了。
31
32
32
- 1 . ** 克隆项目到本地**
33
+ > ** 注意:**
34
+ >
35
+ > 因为博客全文搜索功能依赖 Elasticsearch 服务,如果使用 Virtualenv 或者 Pipenv 启动项目而不想搭建 Elasticsearch 服务的话,请先设置环境变量 ` ENABLE_HAYSTACK_REALTIME_SIGNAL_PROCESSOR=no ` 以关闭实时索引,否则无法创建博客文章。如果关闭实时索引,全文搜索功能将不可用。
36
+ >
37
+ > Windows 设置环境变量的方式:` set ENABLE_HAYSTACK_REALTIME_SIGNAL_PROCESSOR=no `
38
+ >
39
+ > Linux 或者 macOS:` export ENABLE_HAYSTACK_REALTIME_SIGNAL_PROCESSOR=no `
40
+ >
41
+ > 使用 Docker 启动则无需设置,因为会自动启动一个包含 Elasticsearch 服务的 Docker 容器。
33
42
34
- ```
35
- git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git
36
- ```
37
-
38
- 2 . ** 安装 Pipenv(已安装跳过)**
43
+ 无论采用何种方式,先克隆代码到本地:
39
44
45
+ ``` bash
46
+ $ git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git
47
+ ```
48
+
49
+ ### Virtualenv
50
+
51
+ 1 . 创建虚拟环境并激活虚拟环境,具体方法可参考:[ 开始进入 django 开发之旅:使用虚拟环境] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/59/#%E4%BD%BF%E7%94%A8%E8%99%9A%E6%8B%9F%E7%8E%AF%E5%A2%83 )
52
+
53
+ 2 . 安装项目依赖
54
+
55
+ ``` bash
56
+ $ cd HelloDjango-blog-tutorial
57
+ $ pip install -r requirements.txt
40
58
```
41
- pip install pipenv
42
- ```
43
-
44
- 3 . ** 安装项目依赖**
45
59
60
+ 3 . 迁移数据库
61
+
62
+ ``` bash
63
+ $ python manage.py migrate
46
64
```
47
- cd HelloDjango-blog-tutorial
48
- pipenv install --dev
65
+
66
+ 4 . 创建后台管理员账户
67
+
68
+ ``` bash
69
+ $ python manage.py createsuperuser
49
70
```
50
-
51
- > 关于如何使用 Pipenv,参阅:[ 开始进入 django 开发之旅] ( http://zmrenwu.com/post/3/ ) 的 Pipenv 创建和管理虚拟环境部分。
52
71
53
- 4 . ** 迁移数据库**
72
+ 具体请参阅 [ 创作后台开启,请开始你的表演] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/ ) 。
73
+
74
+ 5 . 运行开发服务器
54
75
55
- 在项目根目录运行如下命令迁移数据库:
76
+ ``` bash
77
+ $ python manage.py runserver
56
78
```
57
- pipenv run python manage.py migrate
79
+
80
+ 6 . 浏览器访问 http://127.0.0.1:8000/admin,使用第 4 步创建的管理员账户登录后台发布文章,如何发布文章可参考:[ 创作后台开启,请开始你的表演] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/ ) 。
81
+
82
+ 或者执行 fake 脚本批量生成测试数据:
83
+
84
+ ``` bash
85
+ $ python -m scripts.fake
58
86
```
59
87
60
- 5 . ** 创建后台管理员账户**
88
+ > 批量脚本会清除全部已有数据,包括第 4 步创建的后台管理员账户。脚本会再默认生成一个管理员账户,用户名和密码都是 admin。
89
+
90
+ 9 . 浏览器访问:http://127.0.0.1:8000,可进入到博客首页
91
+
92
+ ### Pipenv
93
+
94
+ 1 . 安装 Pipenv(已安装可跳过)
95
+
96
+ ``` bash
97
+ $ pip install pipenv
98
+ ```
99
+
100
+ 2. 安装项目依赖
101
+
102
+ ` ` ` bash
103
+ $ cd HelloDjango-blog-tutorial
104
+ $ pipenv install --dev
105
+ ` ` `
106
+
107
+ 关于如何使用 Pipenv,参阅:[开始进入 django 开发之旅](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/59/) 的 Pipenv 创建和管理虚拟环境部分。
108
+
109
+ 3. 迁移数据库
110
+
111
+ 在项目根目录运行如下命令迁移数据库:
112
+ ` ` ` bash
113
+ $ pipenv run python manage.py migrate
114
+ ` ` `
115
+
116
+ 4. 创建后台管理员账户
61
117
62
118
在项目根目录运行如下命令创建后台管理员账户
63
119
64
- ```
65
- pipenv run python manage.py createsuperuser
120
+ ` ` ` bash
121
+ $ pipenv run python manage.py createsuperuser
66
122
` ` `
67
123
68
124
具体请参阅 [创作后台开启,请开始你的表演](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/)。
69
125
70
- 6 . ** 运行开发服务器**
126
+ 5. 运行开发服务器
71
127
72
128
在项目根目录运行如下命令开启开发服务器:
73
129
74
- ```
75
- pipenv run python manage.py runserver
130
+ ` ` ` bash
131
+ $ pipenv run python manage.py runserver
76
132
` ` `
77
133
78
- 在浏览器访问: http://127.0.0.1:8000
134
+ 6. 浏览器访问 http://127.0.0.1:8000/admin,使用第 4 步创建的管理员账户登录后台发布文章,如何发布文章可参考:[创作后台开启,请开始你的表演](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/)。
79
135
80
- 7 . ** 进入后台发布文章 **
136
+ 或者执行 fake 脚本批量生成测试数据:
81
137
82
- 在浏览器访问:http://127.0.0.1:8000/admin
138
+ ` ` ` bash
139
+ $ pipenv run python -m scripts.fake
140
+ ` ` `
83
141
84
- 使用第 5 步创建的后台管理员账户登录后台 。
142
+ > 批量脚本会清除全部已有数据,包括第 4 步创建的后台管理员账户。脚本会再默认生成一个管理员账户,用户名和密码都是 admin 。
85
143
144
+ 7. 在浏览器访问:http://127.0.0.1:8000/,可进入到博客首页。
86
145
87
146
# ## Docker
88
147
89
- 1 . ** 安装 Docker 和 Docker Compose**
148
+ 1. 安装 Docker 和 Docker Compose
149
+
150
+ 3. 构建和启动容器
90
151
91
- 2 . ** 克隆项目到本地**
152
+ ` ` ` bash
153
+ $ docker-compose -f local.yml build
154
+ $ docker-compose -f local.yml up
155
+ ` ` `
156
+
157
+ 4. 创建后台管理员账户
92
158
159
+ ` ` ` bash
160
+ $ docker exec -it hellodjango_blog_tutorial_local python manage.py createsuperuser
93
161
` ` `
94
- git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git
162
+
163
+ 其中 hellodjango_blog_tutorial_local 为项目预定义容器名。
164
+
165
+ 4. 浏览器访问 http://127.0.0.1:8000/admin,使用第 3 步创建的管理员账户登录后台发布文章,如何发布文章可参考:[创作后台开启,请开始你的表演](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/)。
166
+
167
+ 或者执行 fake 脚本批量生成测试数据:
168
+
169
+ ` ` ` bash
170
+ $ docker exec -it hellodjango_blog_tutorial_local python -m scripts.fake
171
+ ` ` `
172
+
173
+ > 批量脚本会清除全部已有数据,包括第 3 步创建的后台管理员账户。脚本会再默认生成一个管理员账户,用户名和密码都是 admin。
174
+
175
+ 5. 为 fake 脚本生成的博客文章创建索引,这样就可以使用 Elasticsearch 服务搜索文章
176
+
177
+ ` ` ` bash
178
+ $ docker exec -it hellodjango_blog_tutorial_local python manage.py rebuild_index
95
179
` ` `
96
180
97
- 3 . ** 构建镜像和启动容器**
181
+ > 通过 admin 后台添加的文章会自动创建索引。
182
+
183
+ 6. 在浏览器访问:http://127.0.0.1:8000/,可进入到博客首页。
184
+
185
+ # ## 线上部署
186
+
187
+ 线上部署的详细文档请参考下方教程目录索引中的 ** 部署篇** 部分,如果不想了解细节或已了解细节,使用 Docker 仅需以下几个简单步骤就可以上线运行:
188
+
189
+ > ** 小贴士:**
190
+ >
191
+ > 国内服务器请设置好镜像加速,否则 Docker 构建容器的过程会非常缓慢!具体可参考 ** 部署篇** Docker 部署 django 中线上部署部分的内容。
98
192
193
+ 1. 克隆代码到服务器
194
+
195
+ ` ` ` bash
196
+ $ git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git
99
197
` ` `
100
- docker-compose -f local.yml build
101
- docker-compose -f local.yml up
198
+
199
+ 2. 创建环境变量文件用于存放项目敏感信息
200
+
201
+ ` ` ` bash
202
+ $ cd HelloDjango-blog-tutorial
203
+ $ mkdir .envs
204
+ $ touch .envs/.production
102
205
` ` `
103
206
104
- 4 . ** 创建后台管理员账户 **
207
+ 3. 在 .production 文件写入下面的内容并保存
105
208
106
209
```
107
- docker exec -it hellodjango_blog_tutorial_local python manage.py createsuperuser
210
+ # django 用于签名和加密等功能的密钥,泄露会严重降低网站的安全性
211
+ # 推荐使用这个工具生成:https://miniwebtool.com/django-secret-key-generator/
212
+ DJANGO_SECRET_KEY=0p72%e@r3qr$bq%%&bxj#_ bem+na2t^0(#((fom6eewrg)gyb^
213
+
214
+ # 设置 django 启动时加载的配置文件
215
+ DJANGO_SETTINGS_MODULE=blogproject.settings.production
216
+ ```
217
+
218
+ 4. 修改 Nginx 配置:复制 compose/nginx/hellodjango-blog-tutorial.conf-tmpl 到同一目录,并重命名为 hellodjango-blog-tutorial.conf,修改第 6 行的 server_name 为自己的域名(如果没有域名就改为服务器的公网 ip 地址)
219
+
220
+ 5. 启动容器
221
+
222
+ ```bash
223
+ $ docker-compose -f production.yml up --build -d
108
224
```
109
225
110
- 其中 hellodjango_blog_tutorial_local 为项目预定义容器名
226
+ 6 . 执行 docker ps 检查容器启动状况,看到如下的 3 个容器说明启动成功:
111
227
112
- 5 . 进入后台发布文章
228
+ - hellodjango_blog_tutorial_nginx
229
+ - hellodjango_blog_tutorial_elasticsearch
230
+ - hellodjango_blog_tutorial
113
231
114
- 在浏览器访问: http://127.0.0.1:8000/admin
232
+ 7 . 配置 HTTPS 证书(没有配置域名无法配置,只能通过服务器 ip 以 HTTP 协议访问)
115
233
116
- 使用第 3 步创建的后台管理员账户登录
234
+ ``` bash
235
+ $ docker
exec -it hellodjango_blog_tutorial_nginx certbot --nginx -n --agree-tos --redirect --email
[email protected] -d hellodjango-blog-tutorial-demo.zmrenwu.com
236
+ ```
117
237
118
- 具体请参阅 [ 创作后台开启,请开始你的表演] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/ ) 。
238
+ 解释一下各参数的含义:
239
+
240
+ - --nginx,使用 Nginx 插件
241
+ - -n 非交互式,否则会弹出询问框
242
+ - --redirect,自动配置 Nginx,将所有 http 请求都重定向到 https
243
+ - --email
[email protected] ,替换为自己的 email,用于接收通知
244
+ - -d 域名列表,开启 https 的域名,替换为自己的域名,多个域名用逗号分隔
245
+
246
+ 8 . 浏览器访问域名或者服务器 ip 即可进入博客首页
119
247
120
248
## 教程目录索引
121
249
122
- ** 基础 **
250
+ ** 基础篇 **
123
251
124
252
1 . [ 开始进入 django 开发之旅] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/59/ )
125
253
2 . [ "空空如也"的博客应用] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/60/ )
@@ -136,10 +264,16 @@ tutorial 分支为项目的主分支,每一篇教程的代码都和历史提
136
264
13 . [ 分类、归档和标签页] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/71/ )
137
265
14 . [ 交流的桥梁:评论功能] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/72/ )
138
266
15 . [ 优化博客功能细节,提升使用体验] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/73/ )
267
+
268
+ ** 部署篇**
269
+
139
270
16 . [ Nginx+Gunicorn+Supervisor 部署 Django 博客应用] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/74/ )
140
271
17 . [ 使用 Fabric 自动化部署] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/75/ )
141
272
18 . [ 使用 Certbot 向 Let's Encrypt 免费申请 HTTPS 证书] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/76/ )
142
273
19 . [ 使用 Docker 让部署 Django 项目更加轻松] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/77/ )
274
+
275
+ ** 进阶篇**
276
+
143
277
20 . [ 开发博客文章阅读量统计功能] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/78/ )
144
278
21 . [ Django 官方推荐的姿势:类视图] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/79/ )
145
279
22 . [ 在脚本中使用 ORM:Faker 批量生成测试数据] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/80/ )
@@ -149,6 +283,9 @@ tutorial 分支为项目的主分支,每一篇教程的代码都和历史提
149
283
26 . [ 开启 Django 博客的 RSS 功能] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/84/ )
150
284
27 . [ Django 博客实现简单的全文搜索] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/85/ )
151
285
28 . [ Django Haystack 全文检索与关键词高亮] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/86/ )
286
+
287
+ ** 测试篇**
288
+
152
289
29 . [ 单元测试:测试 blog 应用] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/87/ )
153
290
30 . [ 单元测试:测试评论应用] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/88/ )
154
291
31 . [ Coverage.py 统计测试覆盖率] ( https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/89/ )
@@ -160,5 +297,12 @@ tutorial 分支为项目的主分支,每一篇教程的代码都和历史提
160
297
</p >
161
298
162
299
163
- ## 声明
300
+ ## QQ 群
301
+
302
+ 加入 QQ 群和更多的 django 开发者进行交流:
303
+
304
+ Django学习小组主群:696899473
305
+
306
+ ## 版权声明
307
+
164
308
<img alt =" 知识共享许可协议 " style =" border-width : 0 " src =" https://licensebuttons.net/l/by-nc-nd/4.0/88x31.png " ></a ><br >本作品采用<a rel =" license " href =" https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh " >署名-非商业性使用-禁止演绎 4.0 国际 </a >进行许可。
0 commit comments