使用Python Django将应用程序部署到Heroku

首先

用Python的Web应用框架Django尝试将应用部署到Heroku。

初始设置

确认Python 3系的安装情况

检查版本
python –version

确认python的位置在哪里

※虽然Mac默认配有Python 2版本,但该版本即将被废弃,因此建议您安装Python 3版本。
※如果您还未安装Python,请参考以下文章进行安装:
https://qiita.com/ms-rock/items/72b8f1abc661c539bb09

2. Django安装

可以在Django官方网站上查看最新版本并进行安装,但如果安装django-tool-belt,就可以一次性安装包括部署所需的所有内容。

安装django-toolbelt

$ pip install django-toolbelt
$ pip list
Package         Version
--------------- -------
dj-database-url 0.5.0  
dj-static       0.0.6  
Django          2.0.6  
django-toolbelt 0.0.1  
gunicorn        19.8.1 
pip             10.0.1 
psycopg2        2.7.4  
pytz            2018.4 
setuptools      28.8.0 
static3         0.7.0  

有时在安装psycopg2时会遇到故障,但可以通过以下文章中的解决方法来解决:
https://dev.classmethod.jp/articles/mac-psycopg2-install/

创建项目

当 Django 被安装后,就能够使用 django-admin 命令来启动一个新的项目,命令为 django-admin startproject (应用名称)。

创建一个名为 sample_app 的项目,使用 django-admin startproject sample_app 的命令。

将会生成一个sample_app目录,其结构如下所示。


.
├── manage.py
└── sample_app
    ├── __init__.py
    ├── settings.py
    ├── urls.py
    └── wsgi.py

创建venv环境。

venv是什么?

这个模块是Python3提供的一个虚拟环境管理工具。
它常用于在每个项目中切换安装的软件包。
※类似的Python环境管理工具还有一个名为”virtualenv”的命令。
它是Python2系列所需的,如果需要在Python2系列中创建项目,则需要使用该工具,但大多数情况下都是在Python3系列中创建项目的,因此不需要它。
※如果将使用venv创建的环境移动,会导致环境破坏,因此如果想更改环境的位置,则需要使用pip freeze导出现有环境,并创建一个新的环境。

用 Python 的 -m venv 命令创建一个虚拟环境,环境名称可以自由命名。

创建venv环境

$ python -m venv env
$

切换到venv环境

$ source ./env/bin/activate
(env)$ 

使用pip list命令来检查包。

(env)$ pip install --upgrade pip
(env)$ pip list
pip
setuptools

重新安装最新版本的Django。

(env)$ pip list
Package    Version
---------- -------
pip        20.2.4
setuptools 49.2.1
(env)$ python -m pip install Django
(env)$ pip list
Package    Version
---------- -------
asgiref    3.2.10
Django     3.1.2
pip        20.2.4
pytz       2020.1
setuptools 49.2.1
sqlparse   0.4.1

如果要取消venv环境,请执行deactivate。

(env)$ deactivate
$ 

5. 启动开发服务器

移动到manage.py所在的文件夹,并使用runserver命令
(env) $ python manage.py runserver

127.0.0.1_8000_.png

要结束,请按control+C

6. 项目的日语设置 de

更改 sample_app/settings.py 文件中的语言代码和时区设置。

LANGUAGE_CODE = 'ja'

TIME_ZONE = 'Asia/Tokyo'
スクリーンショット 2017-12-11 23.48.41.png

7. 数据库的设置 de

在Django中,默认使用的是SQLite数据库。
数据库设置位于sample_app/settings.py文件中的DATABASES部分。
需确认DATABASES的设置。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': BASE_DIR / 'db.sqlite3',
    }
}

创建管理用的数据表

Django在默认情况下提供了用户管理、会话管理和管理网站等功能。
此外,它还提供了用于创建和更改数据库表的迁移功能。

请确认已安装的应用程序的设置。

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
]

确认桌子是空的

(env) $ python manage.py dbshell
sqlite> .table
sqlite> .q

执行迁移,请执行以下命令。

(env) % 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 auth.0010_alter_group_name_max_length... OK
  Applying auth.0011_update_proxy_permissions... OK
  Applying auth.0012_alter_user_first_name_max_length... OK
  Applying sessions.0001_initial... OK
(env) % 

确认桌子已经做好了。

(env) $ python manage.py dbshell
sqlite> .table
auth_group                  auth_user_user_permissions
auth_group_permissions      django_admin_log          
auth_permission             django_content_type       
auth_user                   django_migrations         
auth_user_groups            django_session            
sqlite> 

9. 创造一个应用程序

项目和其初始设置已经完成,现在开始创建定义实际功能和界面等的应用程序主体。

创建应用程序 app
(env) $ python manage.py startapp app

生成的App目录如下:

.
├── __init__.py
├── admin.py
├── apps.py
├── migrations
│   └── __init__.py
├── models.py
├── tests.py
└── views.py

在创建应用程序时,在app/apps.py文件中会创建一个名为AppConfig的应用程序配置类。将AppConfig添加到sample_app/setting.py的INSTALLED_APPS中。

# Application definition

INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'app.apps.AppConfig', # AppConfigを追加
]

网站管理

10. 创建管理员账户

使用createsuperuser命令创建管理员用户。

(env) $ python manage.py createsuperuser
Username (leave blank to use 'ユーザー名'): (任意のユーザーネームを入力する)
Email address: (任意のメールアドレスを入力する)                 
Password: (パスワードを入力する)
Password (again): (パスワードを再入力)
Superuser created successfully.

11. 启动开发服务器

启动服务器,访问http://127.0.0.1:8000/admin

(env) $ python manage.py runserver
Django version 2.0.6, using settings 'sample_app.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
スクリーンショット 2017-12-12 7.38.01.png
スクリーンショット 2017-12-12 7.40.34.png

模型的定义

生成一张桌子

12.建立模型

在app/models.py文件中进行以下编辑
定义了一个名为task的模型

from django.db import models


class Task(models.Model):
    name = models.CharField('タスク名', max_length=255)
    created_date = models.DateTimeField('作成日時', auto_now_add=True)
    update_date = models.DateTimeField('更新日時', auto_now=True)

    def __str__(self):
        return self.name

使用makemigration命令创建迁移文件

(env) $ python manage.py makemigrations
Migrations for 'app':
  app/migrations/0001_initial.py
    - Create model Task

使用migrate命令执行迁移操作。

(env) $ python manage.py migrate
Operations to perform:
  Apply all migrations: admin, app, auth, contenttypes, sessions
Running migrations:
  Applying app.0001_initial... OK
(env) $ 

确认app_task表已创建

(env) $ python manage.py dbshell
sqlite> .table
app_task                    auth_user_user_permissions
auth_group                  django_admin_log          
auth_group_permissions      django_content_type       
auth_permission             django_migrations         
auth_user                   django_session            
auth_user_groups          
sqlite>

13. 将模特注册到管理网站

请在app/admin.py中输入以下内容

from django.contrib import admin

# Taskモデルをインポート
from .models import Task

# 管理サイトへのモデルを登録
admin.site.register(Task)
スクリーンショット 2017-12-12 8.41.35.png

引入版本管理工具。

对于14到18岁的人,如果已经明白了就可以跳过不问问题。

14. Git设置

从以下网站上下载并安装Git:
https://git-scm.com/downloads

设定用户名和电子邮件地址

(env) $ git config --global user.email (メールアドレス)
(env) $ git config --global user.name (ユーザー名)

15. 创建存储库

因为已经创建了仓库,所以只需执行 “git init” 命令即可,该命令会创建与 “git init(仓库名)” 中指定的名称相同的仓库。

(env) $ git init
Initialized empty Git repository in 
/Users/ユーザー名/PycharmProjects/sample_app/.git/

生成并注册ssh密钥

为了与GitHub进行连接,可以使用以下命令生成SSH密钥。

$ ssh-keygen -t rsa -b 4096 -C (メールアドレス)
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/ユーザー名/.ssh/id_rsa): (エンターを押す)
・
・
・
$ tree
.
├── id_rsa
└── id_rsa.pub

执行以下命令。

$ pbcopy < ~/.ssh/id_rsa.pub

将id_rsa.pub文件的内容复制。
登录github,注册SSH Key。
在”New SSH Key”中输入Title(可选)和Key(复制的内容),然后进行注册。

17. 从“New Repository”创建远程仓库,将远程仓库的URI设置为本地。

从新的存储库创建一个仓库。

スクリーンショット 2017-12-12 11.18.22.png

复制已创建的远程存储库的URI,并执行以下命令:
$ git remote add origin(远程存储库的SSH URI)

18. 各种Git命令

查看差异状态
git 状态

将更改添加到阶段

提交更改
git commit -m “信息”

查看分支

切换到另一个分支
git branch (要切换的分支名字)

将代码推送到远程仓库
git push -u origin master

拉取

将应用部署到Heroku上

19.准备一个Heroku账户

如果没有Heroku账户,请首先创建Heroku账户,并安装Heroku CLI以使用heroku命令。

在Heroku上配置应用程序的设置。

ALLOWED_HOSTS是指定Web系统允许启动的IP地址的项目,在Heroku上,如果没有指定IP地址,将变为DisallowedHost。
如果需要限制IP,就需要定义IP,但如果是一个任何地方都可以访问的应用程序,可以将其指定为*。

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

在Heroku上,使用Django自带的sqlite3无法工作,需要设置为使用Heroku默认的postgresql数据库。
dj_database_url包含在django-toolbelt中。

import dj_database_url
db_from_env = dj_database_url.config()
DATABASES['default'].update(db_from_env)

使用 Gunicorn 或其他 WSGI 服务器从生产环境应用静态文件时需要加载 dj-static 并封装 get_wsgi_application。

import os

from dj_static import Cling
from django.core.wsgi import get_wsgi_application

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

application = Cling(get_wsgi_application())

21.制作部署所需的文件

创建Procfile。Procfile是一个定义在Heroku上执行的命令的文件。
参考Django和Heroku的文档,输入如下内容。

https://docs.djangoproject.com/ja/3.1/howto/deployment/wsgi/gunicorn/ →
https://docs.djangoproject.com/zh-hans/3.1/howto/deployment/wsgi/gunicorn/

https://devcenter.heroku.com/articles/django-app-configuration →
https://devcenter.heroku.com/zh-hans/articles/django-app-configuration

(env) $ echo "web: gunicorn sample_app.wsgi --log-file -" > Procfile
(env) $

创建一个 runtime.txt 文件。
runtime.txt 的作用是指定 Python 的版本。

(env)$ echo "python-3.8.1" > runtime.txt
(env)$ 

创建 requirements.txt 文件。
requirements.txt 文件用于表示 pip 的依赖关系。

(env)$ pip3 freeze > requirements.txt
(env)$ 

22. 创建一个Heroku应用程序

执行以下命令。

(env)$ heroku create
・・・
(env)$

Heroku环境变量的配置。
链接:https://devcenter.heroku.com/articles/django-assets

(env)$ heroku config:set DISABLE_COLLECTSTATIC=1
(env)$

查看已创建的应用程序信息

(env)$ heroku apps
・・・
(env)$

如果想要删除已创建的应用程序(使用 –confirm 命令可无需确认即可删除)

$ heroku apps:destroy --app (app名) --confirm (app名)
(env)$

将代码推送到Heroku上。

(env)$ git add .
(env)$ git commit -m "Herokuの設定"
(env)$ git push heroku master

在Heroku上进行迁移。

(env)$ heroku run python manage.py migrate
(env)$

创建Heroku管理网站用户

(env)$ heroku run python manage.py createsuperuser
・
・
・
Username (leave blank to use ''): 
Email address: 
Password: 
Password (again): 
Superuser created successfully.
(env)$ 

打开Heroku并进行确认

(env)$ heroku open
(env)$ 

请在以下网址中登录管理员账号:https://(应用名称).herokuapp.com/admin/login/?next=/admin/

スクリーンショット 2017-12-12 13.16.48.png

请问您能提供一下上述内容的中文释义吗?谢谢!

以下是在Heroku上进行Python项目的最佳实践,可以参考这个存储库:
https://github.com/heroku/python-getting-started

广告
将在 10 秒后关闭
bannerAds