Як викласти Django застосунок на Heroku і не втратити зв'язок зі статичними файлами

5 хв. читання

Багато пайтоністів люблять фреймворк Django, та не у всіх залишається таке ставлення до нього, коли треба вийти за межі експерименту на власному комп'ютері, та треба записати у settings.py:

DEBUG = False

Та запустити:

python manage.py collectstatic

Якщо після цього знову запустити веб-сервер, ваші сторінки вже не будуть мати того самого гарного вигляду. Річ у тім, що автори фреймворку очікували, що у разі деплоя на продакшин сервер, ви самі налаштуєте роздачу статичних файлів за допомогою Apache 2 чи nginx.

Та сьогодні я розкажу, як задеплоїти ваш застосунок на Heroku (а значить копатись в апач та енджинікс не доведеться). На початок виконання описаних нижче дій вам треба мати Django проект (бажано працездатний) та Heroku CLI. До речі, якщо не любите засмічувати систему купою усяких інструментів, щодо використання яких у майбутньому ви невпевнені, розробка проекту у віртуалці чи docker контейнері – добра ідея. Також обов'язково мати обліковку на сайті Heroku.

Заходимо у теку нашого проекту. Якщо проект – не репозиторій гіта, зробіть його таким:

git init

Також встановіть налаштування гіта:

git config --global user.name "Mikki Mouse"
git config --global user.email "mikki@disney.com"

Можете вказати замість --global прапорець --local, якщо не хочете поширювати ці налаштування на усю систему (або знову подумайте про vagrant чи docker).

Тепер робимо:

heroku login

Вводимо свою адресу е-пошти та пароль. Далі пишемо команду:

heroku create django-and-mikki

Так ви створите у своїй Heroku обліковці застосунок з ім'ям django-and-mikki (якщо хтось раніше за вас не створив його у себе), і цей застосунок ви можете побачити на своїй дошці (dashboard) та зайти на нього у браузері за адресою https://django-and-mikki.herokuapp.com. Вашому репозиторію буде вказано віддалену адресу для зберігання його на серверах heroku.com. Можете подивитись результат увівши команду:

git remote -v

Вам покаже щось на зразок такого:

heroku    https://git.heroku.com/django-and-mikki.git (fetch)
heroku    https://git.heroku.com/django-and-mikki.git (push)

Вказувати ім'я сайту-застосунку не обов'язково, можете ввести просто:

heroku create

І Heroku призначить вашому творінню ім'я випадковим чином.

У файлі settings.py потрібно вказати нашу нову веб-адресу, щоб джанго не забороняв нам доступ через браузер:

ALLOWED_HOSTS = ['https://web.archive.org/web/20230321170249/https://django-and-mikki.herokuapp.com']

Якщо у вас є файли, які не повинні потрапляти у віддалений репозиторій, то створіть файл .gitignore та вкажіть там ці файли або цілі теки з ними.

Також у нашому проекті обов'язково мають бути певні файли, за якими Heroku визначить, що наш проект написано на python, та що ми хочемо його запустити певним чином.

Файл requirements.txt з таким вмістом:

Django=2.0.4
gunicorn

gunicorn – те, що допоможе з'єднати пайтон з сервером на інстансі Heroku, а також зробить наш застосунок багатонитковим.

Також має бути файл Procfile з вмістом:

web: gunicorn <ім'я_вашого_джанго_проекту>.wsgi --log-file---

Можна ще додати (хоч це не обов'язково) файл runtime.txt, у якому можна вказати точну версію Python, який потрібен вашому Django проекту:

python-3.6.4

Тепер робимо коміт:

git add.
git commit -m "deploy to heroku"

І нарешті сам деплой:

$ git push heroku master

Як бачите, деплой – це просто пуш у віддалений репозиторій Heroku, і пушимо ми у гілку master. Має вивести щось отаке:

Counting objects: 45, done.
Compressing objects: 100% (37/37), done.
Writing objects: 100% (45/45), 19.94 KiB | 0 bytes/s, done.
Total 45 (delta 1), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Python app detected
remote: -----> Installing python-3.6.4
remote: -----> Installing pip
remote: -----> Installing requirements with pip
remote:        Collecting Django==2.0.4 (from -r /tmp/build_b42ef899b919045814d58b7e9f46d045/requirements.txt (line 1))
remote:          Downloading https://files.pythonhosted.org/packages/89/f9/94c20658f0cdecc2b6607811e2c0bb042408a51f589e5ad0cb0eac3236a1/Django-2.0.4-py3-none-any.whl (7.1MB)
remote:        Collecting gunicorn (from -r /tmp/build_b42ef899b919045814d58b7e9f46d045/requirements.txt (line 2))
remote:          Downloading https://files.pythonhosted.org/packages/64/32/becbd4089a4c06f0f9f538a76e9fe0b19a08f010bcb47dcdbfbc640cdf7d/gunicorn-19.7.1-py2.py3-none-any.whl (111kB)
remote:        Collecting pytz==2018.4 (from -r /tmp/build_b42ef899b919045814d58b7e9f46d045/requirements.txt (line 3))
remote:          Downloading https://files.pythonhosted.org/packages/dc/83/15f7833b70d3e067ca91467ca245bae0f6fe56ddc7451aa0dc5606b120f2/pytz-2018.4-py2.py3-none-any.whl (510kB)
remote:        Installing collected packages: pytz, Django, gunicorn
remote:        Successfully installed Django-2.0.4 gunicorn-19.7.1 pytz-2018.4
remote:
remote: -----> $ python manage.py collectstatic --noinput
remote:        119 static files copied to '/tmp/build_b42ef899b919045814d58b7e9f46d045/my_all_static_files'.
remote:
remote: -----> Discovering process types
remote:        Procfile declares types -> web
remote:
remote: -----> Compressing...
remote:        Done: 48.5M
remote: -----> Launching...
remote:        Released v4
remote:        https://django-and-mikki.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/django-and-mikki.git
* [new branch]      master -> master

В останніх рядка виводу ми бачимо посилання https://django-and-mikki.herokuapp.com/ . Зайдіть за ним у браузері. Маєте побачити свій проект, тільки без стилів CSS та JS. Якщо при відкриванні цього посилання ви бачите якусь помилку, то зайдіть на панель своїх проектів у Heroku та подивіться логи щойно задеплоєного проекту. Можливо вони вам допоможуть визначити проблему. Також можна увімкнути зневаджувальний режим та знову задеплоїти проект. Тоді при помилці отримаєте більше інформації.

Отже, проект задеплоєно, але статики нема. Щоб це виправити робимо такі зміни. У файл requirements.txt додаємо whitenoise:

Django=2.0.4
gunicorn
whitenoise

У файл settings.py вказуємо теку для збору усіх статичних файлів проекту:

STATIC_ROOT = os.path.join(BASE_DIR, 'my_all_static_files')

Якщо ви уважно передивитесь вивід у консоль під час першого деплоя, то побачите, що я вже мав цю теку вказаною. У тому ж settings.py вказуємо використання проміжного компонента whitenoise:

MIDDLEWARE_CLASSES = (
'whitenoise.middleware.WhiteNoiseMiddleware',
...

А ще пишемо у settings.py:

STATICFILES_STORAGE = 'whitenoise.storage.CompressedManifestStaticFilesStorage'

Все! Комітимо, пушимо і перевіряємо у браузері.

P.S.

Увага! Ця стаття пояснює саме як зв'язати статичні файли з вашим застосунком на Heroku, інші питання розміщення на цьому хостингу тут не розглянуто. Наприклад, якщо у вас у проекті є БД – це треба налаштовувати окремо. Тому будьте уважні.

Помітили помилку? Повідомте автору, для цього достатньо виділити текст з помилкою та натиснути Ctrl+Enter
Codeguida 4.7K
Приєднався: 10 місяців тому
Коментарі (0)

    Ще немає коментарів

Щоб залишити коментар необхідно авторизуватися.

Вхід / Реєстрація