Ответ
Существует два основных подхода к интеграции Vue.js с Django, выбор между которыми зависит от архитектуры проекта.
1. Раздельная архитектура: SPA + REST API
Это самый популярный и масштабируемый подход. Django выступает в роли backend-сервиса, предоставляя REST API, а Vue.js — это полностью отдельное одностраничное приложение (SPA), которое взаимодействует с этим API.
- Django: Используется Django REST Framework (DRF) для создания эндпоинтов.
- Vue.js: Разрабатывается и собирается независимо (с помощью Vite или Vue CLI). Деплоится на статический хостинг (Nginx, S3) или Node.js сервер.
Пример эндпоинта на DRF:
# models.py
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=200)
completed = models.BooleanField(default=False)
# serializers.py
from rest_framework import serializers
from .models import Task
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = '__all__'
# views.py
from rest_framework import viewsets
class TaskViewSet(viewsets.ModelViewSet):
queryset = Task.objects.all()
serializer_class = TaskSerializer
Важные аспекты:
- Требуется настройка CORS (
django-cors-headers) для междоменных запросов. - Аутентификация обычно реализуется через токены (JWT, OAuth2).
2. Гибридная (монолитная) архитектура
В этом подходе Vue.js встраивается непосредственно в шаблоны Django для добавления интерактивности на отдельные страницы. Django по-прежнему отвечает за рендеринг HTML.
- Django: Рендерит шаблоны, в которые включены скрипты Vue.
- Vue.js: Используется либо как простая библиотека, подключенная через
<script>, либо собирается с помощью Webpack/Vite и интегрируется черезdjango-webpack-loader.
Пример в Django-шаблоне:
{% load static %}
<div id="app">
<!-- Тег verbatim нужен, чтобы Django не пытался обработать синтаксис Vue {{...}} -->
{% verbatim %}
<p>{{ message }}</p>
<button @click="reverseMessage">Перевернуть</button>
{% endverbatim %}
</div>
<!-- Подключение собранного JS-файла Vue -->
<script src="{% static 'js/vue-app.js' %}"></script>
Этот способ хорошо подходит для постепенного добавления реактивности в существующий Django-проект или для небольших приложений.