Python: Быстрое создание проекта на Django

Это схема создания сайта, который работает на боевом сервере с доменом mysitedomain.ru, используя Nginx для обработки запросов и Gunicorn для выполнения приложения Django.

1. Установка Django и создание проекта

Создадим виртуальное окружение, установим Django и создадим проект.

python3 -m venv venv
source venv/bin/activate  # активация окружения
pip install django
django-admin startproject mysite
cd mysite
python manage.py startapp main

2. Настройка базовой структуры

Добавим приложение main в INSTALLED_APPS в файле mysite/settings.py:

INSTALLED_APPS = [
	'django.contrib.admin',
	'django.contrib.auth',
	'django.contrib.contenttypes',
	'django.contrib.sessions',
	'django.contrib.messages',
	'django.contrib.staticfiles',
	
	'main',  # добавляем наше приложение
]

3. Создание базового шаблона

В папке main создайте директорию templates и в ней папку main. Создадим общий шаблон base.html в директории main/templates/main:

# main/templates/main/base.html:
# Этот шаблон содержит блоки для head, title, meta, header, content и footer, которые можно переопределять на каждой отдельной странице.
<!DOCTYPE html>
<html lang="ru">
<head>
	{% block head %}
		<meta charset="UTF-8">
		<meta name="viewport" content="width=device-width, initial-scale=1.0">
		<title>{% block title %}Страница{% endblock %}</title>
		{% block meta %}{% endblock %}
	{% endblock %}
</head>
<body>
	<header>
		{% block header %}
			<h1>Мой сайт</h1>
		{% endblock %}
	</header>

	<main>
		{% block content %}{% endblock %}
	</main>

	<footer>
		{% block footer %}
			<p>© 2024 Мой сайт</p>
		{% endblock %}
	</footer>
</body>
</html>

4. Создание шаблонов для страниц

Теперь создадим шаблоны для наших трех страниц: home.html, about.html, и contact.html.

# home.html
# main/templates/main/home.html:

{% extends 'main/base.html' %}

{% block title %}Главная страница{% endblock %}
{% block meta %}
	<meta name="description" content="Описание главной страницы.">
{% endblock %}
{% block content %}
	<h2>Добро пожаловать на наш сайт!</h2>
	<p>Это главная страница нашего сайта.</p>
{% endblock %}


# about.html
# main/templates/main/about.html:

{% extends 'main/base.html' %}

{% block title %}О нас{% endblock %}
{% block meta %}
	<meta name="description" content="Описание страницы о нас.">
{% endblock %}
{% block content %}
	<h2>О нас</h2>
	<p>Мы — компания, которая делает интересные вещи.</p>
{% endblock %}


# contact.html
# main/templates/main/contact.html:

{% extends 'main/base.html' %}

{% block title %}Контакты{% endblock %}
{% block meta %}
	<meta name="description" content="Описание страницы контактов.">
{% endblock %}
{% block content %}
	<h2>Свяжитесь с нами</h2>
	<p>Вы можете связаться с нами по адресу example@example.com</p>
{% endblock %}

5. Определение маршрутов

Добавим маршруты для наших страниц. В файле main/urls.py создадим маршруты:

# main/urls.py:

from django.urls import path
from . import views

urlpatterns = [
	path('', views.home, name='home'),
	path('about/', views.about, name='about'),
	path('contact/', views.contact, name='contact'),
]

6. Представления (views)

В файле main/views.py создадим представления для каждой страницы:

# main/views.py:

from django.shortcuts import render

def home(request):
	return render(request, 'main/home.html')

def about(request):
	return render(request, 'main/about.html')

def contact(request):
	return render(request, 'main/contact.html')

7. Подключение маршрутов

В файле mysite/urls.py подключим маршруты приложения main:

# mysite/urls.py:

from django.contrib import admin
from django.urls import path, include

urlpatterns = [
	path('admin/', admin.site.urls),
	path('', include('main.urls')),
]

8. Запуск проекта для отладки

Теперь можно запустить сервер разработки и проверить, как работают страницы:

# отладочный сервер
python manage.py runserver

# После этого, страницы будут доступны по следующим URL:
# Главная страница: http://127.0.0.1:8000/
# О нас: http://127.0.0.1:8000/about/
# Контакты: http://127.0.0.1:8000/contact/

9. Запуск проекта на рабочем сервере с использованием домена

# Рекомендуем использовать Gunicorn в качестве WSGI сервера. Установим Gunicorn:
pip install gunicorn

# Запуск приложение с помощью Gunicorn, чтобы убедиться, что всё работает:
gunicorn --workers 3 mysite.wsgi:application

# Теперь Gunicorn будет слушать запросы на локальном сервере (по умолчанию на порту 8000). 
# Но для работы в продакшне нужно настроить его через Nginx.

9.1. Настройка Nginx для проксирования запросов

Nginx будет выполнять роль обратного прокси для Gunicorn. Он будет принимать запросы на домен mysitedomain.ru и перенаправлять их на Gunicorn.

# Если Nginx ещё не установлен, установим его:
sudo yum install nginx

sudo systemctl start nginx
sudo systemctl enable nginx

Создадим конфигурационный файл для сайта:

sudo nano /etc/nginx/conf.d/mysitedomain.conf

# Добавим в файл следующие настройки:
server {
	listen 80;
	server_name mysitedomain.ru www.mysitedomain.ru;

	location / {
		# проксируем на Gunicorn
		proxy_pass http://127.0.0.1:8000; 
		proxy_set_header Host $host;
		proxy_set_header X-Real-IP $remote_addr;
		proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
		proxy_set_header X-Forwarded-Proto $scheme;
	}

	location /static/ {
		# путь к статическим файлам
		alias /path/to/your/static/files;  
	}

	location /media/ {
		# путь к медиафайлам
		alias /path/to/your/media/files; 
	}
}
nginx -t
sudo systemctl restart nginx

9.2. Настройка домена

# В панели управления доменом настройте A-запись для вашего домена mysitedomain.ru, указывающую на IP-адрес вашего сервера:
A mysitedomain.ru 123.123.123.123

# Настройка HTTPS
# Установка Certbot
sudo yum install certbot python3-certbot-nginx

# Получение сертификата
sudo certbot --nginx -d mysitedomain.ru -d www.mysitedomain.ru

# Настройка автообновления сертификатов
sudo crontab -e
# И добавим строку для ежедневной проверки:
0 3 * * * /usr/bin/certbot renew --quiet

9.3. Настройка статических и медиа файлов

Перед тем, как развернуть сайт на боевом сервере, нужно собрать статические файлы:

# Статические файлы будут собраны в директорию, указанную в STATIC_ROOT в settings.py. Например:
python manage.py collectstatic

# STATIC_ROOT = '/var/www/mysitedomain/static/'
# MEDIA_ROOT = '/var/www/mysitedomain/media/'

9.4. Настройка Gunicorn с systemd

# Создадим файл юнита/сервиса для Gunicorn:
sudo nano /etc/systemd/system/gunicorn.service

# Добавим следующие настройки:
[Unit]
Description=gunicorn daemon
After=network.target

[Service]
User=www-data
Group=www-data
# Замените /path/to/your/project/mysite на путь к вашему проекту, 
# а /path/to/your/venv/ — на путь к виртуальному окружению.
WorkingDirectory=/path/to/your/project/mysite
ExecStart=/path/to/your/venv/bin/gunicorn --workers 3 --bind unix:/path/to/your/project/mysite.sock mysite.wsgi:application

[Install]
WantedBy=multi-user.target

После создания файла юнита, запустим и включим Gunicorn:

# Теперь Gunicorn будет запускаться автоматически при старте системы.
sudo systemctl start gunicorn
sudo systemctl enable gunicorn

10. Добавление в проект статики: css, js и изображений

Для добавления статики в Django проект, создайте директорию static внутри приложения. Внутри неё можно организовать папки для CSS, JS, и изображений.

main/
    static/
        main/
            css/
                style.css
            js/
                script.js
            img/
                logo.png

В файле settings.py добавьте или проверьте следующие строки:

# Путь для статики
STATIC_URL = '/static/'

# Путь для собранных статических файлов (после команды collectstatic)
STATIC_ROOT = '/var/www/mysitedomain/static/'

# Пути для пользовательской статики (внутри приложений)
STATICFILES_DIRS = [
    BASE_DIR / "main/static",
]

Подключение CSS, JS и логотипа в шаблон

# необходимо сначала загрузить статику в шаблон с помощью тега {% load static %}.
# main/templates/main/base.html:
<!DOCTYPE html>
<html lang="ru">
<head>
    {% load static %}
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>{% block title %}Мой сайт{% endblock %}</title>

    <link rel="stylesheet" href="{% static 'main/css/style.css' %}">

    {% block meta %}{% endblock %}
</head>
<body>
    <header>
        <div class="logo">            
            <img src="{% static 'main/img/logo.png' %}" alt="Логотип">
        </div>
        {% block header %}
            <h1>Мой сайт</h1>
        {% endblock %}
    </header>

    <main>
        {% block content %}{% endblock %}
    </main>

    <footer>
        {% block footer %}
            <p>© 2024 Мой сайт</p>
        {% endblock %}

        <script src="{% static 'main/js/script.js' %}"></script>
    </footer>
</body>
</html>

После добавления CSS, JS и изображений, на боевом сервере нужно собрать все статические файлы командой:

# Это переместит все файлы из директорий static в вашу папку, указанную в STATIC_ROOT (например, /var/www/mysitedomain/static/).
python manage.py collectstatic

В продакшн-среде Django обычно требует выполнения команды collectstatic после каждого изменения в статических файлах (например, CSS, JS, изображениях). Это связано с тем, что в режиме продакшн Django не обслуживает статические файлы напрямую. Вместо этого Nginx или другой веб-сервер обслуживает их из специально выделенной директории, в которую Django копирует все статические файлы при помощи команды collectstatic.

В режиме разработки (при DEBUG = True) Django обслуживает статические файлы напрямую, и не нужно выполнять collectstatic после каждого изменения.

2 г. Просмотров: 587
Материал помог? Оценка помогает находить устаревшие и спорные решения.

Комментарии

0

Нашли ошибку или хотите дополнить материал?

Комментариев пока нет.Можно первым дополнить материал или сообщить об ошибке.
Telegram