返回介绍

Deploy

发布于 2025-02-27 00:22:13 字数 8923 浏览 0 评论 0 收藏 0

目前为止,我们所有的工作都是在自己的电脑完成,你可以在自己的浏览器上看到成果。但是,如果我们想要让其他使用者使用这个网站,就必须将它部署(deploy)到稳定的伺服器上,才能随时浏览。

我们选择 Heroku 作为这次的范例,它的免费额度足够经营一个小型网站,并拥有完善的开发者教学资源。

本章根据 Heroku 的官方教学 “Getting Started with Django on Heroku” 稍作调整,教你如何准备部署,并在 Heroku 上发佈你的网站。

安装部署工具

首先利用 pip 安装一些部署时需要用到的套件:

(djangogirls_venv) ~/djangogirls$ pip install dj-database-url gunicorn dj-static

当终端机显示 Successfully installed... 时,表示必要的套件都已经安装好了。

部署准备

为了让 server 了解部署时所需要的安装环境,我们需要调整和准备一些设定档案。

requirements.txt

djangogirls 专案目录底下,利用以下的指令将此虚拟环境裡的 Python 套件全部条列出来,包括套件名称与版本资讯,并储存于 requirements.txt

(djangogirls_venv) ~/djangogirls$ pip freeze > requirements.txt

由于 Heroku 使用 PostgreSQL 资料库,我们还需要手动在 requirements.txt 最后面加上 psycopg2==2.6.1 (Python 的 PostgreSQL 模组)。最终的档案内容范例如下,版本可能会稍有不同:

# djangogirls/requirements.txt

Django==1.8.6
appnope==0.1.0
decorator==4.0.4
dj-database-url==0.3.0
dj-static==0.0.6
gnureadline==6.3.3
gunicorn==19.3.0
ipython==4.0.0
ipython-genutils==0.1.0
path.py==8.1.2
pexpect==4.0.1
pickleshare==0.5
ptyprocess==0.5
simplegeneric==0.8.1
static3==0.6.1
traitlets==4.0.0
psycopg2==2.6.1

Procfile

建立一个 Procfile 档案,告诉 Heroku 要如何启动我们的应用:

web: gunicorn --pythonpath mysite mysite.wsgi

这一行指令分成两个部分,其格式 <process_type>: <command> 表示:

  • -- 启用 web 应用
  • -- Gunicorn 是一个用 Python 开发的 WSGI 工具,可以用来执行 Django 的网站。我们透过指令下列指令来启动网站:
      gunicorn --pythonpath <directory_path> <project_name>.wsgi
    

runtime.txt

为了让 Heroku 知道要用哪一个版本的 Python,新增 runtime.txt 输入:

python-3.4.3

production_settings.py

在前面的章节中,我们透过修改 settings.py 来调整 Django project 的设定,但是通常正式上线(production)的环境会和开发/本机(development/local)环境有所不同。所以我们在 mysite/mysite/ 底下新建一个 production_settings.py ,专门放部署时所需要的设定:

# mysite/mysite/production_settings.py

# Import all default settings.
from .settings import *

import dj_database_url
DATABASES = {
    'default': dj_database_url.config()
}

# Static asset configuration.
STATIC_ROOT = 'staticfiles'

# Honor the 'X-Forwarded-Proto' header for request.is_secure().
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')

# Allow all host headers.
ALLOWED_HOSTS = ['*']

# Turn off DEBUG mode.
DEBUG = False

wsgi.py

WSGI - Web Server Gateway Interface 是 Python 定义网页程式和伺服器沟通的介面。为了让 Heroku 的服务能够透过这个介面与我们的网站沟通,修改 mysite/mysite/wsgi.py 如下:

# mysite/mysite/wsgi.py

import os

from django.core.wsgi import get_wsgi_application

from dj_static import Cling

os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite.settings")

application = Cling(get_wsgi_application())

我们将 dj_static 引入,并在 application 上使用它,以协助帮我们部署 static 档案(例如图片、CSS、JavaScript 档案等等)。

.gitignore

我们不希望把有些开发时使用的档案,例如虚拟环境、本机资料库等等,都一股脑放到网路上。因此,接下来需要建立一个 .gitignore 档案,排除这些资料:

# djangogirls/.gitignore

djangogirls_venv
*.pyc
__pycache__
staticfiles
db.sqlite3

小结

最后的档案结构如下:

djangogirls
├──mysite
│   ├── mysite
│   │   ├── __init__.py
│   │   ├── production_settings.py
│   │   ├── settings.py
│   │   ├── urls.py
│   │   └── wsgi.py
│   ├── templates
│   ├── trips
│   └── manage.py
├── djangogirls_venv
├── .gitignore
├── Procfile
├── requirements.txt
└── runtime.txt

Deploy to Heroku

在开始部署(deploy)之前,请先确定你已经按照 教学手册

  1. 注册 Heroku 帐号: https://id.heroku.com/signup
  2. 安装 Heroku 工具箱: https://toolbelt.heroku.com/

Step 1: 登入 Heroku

安装完工具箱裡的 Heroku client 后,就可以使用 heroku 指令,首先让我们登入:

$ heroku login

输入注册时的 Email 帐号和密码,当你看到 Authentication successful. 时,表示认证成功。

Step 2: 新增一个新的 git repository

djangogirls 资料夹底下新增一个 git repository:

~/djangogirls$ git init
~/djangogirls$ git add .
~/djangogirls$ git commit -m "my djangogirls app"

Step 3-1: 新增新的 Heroku app

接下来,我们需要新增一个可以上传 repository 的地方,如果你之前已经新增过 app,请跳到 Step 3-2

~/djangogirls$ heroku create

预设 create 后面不放名字时,会自动产生随机名称的 Heroku app,如果想要命名自己的 app,如下:

~/djangogirls$ heroku create djangogirlsdiary

注意:

  • Heroku app 是不能重名的,所以如果你也输入 djangogirlsdiary ,会得到 ! Name is already taken 的警告。
  • Heroku app 名称会显示在 deploy 成功后的网址上,例如: https://djangogirlsdiary.herokuapp.com

Step 3-2: 指定已经存在的 app

如果你之前已经新增过 app ,并且想发佈在已经存在的 app 上时,可以先用指令 heroku apps 查看 app 的名称:

$ heroku apps
=== My Apps
djangogirlsdiary

然后设定成你想要上传的 app:

$  heroku git:remote -a djangogirlsdiary
Git remote heroku added.

最后透过 git remote -v 检查一下是否设定到正确的位置:

$ git remote -v
heroku    https://git.heroku.com/djangogirlsdiary.git (fetch)
heroku    https://git.heroku.com/djangogirlsdiary.git (push)

Step 4: 设定环境变数

我们利用 heroku config:set 指令设置 环境变数 ,以确保未来在 Heroku 执行任何指令时,都是使用到部署专用的设定档:

$ heroku config:set DJANGO_SETTINGS_MODULE=mysite.production_settings

Step 5: 利用 git push 上传到 Heroku

使用 git push 指令上传 git repository 后,你会发现它按照 runtime.txt 安装 python-3.4.3,也透过 pip 安装我们在 requirements.txt 上列出的所有套件:

~/djangogirls$ git push heroku master
...
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote: -----> Installing runtime (python-3.4.3)
remote: -----> Installing dependencies with pip
...
remote: -----> Compressing... done, 50.8MB
remote: -----> Launching... done, v1
remote:        https://djangogirlsdiary.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/djangogirlsdiary.git
 * [new branch]      master -> master

如果你遇到下列的错误讯息:

Permission denied (publickey).
fatal: The remote end hung up unexpectedly

请透过下列指令新增 public key,然后再重新 git push

~/djangogirls$ heroku keys:add

Step 6: 启动 web process

先前建立了 Procfile 档案告诉 Heroku 启动时要执行的指令,现在我们使用指令启动 web process,并指定只需要 1 个 instance:

~/djangogirls$ heroku ps:scale web=1

Step 7: Django project 初始化

Django 已经成功启动了,但是我们还需要进行资料库初始化,利用 heroku run 可以在 Heroku 执行指令:

~/djangogirls$ heroku run python mysite/manage.py migrate

并为新资料库建立一个 superuser:

~/djangogirls$ heroku run python mysite/manage.py createsuperuser

Step 8: 开启浏览器观看你的网站

最后,透过 open 指令会自动在浏览器打开你的网站:

~/djangogirls$ heroku open

恭喜你成功地把网站发佈到网路上了!

因为资料库是不同的,之前在本机端的日记都需要再重新输入喔。

你可以分享网址给任何人: https://djangogirlsdiary.herokuapp.com/ 。记得前面要替换成你自己的 Heroku app 名称!

未来如果对网站进行任何修改并想更新到 Heroku,只要先确定 git commit 完成后再 push 到 Heroku 即可。

$ git push heroku master

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文