├── .gitignore
├── ReadMe.md
├── frontend
├── babel.config.js
├── package-lock.json
├── package.json
├── public
│ ├── favicon.ico
│ └── index.html
├── src
│ ├── App.vue
│ ├── assets
│ │ └── logo.png
│ ├── components
│ │ └── HelloWorld.vue
│ └── main.js
└── vue.config.js
├── manage.py
├── myproject
├── __init__.py
├── settings.py
├── urls.py
└── wsgi.py
├── requirements.txt
└── templates
└── application.html
/.gitignore:
--------------------------------------------------------------------------------
1 | db.sqlite3
2 | *.pyc
3 | frontend/node_modules/
4 | frontend/webpack-stats.json
5 | .venv
6 |
--------------------------------------------------------------------------------
/ReadMe.md:
--------------------------------------------------------------------------------
1 | Vue and Django Integration
2 | ================================
3 |
4 | Link to Medium Article
5 | https://medium.com/@rodrigosmaniotto/integrating-django-and-vuejs-with-vue-cli-3-and-webpack-loader-145c3b98501a
6 |
7 |
8 | Basic Commands
9 | --------------
10 | Two terminals...
11 |
12 |
13 | **1st Terminal**
14 | ```
15 | cd frontend
16 | npm install
17 | npm run serve
18 | ```
19 |
20 | **2nd Terminal**
21 |
22 | ```
23 | virtualenv .venv
24 | source .venv/bin/activate
25 | pip install -r requirements.txt
26 | python manage.py migrate
27 | python manage.py createsuperuser
28 | python manage.py runserver
29 | ```
30 |
--------------------------------------------------------------------------------
/frontend/babel.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | presets: [
3 | '@vue/cli-plugin-babel/preset'
4 | ]
5 | }
6 |
--------------------------------------------------------------------------------
/frontend/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "frontend",
3 | "version": "0.1.0",
4 | "private": true,
5 | "scripts": {
6 | "serve": "vue-cli-service serve",
7 | "build": "vue-cli-service build",
8 | "lint": "vue-cli-service lint"
9 | },
10 | "dependencies": {
11 | "core-js": "^3.3.2",
12 | "vue": "^2.6.10"
13 | },
14 | "devDependencies": {
15 | "@vue/cli-plugin-babel": "^4.0.0",
16 | "@vue/cli-plugin-eslint": "^4.0.0",
17 | "@vue/cli-service": "^4.0.0",
18 | "babel-eslint": "^10.0.3",
19 | "eslint": "^5.16.0",
20 | "eslint-plugin-vue": "^5.0.0",
21 | "vue-template-compiler": "^2.6.10",
22 | "webpack-bundle-tracker": "^0.4.3"
23 | },
24 | "eslintConfig": {
25 | "root": true,
26 | "env": {
27 | "node": true
28 | },
29 | "extends": [
30 | "plugin:vue/essential",
31 | "eslint:recommended"
32 | ],
33 | "rules": {},
34 | "parserOptions": {
35 | "parser": "babel-eslint"
36 | }
37 | },
38 | "postcss": {
39 | "plugins": {
40 | "autoprefixer": {}
41 | }
42 | },
43 | "browserslist": [
44 | "> 1%",
45 | "last 2 versions"
46 | ]
47 | }
48 |
--------------------------------------------------------------------------------
/frontend/public/favicon.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ottosmaniotto/django-vuecli3/2415a7a49dcae59a6436a6db1330d32db091a207/frontend/public/favicon.ico
--------------------------------------------------------------------------------
/frontend/public/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 | frontend
9 |
10 |
11 |
14 |
15 |
16 |
17 |
18 |
--------------------------------------------------------------------------------
/frontend/src/App.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |

4 |
5 |
6 |
7 |
8 |
18 |
19 |
29 |
--------------------------------------------------------------------------------
/frontend/src/assets/logo.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ottosmaniotto/django-vuecli3/2415a7a49dcae59a6436a6db1330d32db091a207/frontend/src/assets/logo.png
--------------------------------------------------------------------------------
/frontend/src/components/HelloWorld.vue:
--------------------------------------------------------------------------------
1 |
2 |
3 |
{{ msg }}
4 |
5 | For a guide and recipes on how to configure / customize this project,
6 | check out the
7 | vue-cli documentation.
8 |
9 |
Installed CLI Plugins
10 |
14 |
Essential Links
15 |
22 |
Ecosystem
23 |
30 |
31 |
32 |
33 |
41 |
42 |
43 |
59 |
--------------------------------------------------------------------------------
/frontend/src/main.js:
--------------------------------------------------------------------------------
1 | import Vue from 'vue'
2 | import App from './App.vue'
3 |
4 | Vue.config.productionTip = false
5 |
6 | new Vue({
7 | render: h => h(App),
8 | }).$mount('#app')
9 |
--------------------------------------------------------------------------------
/frontend/vue.config.js:
--------------------------------------------------------------------------------
1 | const BundleTracker = require("webpack-bundle-tracker");
2 |
3 | module.exports = {
4 | publicPath: "http://0.0.0.0:8080/",
5 | outputDir: './dist/',
6 |
7 | chainWebpack: config => {
8 |
9 | config.optimization
10 | .splitChunks(false)
11 |
12 | config
13 | .plugin('BundleTracker')
14 | .use(BundleTracker, [{filename: '../frontend/webpack-stats.json'}])
15 |
16 | config.resolve.alias
17 | .set('__STATIC__', 'static')
18 |
19 | config.devServer
20 | .public('http://0.0.0.0:8080')
21 | .host('0.0.0.0')
22 | .port(8080)
23 | .hotOnly(true)
24 | .watchOptions({poll: 1000})
25 | .https(false)
26 | .headers({"Access-Control-Allow-Origin": ["\*"]})
27 | }
28 | };
29 |
--------------------------------------------------------------------------------
/manage.py:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env python
2 | import os
3 | import sys
4 |
5 | if __name__ == '__main__':
6 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
7 | try:
8 | from django.core.management import execute_from_command_line
9 | except ImportError as exc:
10 | raise ImportError(
11 | "Couldn't import Django. Are you sure it's installed and "
12 | "available on your PYTHONPATH environment variable? Did you "
13 | "forget to activate a virtual environment?"
14 | ) from exc
15 | execute_from_command_line(sys.argv)
16 |
--------------------------------------------------------------------------------
/myproject/__init__.py:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/ottosmaniotto/django-vuecli3/2415a7a49dcae59a6436a6db1330d32db091a207/myproject/__init__.py
--------------------------------------------------------------------------------
/myproject/settings.py:
--------------------------------------------------------------------------------
1 | """
2 | Django settings for myproject project.
3 |
4 | Generated by 'django-admin startproject' using Django 2.1.3.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/2.1/topics/settings/
8 |
9 | For the full list of settings and their values, see
10 | https://docs.djangoproject.com/en/2.1/ref/settings/
11 | """
12 |
13 | import os
14 |
15 | # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
16 | BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
17 | FRONTEND_DIR = os.path.join(BASE_DIR, 'frontend')
18 | TEMPLATES_DIR = os.path.join(BASE_DIR, 'templates')
19 |
20 |
21 | # Quick-start development settings - unsuitable for production
22 | # See https://docs.djangoproject.com/en/2.1/howto/deployment/checklist/
23 |
24 | # SECURITY WARNING: keep the secret key used in production secret!
25 | SECRET_KEY = 'pt6&0^pq&xbcn@qb$e1-@a)svr6#m--$m1&b=l9fmv5j(o55j@'
26 |
27 | # SECURITY WARNING: don't run with debug turned on in production!
28 | DEBUG = True
29 |
30 | ALLOWED_HOSTS = []
31 |
32 |
33 | # Application definition
34 |
35 | INSTALLED_APPS = [
36 | 'django.contrib.admin',
37 | 'django.contrib.auth',
38 | 'django.contrib.contenttypes',
39 | 'django.contrib.sessions',
40 | 'django.contrib.messages',
41 | 'django.contrib.staticfiles',
42 | 'webpack_loader',
43 | ]
44 |
45 | MIDDLEWARE = [
46 | 'django.middleware.security.SecurityMiddleware',
47 | 'django.contrib.sessions.middleware.SessionMiddleware',
48 | 'django.middleware.common.CommonMiddleware',
49 | 'django.middleware.csrf.CsrfViewMiddleware',
50 | 'django.contrib.auth.middleware.AuthenticationMiddleware',
51 | 'django.contrib.messages.middleware.MessageMiddleware',
52 | 'django.middleware.clickjacking.XFrameOptionsMiddleware',
53 | ]
54 |
55 | ROOT_URLCONF = 'myproject.urls'
56 |
57 | TEMPLATES = [
58 | {
59 | 'BACKEND': 'django.template.backends.django.DjangoTemplates',
60 | 'DIRS': [TEMPLATES_DIR,],
61 | 'APP_DIRS': True,
62 | 'OPTIONS': {
63 | 'context_processors': [
64 | 'django.template.context_processors.debug',
65 | 'django.template.context_processors.request',
66 | 'django.contrib.auth.context_processors.auth',
67 | 'django.contrib.messages.context_processors.messages',
68 | ],
69 | },
70 | },
71 | ]
72 |
73 | WSGI_APPLICATION = 'myproject.wsgi.application'
74 |
75 |
76 | # Database
77 | # https://docs.djangoproject.com/en/2.1/ref/settings/#databases
78 |
79 | DATABASES = {
80 | 'default': {
81 | 'ENGINE': 'django.db.backends.sqlite3',
82 | 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
83 | }
84 | }
85 |
86 |
87 | # Password validation
88 | # https://docs.djangoproject.com/en/2.1/ref/settings/#auth-password-validators
89 |
90 | AUTH_PASSWORD_VALIDATORS = [
91 | {
92 | 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
93 | },
94 | {
95 | 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
96 | },
97 | {
98 | 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
99 | },
100 | {
101 | 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
102 | },
103 | ]
104 |
105 |
106 | # Internationalization
107 | # https://docs.djangoproject.com/en/2.1/topics/i18n/
108 |
109 | LANGUAGE_CODE = 'en-us'
110 |
111 | TIME_ZONE = 'UTC'
112 |
113 | USE_I18N = True
114 |
115 | USE_L10N = True
116 |
117 | USE_TZ = True
118 |
119 |
120 | # Static files (CSS, JavaScript, Images)
121 | # https://docs.djangoproject.com/en/2.1/howto/static-files/
122 |
123 | STATIC_URL = '/static/'
124 |
125 | WEBPACK_LOADER = {
126 | 'DEFAULT': {
127 | 'CACHE': DEBUG,
128 | 'BUNDLE_DIR_NAME': '/bundles/', # must end with slash
129 | 'STATS_FILE': os.path.join(FRONTEND_DIR, 'webpack-stats.json'),
130 | }
131 | }
--------------------------------------------------------------------------------
/myproject/urls.py:
--------------------------------------------------------------------------------
1 | """myproject URL Configuration
2 |
3 | The `urlpatterns` list routes URLs to views. For more information please see:
4 | https://docs.djangoproject.com/en/2.1/topics/http/urls/
5 | Examples:
6 | Function views
7 | 1. Add an import: from my_app import views
8 | 2. Add a URL to urlpatterns: path('', views.home, name='home')
9 | Class-based views
10 | 1. Add an import: from other_app.views import Home
11 | 2. Add a URL to urlpatterns: path('', Home.as_view(), name='home')
12 | Including another URLconf
13 | 1. Import the include() function: from django.urls import include, path
14 | 2. Add a URL to urlpatterns: path('blog/', include('blog.urls'))
15 | """
16 | from django.contrib import admin
17 | from django.urls import path
18 | from django.views.generic import TemplateView
19 |
20 |
21 | urlpatterns = [
22 | path('admin/', admin.site.urls),
23 | path("",
24 | TemplateView.as_view(template_name="application.html"),
25 | name="app",
26 | ),
27 | ]
28 |
--------------------------------------------------------------------------------
/myproject/wsgi.py:
--------------------------------------------------------------------------------
1 | """
2 | WSGI config for myproject project.
3 |
4 | It exposes the WSGI callable as a module-level variable named ``application``.
5 |
6 | For more information on this file, see
7 | https://docs.djangoproject.com/en/2.1/howto/deployment/wsgi/
8 | """
9 |
10 | import os
11 |
12 | from django.core.wsgi import get_wsgi_application
13 |
14 | os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'myproject.settings')
15 |
16 | application = get_wsgi_application()
17 |
--------------------------------------------------------------------------------
/requirements.txt:
--------------------------------------------------------------------------------
1 | Django==2.1.3
2 | django-webpack-loader==0.6.0
3 | pytz==2018.7
--------------------------------------------------------------------------------
/templates/application.html:
--------------------------------------------------------------------------------
1 | {% load render_bundle from webpack_loader %}
2 | {% load webpack_static from webpack_loader %}
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 | Django Vue Integration
12 |
13 |
14 |
15 |
16 |
19 |
20 |
21 |
24 |
25 | {% render_bundle 'app' %}
26 |
27 |
28 |
29 |
--------------------------------------------------------------------------------