Django Tutorial Part 11: Deploying Django to production

 

现在,您已经创建(并测试)了一个很棒的LocalLibrary网站,您将想要将其安装在公共Web服务器上,以便图书馆工作人员和成员可以通过Internet访问它. 本文概述了如何寻找主机来部署网站以及如何使网站准备好投入生产.

Prerequisites: 完成所有先前的教程主题,包括Django教程第10部分:测试Django Web应用程序 .
Objective: To learn where and how you can deploy a Django app to production.

Overview

一旦您的站点完成(或完成"足够"以开始公共测试),您将需要将其托管在比您的个人开发计算机更公共和更易访问的地方.

到目前为止,您一直在开发环境中工作,使用Django开发Web服务器将您的站点共享到本地浏览器/网络,并使用(不安全的)开发设置来运行您的网站,这些设置会暴露调试信息和其他私人信息. 在可以外部托管网站之前,您首先需要:

  • 对项目设置进行一些更改.
  • 选择一个托管Django应用的环境.
  • 选择一个用于托管任何静态文件的环境.
  • 设置用于服务网站的生产级基础结构.

本教程提供了有关选择托管站点的选项的一些指导,简要概述了如何使Django应用投入生产,以及如何将LocalLibrary网站安装到Heroku云托管上的有效示例.服务.

What is a production environment?

生产环境是服务器计算机提供的环境,您将在其中运行网站以供外部使用. 环境包括:

  • 网站运行所在的计算机硬件.
  • 操作系统(例如Linux,Windows).
  • 在其上编写网站的编程语言运行时和框架库.
  • 用于提供页面和其他内容的Web服务器(例如Nginx,Apache).
  • 在Django网站和网络服务器之间传递"动态"请求的应用程序服务器.
  • 您的网站所依赖的数据库.

注意 :根据产品的配置方式,您可能还具有反向代理,负载均衡器等.

服务器计算机可以位于您的房屋内,并通过快速链接连接到Internet,但是使用"云中"托管的计算机更为常见. 这实际上意味着您的代码在托管公司的数据中心中的某个远程计算机(或可能是"虚拟"计算机)上运行. 远程服务器通常将以一定价格提供一定级别的保证的计算资源(例如CPU,RAM,存储内存等)和Internet连接.

这种可远程访问的计算/网络硬件称为基础架构即服务(IaaS) . 许多IaaS供应商提供了预安装特定操作系统的选项,您必须在该操作系统上安装生产环境的其他组件. 其他供应商允许您选择功能更全的环境,也许包括完整的Django和Web服务器设置.

注意:预先构建的环境可以简化网站的设置,因为它们会减少配置,但是可用的选项可能会将您限制在不熟悉的服务器(或其他组件)上,并且可能基于旧版OS. 通常,最好自己安装组件,以便获得所需的组件,并且当您需要升级系统的各个部分时,您对从何处开始有了一些想法!

其他托管服务提供商将Django作为平台即服务 (PaaS)产品的一部分来支持Django. 在这种托管中,您无需担心大多数生产环境(Web服务器,应用程序服务器,负载均衡器),因为托管平台会为您照顾这些(以及您需要做的大多数事情)扩展您的应用程序). 这使部署变得非常容易,因为您只需要专注于Web应用程序,而不是所有其他服务器基础结构.

一些开发人员会选择IaaS而不是PaaS来提供更大的灵活性,而其他开发人员会欣赏到减少的维护开销和更易于扩展的PaaS. 当您开始使用时,在PaaS系统上设置网站要容易得多,这就是我们在本教程中将要做的.

Tip: If you choose a Python/Django-friendly hosting provider they should provide instructions on how to set up a Django website using different configurations of webserver, application server, reverse proxy, etc (this won't be relevant if you choose a PaaS). For example, there are many step-by-step guides for various configurations in the Digital Ocean Django community docs.

Choosing a hosting provider

已知有100多家托管服务提供商主动地支持Django或与Django一起很好地工作(在Django Friendly主机中可以找到相当详尽的列表). 这些供应商以不同的价格提供不同类型的环境(IaaS,PaaS)以及不同级别的计算和网络资源.

选择主机时应考虑的一些事项:

  • 您的站点可能有多繁忙,以及满足该需求所需的数据和计算资源成本.
  • 支持水平扩展(添加更多计算机)和垂直扩展(升级到功能更强大的计算机)的支持级别以及这样做的成本.
  • 供应商拥有数据中心的地方,因此访问速度最快的地方.
  • 主机的历史正常运行时间和停机时间性能.
  • 提供了用于管理站点的工具-它们易于使用且安全(例如SFTP与FTP).
  • 用于监视服务器的内置框架.
  • 已知限制. 一些主机将故意阻止某些服务(例如电子邮件). 在某些价格等级中,其他服务器仅提供一定数量的"实时",或者仅提供少量存储.
  • 额外的好处. 一些提供商将提供免费域名,并支持您否则需要付费的SSL证书.
  • 您所依赖的"免费"层是否会随着时间而到期,以及迁移到更昂贵层的成本是否意味着您最好先使用其他一些服务!

刚开始时的好消息是,有许多站点为"免费"提供"评估","开发人员"或"爱好者"计算环境. 这些始终是相当有限的资源/有限的环境,您确实需要注意它们可能会在介绍期后过期. 但是,它们非常适合在实际环境中测试低流量站点,并且可以轻松迁移,以便在站点繁忙时支付更多资源. 此类别中的热门选择包括HerokuPython AnywhereAmazon Web ServicesMicrosoft Azure等.

许多提供商还具有"基本"层,可提供更高级别的计算能力和更少的限制. Digital OceanPython Anywhere是受欢迎的托管服务提供商的示例,它们提供了相对便宜的基本计算层(每月5至10美元).

注意:请记住,价格不是唯一的选择标准. 如果您的网站成功,那么可能会证明可伸缩性是最重要的考虑因素.

Getting your website ready to publish

使用django-adminmanage.py工具创建的Django框架网站已配置为使开发更容易. 由于安全性或性能原因,许多Django项目设置(在settings.py中指定)应因生产而有所不同.

提示:通常有一个单独的settings.py文件用于生产,并从一个单独的文件或环境变量导入敏感设置. 即使其余的源代码在公共存储库中也可用,然后应保护此文件.

您必须检查的关键设置是:

  • DEBUG . 在生产中应将其设置为FalseDEBUG = False ). 这将阻止显示敏感/机密的调试跟踪和变量信息.
  • SECRET_KEY . 这是用于CSRF保护等的较大随机值.重要的是,生产中使用的密钥不可在源代码控制中,也不能在生产服务器外部访问. Django文档建议最好从环境变量中加载或从仅服务器文件中读取.
      #从环境变量中读取SECRET_KEY
     导入操作系统
     SECRET_KEY = os.environ ['SECRET_KEY']
    
     # 要么
    
     #从文件中读取密钥
     用open('/ etc / secret_key.txt')作为f:
         SECRET_KEY = f.read().strip() 

让我们更改LocalLibrary应用程序,以便我们从环境变量(如果已定义)中读取SECRET_KEYDEBUG变量,否则使用配置文件中的默认值.

Open /locallibrary/settings.py, disable the original SECRET_KEY configuration and add the new lines as shown below in bold. During development no environment variable will be specified for the key, so the default value will be used (it shouldn't matter what key you use here, or if the key "leaks", because you won't use it in production).

# SECURITY WARNING: keep the secret key used in production secret!
# SECRET_KEY = 'cg#p$g+j9tax!#a3cup@1$8obt2_+&k3q+pmu)5%asj6yjpkag'
import os
SECRET_KEY = os.environ.get('DJANGO_SECRET_KEY', 'cg#p$g+j9tax!#a3cup@1$8obt2_+&k3q+pmu)5%asj6yjpkag')

然后注释掉现有的DEBUG设置,并添加如下所示的新行.

# SECURITY WARNING: don't run with debug turned on in production!
# DEBUG = True
DEBUG = os.environ.get('DJANGO_DEBUG', '') != 'False'

该值DEBUG将是True默认,但只会是False ,如果价值DJANGO_DEBUG环境变量设置为False . 请注意,环境变量是字符串,而不是Python类型. 因此,我们需要比较字符串. 将DEBUG变量设置为False的唯一方法是将其实际设置为False

您可以通过发出以下命令将环境变量设置为False:

export DJANGO_DEBUG=False

部署清单 (Django docs)中提供了您可能要更改的设置的完整清单. 您还可以使用下面的终端命令列出其中一些:

python3 manage.py check --deploy

Example: Installing LocalLibrary on Heroku

本节提供了有关如何在Heroku PaaS云上安装LocalLibrary的实际演示.

Why Heroku?

Heroku是运行时间最长且流行的基于云的PaaS服务之一. 它最初仅支持Ruby应用程序,但现在可用于托管许多编程环境(包括Django)中的应用程序!

我们选择使用Heroku的原因如下:

  • Heroku的具有自由层真正免费的(尽管有一些限制).
  • 作为PaaS,Heroku为我们处理了许多Web基础架构. 这使上手变得更加容易,因为您不必担心服务器,负载平衡器,反向代理或Heroku为我们提供的其他任何Web基础架构.
  • 尽管确实有一些限制,但这些不会影响此特定应用程序. 例如:
    • Heroku仅提供短期存储,因此用户上传的文件无法安全地存储在Heroku本身上.
    • 如果半小时内没有任何请求,则免费套餐将使不活动的Web应用程序进入睡眠状态. 然后,该站点在唤醒后可能需要几秒钟的时间进行响应.
    • 免费套餐将您网站的运行时间限制为每月一定的小时数(不包括网站"处于睡眠状态"的时间). 这对于使用率低/演示较少的站点很好,但是如果需要100%的正常运行时间,则不合适.
    • 其他限制在"限制" (Heroku文档)中列出.
  • 通常,它只是有效,如果最终喜欢它,则扩展应用程序非常容易.

虽然Heroku非常适合举办此演示,但可能不适合您的真实网站. Heroku使事情易于设置和扩展,但代价是灵活性降低,一旦退出免费套餐,价格可能会昂贵得多.

How does Heroku work?

Heroku在一个或多个" Dynos "中运行Django网站,这些网站是隔离的虚拟Unix容器,可提供运行应用程序所需的环境. dyno完全隔离,并具有临时文件系统(短暂的文件系统,每次dyno重新启动时都会清理/清空). dynos默认情况下唯一共享的是应用程序配置变量 . Heroku在内部使用负载平衡器将网络流量分配给所有"网络"测功机. 由于它们之间没有任何共享,因此Heroku可以通过添加更多的dynos来水平扩展应用程序(当然,您可能还需要扩展数据库以接受其他连接).

Because the file system is ephemeral you can't install services required by your application directly (e.g. databases, queues, caching systems, storage, email services, etc). Instead Heroku web applications use backing services provided as independent "add-ons" by Heroku or 3rd parties. Once attached to your web application, the dynos access the services using information contained in application configuration variables.

为了执行您的应用程序,Heroku需要能够设置适当的环境和依赖项,并了解其启动方式. 对于Django应用,我们在许多文本文件中提供此信息:

  • runtime.txt 使用的编程语言和版本.
  • requirements.txt :Python组件依赖性,包括Django.
  • Procfile :启动Web应用程序将执行的进程的列表. 对于Django,通常是Gunicorn Web应用程序服务器(带有.wsgi脚本).
  • wsgi.py: WSGI配置拨打我们在Heroku的环境Django应用程序.

开发人员使用特殊的客户端应用程序/终端与Heroku进行交互,这很像Unix Bash shell. 这样,您就可以上传存储在git存储库中的代码,检查正在运行的进程,查看日志,设置配置变量等等!

为了使我们的应用程序在Heroku上运行,我们需要将Django Web应用程序放入git存储库中,添加上述文件,与数据库附件集成,并进行更改以正确处理静态文件.

完成所有操作后,我们可以设置一个Heroku帐户,获取Heroku客户端,然后使用它来安装我们的网站.

注意:以下说明反映了在撰写本文时如何使用Heroku. 如果Heroku极大地改变了他们的流程,您可能希望查看他们的安装文档: Django的Heroku入门 .

这就是您入门所需的全部概述(请参阅Heroku的工作方式以获取更全面的指南).

Creating an application repository in Github

Heroku与git源代码版本控制系统紧密集成,可使用它上传/同步对实时系统所做的任何更改. 为此,它添加了一个名为heroku的新heroku"远程"存储库,该存储库指向您在Heroku云上的源存储库. 在开发过程中,您使用git将更改存储在"主"存储库中. 当您要部署站点时,可以将更改同步到Heroku存储库.

注意:如果您习惯遵循良好的软件开发实践,则可能已经在使用git或其他一些SCM系统. 如果您已经有一个git存储库,则可以跳过此步骤.

有很多使用git的方法,但是最简单的方法之一是首先在Github上设置一个帐户,在该处创建存储库,然后在本地同步到它:

  1. 访问https://github.com/并创建一个帐户.
  2. 登录后,单击顶部工具栏中的+链接,然后选择新建存储库 .
  3. 填写此表单上的所有字段. 虽然这些不是强制性的,但强烈建议使用它们.
    • 输入新的存储库名称(例如django_local_library )和描述(例如"用Django编写的本地图书馆网站").
    • 添加.gitignore选择列表中选择Python .
    • 在" 添加许可证选择"列表中选择您的首选许可证.
    • 选中使用README初始化此存储库 .
  4. Press 创建仓库.
  5. 在新的回购页面上,点击绿色的" 克隆或下载 "按钮.
  6. 从出现的对话框内的文本字段中复制URL值(应该类似: https : //github.com/ <your_git_user_id> /django_local_library.git ).

现在已经创建了存储库(" repo"),我们将要在本地计算机上克隆它:

  1. 为本地计算机安装git (您可以在此处找到适用于不同平台的版本).
  2. 打开命令提示符/终端,并使用上面复制的URL克隆存储库:
      git clone https://github.com/ <您的git_user_id> /django_local_library.git
    
    这将在当前工作目录的新文件夹中创建存储库.
  3. 导航到新的仓库.
      cd django_local_library 

最后的步骤是将您的应用程序复制到此本地项目目录,然后将本地存储库(或在git lingo中"推")添加到远程Github存储库:

  1. 将您的Django应用程序复制到该文件夹​​(所有文件的级别与manage.py及以下相同, 而不是包含locallibrary文件夹的文件).
  2. 打开.gitignore文件, 将以下行复制到它的底部,然后保存(此文件用于标识默认情况下不应上传到git的文件).
      #文本备份文件
     * .bak
    
     #数据库
     * .sqlite3 
  3. 打开命令提示符/终端,然后使用add命令将所有文件添加到git中. 这会将.gitignore文件不会忽略的文件添加到"临时区域".
      git添加-A
    
  4. 使用status命令检查要commit所有文件是否正确(要包括源文件,而不是二进制文件,临时文件等). 它看起来应该像下面的清单.
      > git状态
     在分支机构主管
     您的分支机构的最新信息是"起源/母版".
     所做更改:
     (使用" git reset HEAD <文件> ..."取消登台)
    
     修改:.gitignore
     新文件:catalog / __ init__.py
             ...
     新文件:catalog / migrations / 0001_initial.py
             ...
     新文件:templates / registration / password_reset_form.html 
  5. 如果满意,请将文件commit到本地存储库. 从本质上讲,这等同于批准所做的更改并使它们成为本地存储库的正式组成部分.
      git commit -m"应用程序的第一个版本已移至github" 
  6. 此时,远程存储库尚未更改. 使用以下命令将本地存储库同步( push )到远程Github存储库:
      git push origin master 

完成此操作后,您应该可以回到Github上创建回购的页面,刷新页面,然后可以看到整个应用程序已经上传. 您可以使用此添加/提交/推送周期,随着文件的更改继续更新存储库.

提示:这是备份您的" 原始 "项目的好点-尽管我们将在以下部分中进行的某些更改可能对在其他平台可能没有部署的任何平台(或开发)上有用.

最好的方法是使用git管理您的修订. 使用git,您不仅可以返回到特定的旧版本,还可以将其与生产更改分开保存在单独的"分支"中,并选择在生产和开发部门之间移动的所有更改. 学习Git是值得的,但超出了本主题的范围.

最简单的方法是将文件复制到另一个位置. 使用最符合您的git知识的方法!

Update the app for Heroku

本部分说明了您需要对LocalLibrary应用程序进行的更改才能使其在Heroku上正常工作. 尽管Heroku的《 使用Django的 Heroku 入门》中的说明假定您将使用Heroku客户端来运行本地开发环境,但我们所做的更改与现有的Django开发服务器以及我们已经学习的工作流程兼容.

Procfile

在GitHub存储库的根目录中创建文件Procfile (无扩展名),以声明应用程序的进程类型和入口点. 将以下文本复制到其中:

web: gunicorn locallibrary.wsgi --log-file -

" web: "告诉Heroku这是一个Web dyno,可以发送HTTP流量. 这种dyno的启动过程是gunicorn ,这是Heroku推荐的一种流行的Web应用程序服务器. 我们使用locallibrary.wsgi模块中的配置信息启动locallibrary.wsgi (使用我们的应用程序框架/locallibrary/wsgi.py创建).

Gunicorn

Gunicorn是推荐的与Heroku上的Django一起使用的HTTP服务器(如以上Procfile中所述). 它是用于WSGI应用程序的纯Python HTTP服务器,可以在单个dyno内运行多个Python并发进程(有关更多信息,请参见使用Gunicorn部署Python应用程序 ).

虽然我们并不需要Gunicorn开发过程中为我们的LocalLibrary的应用程序,我们将安装它,使之成为我们的一部分要求,对Heroku的建立在远程服务器上.

使用pip (我们在设置开发环境时安装的)在命令行上本地安装Gunicorn

注意:在安装Gunicorn和带有pip的其他模块之前,请确保您处于Python虚拟环境中(使用workon [name-of-virtual-environment]命令),否则在/中导入这些模块可能会遇到问题后面几节中的locallibrary / settings.py文件.

pip3 install gunicorn

Database configuration

我们无法在Heroku上使用默认的SQLite数据库,因为它是基于文件的,并且每次应用程序重新启动时(通常每天一次,并且每次更改应用程序或其配置变量时,都会从临时文件系统中将其删除) ).

用于处理这种情况的Heroku机制是使用数据库附加组件,并使用由附加组件设置的环境配置变量中的信息来配置Web应用程序. 有很多数据库选项,但是我们将使用Heroku postgres数据库的嗜好层 ,因为它是免费的,受Django支持,并在使用免费嗜好dyno计划层时自动添加到我们的新Heroku应用程序中.

使用名为DATABASE_URL的配置变量将数据库连接信息提供给Web dyno. 建议不要将这些信息硬编码到Django中,而是建议开发人员使用dj-database-url包来解析DATABASE_URL环境变量并将其自动转换为Django所需的配置格式. 除了安装dj-database-url软件包外,我们还需要安装psycopg2 ,因为Django需要此功能与Postgres数据库进行交互.

dj-database-url (Django database configuration from environment variable)

在本地安装dj-database-url ,以使其成为Heroku在远程服务器上设置的要求的一部分:

$ pip3 install dj-database-url
settings.py

打开/locallibrary/settings.py并将以下配置复制到文件的底部:

# Heroku: Update database configuration from $DATABASE_URL.
import dj_database_url
db_from_env = dj_database_url.config(conn_max_age=500)
DATABASES['default'].update(db_from_env)

Note:

  • 由于在开发计算机上不会设置DATABASE_URL环境变量,因此在开发过程中仍将使用SQLite.
  • conn_max_age=500使连接持久化,这比在每个请求周期重新创建连接要有效得多. 但是,这是可选的,可以根据需要删除.
psycopg2 (Python Postgres database support)

Django需要psycopg2才能与Postgres数据库一起使用,并且您需要将其添加到requirements.txt中,以便Heroku在远程服务器上进行设置(如下面的需求部分所述).

Django默认会在本地使用我们的SQLite数据库,因为在我们的本地环境中未设置DATABASE_URL环境变量. 如果您想完全切换到Postgres并使用我们的Heroku免费层数据库进行开发和生产,则可以. 例如,要在Debian风格的Linux系统上本地安装psycopg2及其依赖项,可以使用以下Bash / terminal命令:

sudo apt-get install python-pip python-dev libpq-dev postgresql postgresql-contrib
pip3 install psycopg2-binary

其他平台的安装说明可在此处psycopg2网站上找到 .

但是,您不需要这样做-您不需要在本地计算机上激活PostgreSQL,只要您在requirements.txt中将它作为必需项提供给Heroku(请参见下文)即可.

Serving static files in production

在开发期间,我们使用Django和Django开发网络服务器来提供我们的静态文件(CSS,JavaScript等). 相反,在生产环境中,我们通常会从内容交付网络(CDN)或Web服务器提供静态文件.

注意:通过Django / Web应用程序提供静态文件的效率很低,因为请求必须通过不必要的附加代码(Django)传递,而不是由Web服务器或完全独立的CDN直接处理. 尽管这对于开发期间的本地使用无关紧要,但是如果我们在生产中使用相同的方法,将会对性能产生重大影响.

为了使从Django Web应用程序中单独托管静态文件变得容易,Django提供了collectstatic工具来收集这些文件以进行部署(有一个设置变量,用于定义运行collectstatic时应在何处收集文件). Django模板引用静态文件相对于设置变量( STATIC_URL )的托管位置,因此,如果将静态文件移动到另一台主机/服务器,则可以更改此位置.

相关设置变量为:

  • STATIC_URL :这是从中提供静态文件的基本URL位置,例如在CDN上. 这用于在基本模板中访问的静态模板变量(请参见Django教程第5部分:创建我们的主页 ).
  • STATIC_ROOT :这是目录的绝对路径,Django的" collectstatic"工具将在该目录中收集模板中引用的所有静态文件. 收集后,可以将它们作为一个组上传到要托管文件的任何位置.
  • STATICFILES_DIRS :这列出了Django的collectstatic工具应搜索静态文件的其他目录.
settings.py

打开/locallibrary/settings.py并将以下配置复制到文件底部. BASE_DIR应该已经在文件中定义了( STATIC_URL在创建时可能已经在文件中定义了.虽然不会造成任何危害,但您最好删除重复的先前引用).

# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/2.1/howto/static-files/

# The absolute path to the directory where collectstatic will collect static files for deployment.
STATIC_ROOT = os.path.join(BASE_DIR, 'staticfiles')

# The URL to use when referring to static files (where they will be served from)
STATIC_URL = '/static/'

实际上,我们将使用名为WhiteNoise的库来提供文件服务,该库将在下一部分中安装和配置.

有关更多信息,请参阅Django和静态资产 (Heroku文档).

Whitenoise

有许多方法可以在生产环境中提供静态文件(我们在上一节中看到了相关的Django设置). Heroku建议使用WhiteNoise项目直接在生产中从Gunicorn提供静态资产.

注意: Heroku在上载应用程序后会自动调用collectstatic并准备供WhiteNoise使用的静态文件. 请查看WhiteNoise文档,以获取有关其工作原理以及为什么实现是一种用于提供这些文件的相对有效方法的解释.

此处给出了将WhiteNoise设置为与项目一起使用的步骤(并在下面复制):

WhiteNoise

使用以下命令在本地安装whitenoise:

$ pip3 install whitenoise
settings.py

要安装白噪声到你的Django应用程序,打开/locallibrary/settings.py,找到MIDDLEWARE设置并添加WhiteNoiseMiddleware靠近列表顶部,仅仅是下面SecurityMiddleware

MIDDLEWARE = [
    'django.middleware.security.SecurityMiddleware',
    'whitenoise.middleware.WhiteNoiseMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
]

Optionally, you can reduce the size of the static files when they are served (this is more efficient). Just add the following to the bottom of /locallibrary/settings.py:

# Simplified static file serving.
# https://warehouse.python.org/project/whitenoise/
STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Requirements

Web应用程序的Python要求必须存储在存储库根目录中的文件requirements.txt中. Heroku将在重建环境时自动安装这些文件. 您可以在命令行上使用pip创建此文件(在repo根目录中运行以下命令):

pip3 freeze > requirements.txt

安装完上述所有不同的依赖项之后,您的requirements.txt文件应至少列出这些项目(尽管版本号可能不同). 请删除未在下面列出的所有其他依赖项,除非您已为此应用程序明确添加它们.

dj-database-url==0.5.0
Django==2.1.5
gunicorn==19.9.0
psycopg2-binary==2.7.7
whitenoise==4.1.2

确保存在与上面类似的psycopg2行! 即使您没有在本地安装它,也应该将其添加到requirements.txt .

Runtime

如果定义了runtime.txt文件,它将告诉Heroku使用哪种编程语言. 在仓库的根目录中创建文件,并添加以下文本:

python-3.7.0

注意: Heroku仅支持少量的Python运行时 (在编写本文时,包括上面的运行时). Heroku将使用支持的运行时,无论此文件中指定的值如何.

Re-test and save changes to Github

在继续之前,让我们在本地再次测试该站点,并确保它没有被上述任何更改破坏. 像往常一样运行开发Web服务器,然后检查该站点在浏览器上是否仍然可以正常工作.

python3 manage.py runserver

接下来,让我们将更改push送到Github. 在终端中(导航到我们的本地存储库之后),输入以下命令:

git add -A
git commit -m "Added files and changes required for deployment to heroku"
git push origin master

现在,我们应该准备开始在Heroku上部署LocalLibrary.

Get a Heroku account

要开始使用Heroku,您首先需要创建一个帐户:

  • 转到www.heroku.com ,然后单击免费注册按钮.
  • 输入您的详细信息,然后按创建免费帐户 . 系统会要求您检查您的帐户是否有注册电子邮件.
  • 单击注册电子邮件中的帐户激活链接. 您将被带回到网络浏览器上的帐户.
  • 输入您的密码,然后单击" 设置密码并登录" .
  • 然后,您将登录并转到Heroku仪表板: https : //dashboard.heroku.com/apps .

Install the client

按照Heroku上的说明下载并安装Heroku客户端.

安装客户端后,您将能够运行命令. 例如,要获得有关客户端的帮助:

heroku help

Create and upload the website

要创建应用程序,我们在存储库的根目录中运行" create"命令. 这将在我们的本地git环境中创建一个名为heroku的git远程("指向远程存储库的指针").

heroku create

注意:如果愿意,可以在"创建"之后指定一个值来命名遥控器. 如果不这样做,则会得到一个随机名称. 该名称用于默认URL.

然后,我们可以将我们的应用程序推送到Heroku存储库,如下所示. 这将上传应用程序,将其打包到dyno中,运行collectstatic,然后启动网站.

git push heroku master

如果幸运的话,该应用程序现在已在网站上"运行",但由于我们尚未设置数据库表供应用程序使用,因此无法正常运行. 为此,我们需要使用heroku run命令并启动" one off dyno "以执行迁移操作. 在终端中输入以下命令:

heroku run python manage.py migrate

我们还需要能够添加书籍和作者,因此让我们再次使用一次性dyno创建我们的管理超级用户:

heroku run python manage.py createsuperuser

完成此操作后,我们可以查看该站点. 它应该可以工作,尽管现在还没有任何书籍. 要将浏览器打开到新网站,请使用以下命令:

heroku open

在管理网站中创建一些书籍,然后检查该网站是否表现出预期的效果.

Managing addons

您可以使用heroku addons命令将附加组件签出到您的应用程序. 这将列出所有插件,以及它们的价格等级和状态.

> heroku addons

Add-on                                     Plan       Price  State
─────────────────────────────────────────  ─────────  ─────  ───────
heroku-postgresql (postgresql-flat-26536)  hobby-dev  free   created
 └─ as DATABASE

在这里,我们看到只有一个附加组件,即postgres SQL数据库. 这是免费的,并且在我们创建应用程序时自动创建. 您可以使用以下命令打开网页以更详细地检查数据库附加组件(或任何其他附加组件):

heroku addons:open heroku-postgresql

其他命令允许您创建,销毁,升级和降级加载项(使用与打开类似的语法). 有关更多信息,请参阅管理加载项 (Heroku文档).

Setting configuration variables

您可以使用heroku config命令heroku config出站点的配置变量. 在下面,您可以看到我们只有一个变量,即用于配置数据库的DATABASE_URL .

> heroku config

=== locallibrary Config Vars
DATABASE_URL: postgres://uzfnbcyxidzgrl:j2jkUFDF6OGGqxkgg7Hk3ilbZI@ec2-54-243-201-144.compute-1.amazonaws.com:5432/dbftm4qgh3kda3

如果您回想起准备发布网站的部分,我们必须为DJANGO_SECRET_KEYDJANGO_DEBUG设置环境变量. 让我们现在开始.

注意:密钥必须是真正的秘密! 生成新密钥的一种方法是使用Django秘密密钥生成器 .

我们使用config:set命令设置DJANGO_SECRET_KEY (如下所示). 请记住使用您自己的密钥!

> heroku config:set DJANGO_SECRET_KEY='eu09(ilk6@4sfdofb=b_2ht@vad*$ehh9-)3u_83+y%(+phh&='

Setting DJANGO_SECRET_KEY and restarting locallibrary... done, v7
DJANGO_SECRET_KEY: eu09(ilk6@4sfdofb=b_2ht@vad*$ehh9-)3u_83+y%(+phh

我们类似地设置DJANGO_DEBUG

> heroku config:set DJANGO_DEBUG=

Setting DJANGO_DEBUG and restarting locallibrary... done, v8

如果您现在访问该网站,则会收到"错误请求"错误,因为如果DEBUG=False (作为安全措施),则需要 ALLOWED_HOSTS设置. 打开/locallibrary/settings.py并更改ALLOWED_HOSTS设置,以包括您的基本应用程序URL(例如" locallibrary1234.herokuapp.com")和您通常在本地开发服务器上使用的URL.

ALLOWED_HOSTS = ['<your app URL without the https:// prefix>.herokuapp.com','127.0.0.1']
# For example: 
# ALLOWED_HOSTS = ['fathomless-scrubland-30645.herokuapp.com', '127.0.0.1']

然后保存设置,并将其提交到您的Github存储库和Heroku中:

git add -A
git commit -m 'Update ALLOWED_HOSTS with site and development server URL'
git push origin master
git push heroku master

在站点更新到Heroku后,输入一个不存在的URL(例如/ catalog / doesnotexist / ). 以前,这将显示一个详细的调试页面,但是现在您应该只看到一个简单的"未找到"页面.

Debugging

Heroku客户端提供了一些调试工具:

# Show current logs
heroku logs

# Show current logs and keep updating with any new results
heroku logs --tail

# Add additional logging for collectstatic (this tool is run automatically during a build)
heroku config:set DEBUG_COLLECTSTATIC=1

# Display dyno status
heroku ps

如果您需要更多的信息,则需要开始研究Django Logging .

Summary

至此,有关在生产环境中设置Django应用程序的教程的结尾,以及有关使用Django的系列教程的结尾. 我们希望您发现它们有用. 您可以在Github上查看源代码的完整版本.

下一步是阅读我们的最后几篇文章,然后完成评估任务.

See also

In this module