Django deploy налаштування

Поради як безпечно налаштувати сервер на продакшені

приховати SECRET_KEY

Можемо читати з .env, а можемо з окремого файлу (а також перед кожним запуском формувати новий)

with open(os.path.join(BASE_DIR, ‘secret_key.txt’)) as f:
SECRET_KEY = f.read().strip()

Https налаштування (якщо для сайту вже налаштовано)

# HTTPS settings
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
SECURE_SSL_REDIRECT = True

Django HSTS Settings

# HSTS settings
SECURE_HSTS_SECONDS = 31536000 # 1 year
SECURE_HSTS_PRELOAD = True
SECURE_HSTS_INCLUDE_SUBDOMAINS = True

ALLOWED_HOSTS додаємо тільки ті домени, які використовуємо

ALLOWED_HOSTS = [‘domain.tld’, ‘www.domain.tld’]

DEBUG=False навіть не обговорюється, але маю сказати

Static Files

STATIC_URL = ‘/static/’
STATIC_ROOT = os.path.join(BASE_DIR, “static/”)

python manage.py collectstatic

локальний NGINX (/etc/nginx/sites-available/)

якщо його встановлено на продакшен-сервері то треба додати до налаштувань домену

location /static {
alias /projects/django/domain.tld/static; #Django project’s static files
}

Автоматизована перевірка проекту

Django має команду для перевірки готовності проекту до використання в інтернеті

python manage.py check –deploy

Міграція з однієї бази в іншу (наприклад з sqlite до postgresql)

python manage.py dumpdata > data.json

python manage.py makemigrations
python manage.py migrate

python manage.py shell
from django.contrib.contenttypes.models import ContentType
ContentType.objects.all().delete()

python manage.py loaddata fixture/whole.json

 

 

Джерела

toneteaches 

SQLite -> other DB

medium.com

sweetcode.io

 

Wagtail template hints 1

Приклади коду шаблону щоб не забути, (css – bootstrap 5)

{% extends "base.html" %} {% load static wagtailimages_tags wagtailcore_tags %}

{% for file in page.project_file.all %}
{% if forloop.first %} <div>Files:<br> {% endif %}
<a target="_blank" href="{{ file.prj_file.url }}">
<img class="card-img-top mb-5 mb-md-0" src="{{ file.prj_file.url }}" alt="{{ file.description }}" />
</a>
{% if forloop.last %} {% else %}<br> {% endif %} {% endfor %}</div>

Exim корисні команди

Черга

Подивитись повідомлення, що стоять в черзі на відправку:
exim -bp

порахувати скільки разів зустрічається слово

grep -o -i user@example.com /var/log/exim4/mainlog | wc -l

скільки листів на відправку висить з домену-відправника

exiqgrep -f example.com -i | wc -l

подивитись адреси отримувачів з домену

exiqgrep -f  sender@example.com | grep receiver.tld

Видалити усі повідомлення

exim -bp | exiqgrep -i | xargs exim -Mrm

Оновити конфігурацію

sudo update-exim4.conf -v

джерело: /etc/exim4

результат: /var/lib/exim4/config.autogenerated

 

Джерела:

www.interserver.net

os user history

Python IDE – # noqa

Зустрів таку позначку

class Meta: # noqa

Виявилось, що це не просто комент. Відключає попередження IDE:

NOQA stands for NO Quality Assurance. What this typically means is that if you have any warning in your IDE, then if you add a comment as # noqa at the end of the line then the warning will be ignored by the IDE.

Ще документація 

 

 

 

Docker quickstart

Зберіг тут швидкий старт  по Docker

для Django – декілька команд швидкого запуску в Docker:

docker –version
sudo docker build -t <project_name> .
docker container ls
docker run -it -p 8000:8080 –name <project_name>
sudo docker exec -it <container_id> /bin/bash
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py collectstatic

 

 

 

Wagtail – налаштування мови сайту

Ця тема добре розкрита в  документації 

Додати щось важко, важливо бути уважним. Тут будуть особливості.

Після налаштувань згідно з інструкцією автоматично обирає локаль в залежності від налаштувань браузера відвідувача.

Два варіанти перемикача (ставив в базовий шаблон)

перший – вказано тільки інші мови

{% if page %}
    {% for translation in page.get_translations.live %}
        {% get_language_info for translation.locale.language_code as lang %}
        <a href="{% pageurl translation %}" rel="alternate" hreflang="{{ language_code }}">
            {{ lang.name_local }}
        </a>
    {% endfor %}
{% endif %}

Другий – є усі локалі, налаштовані в settings/base.py

{% for language_code, language_name in LANGUAGES %}
    {% get_language_info for language_code as lang %}

    {% language language_code %}
        <a href="{% pageurl page.localized %}" rel="alternate" hreflang="{{ language_code }}">
            {{ lang.name_local }}
        </a>
    {% endlanguage %}
{% endfor %}

 

{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
<html class=”no-js” lang=”{{ LANGUAGE_CODE }}”>

 

 

 

Django записник

Розгортаємо (наприклад версія Python 3.9, тут для Windows):

python3.9 -m venv env
source env/bin/activate
python -m pip install –upgrade pip
pip install django
АБО pip install git+https://github.com/django/django.git # (альтернатива встановлення з GIT )
pip install -r requirements.txt  # (якщо цей файл є )
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser
python manage.py createsuperuser –email admin@example.com –username admin
python manage.py runserver ‘0.0.0.0:8000’

PS:різновид встановлення Django  з GIT дозволяє встановити будь-який допрацьований проєкт (не обов’язково базований на Django, але тут про нього)

Wagtail записник

Розгортаємо:
python3.9 -m venv env
pip install wagtail
wagtail start mysite .
pip install -r requirements.txt
python manage.py makemigrations
python manage.py migrate
python manage.py createsuperuser

все схоже як у Django

pagination

не оптимально, але для старту ок
https://learnwagtail.com/tutorials/how-to-paginate-your-wagtail-pages/

Django model підказки

Для Foreign – поля обов’язково використовувати on_delete=models.опція є такі ключі:

CASCADE: When the referenced object is deleted, also delete the objects that have references to it (when you remove a blog post for instance, you might want to delete comments as well). SQL equivalent: CASCADE.
PROTECT: Forbid the deletion of the referenced object. To delete it you will have to delete all objects that reference it manually. SQL equivalent: RESTRICT.
RESTRICT: (introduced in Django 3.1) Similar behavior as PROTECT that matches SQL’s RESTRICT more accurately. (See django documentation example)
SET_NULL: Set the reference to NULL (requires the field to be nullable). For instance, when you delete a User, you might want to keep the comments he posted on blog posts, but say it was posted by an anonymous (or deleted) user. SQL equivalent: SET NULL.
SET_DEFAULT: Set the default value. SQL equivalent: SET DEFAULT.
SET(…): Set a given value. This one is not part of the SQL standard and is entirely handled by Django.
DO_NOTHING: Probably a very bad idea since this would create integrity issues in your database (referencing an object that actually doesn’t exist). SQL equivalent: NO ACTION. (2)