<p>我两天前刚给自己画了这个单子。
它是在遵循<a href="https://devcenter.heroku.com/articles/getting-started-with-python#introduction" rel="nofollow">Heroku's help pages for python</a>中描述的步骤之后组装起来的。在</p>
<p>它绝不是确定的或完美的,它会改变,但它是一个有效的跟踪,因为我可以把网站放到网上。在</p>
<p>还有一些问题需要彻底检查,例如上传文件的<code>media/</code>目录的位置出于安全原因应该/可能位于您的项目之外(现在它起作用了,但是我注意到如果dyno休眠,那么以后模板将无法访问/显示文件)。
<code>staticfiles/</code>目录也是如此(尽管这个目录似乎工作得很好)。在</p>
<p>另外,您可能希望将django的调试模式设置为false。在</p>
<p>这里是:</p>
<p><strong>我将现有django应用程序部署到Heroku的第一步</strong></p>
<p>假设:</p>
<p>django已经在你的虚拟环境中了</p>
<p>b)您已经使用</p>
<pre><code>pip freeze > requirements.txt
</code></pre>
<p>把它交给git</p>
^{pr2}$
<p>0)激活项目的虚拟环境</p>
<pre><code>workon xyz #using virtualenvwrapper
</code></pre>
<p>然后转到django项目的目录(简称DPD),如果还没有被带到那里</p>
<pre><code>cd ~/prj/xyz (or cdproject with virtualenvwrapper if setup properly)
</code></pre>
<p>并为heroku twidling创建一个新的git分支,以防止把事情搞砸</p>
<pre><code>git checkout -b he
</code></pre>
<p>1)在heroku上创建应用程序</p>
<pre><code>heroku create xyz
</code></pre>
<p>这也增加了heroku作为回购的远程设备</p>
<p>2)将所需的包添加到要求.txt在</p>
<pre><code>vi requirements.txt
</code></pre>
<p>添加</p>
<pre><code>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
</code></pre>
<p>3)在本地venv中安装所有依赖项</p>
<pre><code>pip install -r requirements.txt allow-all-external
</code></pre>
<p>4)设置heroku django设置</p>
<pre><code>cd xyz
</code></pre>
<p>创建副本</p>
<pre><code>cp setting.py settings_heroku.py
</code></pre>
<p>然后编辑它</p>
<pre><code>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')
</code></pre>
<p>将django的std db cfg替换为</p>
<pre><code>DATABASES['default'] = dj_database_url.config()
DATABASES['default']['ENGINE'] = 'django_postgrespool'
</code></pre>
<p>以及</p>
<pre><code>WSGI_APPLICATION = 'xyz.wsgi_heroku.application'
</code></pre>
<p>5)配置必要的环境变量(heroku configs)</p>
<p>编辑<code>.env</code>文件</p>
<pre><code>vi .env
</code></pre>
<p>例如</p>
<pre><code>DJANGO_SECRET_KEY=whatever
EMAIL_HOST_USER=youruser@gmail.com
EMAIL_HOST_PASSWORD=whateveritis
</code></pre>
<p>或者根据需要手动设置它们(在我的例子中,<code>.env</code>没有效果,显然没有加载,现在必须手动设置变量)</p>
<pre><code>heroku config:set DJANGO_SECRET_KEY=whatever
heroku config:set EMAIL_HOST_USER=youruser@gmail.com
heroku config:set EMAIL_HOST_PASSWORD=whateveritis
</code></pre>
<p>6)为heroku创建一个单独的wsgi文件</p>
<pre><code>cd xyx
cp wsgi.py wsgi_heroku.py
</code></pre>
<p>并对其进行编辑,使其指向正确的设置</p>
<pre><code>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)
</code></pre>
<p>7)确保所有模板都使用</p>
<pre><code>{% load staticfiles %}
</code></pre>
<p>8)定义Procfile文件,使其指向正确的wsgi</p>
<p>例如</p>
^{pr21}$
<p>添加</p>
<pre><code>web: gunicorn xyz.wsgi_heroku log-file -
</code></pre>
<p>9)将所有静态内容收集到DPD/staticfiles/</p>
<p>在本地,确保django指向正确的wsgi设置</p>
<pre><code>export WSGI_APPLICATION=blogger.wsgi_heroku.application
python manage.py collectstatic
</code></pre>
<p>10)将更改添加到本地git repo(he branch)</p>
<pre><code>git add all .
git commit -m 'first 4 heroku'
</code></pre>
<p>11)检查整个装置在本地的工作情况</p>
<pre><code>heroku local # in heroku's help they also add `web`, not needed?!
</code></pre>
<p>12)把你的代码推给heroku</p>
<pre><code>git push heroku he:master
</code></pre>
<p>13)确保应用程序的实例正在运行</p>
<pre><code>heroku ps:scale web=1
</code></pre>
<p>14)在heroku数据库上创建表</p>
<pre><code>heroku run python manage.py migrate
</code></pre>
<p>注意:如果您看到一条消息:“您刚刚安装了Django的auth系统,这意味着您没有定义任何超级用户。现在要创建一个吗?“,类型号</p>
<p>15)将超级用户添加到heroku数据库</p>
<pre><code>heroku run bash
python manage.py createsuperuser
</code></pre>
<p>像往常一样填写细节</p>
<p>16)用必要的固定装置填充DB</p>
<pre><code>heroku run python manage.py loaddata yourfile.json
</code></pre>
<p>17)访问heroku的Web服务器上的网站页面</p>
^{pr31}$
<p>或者去</p>
<pre><code>https://xyz.herokuapp.com/
</code></pre>
<p>还有管理员</p>
<pre><code>https://xyz.herokuapp.com/admin/
</code></pre>
<p>还有DB</p>
<pre><code>https://xyz.herokuapp.com/db
</code></pre>
<p>有用的命令:</p>
<ul>
<li><p>查看应用程序的日志</p>
<p><code>heroku logs [ tail]</code></p></li>
<li><p>列出部署的加载项</p>
<p><code>heroku addons</code></p>
<p>使用一个:</p>
<p><code>heroku addons:open <add-on-name></code></p></li>
<li><p>在heroku上运行一个命令(远程env,您正在部署它)</p>
<p><code>heroku run python manage.py shell</code>
<code>heroku run bash</code></p></li>
<li><p>在Heroku上设置一个配置变量</p>
<p><code>heroku config:set VARNAME=whatever</code></p></li>
<li><p>查看设置的配置变量(包括数据库)</p>
<p><code>heroku config</code></p></li>
<li><p>查看postgres数据库详细信息</p>
<p><code>heroku pg</code></p></li>
</ul>