生成环境部署

发布到生产环境的步骤

  • 配置生产环境配置 (settings):DEBUG & Secret 相关信息

  • 选择Django App的托管环境 (IaaS/PaaS,比如 阿里云/AWS/Azure/GAE/Heroku 等等)

  • 部署前的安全检查

  • 选择静态资源文件的托管环境(包括JS/CSS/图片/文件等) & 部署静态资源

  • 部署 Django 应用容器 & Web服务器

让网站准备好发布

必须调整的关键配置是:

  • DEBUG. 在生产环境中设置为 False(DEBUG = False)。避免在 web 页面上显示敏感的调试跟踪和变量信息

  • SECRET_KEY. 这是用于CSRF保护的随机值

  • ALLOWED_HOSTS, 生产环境必须设置 允许访问的域名

  • 生成 SECRET KEY

    $ python -c 'from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())'
    

密钥的存储和管理

  • 从环境变量读取配置, 或从配置文件中读取

import os

DEBUG = FALSE
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'xxxxzz')
ALLOWED_HOSTS = ["127.0.0.1", "域名", ]
  • 从 KMS 系统中读取配置的密钥

    • 自己部署的 KMS 系统

    • 云服务的 KMS 服务: 阿里云/AWS 的 KMS 服务

部署前的安全检查

$ python manage.py check --deploy

静态资源文件的托管环境

  • 静态内容 Web 服务器: Apache/Nginx

  • CDN 服务器

collectstatic 工具:用来收集静态资源文件, settings 中的相关设置:

  • STATIC_URL: 能够访问到静态文件的 URL 路径。

  • STATIC_ROOT: collectstatic 工具用来保存收集到的项目引用到的任何静态文件的路径

  • STATICFILES_DIRS: 这列出了 Django 的 collectstatic 工具应该搜索静态文件的其他目录。

$ python manage.py collectstatic --settings=settings.local

收集完成后,可以将这些静态文件,上传到托管文件的服务器/CDN。

Django 应用容器

  • 同步应用

    • uWSGI: C 实现的 Python Web 容器;Web 服务器 Apache/Nginx 与 django-uwsgi 进程通信来提供动态的内容;

    • gunicorn:纯 Python 实现的高性能 Python 应用容器,无外部依赖,简单容易配置; 还没有遇到性能问题的时候,推荐使用 gunicorn.

  • 异步应用

    • Daphne: twisted 实现

    • Hypercorn: 基于 sans-io hyper, h11, h2, wsproto实现

    • Uvicorn: 基于 uvloop and httptools 实现

异步支持 Roadmap

  • Django 的异步支持 Roadmap

    • Django 3.0 - ASGI Server

    • Django 3.1 - Async Views

    • Django 3.2/4.0 - Async ORM

  • 异步视图

    async def view(request):
      await asyncio.sleep(0.5)
      return HttpRespomse("Hello, async world!")
    

启动服务器

  • 同步应用服务器,以 gunicorn 为例

    $ python -m pip install gunicorn
    
    $ export DJANGO_SETTINGS_MODULE=settings.local
    
    $ gunicorn -w 3 -b 127.0.0.1:8000 recruitment.wsgi:application
    

    以上启动 3 个 worker进程, 绑定到 本机的8000端口

  • 异步应用服务器,以uvcorn 为例

    $ python -m pip install uvicorn
    
    $ export DJANGO_SETTINGS_MODULE=settings.local
    
    $ uvicorn recruitment.asgi:application --workers 3