我有一个基本的django应用程序(Newsdiffs)在localhost:8000
与python website/manage.py runserver
运行良好,但我想将其迁移到Heroku,我不知道我的下一步是什么。
我认为让它在本地运行会转化为在Heroku上运行它,但我意识到python website/manage.py runserver
正在启动开发设置,我不确定如何告诉它使用主设置。
所有在我的个人档案是这样的:
web: python website/manage.py runserver
在本地,这工作得很好,尽管它在http://127.0.0.1:8000/上启动它,这可能不是我想在Heroku上看到的。那么如何确定在哪里设置主机名和端口呢?我在应用里都没看到。
我两天前刚刚为自己画了这个清单。它是按照Heroku的python帮助页面中描述的步骤组装起来的。
这绝不是确定的,也不是完美的,它会改变,但这是一个有效的跟踪,因为我能够把网站上线。
仍然存在一些问题,要彻底检查,例如,出于安全原因,上传文件的media/
目录的位置应该/可以在您的项目之外(现在它有效,但我已经注意到,如果dyno休眠,那么文件不会被模板到达/显示)。对于staticfiles/
目录也是如此(尽管这个似乎工作得很好)。
也可以将django的调试模式设置为false。
在这里:
将django应用部署到Heroku的第一步
假设:
a)你的django项目已经在虚拟环境中了
b)你已经用 收集了所有项目所需的包pip freeze > requirements.txt
并提交到git
git add requirements.txt
git commit -m 'my prj requirements'
0)激活项目的虚拟环境
workon xyz #using virtualenvwrapper
然后进入你的django项目目录(简称DPD),如果还没有进入那里
cd ~/prj/xyz (or cdproject with virtualenvwrapper if setup properly)
,并创建一个新的git分支,用于heroku twidering,以防止把事情搞砸
git checkout -b he
1)在heroku上创建应用
heroku create xyz
还将heroku添加为您的repo的远程地址
2)将需要的包添加到requirements.txt
vi requirements.txt
添加dj-database-url==0.3.0
django-postgrespool==0.3.0
gunicorn==19.3.0
psycopg2==2.6
django-toolbelt==0.0.1
static3==0.5.1
whitenoise==2.0.3
3)安装本地venv
中的所有依赖项pip install -r requirements.txt --allow-all-external
设置heroku django设置
cd xyz
创建一个副本
cp setting.py settings_heroku.py
并编辑
vi settings_heroku.py
import os
import dj_database_url
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
STATICFILES_DIRS = (os.path.join(BASE_DIR, 'static'), )
MEDIA_ROOT = os.path.join(BASE_DIR, "media")
STATIC_ROOT = os.path.join(BASE_DIR, "staticfiles")
STATIC_URL = '/static/'
MEDIA_URL = '/media/'
STATICFILES_STORAGE = 'whitenoise.django.GzipManifestStaticFilesStorage'
SECRET_KEY = os.environ["DJANGO_SECRET_KEY"]
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
用
替换django的STD db CFGDATABASES['default'] = dj_database_url.config()
DATABASES['default']['ENGINE'] = 'django_postgrespool'
和
WSGI_APPLICATION = 'xyz.wsgi_heroku.application'
配置必要的环境变量(heroku configs)
编辑.env
文件
vi .env
。
DJANGO_SECRET_KEY=whatever
EMAIL_HOST_USER=youruser@gmail.com
EMAIL_HOST_PASSWORD=whateveritis
和/或在需要时手动设置它们(在我的情况下,.env
没有效果,显然没有加载,并且现在必须手动设置变量)
heroku config:set DJANGO_SECRET_KEY=whatever
heroku config:set EMAIL_HOST_USER=youruser@gmail.com
heroku config:set EMAIL_HOST_PASSWORD=whateveritis
6)为heroku创建一个单独的wsgi文件
cd xyx
cp wsgi.py wsgi_heroku.py
并编辑它,使其指向正确的设置
vi wsgi_heroku.py
from whitenoise.django import DjangoWhiteNoise
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "xyz.settings_heroku")
application = get_wsgi_application()
application = DjangoWhiteNoise(application)
7)确保所有模板都使用
{% load staticfiles %}
8)定义Procfile文件,使其指向正确的wsgi
。
cd ~/prj/xyz (DPD)
vi Procfile
添加web: gunicorn xyz.wsgi_heroku --log-file -
9)收集所有静态内容到DPD/staticfiles/
在本地,确保django指向正确的wsgi设置
export WSGI_APPLICATION=blogger.wsgi_heroku.application
python manage.py collectstatic
10)将更改添加到本地git仓库(分支)
git add --all .
git commit -m 'first 4 heroku'
11)检查整个东西在本地工作
heroku local # in heroku's help they also add `web`, not needed?!
把你的代码推送到heroku
git push heroku he:master
heroku ps:scale web=1
14)在heroku DB上创建表
heroku run python manage.py migrate
注意:如果你看到这样的消息:"你刚刚安装了Django的认证系统,这意味着你没有定义任何超级用户。"您现在想创建一个吗?,输入no.
15)添加超级用户到heroku数据库
heroku run bash
python manage.py createsuperuser
和往常一样填写细节
用必要的fixture填充DBheroku run python manage.py loaddata yourfile.json
17)访问heroku的web服务器的网页
heroku open
或转到
https://xyz.herokuapp.com/
和admin
https://xyz.herokuapp.com/admin/
和DB
https://xyz.herokuapp.com/db
有用的命令:
查看应用的日志
heroku logs [--tail]
列出已部署的插件
heroku addons
和使用一个:
heroku addons:open <add-on-name>
在heroku(您正在部署的远程环境)上运行命令
heroku run python manage.py shell
heroku run bash
在Heroku上设置配置变量
heroku config:set VARNAME=whatever
查看已设置的配置变量(包括DB的)
heroku config
查看postgres数据库详细信息
heroku pg
如果你了解一些python,并且有很多用其他语言构建web应用程序的经验,但不完全理解Heroku适合哪里,我强烈推荐Discover Flask,它弥补了我对这些部分如何组合在一起的理解中的许多漏洞。
我想出来的一些事情:
-
如果你要部署到Heroku,你确实需要一个隔离的虚拟环境,因为Heroku从requirements.txt文件中安装Python模块。
-
Gunicorn是一个web服务器,你肯定需要在Gunicorn下运行你的应用程序,否则它不会在Heroku上运行。
-
"Procfile"不只是给出你用来在本地运行应用程序的命令。这是希罗库的要求。如果你有一个在Heroku上运行的应用,但它不包括Procfile,他们就遗漏了一些东西。
-
你没有告诉Heroku你的主机名是什么。当您运行
heroku create
时,它应该告诉您您的域名将是什么。每次你运行git push heroku master
(或任何分支你推,也许不是master
), Heroku将(尝试)重启你的应用程序。 -
Heroku不支持sqlite。你必须在Postgres中运行你的生产数据库。
这并没有直接回答我的问题,但它确实填补了一些使我难以提出正确问题的缺失部分。尽管RTFM。:)