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

2024-09-29 23:28:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个基本的django应用程序(Newsdiffs),它可以在localhost:8000和{}一起运行,但是我想把它迁移到Heroku,我不知道下一步是什么。在

我原以为让它在本地运行会转化为在Heroku上运行,但是我发现python website/manage.py runserver正在启动dev设置,我不知道如何告诉它使用主设置。在

我的Procfile中只有以下内容:

网站:python网站/管理.py运行服务器

在本地,这很好,尽管它在http://127.0.0.1:8000/启动它,这可能不是我在Heroku上想要的。那么如何确定在哪里设置主机名和端口呢?我在任何地方都看不到。在


Tags: djangopydev服务器应用程序localhosthttpheroku
2条回答

我两天前刚给自己画了这个单子。 它是在遵循Heroku's help pages for python中描述的步骤之后组装起来的。在

它绝不是确定的或完美的,它会改变,但它是一个有效的跟踪,因为我可以把网站放到网上。在

还有一些问题需要彻底检查,例如上传文件的media/目录的位置出于安全原因应该/可能位于您的项目之外(现在它起作用了,但是我注意到如果dyno休眠,那么以后模板将无法访问/显示文件)。 staticfiles/目录也是如此(尽管这个目录似乎工作得很好)。在

另外,您可能希望将django的调试模式设置为false。在

这里是:

我将现有django应用程序部署到Heroku的第一步

假设:

django已经在你的虚拟环境中了

b)您已经使用

pip freeze > requirements.txt

把它交给git

^{pr2}$

0)激活项目的虚拟环境

workon xyz  #using virtualenvwrapper

然后转到django项目的目录(简称DPD),如果还没有被带到那里

cd ~/prj/xyz  (or cdproject with virtualenvwrapper if setup properly)

并为heroku twidling创建一个新的git分支,以防止把事情搞砸

git checkout -b he

1)在heroku上创建应用程序

heroku create xyz

这也增加了heroku作为回购的远程设备

2)将所需的包添加到要求.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

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'

以及

WSGI_APPLICATION = 'xyz.wsgi_heroku.application'

5)配置必要的环境变量(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

例如

^{pr21}$

添加

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 repo(he branch)

git add  all .
git commit -m 'first 4 heroku'

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

注意:如果您看到一条消息:“您刚刚安装了Django的auth系统,这意味着您没有定义任何超级用户。现在要创建一个吗?“,类型号

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

heroku run bash
python manage.py createsuperuser

像往常一样填写细节

16)用必要的固定装置填充DB

heroku run python manage.py loaddata yourfile.json

17)访问heroku的Web服务器上的网站页面

^{pr31}$

或者去

https://xyz.herokuapp.com/

还有管理员

https://xyz.herokuapp.com/admin/

还有DB

https://xyz.herokuapp.com/db

有用的命令:

  • 查看应用程序的日志

    heroku logs [ tail]

  • 列出部署的加载项

    heroku addons

    使用一个:

    heroku addons:open <add-on-name>

  • 在heroku上运行一个命令(远程env,您正在部署它)

    heroku run python manage.py shellheroku run bash

  • 在Heroku上设置一个配置变量

    heroku config:set VARNAME=whatever

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

    heroku config

  • 查看postgres数据库详细信息

    heroku pg

如果您了解一些python,并且有很多用其他语言构建web应用程序的经验,但不完全了解Heroku适合何处,我强烈推荐Discover Flask,它弥补了我对这些部分如何组合的理解中的许多漏洞。在

我解决了一些问题:

  • 如果要部署到Heroku,确实需要一个独立的虚拟环境,因为Heroku从要求.txt文件。

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

  • "Procfile"不只是给出在本地运行应用程序所使用的命令。Heroku需要它。所以,如果你有一个在Heroku上运行的应用程序,它不包括Procfile,他们会遗漏一些东西。

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

  • 赫罗库doesn't support sqlite。你必须在Postgres中运行你的生产数据库。

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

相关问题 更多 >

    热门问题