Python 如何将现有django应用程序/项目部署/迁移到Heroku上的生产服务器?

Python 如何将现有django应用程序/项目部署/迁移到Heroku上的生产服务器?,python,django,heroku,deployment,web-deployment,Python,Django,Heroku,Deployment,Web Deployment,我有一个基本的django应用程序(),它在localhost:8000和python-website/manage.py-runserver上运行得很好,但是我想把它迁移到Heroku,我不知道下一步该怎么做 我认为让它在本地运行会转化为在Heroku上运行,但我意识到python网站/manage.py runserver正在启动开发设置,我不知道如何告诉它使用主设置 我的Procfile中的所有内容如下: web:python网站/manage.py运行服务器 在本地,这很好用,尽管它的发

我有一个基本的django应用程序(),它在
localhost:8000
python-website/manage.py-runserver
上运行得很好,但是我想把它迁移到Heroku,我不知道下一步该怎么做

我认为让它在本地运行会转化为在Heroku上运行,但我意识到
python网站/manage.py runserver
正在启动开发设置,我不知道如何告诉它使用主设置

我的Procfile中的所有内容如下:

web:python网站/manage.py运行服务器


在本地,这很好用,尽管它的发布时间可能不是我想要的Heroku。那么,我如何确定在哪里设置主机名和端口呢?我在应用程序的任何地方都看不到。两天前我刚刚为自己绘制了这个列表。 按照中所述的步骤将其组装在一起

这绝对不是确定的,也不是完美的,它会改变,但这是一个有效的跟踪,因为我能够将该网站上线

一些问题仍然存在,有待彻底检查,例如,出于安全原因,上载文件的
媒体/
目录的位置应该/可能位于您的项目之外(现在它可以工作,但我注意到,如果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)
并为heroku twiddling创建一个新的git分支,以防止把事情搞砸

git checkout -b he
1) 在heroku上创建应用程序

heroku create xyz
这也增加了heroku作为您回购协议的遥控器

2) 将所需的包添加到requirements.txt

vi requirements.txt

3) 在本地venv中安装所有依赖项

pip install -r requirements.txt --allow-all-external
4) 设置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 cfg替换为

DATABASES['default'] =  dj_database_url.config()
DATABASES['default']['ENGINE'] = 'django_postgrespool'

5) 配置必要的环境变量(heroku配置)

编辑
.env
文件

vi .env
e、 g

和/或在需要时手动设置(在我的例子中,
.env
没有效果,显然没有加载,现在必须手动设置变量)

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

e、 g

9) 将所有静态内容收集到DPD/StaticFile中/

在本地,确保django指向正确的wsgi设置

export WSGI_APPLICATION=blogger.wsgi_heroku.application
python manage.py collectstatic
10) 将更改添加到本地git回购(he分支)

11) 检查整个系统是否在本地工作

heroku local # in heroku's help they also add `web`, not needed?!
12) 将代码推送到heroku

git push heroku he:master
13) 确保应用程序的实例正在运行

heroku ps:scale web=1
14) 在heroku数据库上创建表

heroku run python manage.py migrate
heroku run bash
python manage.py createsuperuser
注意:如果您看到一条消息说,“您刚刚安装了Django的auth系统,这意味着您没有定义任何超级用户。是否立即创建超级用户?”,请键入no

15) 将超级用户添加到heroku数据库

heroku run python manage.py migrate
heroku run bash
python manage.py createsuperuser
并像往常一样填写细节

16) 用必要的装置填充数据库

heroku run python manage.py loaddata yourfile.json
17) 访问heroku的Web服务器上的网站页面

heroku open
或者去

https://xyz.herokuapp.com/
还有管理员

https://xyz.herokuapp.com/admin/
那么DB呢

https://xyz.herokuapp.com/db
有用的命令:

  • 查看应用程序的日志

    heroku日志[--tail]

  • 列出已部署的加载项

    heroku插件

    并使用一个:

    heroku插件:打开

  • 在heroku(您正在部署的远程环境)上运行命令

    heroku运行python manage.py shell
    heroku运行bash

  • 在Heroku上设置配置变量

    heroku config:set VARNAME=which

  • 查看已设置的配置变量(包括数据库)

    heroku配置

  • 查看postgres数据库详细信息

    heroku pg


如果你懂一些python,并且有很多用其他语言构建web应用程序的经验,但不完全了解Heroku的适用范围,我强烈建议你,这弥补了我在理解这些部分如何组合在一起时存在的许多漏洞

我解决的一些问题:

  • 如果要部署到Heroku,确实需要一个隔离的虚拟环境,因为Heroku从requirements.txt文件安装Python模块

  • Gunicorn是一个web服务器,你肯定需要在Gunicorn下运行你的应用程序,否则它不会在Heroku上运行

  • 不仅仅是给你在本地运行应用程序的命令。赫罗库需要它。所以,如果你有一个应用程序是为在Heroku上运行而构建的,但它不包含Procfile,那么他们会遗漏一些东西

  • 你不会告诉Heroku你的主机名是什么。当你运行heroku create时,它会告诉你你的域名是什么。每次你运行
    git-push-heroku-master
    (或者你正在推动的任何分支,可能不是
    master
    ),heroku都会(尝试)重启你的应用程序

  • 希罗库。您必须在Postgres中运行生产数据库


这并没有直接回答我的问题,但它确实填补了一些缺失的部分,这使得我甚至很难提出正确的问题。RTFM(尽管有。:)

签入settings.py。调试=flase。。有些设置可能是他们的..你为什么认为
heroku run python manage.py loaddata yourfile.json
heroku open
https://xyz.herokuapp.com/
https://xyz.herokuapp.com/admin/
https://xyz.herokuapp.com/db