{"id":22848314,"url":"https://github.com/hellogithub-team/hellodjango-blog-tutorial","last_synced_at":"2025-05-16T06:04:44.042Z","repository":{"id":40244154,"uuid":"198028393","full_name":"HelloGitHub-Team/HelloDjango-blog-tutorial","owner":"HelloGitHub-Team","description":"免费带你学 django 全栈！基于 django 2.2 的个人博客，初学者绝对不能错过的 django 教程！｡◕ᴗ◕｡","archived":false,"fork":false,"pushed_at":"2023-06-22T10:51:01.000Z","size":5680,"stargazers_count":1387,"open_issues_count":13,"forks_count":314,"subscribers_count":45,"default_branch":"master","last_synced_at":"2025-04-08T15:14:04.622Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.zmrenwu.com/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/HelloGitHub-Team.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2019-07-21T07:49:58.000Z","updated_at":"2025-04-02T11:25:16.000Z","dependencies_parsed_at":"2024-12-27T06:06:31.552Z","dependency_job_id":"e24fd264-80e4-45d8-a883-ff96d2d0b937","html_url":"https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial","commit_stats":{"total_commits":37,"total_committers":1,"mean_commits":37.0,"dds":0.0,"last_synced_commit":"ceb8c1edf9deed7177e07f5a3d4920c7602ebdad"},"previous_names":[],"tags_count":31,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloGitHub-Team%2FHelloDjango-blog-tutorial","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloGitHub-Team%2FHelloDjango-blog-tutorial/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloGitHub-Team%2FHelloDjango-blog-tutorial/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/HelloGitHub-Team%2FHelloDjango-blog-tutorial/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/HelloGitHub-Team","download_url":"https://codeload.github.com/HelloGitHub-Team/HelloDjango-blog-tutorial/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254478186,"owners_count":22077675,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-13T04:11:19.018Z","updated_at":"2025-05-16T06:04:44.023Z","avatar_url":"https://github.com/HelloGitHub-Team.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./cover.jpg\"/\u003e\n  \u003cbr\u003e\u003cstrong\u003eHelloDjango-blog-tutorial\u003c/strong\u003e\u003cbr\u003e\n  \u003cstrong\u003e完全免费、开源的 HelloDjango 系列教程之博客开发\u003c/strong\u003e。\u003cbr\u003e\n  基于 django 2.2，带你从零开始一步步创建属于自己的博客网站。\n\u003c/p\u003e\n\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://raw.githubusercontent.com/521xueweihan/img/master/hellogithub/logo/weixin.png\"\u003e\u003cimg src=\"https://img.shields.io/badge/Talk-%E5%BE%AE%E4%BF%A1%E7%BE%A4-brightgreen.svg?style=popout-square\" alt=\"WeiXin\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial/stargazers\"\u003e\u003cimg src=\"https://img.shields.io/github/stars/HelloGitHub-Team/HelloDjango-blog-tutorial.svg?style=popout-square\" alt=\"GitHub stars\"\u003e\u003c/a\u003e\n  \u003ca href=\"https://weibo.com/hellogithub\"\u003e\u003cimg src=\"https://img.shields.io/badge/%E6%96%B0%E6%B5%AA-Weibo-red.svg?style=popout-square\" alt=\"Sina Weibo\"\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**特别说明**：本项目不仅仅是教程用的演示项目！我们的目标是开发一个功能完善、测试充分、可用于生产环境的开源博客系统。和其他开源博客系统不同点在于，我们以教程的形式详细记录项目从 0 到 1 的开发过程。\n\n## 分支说明\n\nmaster 分支为项目的主分支，每一步关键功能的开发都对应一篇详细的教程，并和历史提交以及标签一一对应。例如第一篇教程对应第一个 commit，对应标签为 step1，依次类推。\n\n## 资源列表\n\n- [成品在线预览](https://hellodjango-blog-tutorial-demo.zmrenwu.com/)\n- 教程首发 HelloGitHub 微信公众号和 [追梦人物的博客](https://www.zmrenwu.com/)，在线学习地址：[HelloDjango - Django博客教程（第二版）](https://zmrenwu.com/courses/hellodjango-blog-tutorial/)\n- 项目 [源码仓库](https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial)\n- 项目 [前端模板源码仓库](https://github.com/zmrenwu/django-blog-tutorial-templates)\n\n## 本地运行\n\n可以使用 Virtualenv、Pipenv、Docker 等在本地运行项目，每种方式都只需运行简单的几条命令就可以了。\n\n\u003e **注意：**\n\u003e\n\u003e 因为博客全文搜索功能依赖 Elasticsearch 服务，如果使用 Virtualenv 或者 Pipenv 启动项目而不想搭建 Elasticsearch 服务的话，请先设置环境变量 `ENABLE_HAYSTACK_REALTIME_SIGNAL_PROCESSOR=no` 以关闭实时索引，否则无法创建博客文章。如果关闭实时索引，全文搜索功能将不可用。\n\u003e\n\u003e Windows 设置环境变量的方式：`set ENABLE_HAYSTACK_REALTIME_SIGNAL_PROCESSOR=no`\n\u003e\n\u003e Linux 或者 macOS：`export ENABLE_HAYSTACK_REALTIME_SIGNAL_PROCESSOR=no`\n\u003e\n\u003e 使用 Docker 启动则无需设置，因为会自动启动一个包含 Elasticsearch 服务的 Docker 容器。\n\n无论采用何种方式，先克隆代码到本地：\n\n```bash\n$ git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git\n```\n\n### Virtualenv\n\n1. 创建虚拟环境并激活虚拟环境，具体方法可参考：[开始进入 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)\n\n2. 安装项目依赖\n\n   ```bash\n   $ cd HelloDjango-blog-tutorial\n   $ pip install -r requirements.txt\n   ```\n\n3. 迁移数据库\n\n   ```bash\n   $ python manage.py migrate\n   ```\n\n4. 创建后台管理员账户\n\n   ```bash\n   $ python manage.py createsuperuser\n   ```\n\n   具体请参阅 [创作后台开启，请开始你的表演](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/)。\n\n5. 运行开发服务器\n\n   ```bash\n   $ python manage.py runserver\n   ```\n\n6. 浏览器访问 http://127.0.0.1:8000/admin，使用第 4 步创建的管理员账户登录后台发布文章，如何发布文章可参考：[创作后台开启，请开始你的表演](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/)。\n\n   或者执行 fake 脚本批量生成测试数据：\n\n   ```bash\n   $ python -m scripts.fake\n   ```\n\n   \u003e 批量脚本会清除全部已有数据，包括第 4 步创建的后台管理员账户。脚本会再默认生成一个管理员账户，用户名和密码都是 admin。\n\n9. 浏览器访问：http://127.0.0.1:8000，可进入到博客首页\n\n### Pipenv\n\n1. 安装 Pipenv（已安装可跳过）\n\n    ```bash\n    $ pip install pipenv\n    ```\n\n2. 安装项目依赖\n\n    ```bash\n    $ cd HelloDjango-blog-tutorial\n    $ pipenv install --dev\n    ```\n\n    关于如何使用 Pipenv，参阅：[开始进入 django 开发之旅](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/59/) 的 Pipenv 创建和管理虚拟环境部分。\n\n3. 迁移数据库\n\n    在项目根目录运行如下命令迁移数据库：\n    ```bash\n    $ pipenv run python manage.py migrate\n    ```\n\n4. 创建后台管理员账户\n\n   在项目根目录运行如下命令创建后台管理员账户\n   \n   ```bash\n   $ pipenv run python manage.py createsuperuser\n   ```\n\n   具体请参阅 [创作后台开启，请开始你的表演](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/)。\n\n5. 运行开发服务器\n\n   在项目根目录运行如下命令开启开发服务器：\n\n   ```bash\n   $ pipenv run python manage.py runserver\n   ```\n\n6. 浏览器访问 http://127.0.0.1:8000/admin，使用第 4 步创建的管理员账户登录后台发布文章，如何发布文章可参考：[创作后台开启，请开始你的表演](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/)。\n\n   或者执行 fake 脚本批量生成测试数据：\n\n   ```bash\n   $ pipenv run python -m scripts.fake\n   ```\n\n   \u003e 批量脚本会清除全部已有数据，包括第 4 步创建的后台管理员账户。脚本会再默认生成一个管理员账户，用户名和密码都是 admin。\n\n7. 在浏览器访问：http://127.0.0.1:8000/，可进入到博客首页。\n\n### Docker\n\n1. 安装 Docker 和 Docker Compose\n\n3. 构建和启动容器\n\n   ```bash\n   $ docker-compose -f local.yml build\n   $ docker-compose -f local.yml up\n   ```\n\n4. 创建后台管理员账户\n\n   ```bash\n   $ docker exec -it hellodjango_blog_tutorial_local python manage.py createsuperuser\n   ```\n\n   其中 hellodjango_blog_tutorial_local 为项目预定义容器名。\n\n4. 浏览器访问 http://127.0.0.1:8000/admin，使用第 3 步创建的管理员账户登录后台发布文章，如何发布文章可参考：[创作后台开启，请开始你的表演](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/)。\n\n   或者执行 fake 脚本批量生成测试数据：\n\n   ```bash\n   $ docker exec -it hellodjango_blog_tutorial_local python -m scripts.fake\n   ```\n\n   \u003e  批量脚本会清除全部已有数据，包括第 3 步创建的后台管理员账户。脚本会再默认生成一个管理员账户，用户名和密码都是 admin。\n\n5. 为 fake 脚本生成的博客文章创建索引，这样就可以使用 Elasticsearch 服务搜索文章\n\n   ```bash\n   $ docker exec -it hellodjango_blog_tutorial_local python manage.py rebuild_index\n   ```\n\n   \u003e 通过 admin 后台添加的文章会自动创建索引。\n\n6. 在浏览器访问：http://127.0.0.1:8000/，可进入到博客首页。\n\n### 线上部署\n\n线上部署的详细文档请参考下方教程目录索引中的 **部署篇** 部分，如果不想了解细节或已了解细节，使用 Docker 仅需以下几个简单步骤就可以上线运行：\n\n\u003e **小贴士：**\n\u003e\n\u003e 国内服务器请设置好镜像加速，否则 Docker 构建容器的过程会非常缓慢！具体可参考 **部署篇** Docker 部署 django 中线上部署部分的内容。\n\n1. 克隆代码到服务器\n\n   ```bash\n   $ git clone https://github.com/HelloGitHub-Team/HelloDjango-blog-tutorial.git\n   ```\n\n2. 创建环境变量文件用于存放项目敏感信息\n\n   ```bash\n   $ cd HelloDjango-blog-tutorial\n   $ mkdir .envs\n   $ touch .envs/.production\n   ```\n\n3. 在 .production 文件写入下面的内容并保存\n\n   ```\n   # django 用于签名和加密等功能的密钥，泄露会严重降低网站的安全性\n   # 推荐使用这个工具生成：https://miniwebtool.com/django-secret-key-generator/\n   DJANGO_SECRET_KEY=0p72%e@r3qr$bq%%\u0026bxj#_bem+na2t^0(#((fom6eewrg)gyb^\n   \n   # 设置 django 启动时加载的配置文件\n   DJANGO_SETTINGS_MODULE=blogproject.settings.production\n   ```\n\n4. 修改 Nginx 配置：复制 compose/nginx/hellodjango-blog-tutorial.conf-tmpl 到同一目录，并重命名为 hellodjango-blog-tutorial.conf，修改第 6 行的 server_name 为自己的域名（如果没有域名就改为服务器的公网 ip 地址）\n\n5. 启动容器\n\n   ```bash\n   $ docker-compose -f production.yml up --build -d\n   ```\n\n6. 执行 docker ps 检查容器启动状况，看到如下的 3 个容器说明启动成功：\n\n   - hellodjango_blog_tutorial_nginx\n   - hellodjango_blog_tutorial_elasticsearch\n   - hellodjango_blog_tutorial\n\n7. 配置 HTTPS 证书（没有配置域名无法配置，只能通过服务器 ip 以 HTTP 协议访问）\n\n   ```bash\n   $ docker exec -it hellodjango_blog_tutorial_nginx certbot --nginx -n --agree-tos --redirect --email email@hellodjango.com -d hellodjango-blog-tutorial-demo.zmrenwu.com\n   ```\n\n   解释一下各参数的含义：\n\n   - --nginx，使用 Nginx 插件\n   - -n 非交互式，否则会弹出询问框\n   - --redirect，自动配置 Nginx，将所有 http 请求都重定向到 https\n   - --email xxx@xxx.com，替换为自己的 email，用于接收通知\n   - -d 域名列表，开启 https 的域名，替换为自己的域名，多个域名用逗号分隔\n\n8. 浏览器访问域名或者服务器 ip 即可进入博客首页\n\n## 教程目录索引\n\n**基础篇**\n\n1. [开始进入 django 开发之旅](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/59/)\n2. [\"空空如也\"的博客应用](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/60/)\n3. [创建 Django 博客的数据库模型](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/61/)\n4. [Django 迁移、操作数据库](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/62/)\n5. [Django 的接客之道](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/63/)\n6. [博客从“裸奔”到“有皮肤”](https://www.zmrenwu.com/courseqs/hellodjango-blog-tutorial/materials/64/)\n7. [创作后台开启，请开始你的表演](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/65/)\n8. [开发博客文章详情页](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/66/)\n9. [让博客支持 Markdown 语法和代码高亮](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/67/)\n10. [Markdown 文章自动生成目录，提升阅读体验](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/68/)\n11. [自动生成文章摘要](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/69/)\n12. [页面侧边栏：使用自定义模板标签](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/70/)\n13. [分类、归档和标签页](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/71/)\n14. [交流的桥梁：评论功能](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/72/)\n15. [优化博客功能细节，提升使用体验](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/73/)\n\n**部署篇**\n\n16. [Nginx+Gunicorn+Supervisor 部署 Django 博客应用](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/74/)\n17. [使用 Fabric 自动化部署](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/75/)\n18. [使用 Certbot 向 Let's Encrypt 免费申请 HTTPS 证书](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/76/)\n19. [使用 Docker 让部署 Django 项目更加轻松](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/77/)\n\n**进阶篇**\n\n20. [开发博客文章阅读量统计功能](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/78/)\n21. [Django 官方推荐的姿势：类视图](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/79/)\n22. [在脚本中使用 ORM：Faker 批量生成测试数据](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/80/)\n23. [通过 Django Pagination 实现简单分页](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/81/)\n24. [稳定易用的 Django 分页库，完善分页功能](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/82/)\n25. [统计各个分类和标签下的文章数](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/83/)\n26. [开启 Django 博客的 RSS 功能](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/84/)\n27. [Django 博客实现简单的全文搜索](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/85/)\n28. [Django Haystack 全文检索与关键词高亮](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/86/)\n\n**测试篇**\n\n29. [单元测试：测试 blog 应用](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/87/)\n30. [单元测试：测试评论应用](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/88/)\n31. [Coverage.py 统计测试覆盖率](https://www.zmrenwu.com/courses/hellodjango-blog-tutorial/materials/89/)\n\n## 继续学习\n有了以上的 django 基础，让我继续学习 [django REST framework 教程](https://www.zmrenwu.com/courses/django-rest-framework-tutorial/)\n\n## 公众号\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/521xueweihan/img/master/hellogithub/logo/weixin.png\" style=\"max-width:70%;\"\u003e\u003cbr\u003e\n欢迎关注 HelloGitHub 公众号，获取更多开源项目的资料和内容。\n\u003c/p\u003e\n\n\n## QQ 群\n\n加入 QQ 群和更多的 django 开发者进行交流：\n\nDjango学习小组主群：696899473\n\n## 版权声明\n\n\u003cimg alt=\"知识共享许可协议\" style=\"border-width: 0\" src=\"https://licensebuttons.net/l/by-nc-nd/4.0/88x31.png\"\u003e\u003c/a\u003e\u003cbr\u003e本作品采用\u003ca rel=\"license\" href=\"https://creativecommons.org/licenses/by-nc-nd/4.0/deed.zh\"\u003e署名-非商业性使用-禁止演绎 4.0 国际 \u003c/a\u003e进行许可。","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhellogithub-team%2Fhellodjango-blog-tutorial","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhellogithub-team%2Fhellodjango-blog-tutorial","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhellogithub-team%2Fhellodjango-blog-tutorial/lists"}