使用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
要结束,请按control+C
6. 项目的日语设置 de
更改 sample_app/settings.py 文件中的语言代码和时区设置。
LANGUAGE_CODE = 'ja'
TIME_ZONE = 'Asia/Tokyo'
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.
模型的定义
生成一张桌子
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)
引入版本管理工具。
对于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设置为本地。
从新的存储库创建一个仓库。
复制已创建的远程存储库的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/
请问您能提供一下上述内容的中文释义吗?谢谢!
以下是在Heroku上进行Python项目的最佳实践,可以参考这个存储库:
https://github.com/heroku/python-getting-started