

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 将 Django 应用程序部署到 Elastic Beanstalk
<a name="create-deploy-python-django"></a>

本教程演练如何将默认的自动生成的 [Django](https://www.djangoproject.com/) 网站部署到运行 Python 的 AWS Elastic Beanstalk 环境。本教程向您展示如何通过使用 Elastic Beanstalk 环境在云中托管 Python Web 应用程序。

在本教程中，您将执行以下操作：
+ [设置 Python 虚拟环境和安装 Django](#python-django-setup-venv)
+ [创建 Django 项目](#python-django-create-app)
+ [为 Elastic Beanstalk 配置您的 Django 应用程序](#python-django-configure-for-eb) 
+ [使用 EB CLI 部署站点](#python-django-deploy) 
+ [更新应用程序](#python-django-update-app) 
+ [清理](#python-django-stopping)

## 先决条件
<a name="python-django-prereq"></a>

要完成此教程，您应当安装所有面向 Python 的[常见先决条件](python-development-environment.md)软件，包括以下程序包：
+ Python 3.7 或更高版本
+ `pip`
+ `virtualenv`
+ `awsebcli`

[Django](https://www.djangoproject.com/) 框架将作为此教程的一部分安装。

**注意**  
使用 EB CLI 创建环境需要[服务角色](concepts-roles-service.md)。您可以通过在 Elastic Beanstalk 控制台中创建环境来创建服务角色。如果您没有服务角色，EB CLI 会尝试在您运行 `eb create` 时创建一个。

## 设置 Python 虚拟环境和安装 Django
<a name="python-django-setup-venv"></a>

使用 `virtualenv` 创建虚拟环境，并用它来安装 Django 及其依赖项。通过使用虚拟环境，您可以确切地知道您的应用程序需要哪些软件包，以便在运行您的应用程序的 Amazon EC2 实例上安装所需的软件包。

以下步骤演示必须为基于 Unix 的系统和 Windows 输入的命令，这些命令显示在单独的选项卡上。

**设置虚拟环境**

1. 创建名为 `eb-virt` 的虚拟环境。

------
#### [ Unix-based systems ]

   ```
   ~$ virtualenv ~/eb-virt
   ```

------
#### [ Windows ]

   ```
   C:\> virtualenv %HOMEPATH%\eb-virt
   ```

------

1. 激活虚拟环境。

------
#### [ Unix-based systems ]

   ```
   ~$ source ~/eb-virt/bin/activate
   (eb-virt) ~$
   ```

------
#### [ Windows ]

   ```
   C:\>%HOMEPATH%\eb-virt\Scripts\activate
   (eb-virt) C:\>
   ```

------

   您将看到您的命令提示符前面带有 `(eb-virt)`，表明您在虚拟环境中。
**注意**  
这些指令的剩余部分在您的主目录 `~$` 中显示 Linux 命令提示符。在 Windows 上，这是`C:\Users\USERNAME>`，你*USERNAME*的 Windows 登录名在哪里。

1. 使用 `pip` 安装 Django。

   ```
   (eb-virt)~$ pip install django==2.2
   ```
**注意**  
您安装的 Django 版本必须与您在 Elastic Beanstalk Python 配置中选择用于部署应用程序的 Python 版本兼容。有关部署的更多信息，请参阅本主题中的[使用 EB CLI 部署站点](#python-django-deploy)。  
有关当前 Python 平台版本的更多信息，请参阅《AWS Elastic Beanstalk 平台》**文档中的 [Python](https://docs.aws.amazon.com/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.python)。  
有关 Django 与 Python 的版本兼容性问题，请参阅[我可以将哪个 Python 版本与 Django 一起使用？](https://docs.djangoproject.com/en/3.1/faq/install/#what-python-version-can-i-use-with-django)

1. 要验证已安装 Django，请输入以下命令。

   ```
   (eb-virt)~$ pip freeze
   Django==2.2
   ...
   ```

   此命令列出虚拟环境中已安装的所有程序包。稍后，您使用此命令的输出来配置项目，以便配合 Elastic Beanstalk 使用。

## 创建 Django 项目
<a name="python-django-create-app"></a>

现在您已准备好使用虚拟环境来创建 Django 项目并在计算机上运行。

**注意**  
本教程使用 SQLite的是 Python 中包含的数据库引擎。使用您的项目文件部署数据库。对于生产环境，我们建议您使用 Amazon Relational Database Service (Amazon RDS)，并且将它与您的环境分隔开。有关更多信息，请参阅 [将 Amazon RDS DB 实例添加到 Python Elastic Beanstalk 环境](create-deploy-python-rds.md)。

**生成 Django 应用程序**

1. 激活虚拟环境。

------
#### [ Unix-based systems ]

   ```
   ~$ source ~/eb-virt/bin/activate
   (eb-virt) ~$
   ```

------
#### [ Windows ]

   ```
   C:\>%HOMEPATH%\eb-virt\Scripts\activate
   (eb-virt) C:\>
   ```

------

   您将看到您的命令提示符带有 `(eb-virt)` 前缀，表明您在虚拟环境中。
**注意**  
这些指令的剩余部分显示在您的主目录和 Linux 主目录 `~/` 中的 Linux 命令提示符 `~$`。在 Windows 上`C:\Users\USERNAME>`，这些*USERNAME*是，你的 Windows 登录名在哪里。

1. 使用 `django-admin startproject` 命令创建名为 `ebdjango` 的 Django 项目。

   ```
   (eb-virt)~$ django-admin startproject ebdjango
   ```

   该命令创建名为 **ebdjango** 的标准 Django 站点，包含以下目录结构。

   ```
   ~/ebdjango
     |-- ebdjango
     |   |-- __init__.py
     |   |-- settings.py
     |   |-- urls.py
     |   `-- wsgi.py
     `-- manage.py
   ```

1. 使用 `manage.py runserver` 在本地运行 Django 站点。

   ```
   (eb-virt) ~$ cd ebdjango
   ```

   ```
   (eb-virt) ~/ebdjango$ python manage.py runserver
   ```

1. 在 Web 浏览器中，打开 `http://127.0.0.1:8000/` 以查看站点。

1. 检查服务器日志，查看请求的输出。要停止 Web 服务器并返回到虚拟环境，请按 **Ctrl\$1C**。

   ```
   Django version 2.2, using settings 'ebdjango.settings'
   Starting development server at http://127.0.0.1:8000/
   Quit the server with CONTROL-C.
   [07/Sep/2018 20:14:09] "GET / HTTP/1.1" 200 16348
   Ctrl+C
   ```

## 为 Elastic Beanstalk 配置您的 Django 应用程序
<a name="python-django-configure-for-eb"></a>

本地计算机已有一个 Django 支持的网站，因此，您可将其配置为配合 Elastic Beanstalk 部署。

默认情况下，Elastic Beanstalk 会查找名为 `application.py` 的文件来启动您的应用程序。由于这不在您创建的 Django 项目中，因此您必须对您应用程序的环境做出一些调整。您还必须设置环境变量，以便可以加载您的应用程序的模块。

**为 Elastic Beanstalk 配置您的站点**

1. 激活虚拟环境。

------
#### [ Unix-based systems ]

   ```
   ~/ebdjango$ source ~/eb-virt/bin/activate
   ```

------
#### [ Windows ]

   ```
   C:\Users\USERNAME\ebdjango>%HOMEPATH%\eb-virt\Scripts\activate
   ```

------

1. 运行 `pip freeze`，然后将输出保存到名为 `requirements.txt` 的文件。

   ```
   (eb-virt) ~/ebdjango$ pip freeze > requirements.txt
   ```

   Elastic `requirements.txt` Beanstalk 用于确定要在运行您的应用程序的实例 EC2 上安装哪个软件包。

1. 创建一个名为 `.ebextensions` 的目录。

   ```
   (eb-virt) ~/ebdjango$ mkdir .ebextensions
   ```

1. 在 `.ebextensions` 目录中，添加名为 `django.config` 的[配置文件](ebextensions.md)，包含以下文本：  
**Example \$1/ebdjango/.ebextensions/django.config**  

   ```
   option_settings:
     aws:elasticbeanstalk:container:python:
       WSGIPath: ebdjango.wsgi:application
   ```

   设置 `WSGIPath` 指定 Elastic Beanstalk 用于启动应用程序的 WSGI 脚本位置。
**注意**  
如果您使用的是 Amazon Linux AMI Python 平台版本（在 Amazon Linux 2 之前），请将 `WSGIPath` 的值替换为 `ebdjango/wsgi.py`。示例中的值适用于 Gunicorn WSGI 服务器，该服务器在 Amazon Linux AMI 平台版本上不受支持。

1. 使用 `deactivate` 命令停用虚拟环境。

   ```
   (eb-virt) ~/ebdjango$ deactivate
   ```

   每当您需要为应用程序添加程序包或本地运行应用程序时，重新激活虚拟环境。

## 使用 EB CLI 部署站点
<a name="python-django-deploy"></a>

您已添加在 Elastic Beanstalk 上部署应用程序所需的全部内容。您的项目目录现在应该如下所示。

```
~/ebdjango/
|-- .ebextensions
|   `-- django.config
|-- ebdjango
|   |-- __init__.py
|   |-- settings.py
|   |-- urls.py
|   `-- wsgi.py
|-- db.sqlite3
|-- manage.py
`-- requirements.txt
```

下一步，您将创建应用程序环境并使用 Elastic Beanstalk 部署已配置的应用程序。

完成部署后，您应立即编辑 Django 的配置以将 Elastic Beanstalk 分配给您的应用程序的域名添加到 Django 的 `ALLOWED_HOSTS`。然后，您将重新部署您的应用程序。这是一个 Django 安全要求，旨在防止 HTTP `Host` 标头攻击。有关更多信息，请参阅[主机标头验证](https://docs.djangoproject.com/en/2.2/topics/security/#host-headers-virtual-hosting)。

**创建环境并部署 Django 应用程序**
**注意**  
本教程将 EB CLI 作为部署机制，但您也可以使用 Elastic Beanstalk控制台部署包含项目内容的 .zip 文件。

1. 使用 **eb init** 命令，初始化 EB CLI 存储库。

   ```
   ~/ebdjango$ eb init -p python-3.7 django-tutorial
   Application django-tutorial has been created.
   ```

   此命令会创建一个名为 `django-tutorial` 的应用程序。它还配置本地存储库，以最新的 Python 3.7 平台版本创建环境。

1. （可选）**eb init**再次运行以配置默认密钥对，以便您可以使用 SSH 连接到运行应用程序的 EC2 实例。

   ```
   ~/ebdjango$ eb init
   Do you want to set up SSH for your instances?
   (y/n): y
   Select a keypair.
   1) my-keypair
   2) [ Create new KeyPair ]
   ```

   如果您已有密钥对，请选择一个，或按提示创建一个。如果您没有看到提示或需要以后更改设置，请运行 **eb init -i**。

1. 创建环境并使用 **eb create** 将应用程序部署到此环境中。

   ```
   ~/ebdjango$ eb create django-env
   ```
**注意**  
如果您看到“service role required”错误消息，请以交互方式运行 `eb create` (不指定环境名称)，EB CLI 会为您创建角色。

   此命令创建名为 `django-env` 的负载均衡的 Elastic Beanstalk 环境。创建一个环境需要大约 5 分钟。Elastic Beanstalk 在创建运行应用程序所需的资源时，将输出信息性消息，并由 EB CLI 转发至终端。

1. 当环境创建过程完成时，通过运行 **eb status** 找到您的新环境的域名。

   ```
   ~/ebdjango$ eb status
   Environment details for: django-env
     Application name: django-tutorial
     ...
     CNAME: eb-django-app-dev.elasticbeanstalk.com
     ...
   ```

   您的环境的域名是 `CNAME` 属性的值。

1. 打开 `settings.py` 目录中的 `ebdjango` 文件。找到 `ALLOWED_HOSTS` 设置，然后将您在上一步中找到的应用程序域名添加到该设置的值。如果您在该文件中找不到此设置，请将此设置添加到一个新行。

   ```
   ...
   ALLOWED_HOSTS = ['eb-django-app-dev.elasticbeanstalk.com']
   ```

1. 部署该文件，然后通过运行 **eb deploy** 部署您的应用程序。运行 **eb deploy** 时，EB CLI 会捆绑项目目录中的内容并将其部署到环境中。

   ```
   ~/ebdjango$ eb deploy
   ```
**注意**  
如果您将 Git 用于您的项目，请参阅[将 EB CLI 与 Git 配合使用](eb3-cli-git.md)。

1. 当环境更新过程完成时，请使用 **eb open** 打开网站。

   ```
   ~/ebdjango$ eb open
   ```

   这将使用为应用程序创建的域名打开一个浏览器窗口。您应该看到在本地创建和测试的相同 Django 网站。

如果您没有看到应用程序运行，或者出现错误消息，请查看[排查部署问题](troubleshooting.md#troubleshooting-deployments)以获取有关如何确定错误原因的帮助。

如果您*确实* 看到应用程序在运行，那么恭喜，您已使用 Elastic Beanstalk 部署了第一个 Django 应用程序！

## 更新应用程序
<a name="python-django-update-app"></a>

现在，您已在 Elastic Beanstalk 上运行应用程序，接下来可以更新和重新部署您的应用程序或其配置，Elastic Beanstalk 会处理更新实例和启动新的应用程序版本的工作。

在本示例中，我们将启用 Django 管理控制台并配置一些其他设置。

### 修改您的站点设置
<a name="python-django-modify-site"></a>

默认情况下， Django 网站使用 UTC 时区显示时间。您可以通过在 `settings.py` 中指定时区来加以更改。

**更改您的站点的时区**

1. 在 `settings.py` 中修改 `TIME_ZONE` 设置。  
**Example \$1/ .py ebdjango/ebdjango/settings**  

   ```
   ...
   # Internationalization
   LANGUAGE_CODE = 'en-us'
   TIME_ZONE = 'US/Pacific'
   USE_I18N = True
   USE_L10N = True
   USE_TZ = True
   ```

   如需获取时区列表，请访问[此页面](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)。

1. 将应用程序部署到您的 Elastic Beanstalk 环境。

   ```
   ~/ebdjango/$ eb deploy
   ```

### 创建站点管理员
<a name="python-django-create-admin"></a>

您可以为 Django 应用程序创建站点管理员，以便从站点直接访问管理员控制台。管理员登录详细信息安全地存储在包含在 Django 生成的默认项目中包含的本地数据库镜像中。

**创建站点管理员**

1. 初始化 Django 应用程序的本地数据库。

   ```
   (eb-virt) ~/ebdjango$ python manage.py migrate
   Operations to perform:
     Apply all migrations: admin, auth, contenttypes, sessions
   Running migrations:
     Applying contenttypes.0001_initial... OK
     Applying auth.0001_initial... OK
     Applying admin.0001_initial... OK
     Applying admin.0002_logentry_remove_auto_add... OK
     Applying admin.0003_logentry_add_action_flag_choices... OK
     Applying contenttypes.0002_remove_content_type_name... OK
     Applying auth.0002_alter_permission_name_max_length... OK
     Applying auth.0003_alter_user_email_max_length... OK
     Applying auth.0004_alter_user_username_opts... OK
     Applying auth.0005_alter_user_last_login_null... OK
     Applying auth.0006_require_contenttypes_0002... OK
     Applying auth.0007_alter_validators_add_error_messages... OK
     Applying auth.0008_alter_user_username_max_length... OK
     Applying auth.0009_alter_user_last_name_max_length... OK
     Applying sessions.0001_initial... OK
   ```

1. 运行 `manage.py createsuperuser` 以创建管理员。

   ```
   (eb-virt) ~/ebdjango$ python manage.py createsuperuser
   Username: admin
   Email address: me@mydomain.com
   Password: ********
   Password (again): ********
   Superuser created successfully.
   ```

1. 要告诉 Django 在哪里存储静态文件，请在 `settings.py` 中定义 `STATIC_ROOT`。  
**Example \$1/ .py ebdjango/ebdjango/settings**  

   ```
   # Static files (CSS, JavaScript, Images)
   # https://docs.djangoproject.com/en/2.2/howto/static-files/
   STATIC_URL = '/static/'
   STATIC_ROOT = 'static'
   ```

1. 运行`manage.py collectstatic`以在`static`目录中填充管理站点的静态资产（JavaScript、CSS 和图像）。

   ```
   (eb-virt) ~/ebdjango$ python manage.py collectstatic
   119 static files copied to ~/ebdjango/static
   ```

1. 部署您的应用程序。

   ```
   ~/ebdjango$ eb deploy
   ```

1. 在您的浏览器中打开站点，并且将 `/admin/` 附加到站点 URL，以此查看管理控制台，如下所示。

   ```
   http://djang-env.p33kq46sfh.us-west-2.elasticbeanstalk.com/admin/
   ```  
![\[输入您在步骤 2 中创建的用户名和密码来登录管理控制台。\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/eb_django_admin_login.png)

1. 使用您在步骤 2 中配置的用户名和密码登录。  
![\[使用 Elastic Beanstalk 部署的 Django 网站的 Django 管理控制台\]](http://docs.aws.amazon.com/zh_cn/elasticbeanstalk/latest/dg/images/eb_django_admin_console.png)

你可以使用类似的本地程序， updating/testing 然后使用**eb deploy**。Elastic Beanstalk 将执行更新您的实时服务器的工作，因此，您可以重点关注应用程序开发而不是服务器管理！

### 添加数据库迁移配置文件
<a name="python-django-migrate-site"></a>

您可以将命令添加到 `.ebextensions` 脚本，该脚本会在您的站点发生更新时运行。这样，您可以自动实现数据库迁移。

**在部署应用程序时添加迁移步骤**

1. 利用以下内容创建名为 `db-migrate.config` 的[配置文件](ebextensions.md)。  
**Example \$1/ebdjango/.ebextensions/db-migrate.config**  

   ```
   container_commands:
     01_migrate:
       command: "source /var/app/venv/*/bin/activate && python3 manage.py migrate"
       leader_only: true
   option_settings:
     aws:elasticbeanstalk:application:environment:
       DJANGO_SETTINGS_MODULE: ebdjango.settings
   ```

   此配置文件激活服务器的虚拟环境，在启动应用程序之前在部署流程中运行 `manage.py migrate` 命令。由于它在应用程序启动之前运行，因此您还必须明确配置 `DJANGO_SETTINGS_MODULE` 环境变量（通常在启动时由 `wsgi.py` 负责此项工作）。在命令中指定 `leader_only: true` 可确保当您重新部署到多个实例时，该命令仅运行一次。

1. 部署您的应用程序。

   ```
   ~/ebdjango$ eb deploy
   ```

## 清理
<a name="python-django-stopping"></a>

要在开发会话之间节省实例使用时间和其他 AWS 资源，请使用终止您的 Elastic Beanstalk 环境。**eb terminate**

```
~/ebdjango$ eb terminate django-env
```

此命令终止环境及其中运行的所有 AWS 资源。但它不删除应用程序，因此，您始终可以再次运行 **eb create**，创建具有相同配置的更多环境。

如果您不再使用示例应用程序，也可移除项目文件夹和虚拟环境。

```
~$ rm -rf ~/eb-virt
~$ rm -rf ~/ebdjango
```

## 后续步骤
<a name="python-django-next-steps"></a>

有关 Django 的更多信息（包括详细教程），请访问[官方文档](https://docs.djangoproject.com/en/2.2/)。

如果您希望尝试其他 Python Web 框架，请参阅[将 Flask 应用程序部署到 Elastic Beanstalk](create-deploy-python-flask.md)。