(译)一个完整的Django入门指南 第7部分

一、前言

本篇文章是翻译 A Complete Beginner's Guide to Django 系列的最后一篇文章 A Complete Beginner's Guide to Django - Part 7,由于搜索找了好久都没有找到对应的中文翻译篇(若是有,就是我没有找到...),又由于这个系列真的很是的好,简单,容易,很是适配入门,因此就打算自已试试翻译,也当是本身学习入门的一步吧!css

简介(Introduction)

20180714-A-Complete Beginner's-Guide-to-Django-Part7.jpg

欢迎来到咱们教程系列的最后一部分!这篇文章,咱们将把Django应用程序部署到生产服务器。咱们还将为咱们的服务器配置Email服务和HTTPS证书。html

首先,我想到了给一个使用虚拟专用服务器(VPS)的例子,它更通用,而后使用一个平台好比 Heroku 服务。但它我写得太详细了,因此本教程我最终偏向关于VPS的内容。python

咱们的项目已经上线啦!您能够在阅读本文以前点击在线查看,这是咱们本文要部署的应用程序:www.djangoboards.comjquery

版本控制(Version Control)

版本控制是软件开发中很是重要的话题。特别是在团队开发中同时开发多个功能,并一块儿维护项目代码时。不管是一个开发人员项目仍是多个开发人员项目,每一个项目都应该使用版本控制。linux

版本控制系统有几种选择。也许是由于GitHub的流行,Git 成为版本控制的实际标准。因此若是你不熟悉版本控制,Git是一个很好的入门起点。通常有不少相关的教程,课程和资源,所以遇到问题很容易找到帮助。nginx

GitHub和Code School有一个关于Git的很棒的互动教程,这是一个很是好的介绍Git的网站。几年前我就开始从SVN转到Git。git

这是一个很是重要的话题,我其实应该从第一个教程开始讲Git。但事实是我但愿本教程系列的重点放在Django上。若是Git这东西对您来讲都是新的,请不要担忧。一步一步入门是很重要的。也许你的第一个项目并不完美。重要的是要坚持学习和慢慢提升你的技能,但要有恒心!github

关于Git的一个很是好的事情是它不只仅是一个版本控制系统。围绕它创建了丰富的工具和服务生态系统。一些很好的例子好比持续集成、部署、代码审查、代码质量和项目管理。sql

使用Git来支持Django项目的部署过程很是有用。这是从源代码存储库中拉取最新版本或在出现问题时回滚到特定版本的便捷方式。有许多服务使用Git来集成,以便执行自动化测试和部署。数据库

若是您没有在本地计算机上安装Git,请从 git-scm.com/downloads 下载和安装。

Git 基本配置(Basic Setup)

首先,设置你电脑的Git身份:

git config --global user.name "Vitor Freitas"
    git config --global user.email vitor@simpleisbetterthancomplex.com
复制代码

译者注:

  • git config --global user.name “xxx”: 设置git操做者名称
  • git config --global user.email “email” 设置git操做者邮箱 这2个配置的名字和邮箱,会记录在git操做记录中。

在项目根目录(与manage.py相同的目录)中,初始化一个git存储库:

git init
复制代码
Initialized empty Git repository in /Users/vitorfs/Development/myproject/.git/
复制代码

检查存储库的状态:

git status
复制代码
On branch master

Initial commit

Untracked files:
  (use "git add <file>..." to include in what will be committed)

  accounts/
  boards/
  manage.py
  myproject/
  requirements.txt
  static/
  templates/

nothing added to commit but untracked files present (use "git add" to track)
复制代码

在继续添加源文件以前,请在项目根目录中建立名为**.gitignore**的新文件。这个特殊的文件将帮助咱们保持Git仓库的干净,保证缓存文件或日志这样的没必要要的文件不会添加到Git仓库中。

您能够从 GitHub 获取 Python项目的通用.gitignore文件

确保将它从 Python.gitignore 重命名为 .gitignore(点很重要!)。

您能够补充 .gitignore 文件内容,告诉它(Git)忽略SQLite数据库文件,例如:

.gitignore 文件内容:

__pycache__/
*.py[cod]
.env
venv/

SQLite database files
*.sqlite3
复制代码

如今将文件添加到存储库:

git add .
复制代码

请注意上面add后面有一个点。上面的命令告诉Git 在当前目录中添加全部未跟踪的文件。(译者注,点表示全部,整句就表示添加因此文件到Git,除了.gitignore文件列出的要忽略。)

如今进行第一次提交:

git commit -m "Initial commit"
复制代码

必定要写一个注释说明这个提交是什么,简要描述你改变了什么。

Git 远程仓库(Remote Repository)

如今让咱们将 GitHub 设置为远程仓库。首先,在GitHub上建立一个免费账户,而后在电子邮件中点击GitHub发来的验证连接确认您的电子邮件地址。而后您就能在GitHub上建立公开仓库(译者注:GitHub公开仓库是免费的,私有仓库收费。)。

如今,只需为仓库建立一个名称,不要勾选使用自述文件初始化它(initialize this repository with a README),也不要添加 Add .gitignore 或添加 Add a license 许可证。确保仓库开始为空:

20180714-GitHub-Create-Repository.png

建立仓库后,您应该看到以下内容:

20180714-GitHub-Repository.png

如今让咱们将其配置为咱们的远程仓库:

git remote add origin git@github.com:sibtc/django-boards.git
复制代码

如今将代码推送到远程服务器,即GitHub仓库:

git push origin master

Counting objects: 84, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (81/81), done.
Writing objects: 100% (84/84), 319.70 KiB | 0 bytes/s, done.
Total 84 (delta 10), reused 0 (delta 0)
remote: Resolving deltas: 100% (10/10), done.
To git@github.com:sibtc/django-boards.git
 * [new branch]      master -> master
复制代码

20180714-GitHub-Initial-Commit.png

我建立此仓库只是为了演示使用现有代码库建立远程仓库的过程。该项目的源代码正式托管在此仓库中:github.com/sibtc/djang…

项目配置(Project Settings)

不管代码是存储在公共或私有远程仓库中,都不该提交敏感信息并将其推送到远程仓库。这包括密钥,密码,API密钥等。

此时,咱们必须在 settings.py 模块中处理两种特定类型的配置:

  • 密钥和密码等敏感信息;
  • 针对特定的环境配置。

密码和密钥能够存储在环境变量中或使用本地文件(未提交到远程仓库):

# environment variables
import os
SECRET_KEY = os.environ['SECRET_KEY']

# or local files
with open('/etc/secret_key.txt') as f:
    SECRET_KEY = f.read().strip()
复制代码

为此, 我在我开发的每一个Django项目中都使用了一个名为 Python Decouple 的优秀实用功能库。它将搜索名为 .env 的本地文件以设置这配置变量,并将内容配置到环境变量。它还提供了一个定义默认值的接口,在适当时将数据转换为intboollist

这不是强制性的,但我真的以为它是一个很是有用的工具。它像Heroku这样的服务同样有魅力。

首先,让咱们安装它:

pip install python-decouple
复制代码

myproject/settings.py

from decouple import config

SECRET_KEY = config('SECRET_KEY')
复制代码

如今,咱们能够将敏感信息放在一个名为**.env的特殊文件中(注意前面的点),该文件位于manage.py**文件所在的目录中:

myproject/
 |-- myproject/
 |    |-- accounts/
 |    |-- boards/
 |    |-- myproject/
 |    |-- static/
 |    |-- templates/
 |    |-- .env        <-- here!
 |    |-- .gitignore
 |    |-- db.sqlite3
 |    +-- manage.py
 +-- venv/
复制代码

.env 文件内容:

SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
复制代码

该**.ENV文件中忽略的.gitignore文件,因此每次咱们要部署应用程序或在不一样的机器上运行时,咱们将建立一个.ENV**文件,并添加必要的配置。

如今让咱们安装另外一个库来帮助咱们用简单一行代码来编写数据库链接。这样,在不一样的环境中编写不一样的数据库链接字符串会更容易:

pip install dj-database-url
复制代码

目前,咱们须要解耦的所有配置:

myproject/settings.py

from decouple import config, Csv
import dj_database_url

SECRET_KEY = config('SECRET_KEY')
DEBUG = config('DEBUG', default=False, cast=bool)
ALLOWED_HOSTS = config('ALLOWED_HOSTS', cast=Csv())
DATABASES = {
    'default': dj_database_url.config(
        default=config('DATABASE_URL')
    )
}
复制代码

本地计算机的**.env**文件示例:

SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
DEBUG=True
ALLOWED_HOSTS=.localhost,127.0.0.1
复制代码

请注意,在DEBUG配置中咱们给了一个默认值(True),所以在生产环境中咱们能够忽略(注释)此配置,所以它将被自动设置为False,由于它生产环境应该是False的。

如今ALLOWED_HOSTS将被转换成一个列表**['.localhost', '127.0.0.1'. ]。如今,这是在咱们的本地机器上,为了生产,咱们将其设置为相似于['.djangoboards.com', ]**您拥有的任何域名。

这特定配置可确保您的应用程序仅提供给这个域名。

记录依赖库版本(Tracking Requirements)

跟踪项目的依赖关系是一个很好的作法,所以另外一台机器上更容易安装它(依赖的环境)。

咱们能够经过运行下面的命令来检查当前安装的Python依赖库:

pip freeze

dj-database-url==0.4.2
Django==1.11.6
django-widget-tweaks==1.4.1
Markdown==2.6.9
python-decouple==3.1
pytz==2017.2
复制代码

在项目根目录中建立名为requirements.txt的文件,并在其中添加依赖项(就是上面 pip freeze获得的项目全部的依赖库):

requirements.txt 文件内容:

dj-database-url==0.4.2
Django==1.11.6
django-widget-tweaks==1.4.1
Markdown==2.6.9
python-decouple==3.1
复制代码

我保留了pytz == 2017.2,由于它是由Django自动安装的。

您能够更新源代码仓库:

git add .
git commit -m "Add requirements.txt file"
git push origin master
复制代码

域名(Domain Name)

若是咱们要正确部署Django应用程序,咱们将须要一个域名(译者注:若是部署外网,给别人使用须要域名,但若是是内网使用,只有IP地址也能够访问。此处,做者意思要处理上线外网。)。拥有域名来为应用程序提供服务,配置电子邮件服务和配置https证书很是重要。

最近,我一直在使用 Namecheap 。您能够以8.88美圆/年的价格得到.com域名,或者若是您只是尝试一下,您能够用 0.99美圆/年 的价格注册.xyz域名。(译者注:在中国,能够注册阿里云、腾讯云等著名的注册商都有域名卖买,你们可自行搜索官网。)

不管如何,您能够自由使用任何注册商。为了演示部署过程,我注册了 www.DjangoBoards.com 域名。

部署策略(20180714-GitHub-Initial-Commit.pn)

如下是咱们将在本教程中使用的部署策略的概述:

20180714-Django-Deployment-Strategy.jpg

云服务是使用 Digital Ocean 提供的虚拟专用服务器。您可使用个人会员连接注册Digital Ocean以得到 免费的10美圆信用额度(仅适用于新账户)。(译者注:云服务商在中国可选择阿里云、腾讯云)

首先咱们将使用 NGINX(译者注:Nginx是一个异步框架的 Web服务器,一般做为负载均衡器。),其商标是食人魔。NGINX将收到访问者对服务器的全部请求。但若是请求数据,它不会尝试作任何不聪明的事情(译者注:Nginx主要负责处理请求,并分发给文件系统或HTTP服务器等。)。它所要作的就是肯定所请求的信息是不是一个能够自行提供的静态资源,或者它是否更复杂。若是是,它会将请求传递给 Gunicorn(译者注:Gunicorn“绿色独角兽”是一个被普遍使用的高性能的Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn )项目,使用pre-fork worker模式,具备使用很是简单,轻量级的资源消耗,以及高性能等特色。)。

NGINX 还将配置 HTTPS证书。这意味着它只接受经过HTTPS的请求。若是客户端尝试经过HTTP请求,NGINX将首先将用户重定向到HTTPS,而后它才会决定如何处理请求连接。

咱们还将安装此 certbot 以自动续订 Let’s Encrypt 的证书。(译者注:想了解更多内容,可阅读HTTPS 简介及使用官方工具 Certbot 配置 Let’s Encrypt SSL 安全证书详细教程 | Linux Story。)

Gunicorn是一个应用服务器。根据服务器拥有的CPU处理器数量,它能够经过生成多个同时工做的程序以并行处理多个请求。它管理工做负载并执行Python和Django代码。

Django是一个努力工做的表明。它能够访问数据库(PostgreSQL)或文件系统。但在大多数状况下,工做是在视图内部完成,渲染模板,以及过去几周咱们编写过的全部内容。在Django处理请求以后,它会向Gunicorn返回一个响应,他将结果返回给NGINX,最终将响应传递给客户端。

咱们还将安装**PostgreSQL**,一个优秀的数据库系统。因为Django的ORM系统,很容易切换数据库。(译者注:PostgreSQL被业界誉为“最早进的开源数据库”,面向企业复杂SQL处理的OLTP在线事务处理场景,支持NoSQL数据类型(JSON/XML/hstore)、支持GIS地理信息处理。)

最后一步是安装**Supervisor**。它是一个过程控制系统,它将密切关注Gunicorn和Django,以确保一切顺利进行。若是服务器从新启动,或者Gunicorn崩溃,它将自动重启。(译者注:Supervisor是一个Python开发的client/server系统,能够管理和监控*nix上面的进程的工具。)

部署到VPS(Digital Ocean)(Deploying to a VPS (Digital Ocean))

您可使用您喜欢的任何其余VPS(虚拟专用服务器)。配置应该很是类似,毕竟咱们将使用Ubuntu 16.04 做为咱们的服务器。

首先,让咱们建立一个新的服务器(在Digital Ocean上,他们称之为“Droplet”)。选择Ubuntu 16.04:

20180714-Digital-Ocean-Create-Droplets.png

选择尺寸。最小的空间就足够了:

20180714-Digital-Ocean-Create-Droplets-Choose-Size.png

而后为您的Droplet选择一个主机名(在个人例子为“django-boards”):

20180714-Digital-Ocean-Create-Droplets-Choose-Hostname.png

若是您有SSH密钥,则能够将其添加到您的账户。而后,您将可以使用它登陆服务器。不然,他们会经过电子邮件向您发送root密码。(译者注:SSH密钥能够不用输入密码就连接到服务器,具体可自行搜索了解更多。)

如今选择服务器的IP地址:

20180714-Digital-Ocean-Choose-IPaddress.png

在咱们登陆服务器以前,让咱们将域名指向此IP地址。这将节省一些时间,由于DNS设置一般须要几分钟才能传播。

20180714-Digital-Ocean-Add-DNS-Record.png
因此这里咱们添加了两条A记录,一条指向主域名“djangoboards.com”,另外一条指向“www.djangoboards.com”。咱们将使用NGINX配置规范URL。

如今让咱们使用终端登陆服务器:

ssh root@45.55.144.54
root@45.55.144.54's password: 复制代码

而后你应该看到如下消息:

You are required to change your password immediately (root enforced)
Welcome to Ubuntu 16.04.3 LTS (GNU/Linux 4.4.0-93-generic x86_64)

 * Documentation:  https://help.ubuntu.com
 * Management:     https://landscape.canonical.com
 * Support:        https://ubuntu.com/advantage

  Get cloud support with Ubuntu Advantage Cloud Guest:
    http://www.ubuntu.com/business/services/cloud

0 packages can be updated.
0 updates are security updates.


Last login: Sun Oct 15 18:39:21 2017 from 82.128.188.51
Changing password for root.
(current) UNIX password:
复制代码

设置新密码,而后开始配置服务器。

sudo apt-get update
sudo apt-get -y upgrade
复制代码

若是在升级过程当中收到任何提示,请选择"keep the local version currently installed"(保持当前安装的本地版本)选项。

Python 3.6

sudo add-apt-repository ppa:deadsnakes/ppa
sudo apt-get update
sudo apt-get install python3.6
复制代码

PostgreSQL

sudo apt-get -y install postgresql postgresql-contrib
复制代码

NGINX

sudo apt-get -y install nginx
复制代码

Supervisor

sudo apt-get -y install supervisor

sudo systemctl enable supervisor
sudo systemctl start supervisor
复制代码

Virtualenv

wget https://bootstrap.pypa.io/get-pip.py
sudo python3.6 get-pip.py
sudo pip3.6 install virtualenv
复制代码

应用用户(Application User)

使用如下命令建立新用户:

adduser boards
复制代码

一般,我只选择应用程序的名称。输入密码,并可选择在提示中添加一些额外信息。

如今将用户添加到sudoers列表:

gpasswd -a boards sudo
复制代码

PostgreSQL数据库配置(PostgreSQL Database Setup)

首先切换到postgres用户:

sudo su - postgres
复制代码

建立数据库用户:

createuser u_boards
复制代码

建立一个新数据库并将用户设置为全部者:

createdb django_boards --owner u_boards
复制代码

为用户定义一个强密码:

psql -c "ALTER USER u_boards WITH PASSWORD 'BcAZoYWsJbvE7RMgBPzxOCexPRVAq'" 复制代码

咱们如今能够退出postgres用户了:

exit
复制代码

Django项目配置(Django Project Setup)

切换到应用程序用户:

sudo su - boards
复制代码

开始前,咱们先检查终端的位置:

pwd

/home/boards
复制代码

首先,让咱们用咱们的代码克隆存储库:

git clone https://github.com/sibtc/django-beginners-guide.git
复制代码

启动虚拟环境(virtualenv):

virtualenv venv -p python3.6
复制代码

初始化virtualenv:

source venv/bin/activate
复制代码

安装依赖的库(译者注:从文件中读取依赖进行安装。):

pip install -r django-beginners-guide/requirements.txt
复制代码

咱们再添加两个额外的库,Gunicorn和PostgreSQL驱动程序:

pip install gunicorn
pip install psycopg2
复制代码

如今在**/home/boards/django-beginners-guide文件夹中,让咱们建立一个.env**文件来存储数据库凭据,密钥和其余全部内容:

/home/boards/django-beginners-guide/.env

SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
ALLOWED_HOSTS=.djangoboards.com
DATABASE_URL=postgres://u_boards:BcAZoYWsJbvE7RMgBPzxOCexPRVAq@localhost:5432/django_boards
复制代码

如下是数据库URL的语法:postgres://db_user:db_password@db_host:db_port/db_name

如今让咱们迁移数据库,收集静态文件并建立一个超级用户:

cd django-beginners-guide
复制代码
python manage.py migrate

Operations to perform:
  Apply all migrations: admin, auth, boards, 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 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 boards.0001_initial... OK
  Applying boards.0002_auto_20170917_1618... OK
  Applying boards.0003_topic_views... OK
  Applying sessions.0001_initial... OK

复制代码

如今静态文件:

python manage.py collectstatic

Copying '/home/boards/django-beginners-guide/static/js/jquery-3.2.1.min.js'
Copying '/home/boards/django-beginners-guide/static/js/popper.min.js'
Copying '/home/boards/django-beginners-guide/static/js/bootstrap.min.js'
Copying '/home/boards/django-beginners-guide/static/js/simplemde.min.js'
Copying '/home/boards/django-beginners-guide/static/css/app.css'
Copying '/home/boards/django-beginners-guide/static/css/bootstrap.min.css'
Copying '/home/boards/django-beginners-guide/static/css/accounts.css'
Copying '/home/boards/django-beginners-guide/static/css/simplemde.min.css'
Copying '/home/boards/django-beginners-guide/static/img/avatar.svg'
Copying '/home/boards/django-beginners-guide/static/img/shattered.png'
...
复制代码

此命令将全部静态资产复制到外部目录,NGINX能够在该目录中为咱们提供文件。稍后会详细介绍。

如今为应用程序建立一个超级用户:

python manage.py createsuperuser
复制代码

配置Gunicorn(Configuring Gunicorn)

Gunicorn是负责在代理服务器后面执行Django代码的工具。

在**/home/boards中建立一个名为gunicorn_start**的新文件:

#!/bin/bash 
NAME="django_boards"
DIR=/home/boards/django-beginners-guide
USER=boards
GROUP=boards
WORKERS=3
BIND=unix:/home/boards/run/gunicorn.sock
DJANGO_SETTINGS_MODULE=myproject.settings
DJANGO_WSGI_MODULE=myproject.wsgi
LOG_LEVEL=error

cd $DIR
source ../venv/bin/activate

export DJANGO_SETTINGS_MODULE=$DJANGO_SETTINGS_MODULE
export PYTHONPATH=$DIR:$PYTHONPATH

exec ../venv/bin/gunicorn ${DJANGO_WSGI_MODULE}:application \
  --name $NAME \
  --workers $WORKERS \
  --user=$USER \
  --group=$GROUP \
  --bind=$BIND \
  --log-level=$LOG_LEVEL \
  --log-file=-
  
复制代码

此脚本将启动应用程序服务器。咱们提供了一些信息,例如Django项目的位置,用于运行服务器的应用程序用户等等。

如今让这个文件可执行:

chmod u+x gunicorn_start
复制代码

建立两个空文件夹,一个用于套接字文件,另外一个用于存储日志:

mkdir run logs
复制代码

如今**/home/boards**里面的目录结构应该是这样的:

django-beginners-guide/
gunicorn_start
logs/
run/
staticfiles/
venv/
复制代码

其中staticfiles文件夹由建立collectstatic命令。

配置Supervisor(Configuring Supervisor)

首先,在 /home/boards/logs/ 文件夹中建立一个空的日志文件:

touch logs/gunicorn.log
复制代码

如今建立一个新的supervisor文件:

sudo vim /etc/supervisor/conf.d/boards.conf
复制代码
[program:boards]
command=/home/boards/gunicorn_start
user=boards
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/home/boards/logs/gunicorn.log
复制代码

保存文件并运行如下命令:

sudo supervisorctl reread
sudo supervisorctl update
复制代码

如今检查状态:

sudo supervisorctl status boards
复制代码
boards        RUNNING   pid 308, uptime 0:00:07
复制代码

配置NGINX(Configuring NGINX)

下一步是设置NGINX服务器以提供静态文件并将请求传递给Gunicorn:

/etc/nginx/sites-available/ 中添加一个名为boards的新配置文件:

upstream app_server {
    server unix:/home/boards/run/gunicorn.sock fail_timeout=0;
}

server {
    listen 80;
    server_name www.djangoboards.com;  # here can also be the IP address of the server

    keepalive_timeout 5;
    client_max_body_size 4G;

    access_log /home/boards/logs/nginx-access.log;
    error_log /home/boards/logs/nginx-error.log;

    location /static/ {
        alias /home/boards/staticfiles/;
    }

    # checks for static file, if not found proxy to app
    location / {
        try_files $uri @proxy_to_app;
    }

    location @proxy_to_app {
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
      proxy_set_header Host $http_host;
      proxy_redirect off;
      proxy_pass http://app_server;
    }
}
复制代码

建立指向已启用站点的文件夹的引用连接:

sudo ln -s /etc/nginx/sites-available/boards /etc/nginx/sites-enabled/boards
复制代码

删除默认的NGINX网站:

sudo rm /etc/nginx/sites-enabled/default
复制代码

重启NGINX服务:

sudo service nginx restart
复制代码

此时,若是DNS已经生效,则可能经过URL www.djangoboards.com 访问该网站。

20180714-django-boards.png

配置电子邮件服务(Configuring an Email Service)

入门使用的最佳选择之一是 Mailgun。它提供了一个很是可靠的免费计划,每个月包含12,000封电子邮件。

注册一个免费账户。而后按照步骤操做,这很是简单。您必须与您注册域名的服务一块儿使用。在个人例子中,它是 Namecheap

点击添加域以向您的账户添加新域。按照说明操做,确保使用 “mg.” 子域名:

20180714-mailgun-add-domain.png

如今抓取第一组DNS记录,它是两个TXT记录:

20180714-mailgun-add-NDS-Records.png

使用您的注册商提供的网络界面将其添加到您的域中:

20180714-DNS-List-Add-mail-record.png

重复上述步骤,对MX记录作一样的事情:

20180714-DNS-list-MX-record.png

将它们添加到域中:

20180714-DNS-list-add-MX-Record.png

如今这一步不是强制性的,但因为咱们已经在这里,因此也配置一下:

20180714-Add-DNS-Records-For-Tracking.png

20180714-DNS-add-CNAME-Record.png

添加全部DNS记录后,单击“当即检查DNS记录”按钮:

20180714-Domain-Verfication-Check-DNS-Recodrds.png

如今咱们须要有一些耐心。有时须要一段时间来验证DNS。

同时,咱们能够配置应用程序以接收链接参数。

myproject/settings.py

EMAIL_BACKEND = config('EMAIL_BACKEND', default='django.core.mail.backends.smtp.EmailBackend')
EMAIL_HOST = config('EMAIL_HOST', default='')
EMAIL_PORT = config('EMAIL_PORT', default=587, cast=int)
EMAIL_HOST_USER = config('EMAIL_HOST_USER', default='')
EMAIL_HOST_PASSWORD = config('EMAIL_HOST_PASSWORD', default='')
EMAIL_USE_TLS = config('EMAIL_USE_TLS', default=True, cast=bool)

DEFAULT_FROM_EMAIL = 'Django Boards <noreply@djangoboards.com>'
EMAIL_SUBJECT_PREFIX = '[Django Boards] '
复制代码

而后,个人本地计算机**.env**文件将以下所示:

SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
DEBUG=True
ALLOWED_HOSTS=.localhost,127.0.0.1
DATABASE_URL=sqlite:///db.sqlite3
EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
复制代码

个人线上(云服务器).env文件看起来像这样:

SECRET_KEY=rqr_cjv4igscyu8&&(0ce(=sy=f2)p=f_wn&@0xsp7m$@!kp=d
ALLOWED_HOSTS=.djangoboards.com
DATABASE_URL=postgres://u_boards:BcAZoYWsJbvE7RMgBPzxOCexPRVAq@localhost:5432/django_boards
EMAIL_HOST=smtp.mailgun.org
EMAIL_HOST_USER=postmaster@mg.djangoboards.com
EMAIL_HOST_PASSWORD=ED2vmrnGTM1Rdwlhazyhxxcd0F
复制代码

您能够在Mailgun 的the Domain Information(域信息)部分中找到您的凭据。

  • EMAIL_HOST: SMTP Hostname(SMTP主机名)
  • EMAIL_HOST_USER: Default SMTP Login(默认SMTP登陆)
  • EMAIL_HOST_PASSWORD: Default Password(默认密码)

咱们能够在线上服务器中测试新设置。在本地计算机上的settings.py文件中进行更改,将更改提交到远程仓库。而后,在服务器中拉出新代码并从新启动Gunicorn进程:

git pull
复制代码

使用电子邮件凭据编辑**.env**文件。

而后重启Gunicorn进程:

sudo supervisorctl restart boards
复制代码

如今咱们能够尝试测试重置密码的邮件流程:

20180714-Email-Please-reset-your-password.png

在Mailgun仪表板上,您能够得到有关电子邮件传递的一些统计信息:

20180714-Email-Mailgun-Message-Delivery.png

配置HTTPS证书(Configuring HTTPS Certificate)

如今让咱们使用 Let's Encrypt 提供的一个很好的HTTPS证书来提升咱们的应用程序的安全性。

设置HTTPS从未如此简单。更好的是,咱们如今能够免费得到它。他们提供了一个名为certbot的解决方案 ,负责为咱们安装和更新证书。这很是简单:

sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository ppa:certbot/certbot
sudo apt-get update
sudo apt-get install python-certbot-nginx
复制代码

如今安装证书:

sudo certbot --nginx
复制代码

只需按照提示操做便可。当被问及:

Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.

复制代码

选择2将全部HTTP流量重定向到HTTPS。

有了这个,该网站已经经过HTTPS提供服务:

20180714-Let's-Encrypt-certbot-Https.png

设置证书的自动续订。运行如下命令编辑crontab文件:

sudo crontab -e
复制代码

将如下行添加到文件末尾:

0 4 * * * /usr/bin/certbot renew --quiet
复制代码

该命令将天天凌晨4点运行。全部在30天内到期的证书将自动续订。

总结(Conclusions)

很是感谢全部关注本系列教程的人,给予评论和反馈!我真的很感激!这是该系列的最后一篇教程。我但愿你喜欢它!

尽管这是教程系列的最后一部分,但我仍是计划编写一些后续教程来探索其余有趣的主题,例如数据库优化以及在咱们目前拥有的内容之上添加更多功能。

顺便说一句,若是您有兴趣为项目作出贡献,不多有人愿意免费提交pull请求!该项目的源代码可在GitHub上得到:github.com/sibtc/djang…

另外,请告诉我您还想看到的其余内容!:-)

译者总结

翻译本文以前,历来没有翻译过技术文章。如今用一天时间翻译完,真的以为翻译的工做很辛苦,之前看了不少翻译的文章,在这里感谢那些无私奉献的译者们!

在翻译过程当中,有不少技术点,须要自已查一下资料,带出一些扩展;有一些技术知识,原做者一笔带过,又惧怕读者看不懂,而后又想展开述;遇到一些本身不懂的技术,也是要硬头表去翻译;也有一些翻译的句子,反复屡次斟酌文字,但愿可以通俗易懂的描述出来。

最后,翻译只是第一步,理解了原做者的文章,并更好的学习到知识,简单明了的译文,是翻译的初心。固然,在这过程,也发现英文的重要性,但愿你们也重视英文,为本身的技术视野更广,不断努力!正如文中做者说的,也许是你第一次遇到的知识,只有坚持,反复多看几回,慢慢的,你必定会懂的!恒心!

参考扩展

教程材料一共会被分为七个部分。 此教程将从安装、开发环境的准备,模型,视图,模板,URL到更高级的主题(如迁移,测试和部署)中详细探讨全部基本概念。

Vitor Freitas 原文系列:

公众号Python之禅 翻译:

苍云横渡 翻译的Windows版本:

扩展阅读:


  • 若有疑问,欢迎在评论区一块儿讨论!
  • 若有不正确的地方,欢迎指导!
> 注:本文首发于 [iHTCboy's blog](https://iHTCboy.com),如若转载,请注来源
相关文章
相关标签/搜索