SlideShare a Scribd company logo
Vue.js con Django
¿tiene sentido? @javierabadia
@VueJSMadrid
¿Tiene sentido una SPA con backend?
• Autenticación
• Persistencia
• Proceso de Datos
• Acceso a almacenes
de datos externos
• elasticsearch
• mongodb
• …
• Acceso a APIs
externas
• …
¿por qué Django frente a Node.js?
La experiencia ‘óptima’ de desarrollo
• Trabajar de forma unificada
(mismo IDE)
• Desarrollo en el backend
• debugging
• breakpoints, etc
• Desarrollo en el frontend
• con agilidad
• usando Hot Module
Replacement (HMR)
La estructura clásica de Django
Vistas
Templates
Modelos
ORM
Autenticación
Middleware
Formularios
Administración
HTML
Ejemplo: Catálogo de GIFs para IoT
http://localhost:8000/ http://localhost:8000/detail/323
DEMO
Arquitectura de una SPA de Vue.js
$ vue init webpack-simple frontend
$ cd frontend
$ yarn
$ npm run dev
localhost:8080
El puente entre Django y Webpack
$ cd frontend
$ npm install --save-dev webpack-bundle-tracker
# (en un virtualenv, por supuesto)
$ pip install django-webpack-loader
Todo junto
var path = require('path')
var webpack = require('webpack')
var BundleTracker = require('webpack-bundle-tracker');
module.exports = {
…
plugins: [
new BundleTracker({filename: './webpack-stats.json'})
]
}
// frontend/webpack.conf.js
{% extends 'base.html' %}
{% load render_bundle from webpack_loader %}
{% block content %}
<div id="app"></div>
{% render_bundle 'main' %}
{% endblock %}
{# backend/templates/index.html #}
{
"status": "done",
"publicPath": "http://localhost:8080/dist/",
"chunks": {
"main": [
{
"name": "build.js",
"publicPath": "http://localhost:8080/dist/build.js",
"path": "/Users/jami/…/gif_catalog/frontend/dist/build.js"
}
]
}
}
// frontend/webpack-stats.json
…
WEBPACK_LOADER = {
'DEFAULT': {
'BUNDLE_DIR_NAME': 'dist/',
'STATS_FILE': os.path.join(BASE_DIR,
'frontend/webpack-stats.json'),
}
}
# settings.py
def index(request):
return render(request, 'index.html', {})
# backend/views.py
{% extends 'base.html' %}
{% load render_bundle from webpack_loader %}
{% block content %}
<div id="app"></div>
{% render_bundle 'main' %}
{% endblock %}
{# backend/templates/index.html #}
Django
:8000
Webpack
:8080
urlpatterns = [
url(r'^', views.index),
]
# backend/urls.py
App.vue
main.js
*.vue
localhost:8000/
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
…
</head>
<body>
<div id="app"></div>
<script type="text/javascript"
src="http://localhost:8080/dist/build.js">
</script>
</body
</html>
HMRbuild.js
Webpack: detalles de configuración
var path = require('path')
var webpack = require('webpack')
var BundleTracker = require('webpack-bundle-tracker');
module.exports = {
entry: './src/main.js',
output: {
path: path.resolve(__dirname, './dist'),
publicPath: 'http://localhost:8080/dist/',
filename: 'build.js'
},
module: {
...
},
devServer: {
historyApiFallback: true,
noInfo: true,
headers: {
'Access-Control-Allow-Origin': '*'
}
},
plugins: [
new BundleTracker({filename: './webpack-stats.json'})
]
}
url absoluta
incluyendo puerto
activar CORS para que el cliente
HMR pueda hacer peticiones al
devServer de webpack
// webpack.config.js
Django
:8000
localhost:8000/
HTML
localhost:8000/api/*
JSON
Implementar una API ¿REST?
urlpatterns = [
url(r'^api/pics', api.pics),
url(r'^', views.index),
]
# backend/urls.py
def pics(request):
count = GifPicture.objects.all().count()
all_ids = range(count)
random.shuffle(all_ids)
picked_ids = all_ids[:18]
gif_pictures = GifPicture.objects
.filter(id__in=picked_ids)
.order_by('-upload_date')
result = {
'pics': gif_pictures,
}
return JsonResponse(result)
# backend/api.py
import axios from 'axios';
export default {
getRandomPics() {
return axios.get('/api/pics')
.then(response => {
return response.data.pics;
});
},
}
// gifPicsApi.js
Django
:8000
…
<script>
import gifPicsApi from '../services/gifPicsApi.js';
export default {
…
mounted() {
gifPicsApi.getRandomPics().then(pics => {
this.pics = pics;
});
},
};
</script>
// GifHome.vue
Autenticación
Una posible implementación: 2PA
http://localhost:8000/login http://localhost:8000/*
create session
redirect
set cookie
vue-routing
Django + auth + sessions
<script>
export default {
name: 'app',
data() {
return {
msg: 'Welcome to Your Vue.js App!',
user: {},
}
},
created() {
this.user = window.user;
},
}
</script>
// App.vue
@login_required
def index(request):
context = {
'user': request.user,
}
return render(request, 'index.html', context)
# backend/views.py
{% extends 'base.html' %}
{% load render_bundle from webpack_loader %}
{% block content %}
<div id="app"></div>
<script>
var user = {
username: "{{ user.username }}",
email: "{{ user.email }}",
};
</script>
{% render_bundle 'main' %}
{% endblock %}
# backend/templates/index.html
DEMO
Rutas
urlpatterns = [
url(r'^api/suggestions/$', api.suggestions),
url(r'^api/search/$', api.search),
url(r'^api/pics/(?P<id>[0-9]+)$', api.pic_details),
url(r'^api/pics/$', api.pics),
url(r'^', views.index),
]
# backend/urls.py
Vue.use(Router);
const router = new Router({
mode: 'history',
routes: [
{
path: '/',
name: 'home',
component: GifHome
},{
path: '/detail/:id',
name: 'detail',
component: GifDetail,
props:true
},{
path: '*',
component: Error404
}, // Not found
],
});
# router.js
urlpatterns = [
url(r'^admin/', admin.site.urls),
url('^', include('django.contrib.auth.urls')),
url(r'^', include('backend.urls'))
]
# urls.py
/login
/logout
Comentarios Finales
• APIs
• REST?
• ‘a pelo’
• django-tastypie
• django-rest-framework
• GraphQL
• graphene (django)
• apollo (vue)
• (no lo he probado)
• Server Side Rendering
• nope
• seeding
• sip
• SEO
• pre-render
• inyectar contenido en Django
Conclusión
Referencias
• Doc de Vue: https://vuejs.org/v2/guide/single-file-components.html
• Doc de Webpack: https://webpack.js.org/
• SurviveJS: https://survivejs.com/webpack/
• webpack-bundle-tracker: https://github.com/ezhome/webpack-bundle-tracker
• django-webpack-loader: https://github.com/ezhome/django-webpack-loader
• hello-vue + Django project: https://github.com/rokups/hello-vue-django
• modernize Django frontend: http://owaislone.org/blog/modern-frontends-with-django/
• Django + REACT with HMR: http://owaislone.org/blog/webpack-plus-reactjs-and-django/
Gracias!
@javierabadia

More Related Content

PPTX
Django + Vue, JavaScript de 3ª generación para modernizar Django
PDF
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...
PPTX
HTML & CSS
PDF
Cours java
PPTX
Java RMI
PDF
Manuel des TP : Atelier Web 2
PDF
Gradle Introduction
PDF
Les bases de l'HTML / CSS
Django + Vue, JavaScript de 3ª generación para modernizar Django
Copy & Pest - A case-study on the clipboard, blind trust and invisible cross-...
HTML & CSS
Cours java
Java RMI
Manuel des TP : Atelier Web 2
Gradle Introduction
Les bases de l'HTML / CSS

What's hot (20)

PPTX
Introduction to the DOM
PDF
Namespaces
PPT
Admin linux utilisateurs_et_groupes cours 1
PPTX
cours javascript.pptx
PDF
Installation et Configuration ee JDK et de Tomcat
PDF
HTML, CSS et Javascript
PDF
Html css
PDF
Presentation Csharp et winforms
PPTX
Les boites de dialogue en java
PDF
Python Programming: Data Structure
PPT
Java IO Package and Streams
PDF
Cours d'introduction aux HTML5 & CSS3
PPTX
HTML5 DRAG AND DROP
PDF
Tp n 4 linux
PPTX
Sécurité-Wifi
PPTX
Cours javascript v1
PDF
JDBC: Gestion des bases de données en Java
PPTX
Initiation à Bootstrap
PDF
Django Introduction & Tutorial
Introduction to the DOM
Namespaces
Admin linux utilisateurs_et_groupes cours 1
cours javascript.pptx
Installation et Configuration ee JDK et de Tomcat
HTML, CSS et Javascript
Html css
Presentation Csharp et winforms
Les boites de dialogue en java
Python Programming: Data Structure
Java IO Package and Streams
Cours d'introduction aux HTML5 & CSS3
HTML5 DRAG AND DROP
Tp n 4 linux
Sécurité-Wifi
Cours javascript v1
JDBC: Gestion des bases de données en Java
Initiation à Bootstrap
Django Introduction & Tutorial
Ad

Similar to Vue.js + Django - configuración para desarrollo con webpack y HMR (20)

PDF
SF Grails - Ratpack - Compact Groovy Webapps - James Williams
PDF
Heroku pop-behind-the-sense
PDF
Front End Development for Back End Java Developers - Jfokus 2020
PDF
The MEAN stack
PPTX
Developing your first application using FIWARE
PDF
Serverless Angular, Material, Firebase and Google Cloud applications
PDF
Scalable web application architecture
PDF
Making web stack tasty using Cloudformation
PDF
GDG Addis - An Introduction to Django and App Engine
PDF
Introduction to Django
PDF
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
PDF
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
PPTX
Running Vue Storefront in production (PWA Magento webshop)
PDF
Integrating WordPress With Web APIs
PDF
using Mithril.js + postgREST to build and consume API's
PDF
soft-shake.ch - Hands on Node.js
PDF
Gae Meets Django
PPTX
Designing REST API automation tests in Kotlin
PPT
nodejs tutorial foor free download from academia
PDF
OneRing @ OSCamp 2010
SF Grails - Ratpack - Compact Groovy Webapps - James Williams
Heroku pop-behind-the-sense
Front End Development for Back End Java Developers - Jfokus 2020
The MEAN stack
Developing your first application using FIWARE
Serverless Angular, Material, Firebase and Google Cloud applications
Scalable web application architecture
Making web stack tasty using Cloudformation
GDG Addis - An Introduction to Django and App Engine
Introduction to Django
Maciej Treder "Server-side rendering with Angular—be faster and more SEO, CDN...
09 - express nodes on the right angle - vitaliy basyuk - it event 2013 (5)
Running Vue Storefront in production (PWA Magento webshop)
Integrating WordPress With Web APIs
using Mithril.js + postgREST to build and consume API's
soft-shake.ch - Hands on Node.js
Gae Meets Django
Designing REST API automation tests in Kotlin
nodejs tutorial foor free download from academia
OneRing @ OSCamp 2010
Ad

More from Javier Abadía (12)

PPTX
Good Names - Difference between code anyone can understand and cryptic gibberish
PDF
Python Asíncrono - Async Python
PPTX
Extendiendo Django: Cómo Escribir Tu Propio Backend de Base de Datos - Exasol
PPTX
UX/UI para Desarrolladores
PPTX
Reactividad en Angular, React y VueJS
PPTX
Las reglas que hay que romper para que tu equipo de desarrollo sea el más RÁPIDO
PPTX
Retos de Programación en Python
PPTX
Anatomía de un Bot para Resultados Electorales
PPTX
Deep learning image classification aplicado al mundo de la moda
PPTX
Análisis de colores: cómo analizar tendencias de moda automáticamente
PPTX
Codemotion 2016 - d3.js un taller divertido y difícil
PDF
La Noche Electoral
Good Names - Difference between code anyone can understand and cryptic gibberish
Python Asíncrono - Async Python
Extendiendo Django: Cómo Escribir Tu Propio Backend de Base de Datos - Exasol
UX/UI para Desarrolladores
Reactividad en Angular, React y VueJS
Las reglas que hay que romper para que tu equipo de desarrollo sea el más RÁPIDO
Retos de Programación en Python
Anatomía de un Bot para Resultados Electorales
Deep learning image classification aplicado al mundo de la moda
Análisis de colores: cómo analizar tendencias de moda automáticamente
Codemotion 2016 - d3.js un taller divertido y difícil
La Noche Electoral

Recently uploaded (20)

PDF
Encapsulation theory and applications.pdf
PDF
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
PDF
Assigned Numbers - 2025 - Bluetooth® Document
PPTX
1. Introduction to Computer Programming.pptx
PPTX
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
PDF
Accuracy of neural networks in brain wave diagnosis of schizophrenia
PDF
Unlocking AI with Model Context Protocol (MCP)
PPTX
SOPHOS-XG Firewall Administrator PPT.pptx
PPT
Teaching material agriculture food technology
PPTX
MYSQL Presentation for SQL database connectivity
PDF
Empathic Computing: Creating Shared Understanding
PPTX
Big Data Technologies - Introduction.pptx
PDF
Spectral efficient network and resource selection model in 5G networks
PDF
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
PDF
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
PDF
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
PDF
gpt5_lecture_notes_comprehensive_20250812015547.pdf
PDF
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
PDF
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
PDF
Dropbox Q2 2025 Financial Results & Investor Presentation
Encapsulation theory and applications.pdf
Blue Purple Modern Animated Computer Science Presentation.pdf.pdf
Assigned Numbers - 2025 - Bluetooth® Document
1. Introduction to Computer Programming.pptx
KOM of Painting work and Equipment Insulation REV00 update 25-dec.pptx
Accuracy of neural networks in brain wave diagnosis of schizophrenia
Unlocking AI with Model Context Protocol (MCP)
SOPHOS-XG Firewall Administrator PPT.pptx
Teaching material agriculture food technology
MYSQL Presentation for SQL database connectivity
Empathic Computing: Creating Shared Understanding
Big Data Technologies - Introduction.pptx
Spectral efficient network and resource selection model in 5G networks
7 ChatGPT Prompts to Help You Define Your Ideal Customer Profile.pdf
TokAI - TikTok AI Agent : The First AI Application That Analyzes 10,000+ Vira...
Build a system with the filesystem maintained by OSTree @ COSCUP 2025
gpt5_lecture_notes_comprehensive_20250812015547.pdf
Optimiser vos workloads AI/ML sur Amazon EC2 et AWS Graviton
Video forgery: An extensive analysis of inter-and intra-frame manipulation al...
Dropbox Q2 2025 Financial Results & Investor Presentation

Vue.js + Django - configuración para desarrollo con webpack y HMR

  • 1. Vue.js con Django ¿tiene sentido? @javierabadia @VueJSMadrid
  • 2. ¿Tiene sentido una SPA con backend? • Autenticación • Persistencia • Proceso de Datos • Acceso a almacenes de datos externos • elasticsearch • mongodb • … • Acceso a APIs externas • …
  • 3. ¿por qué Django frente a Node.js?
  • 4. La experiencia ‘óptima’ de desarrollo • Trabajar de forma unificada (mismo IDE) • Desarrollo en el backend • debugging • breakpoints, etc • Desarrollo en el frontend • con agilidad • usando Hot Module Replacement (HMR)
  • 5. La estructura clásica de Django Vistas Templates Modelos ORM Autenticación Middleware Formularios Administración HTML
  • 6. Ejemplo: Catálogo de GIFs para IoT http://localhost:8000/ http://localhost:8000/detail/323
  • 8. Arquitectura de una SPA de Vue.js $ vue init webpack-simple frontend $ cd frontend $ yarn $ npm run dev localhost:8080
  • 9. El puente entre Django y Webpack $ cd frontend $ npm install --save-dev webpack-bundle-tracker # (en un virtualenv, por supuesto) $ pip install django-webpack-loader
  • 10. Todo junto var path = require('path') var webpack = require('webpack') var BundleTracker = require('webpack-bundle-tracker'); module.exports = { … plugins: [ new BundleTracker({filename: './webpack-stats.json'}) ] } // frontend/webpack.conf.js {% extends 'base.html' %} {% load render_bundle from webpack_loader %} {% block content %} <div id="app"></div> {% render_bundle 'main' %} {% endblock %} {# backend/templates/index.html #} { "status": "done", "publicPath": "http://localhost:8080/dist/", "chunks": { "main": [ { "name": "build.js", "publicPath": "http://localhost:8080/dist/build.js", "path": "/Users/jami/…/gif_catalog/frontend/dist/build.js" } ] } } // frontend/webpack-stats.json … WEBPACK_LOADER = { 'DEFAULT': { 'BUNDLE_DIR_NAME': 'dist/', 'STATS_FILE': os.path.join(BASE_DIR, 'frontend/webpack-stats.json'), } } # settings.py
  • 11. def index(request): return render(request, 'index.html', {}) # backend/views.py {% extends 'base.html' %} {% load render_bundle from webpack_loader %} {% block content %} <div id="app"></div> {% render_bundle 'main' %} {% endblock %} {# backend/templates/index.html #} Django :8000 Webpack :8080 urlpatterns = [ url(r'^', views.index), ] # backend/urls.py App.vue main.js *.vue localhost:8000/ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> … </head> <body> <div id="app"></div> <script type="text/javascript" src="http://localhost:8080/dist/build.js"> </script> </body </html> HMRbuild.js
  • 12. Webpack: detalles de configuración var path = require('path') var webpack = require('webpack') var BundleTracker = require('webpack-bundle-tracker'); module.exports = { entry: './src/main.js', output: { path: path.resolve(__dirname, './dist'), publicPath: 'http://localhost:8080/dist/', filename: 'build.js' }, module: { ... }, devServer: { historyApiFallback: true, noInfo: true, headers: { 'Access-Control-Allow-Origin': '*' } }, plugins: [ new BundleTracker({filename: './webpack-stats.json'}) ] } url absoluta incluyendo puerto activar CORS para que el cliente HMR pueda hacer peticiones al devServer de webpack // webpack.config.js
  • 14. Implementar una API ¿REST? urlpatterns = [ url(r'^api/pics', api.pics), url(r'^', views.index), ] # backend/urls.py def pics(request): count = GifPicture.objects.all().count() all_ids = range(count) random.shuffle(all_ids) picked_ids = all_ids[:18] gif_pictures = GifPicture.objects .filter(id__in=picked_ids) .order_by('-upload_date') result = { 'pics': gif_pictures, } return JsonResponse(result) # backend/api.py import axios from 'axios'; export default { getRandomPics() { return axios.get('/api/pics') .then(response => { return response.data.pics; }); }, } // gifPicsApi.js Django :8000 … <script> import gifPicsApi from '../services/gifPicsApi.js'; export default { … mounted() { gifPicsApi.getRandomPics().then(pics => { this.pics = pics; }); }, }; </script> // GifHome.vue
  • 15. Autenticación Una posible implementación: 2PA http://localhost:8000/login http://localhost:8000/* create session redirect set cookie vue-routing
  • 16. Django + auth + sessions <script> export default { name: 'app', data() { return { msg: 'Welcome to Your Vue.js App!', user: {}, } }, created() { this.user = window.user; }, } </script> // App.vue @login_required def index(request): context = { 'user': request.user, } return render(request, 'index.html', context) # backend/views.py {% extends 'base.html' %} {% load render_bundle from webpack_loader %} {% block content %} <div id="app"></div> <script> var user = { username: "{{ user.username }}", email: "{{ user.email }}", }; </script> {% render_bundle 'main' %} {% endblock %} # backend/templates/index.html
  • 17. DEMO
  • 18. Rutas urlpatterns = [ url(r'^api/suggestions/$', api.suggestions), url(r'^api/search/$', api.search), url(r'^api/pics/(?P<id>[0-9]+)$', api.pic_details), url(r'^api/pics/$', api.pics), url(r'^', views.index), ] # backend/urls.py Vue.use(Router); const router = new Router({ mode: 'history', routes: [ { path: '/', name: 'home', component: GifHome },{ path: '/detail/:id', name: 'detail', component: GifDetail, props:true },{ path: '*', component: Error404 }, // Not found ], }); # router.js urlpatterns = [ url(r'^admin/', admin.site.urls), url('^', include('django.contrib.auth.urls')), url(r'^', include('backend.urls')) ] # urls.py /login /logout
  • 19. Comentarios Finales • APIs • REST? • ‘a pelo’ • django-tastypie • django-rest-framework • GraphQL • graphene (django) • apollo (vue) • (no lo he probado) • Server Side Rendering • nope • seeding • sip • SEO • pre-render • inyectar contenido en Django
  • 21. Referencias • Doc de Vue: https://vuejs.org/v2/guide/single-file-components.html • Doc de Webpack: https://webpack.js.org/ • SurviveJS: https://survivejs.com/webpack/ • webpack-bundle-tracker: https://github.com/ezhome/webpack-bundle-tracker • django-webpack-loader: https://github.com/ezhome/django-webpack-loader • hello-vue + Django project: https://github.com/rokups/hello-vue-django • modernize Django frontend: http://owaislone.org/blog/modern-frontends-with-django/ • Django + REACT with HMR: http://owaislone.org/blog/webpack-plus-reactjs-and-django/

Editor's Notes

  • #3: la mayoría de aplicaciones que se ven en los ejemplos son “estáticas”… se sirven ficheros al cliente y todo se ejecuta en el cliente podrías almacenar los ficheros en un servidor “tonto” (S3) y no necesitas más pero enseguida se queda corto, en la vida real necesitas un backend
  • #4: node es la elección natural cuando pensamos en un backend para vue un solo lenguaje isomorphic code server-side-rendering async I/O django Django has neatly packaged the best of web development in a very convenient project Access to other libs p.ej. pandas, machine learning, image recognition, ORM… laravel: default front-end for laravel (Jul 2016), made the framework take off
  • #5: yo uso PyCharm pero funciona igual lanzando los comandos desde el terminal y usando SublimeText u otro editor
  • #6: Vistas, Templates ORM, Modelos: migraciones, esquemas… Middleware, Autenticación Formularios, Administración Django has neatly packaged the best of web development in a very convenient project
  • #9: webpack HMR DevTools ver el index.html
  • #11: webpack-bundle-tracker plug-in de webpack genera un fichero ’webpack-stats.json’ con los resultados de la compilación django-webpack-loader módulo de django lee el fichero ‘webpack-stats.json’ y renderiza las tags <script> apropiadas en una plantilla de Django Django debe servir el index.html de nuestra app El index.html ‘tira’ de los bundles generados por webpack webpack escucha, implementa HMR
  • #15: En el servidor Simplemente usar JsonResponse() Django REST Framework no es necesario experiencia similar a los formularios de Django En el cliente axios
  • #16: Django sirve 2 vistas vista de login vista de SPA Django mantiene las sesiones que se comparten con el cliente mediante una cookie Django comprueba la cookie/sesión en cada llamada podemos embeber la identidad en la plantilla Hay otras formas SPA -> TokenAuthentication (Django REST Framework) Types of authentication SessionAuthentication TokenAuthentication … https://stackoverflow.com/a/27582256/79536 http://www.django-rest-framework.org/topics/ajax-csrf-cors/
  • #19: Django devuelve lo mismo para todas las rutas El vue-router selecciona la vista correcta
  • #20: https://www.pydanny.com/choosing-an-api-framework-for-django.html https://django-tastypie.readthedocs.io/en/latest/ http://www.django-rest-framework.org/ https://github.com/graphql-python/graphene https://vuejsdevelopers.com/2017/04/01/vue-js-prerendering-node-laravel/