在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,然后在下面的画面中选择“创建新项目”。

スクリーンショット 2018-12-04 3.20.16.png

1.2. PyCharm项目的配置。

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

スクリーンショット 2018-12-04 3.07.12.png
    1. 在PyCharm项目中,我们通过选取左上角的Location来指定项目的目录。 在这个例子中,我们选择了~ / PycharmProjects / sample作为目录。

 

    1. 点击Project Interpreter左侧的▽符号,然后会显示出3以后的菜单。

 

    1. 这次我们要创建一个新的虚拟环境,因此选择New environment using。同时,我们选择Virtualenv作为虚拟环境。

 

    1. 在中间位置的Location处指定虚拟环境的创建目录。这次我们决定在之前指定的Pycharm项目目录sample下创建一个名为myvenv的虚拟环境。因此,我们将其指定为~ / PycharmProjects / sample / myvenv。

 

    通过Base interpreter指定Python的版本。在这个例子中,我们选择了Python3.7。

当您输入完全部内容后,选择屏幕右下角的”创建”按钮。

スクリーンショット 2018-12-04 3.27.30.png

2. PyCharm终端的启动

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

スクリーンショット 2018-12-08 20.41.08.png

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

スクリーンショット 2018-12-08 20.48.48.png

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”,你可以在样本目录下创建新的文件、目录等。这次我们要创建目录,所以选择”目录”。

スクリーンショット 2018-12-08 22.38.30.png

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

スクリーンショット 2018-12-08 22.48.39.png

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

スクリーンショット 2018-12-08 22.59.18.png

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!”的字样。

スクリーンショット 2018-12-09 14.37.52.png

如果没有显示为红色,那么说明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的远程仓库。

スクリーンショット 2018-12-09 9.08.47.png

13. Heroku的配置

13.1. 创建一个Heroku应用程序

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

スクリーンショット 2018-12-09 9.16.51.png

13.2. Heroku与GitHub的远程代码仓库进行关联。

在Heroku应用程序django201812的部署页面上,进行Heroku和GitHub的连接配置。

スクリーンショット 2018-12-09 9.19.53.png

只需要一个选项:在上述屏幕上,

    1. 选择GitHub

 

    1. 输入之前在GitHub创建的远程仓库名称

选择搜索
当远程仓库名称显示出来时,选择连接

然后,屏幕会显示如下内容。

スクリーンショット 2018-12-09 9.23.21.png

现在,Heroku应用程序django201812和GitHub的远程存储库hello_django已经连接起来了。

13.3. 在将代码推送到GitHub的远程仓库后,设置自动将其部署到Heroku。

同样地,在Heroku应用程序django201812的部署页面上选择启用自动部署。

スクリーンショット 2018-12-09 9.28.35.png

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

スクリーンショット 2018-12-09 9.29.37.png

现在,只需要将这些代码推送到GitHub的远程仓库hello_django,Heroku的应用程序django201812就会自动部署。

13.4. 将SECRET_KEY设置为环境变量。

在Heroku应用程序django201812的设置页面上,进行环境变量的配置。

请在以下屏幕上选择”Reveal Config Vars”。

スクリーンショット 2018-12-09 11.30.12.png

然后,会出现一个输入环境变量名称和其值的页面。

    1. 在左边的表单中输入SECRET_KEY。

 

    1. 在右边的表单中输入以前在settings.py中记录并现在记录在local_settings.py中的SECRET_KEY的值(无需包括单引号)。

 

    选择添加。

我会去做。

スクリーンショット 2018-12-09 11.31.56.png

这样,环境变量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。

スクリーンショット 2018-12-09 14.51.49.png
(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的代码页面上确认各种文件已成功注册。

スクリーンショット 2018-12-09 14.11.33.png

15.2 确认 Heoku 自动部署结果

选择 Heroku 应用程序 django201812 的管理界面右上角的 “打开应用” 选项。

スクリーンショット 2018-12-09 14.16.32.png

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

スクリーンショット 2018-12-09 14.43.42.png

如果在开发环境同样以红色字体显示“Hello Django!”的话,那么就表示部署成功了。

辛苦了

如果显示不正常

部署或构建可能失败。

您可以在Heroku应用程序django201812的Activity页面上查看部署和构建失败时的日志,从而进行故障排查。

在以下的画面示例中,构建失败,选择查看构建日志可以查看该日志。

スクリーンショット 2018-12-09 11.21.16.png

请参照下列的中文翻译。

DjangoBrothers博客- 在Heroku上部署Django应用的步骤

广告
将在 10 秒后关闭
bannerAds