在PyCharm中创建用于处理静态文件的Django应用程序,同时在GitHub上将SECRET_KEY保密,并通过GitHub将应用程序部署到Heroku
首先
在我七个月的Python编程经历中,我多次使用Django创建的Web应用程序,并将其部署到Heroku上。但是,在逐渐了解Django和Heroku的知识的过程中,我发现部署的步骤也在不断变化,因此我决定将最新的步骤总结一次作为我的参考。
为了确保在三个月后的自己能够顺利进行部署而创建了这个,而且如果能对其他人有所帮助,我将非常高兴。
这篇文章所涉及的主题
-
- 仮想環境(Virtualenv)を使ったプロジェクトをPyCharm CEで新規作成する方法
-
- django-herokuまたはdjango-toolbeltを使ってHerokuのデプロイに必要なパッケージをインストールする方法
-
- Djangoで静的ファイル(CSS)を使うための設定
-
- GitHubのリモートリポジトリを経由してHerokuに自動デプロイする方法
- settings.pyのSECRET_KEYをGitHubに公開しないようにする方法
前提 tí)
-
- Pythonをインストール済み
-
- PyCharm CE(無料版)をインストール済み
-
- GitHubのアカウントを取得済み
-
- Herokuのアカウントを取得済み
- Gitをインストール済み
环境
-
- macOS High Sierra 10.13.6
-
- Python 3.7.0
-
- Django 2.1.4
- PyCharm 2018.1.4(Community Edition)
这篇文章特定的术语
由于出现了类似的名称,我觉得这可能会让其他人感到困惑,所以我整理了以下内容。
-
- sample : PyCharmプロジェクトを配置したディレクトリ名
-
- django_pj : Djangoプロジェクトを配置したディレクトリ名
-
- hello : 作成したDjangoアプリケーション名
-
- hello_django : 作成したGitHub上のリモートリポジトリ名
- django201812 : 作成したHerokuのアプリケーション名
1. 创建PyCharm项目
1.1. 启动PyCharm CE
打开PyCharm,然后在下面的画面中选择“创建新项目”。

1.2. PyCharm项目的配置。
接下来,我们将配置PyCharm项目。

-
- 在PyCharm项目中,我们通过选取左上角的Location来指定项目的目录。 在这个例子中,我们选择了~ / PycharmProjects / sample作为目录。
-
- 点击Project Interpreter左侧的▽符号,然后会显示出3以后的菜单。
-
- 这次我们要创建一个新的虚拟环境,因此选择New environment using。同时,我们选择Virtualenv作为虚拟环境。
-
- 在中间位置的Location处指定虚拟环境的创建目录。这次我们决定在之前指定的Pycharm项目目录sample下创建一个名为myvenv的虚拟环境。因此,我们将其指定为~ / PycharmProjects / sample / myvenv。
- 通过Base interpreter指定Python的版本。在这个例子中,我们选择了Python3.7。
当您输入完全部内容后,选择屏幕右下角的”创建”按钮。

2. PyCharm终端的启动
当PyCharm项目创建完成后,会显示如下界面。
接下来,我们选择启动PyCharm的终端,以输入各种必要的命令。
选择屏幕底部的”Terminal”。

然后,将显示如下的终端界面。在这个界面上,您可以输入各种命令。

3. Django的安装
3.1. 确认虚拟环境
终端显示屏中显示着(myvenv)字样,这表示正在启动名为myvenv的虚拟环境。
(myvenv) sample $
接下来,我们将在虚拟环境myvenv中安装Django等内容,但首先我们将查看当前虚拟环境myvenv中已安装了哪些内容。
输入pip list。
(myvenv) sample $ pip list
Package Version
---------- -------
pip 10.0.1
setuptools 39.1.0
You are using pip version 10.0.1, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
(myvenv) sample $
然后,您将看到已安装在虚拟环境myvenv中的软件包列表。
顺便提一下,就像上面的执行结果一样。
You are using pip version XX.X, however version XX.X is available.
You should consider upgrading via the 'pip install --upgrade pip' command.`
如果显示提示,请安装最新版本的pip。按照说明执行以下命令:
pip install –upgrade pip
来安装最新版本的pip。
(myvenv) sample $ pip install --upgrade pip
Collecting pip
Using cached https://files.pythonhosted.org/packages/c2/d7/90f34cb0d83a6c5631cf71dfe64cc1054598c843a92b400e55675cc2ac37/pip-18.1-py2.py3-none-any.whl
Installing collected packages: pip
Found existing installation: pip 10.0.1
Uninstalling pip-10.0.1:
Successfully uninstalled pip-10.0.1
Successfully installed pip-18.1
(myvenv) sample $
3.2. 安装Django和其他必要的软件包。
要将Django应用程序部署到Heroku,除了Django外,还需要安装一些其他包。
安装django-heroku或django-toolbelt后,Django本身和其他所需的包将被一起安装,非常方便。但是,由于各自存在一些缺失的包,下面将分别介绍如何安装缺失的部分。
有一个选项可以解释这句话的中文意思:安装django-heroku和gunicorn的模式1。
(myvenv) sample $ pip install django-heroku gunicorn
(myvenv) sample $ pip list
Package Version
--------------- -------
dj-database-url 0.5.0 # 追加
Django 2.1.4 # 追加
django-heroku 0.3.1 # 追加
gunicorn 19.9.0 # 追加
pip 18.1
psycopg2 2.7.6.1 # 追加
pytz 2018.7 # 追加
setuptools 39.1.0
whitenoise 4.1.2 # 追加
安装第二部分的模式django-toolbelt和whitenoise。
(myvenv) sample $ pip install django-toolbelt whitenoise
(myvenv) sample $ pip list
Package Version
--------------- -------
dj-database-url 0.5.0 # 追加
dj-static 0.0.6 # 追加
Django 2.1.4 # 追加
django-toolbelt 0.0.1 # 追加
gunicorn 19.9.0 # 追加
pip 18.1
psycopg2 2.7.6.1 # 追加
pytz 2018.7 # 追加
setuptools 39.1.0
static3 0.7.0 # 追加
whitenoise 4.1.2 # 追加
在创建Django项目时,创建目录。
在PyCharm项目目录下的sample文件夹中,创建一个Django项目目录。这里将目录名命名为django_pj。
可以使用命令在终端界面上创建目录,但在这里,我们将使用PyCharm的图形用户界面来说明如何创建目录和文件。
在PyCharm中,右键点击样本目录,选择”NEW”,你可以在样本目录下创建新的文件、目录等。这次我们要创建目录,所以选择”目录”。

然后,弹出以下窗口,请输入文件夹名称为django_pj,并选择确定。

在PyCharm项目的目录sample下,创建了一个Django项目的目录django_pj。

5. 创建Django项目
在终端界面上,切换到django_pj目录。
(myvenv) sample $ cd django_pj
当你转到django_pj时,执行django-admin.py startproject config .来创建Django项目。
另外,”config”的部分可以使用任何名称,但它是指与Django项目的整体设置相关的文件所放置的目录名称,所以在这里我们使用”config”。
(myvenv) django_pj $ django-admin.py startproject config .
经过创建Django项目,目录和文件结构如下所示。
(myvenv) django_pj $ tree
.
├── config # 追加
│ ├── __init__.py # 追加
│ ├── settings.py # 追加
│ ├── urls.py # 追加
│ └── wsgi.py # 追加
└── manage.py # 追加
开发环境中创建用于Django标准应用程序的admin等表格。
(myvenv) django_pj $ 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
(myvenv) django_pj $
7. 将语言更改为日语,将时区更改为日本时间。
LANGUAGE_CODE = 'ja' # 変更
TIME_ZONE = 'Asia/Tokyo' # 変更
创建构成Django应用程序的基本文件。
为了创建构成Django应用程序的文件,我们需要执行python manage.py startapp(应用名)命令。
在此示例中,我们将应用名设为hello。
(myvenv) django_pj $ python manage.py startapp hello
在hello目录下创建了各种类型的文件。
(myvenv) django_pj $ tree
.
├── config
│ ├── __init__.py
│ ├── settings.py
│ ├── urls.py
│ └── wsgi.py
├── hello # 追加
│ ├── __init__.py # 追加
│ ├── admin.py # 追加
│ ├── apps.py # 追加
│ ├── migrations # 追加
│ │ └── __init__.py # 追加
│ ├── models.py # 追加
│ ├── tests.py # 追加
│ └── views.py # 追加
└── manage.py
在Django项目中启用Django应用程序。
在刚才创建的Django应用程序hello的目录下查看apps.py文件,可以确认已经创建了HelloConfig类。
from django.apps import AppConfig
class HelloConfig(AppConfig):
name = 'hello'
通过将这个 HelloConfig 类添加到 settings.py 的 INSTALLED_APPS 中,hello 应用程序将在 Django 项目中激活。
INSTALLED_APPS = [
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'hello.apps.HelloConfig', # 追加
]
10. 创建Django应用程序 〜 使用模板和CSS显示Hello Django! 〜
无论Django应用的具体内容是什么,我们将来都会创建一个可以处理模板文件和静态文件的应用程序。
10.1. Django指定要搜索模板的目录。
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')], # 変更
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
10.2. 指定Django去寻找静态文件(如CSS等)的目录
STATIC_URL = '/static/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, 'static')] # 追加
STATIC_ROOT = 'staticfiles' # 追加
10.3. 创建模板
创建一个用于放置模板的目录。
在django_pj目录下创建一个templates目录,并在其中创建一个hello目录。
(myvenv) django_pj $ mkdir -p templates/hello
创建模板文件
(myvenv) django_pj $ touch templates/hello/index.html
编辑模板文件
{% load static %}
<!DOCTYPE html>
<html lang="ja">
<head>
<link rel="stylesheet" href="{% static 'css/hello.css' %}">
</head>
<body>
<h2 class="hello">Hello Django!</h2>
</body>
</html>
10.4. 创建CSS
创建一个用于存放CSS文件的目录。
在django_pj目录下创建一个static目录,并在其中创建一个css目录。
(myvenv) django_pj $ mkdir -p static/css
创建CSS文件
(myvenv) django_pj $ touch static/css/hello.css
编辑 CSS
.hello {
color: red;
}
10.5. 编辑视图
from django.views.generic import TemplateView
class IndexView(TemplateView):
template_name = 'hello/index.html'
10.6. 设置路由
在hello应用程序的目录中新建urls.py文件。
(myvenv) django_pj $ touch hello/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.IndexView.as_view(), name='index'),
]
接下来,我们将将刚刚创建的hello应用的路由设置与整个Django项目的路由设置结合起来。
from django.contrib import admin
from django.conf.urls import include # 追加
from django.urls import path
urlpatterns = [
path('admin/', admin.site.urls),
path('', include('hello.urls')), # 追加
]
在开发环境中确认“Hello Django”的显示。
启动开发服务器
(myvenv) django_pj $ python manage.py runserver
确认
当在浏览器中访问http://127.0.0.1:8000时,将以红色显示“Hello Django!”的字样。

如果没有显示为红色,那么说明static/css/hello.css文件加载失败了。
-
- settings.py
-
- template/hello/index.html
- static/css/hello.css
请确认以下内容。
准备部署到Heroku所需的文件。
11.1. 创建 requirements.txt 文件
(myvenv) django_pj $ pip freeze > requirements.txt
dj-database-url==0.5.0
Django==2.1.4
django-heroku==0.3.1
gunicorn==19.9.0
psycopg2==2.7.6.1
pytz==2018.7
whitenoise==4.1.2
11.2. 创建Procfile
(myvenv) django_pj $ touch Procfile
web: gunicorn config.wsgi
对于“config”部分,请使用wsgi.py所在的目录名称。如果目录名称不是“config”,请适当更改。
创建11.3. runtime.txt文件。
(myvenv) django_pj $ touch runtime.txt
我将提供Python的版本。
python-3.7.0
创建一个用于开发环境的local_settings.py文件。
(myvenv) django_pj $ touch config/local_settings.py
import os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
}
DEBUG = True
SECRET_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'
请将SECRET_KEY的实际内容设为与settings.py文件中所写内容相同。
将settings.py文件编辑为适用于Heroku环境。
删除密钥SECRET_KEY。
为了不在GitHub上公开SECRET_KEY,我们会将其删除(之后会将其从环境变量中读取)。
SECRET_KEY = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' # この行を削除
调试,ALLOWED_HOSTS的更改
DEBUG = False # 変更
ALLOWED_HOSTS = ['*'] # 変更
设置以使用白噪音。
如果您使用的是WhiteNoise的版本4或更高版本,则可以按照以下方式进行设置。
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',
]
数据设置的更改
# 以下を削除
'''
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3',
'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
}
'''
# 代わりに以下を追加
import dj_database_url
DATABASES = {
'default': dj_database_url.config(),
}
在开发环境中,加载local_settings.py文件;在Heroku环境中,设置读取环境变量中的SECRET_KEY。
我会在settings.py的最后一行添加以下内容。
try:
from .local_settings import *
except ImportError:
pass
if not DEBUG:
SECRET_KEY = os.environ['SECRET_KEY']
在没有放置local_settings.py文件的Heroku环境中,由于不经过local_settings.py中的DEBUG = True,所以DEBUG仍保持为False,并从环境变量中加载SECRET_KEY。
待会会解释如何在Heroku的环境变量中设置SECRET_KEY。
在GitHub上创建远程库。
选择Create repository后,将在GitHub上创建一个名为hello_django的远程仓库。

13. Heroku的配置
13.1. 创建一个Heroku应用程序
在Heroku上创建一个应用程序。
这里应用程序的名称为django201812。
选择Create app,应用程序将被创建。

13.2. Heroku与GitHub的远程代码仓库进行关联。
在Heroku应用程序django201812的部署页面上,进行Heroku和GitHub的连接配置。

只需要一个选项:在上述屏幕上,
-
- 选择GitHub
-
- 输入之前在GitHub创建的远程仓库名称
选择搜索
当远程仓库名称显示出来时,选择连接
然后,屏幕会显示如下内容。

现在,Heroku应用程序django201812和GitHub的远程存储库hello_django已经连接起来了。
13.3. 在将代码推送到GitHub的远程仓库后,设置自动将其部署到Heroku。
同样地,在Heroku应用程序django201812的部署页面上选择启用自动部署。

然后,将会显示以下内容。

现在,只需要将这些代码推送到GitHub的远程仓库hello_django,Heroku的应用程序django201812就会自动部署。
13.4. 将SECRET_KEY设置为环境变量。
在Heroku应用程序django201812的设置页面上,进行环境变量的配置。
请在以下屏幕上选择”Reveal Config Vars”。

然后,会出现一个输入环境变量名称和其值的页面。
-
- 在左边的表单中输入SECRET_KEY。
-
- 在右边的表单中输入以前在settings.py中记录并现在记录在local_settings.py中的SECRET_KEY的值(无需包括单引号)。
- 选择添加。
我会去做。

这样,环境变量SECRET_KEY已在Heroku应用程序django201812中设置好了。
14. 创建本地代码仓库
现在我们要回到PyCharm的终端界面,在本地创建一个仓库。
14.1. 制作.gitignore文件
在GitHub的远程存储库中指定不需要管理的文件或目录。
(myvenv) django_pj $ touch .gitignore
myvenv
__pycache__
staticfiles
local_settings.py
db.sqlite3
*.py[co]$
14.2. 创建本地仓库
逐步执行以下步骤。
(myvenv) django_pj $ git init
Initialized empty Git repository in /Users/xxxxxxxx/PycharmProjects/sample/django_pj/.git/
(myvenv) django_pj $ git add .
(myvenv) django_pj $ git commit -m "first commit"
[master (root-commit) 35b4c58] first commit
20 files changed, 224 insertions(+)
create mode 100644 .DS_Store
create mode 100644 .gitignore
create mode 100644 Procfile
create mode 100644 config/__init__.py
create mode 100644 config/settings.py
create mode 100644 config/urls.py
create mode 100644 config/wsgi.py
create mode 100644 hello/__init__.py
create mode 100644 hello/admin.py
create mode 100644 hello/apps.py
create mode 100644 hello/migrations/__init__.py
create mode 100644 hello/models.py
create mode 100644 hello/tests.py
create mode 100644 hello/urls.py
create mode 100644 hello/views.py
create mode 100755 manage.py
create mode 100644 requirements.txt
create mode 100644 runtime.txt
create mode 100644 static/css/hello.css
create mode 100644 templates/hello/index.html
14.3. 将本地代码库与GitHub上的远程代码库进行关联
在中国境内执行以下操作:将远程仓库的URL添加到GitHub中。
您可以从GitHub的远程代码库界面上查看到GitHub上远程仓库的URL。

(myvenv) django_pj $ git remote add origin https://github.com/shonansurvivors/hello_django.git
在GitHub上将代码推送到远程仓库并自动部署到Heroku。
将代码推送至GitHub上的远程库(15.1)
执行”git push -u origin master”。
(myvenv) django_pj $ git push -u origin master
Counting objects: 27, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (18/18), done.
Writing objects: 100% (27/27), 4.20 KiB | 2.10 MiB/s, done.
Total 27 (delta 0), reused 0 (delta 0)
remote:
remote: Create a pull request for 'master' on GitHub by visiting:
remote: https://github.com/shonansurvivors/hello_django/pull/new/master
remote:
To https://github.com/shonansurvivors/hello_django.git
* [new branch] master -> master
Branch 'master' set up to track remote branch 'master' from 'origin'.
成功后,您可以在GitHub的远程仓库hello_django的代码页面上确认各种文件已成功注册。

15.2 确认 Heoku 自动部署结果
选择 Heroku 应用程序 django201812 的管理界面右上角的 “打开应用” 选项。

然后,在浏览器中显示Heroku应用程序django201812。

如果在开发环境同样以红色字体显示“Hello Django!”的话,那么就表示部署成功了。
辛苦了
如果显示不正常
部署或构建可能失败。
您可以在Heroku应用程序django201812的Activity页面上查看部署和构建失败时的日志,从而进行故障排查。
在以下的画面示例中,构建失败,选择查看构建日志可以查看该日志。

请参照下列的中文翻译。
DjangoBrothers博客- 在Heroku上部署Django应用的步骤