Рубрики
Без рубрики

Прицепляя django и vue.js

Эта статья для людей, у которых была промежуточная практика с Vue.js и django del … Теги с Джанго, Vue, Python, WebDev.

Эта статья для частных лиц, у которых была промежуточная практика с Vue.js и Django отдельно, но нужно направление о том, как сделать эти две рамки работать вместе. Я изложу пример того, как настроить какой-нибудь код котельной с простым структурой проекта с помощью Django и Vue.js. Обратите внимание, что я работаю на MacOS Catalina, поэтому команда оболочек будет варьироваться для вашей операционной системы. Готовый продукт можно найти на моем Github: https://github.com/jordanengstrom/blank_django_vue_project.

На высоком уровне мы будем стремиться к структуре проекта, которая выглядит что-то подобное:

my_project/
|
|____ core/
|    |____ __init__.py
|    |____ views.py           # class based TemplateView for index.html
|    
|
|____ frontend/               # root frontend
|    |____ src/               # vue components, router, store, etc.
|    |____ node_modules/
|    |____ vue.config.js      # important file number 1
|    |____ webpack-stats.json # important file number 2
|
|
|____ my_project/             # root backend
|    |____ __init__.py
|    |____ settings.py
|    |____ urls.py
|    |____ views.py
|
|
|____ templates/                
|    |____ index.html         # django template that houses vue
|
|____ .gitignore
|____ venv/
|____ requirements.txt
|____ manage.py
|____ db.sqlite3

Мы начнем с бэкэнда. Создайте пустой каталог для вашего проекта, а затем запустите:

$ django-admin startproject my_project && cd my_project
$ mkdir venv && python3 -m venv venv && source venv/bin/activate
$ (venv) pip install django djangorestframework
$ (venv) mkdir templates && cd templates && touch index.html
$ (venv) cd ..
$ (venv) mkdir core && touch __init__.py && touch views.py

Это все, что нам нужно сделать с Django сейчас. Мы вернемся к шаблонам/index.html и core/views.py файлы позже. Эта следующая команда предполагает, что вы уже установили VUE глобально. Если у вас нет, просто запустите: NPM установить -G VUE-CLI

$ vue create frontend

Затем пройдите через мастер установки, чтобы ваши пресеты выглядели что-то вроде этого (или настройте ваши пресеты, как вы предпочитаете):

$ Vue CLI v4.3.1
  ? Please pick a preset: Manually select features
  ? Check the features needed for your project: Babel, Router, Vuex
  ? Use history mode for router? (Requires proper server setup for index fallback in production) Yes
  ? Where do you prefer placing config for Babel, ESLint, etc.? In package.json
  ? Save this as a preset for future projects? (y/N) N

  ### installation magic happens...

🎉  Successfully created project frontend.
👉  Get started with the following commands:
$ cd frontend
$ npm run serve

Теперь у нас есть отдельные среды Frontend и Backend! Сервер Frontend будет в http://localhost: 8080/ которые будут отображать страницу посадки VUE, а бэкэнда будет в http://127.0.0.1:8000/ которые будут отображать посадочную страницу Django. Вы можете загнать команды преобразования навыше приведенным выше и отключите бэкэнд в корневом каталоге с помощью:

python manage.py runserver

Теперь эти среды просто должны быть в состоянии поговорить друг с другом. Два инструмента, которые мы будем использовать для достижения этого WebPack-Bundle-Tracker на стороне Vue и Django WebPack погрузчика на бэкэнде.

$ cd frontend
$ npm install webpack-bundle-tracker@0.4.3

Нам нужна версия 0.4.3 WebPack-Tracker, потому что файлы Django ожидают, не будут автоматически сгенерированы таким же образом, если мы используем новейшую альфа-версию. Обратите внимание, что 0,4,3 – это последний стабильный выпуск по состоянию на 2020 года. Если мы не укажем эту версию, NPM выйдет по последней версии Alpha, которая не будет работать то же самое. Далее нам нужно создать файл vue.config.js в каталоге frontend:

$ touch vue.config.js

и заполните его этим содержимым:

const BundleTracker = require("webpack-bundle-tracker");

module.exports = {
  // on Windows you might want to set publicPath: "http://127.0.0.1:8080/"
  publicPath: "http://0.0.0.0:8080/",
  outputDir: "./dist/",

  chainWebpack: (config) => {
    config
      .plugin("BundleTracker")
      .use(BundleTracker, [{ filename: "./webpack-stats.json" }]);

    config.output.filename("bundle.js");

    config.optimization.splitChunks(false);

    config.resolve.alias.set("__STATIC__", "static");

    config.devServer
      // the first 3 lines of the following code have been added to the configuration
      .public("http://127.0.0.1:8080")
      .host("127.0.0.1")
      .port(8080)
      .hotOnly(true)
      .watchOptions({ poll: 1000 })
      .https(false)
      .disableHostCheck(true)
      .headers({ "Access-Control-Allow-Origin": ["*"] });
  }

  // uncomment before executing 'npm run build'
  // css: {
  //     extract: {
  //       filename: 'bundle.css',
  //       chunkFilename: 'bundle.css',
  //     },
  // }
};

Ознакомьтесь с базовыми настройками URL, которые поставляются с маршрутизатором Vue. Если вы пропустите это, вы просто получите такое путь: http://127.0.0.1:8000/http:/0.0.0.0:8080/blah-blah-blah На что я говорю – EW WTF? Исправьте его, удалив конфигурацию базового URL:

const router = new VueRouter({
  mode: "history",
  // base: process.env.BASE_URL,
  routes
});

Как только вы создадите этот файл, раскрутите сервер разработки Frontend и файл WebPack-stats.json будет сгенерирован

npm run serve

Теперь перейдите к корневой каталоге и убедитесь, что ваша виртуальная среда активирована, поэтому мы можем установить Django-WebPack-Loader. Также не стесняйтесь генерировать файл ваших требований:

$ (venv) pip install django-webpack-loader
$ pip freeze > requirements.txt

Затем добавьте WebPack_Loader в установленные приложения Django в Settings.py и добавьте следующие изменения в файл settings.py:

INSTALLED_APPS = [
         ...
    'rest_framework',
    'webpack_loader',
]

    .
    .
    .
TEMPLATES = [
    {               ...

        'DIRS': [os.path.join(BASE_DIR, 'templates')],
                    ...
    },
]
    .
    .
    .

STATICFILES_DIRS = [
    os.path.join(BASE_DIR, "assets"),
    os.path.join(BASE_DIR, "frontend/dist"),
]

WEBPACK_LOADER = {
    'DEFAULT': {
        'BUNDLE_DIR_NAME': 'dist/',
        'STATS_FILE': os.path.join(BASE_DIR, 'frontend', 'webpack-stats.json')
    }
}

Вставьте это в свои шаблоны/index.html Файл:

{% load render_bundle from webpack_loader %}



  
    
    
    Document
  
  
    
    

Vue JS

{% render_bundle 'app' %}

Вставьте это в ваше Core/Views.py Файл:

from django.conf import settings
from django.views.generic.base import TemplateView


class IndexTemplateView(TemplateView):
    def get_template_names(self):
        template_name = "index.html"
        return template_name

Убедитесь, что они отражены в вашем файле my_project/urls.py:

from django.urls import re_path
from core.views import IndexTemplateView

urlpatterns = [
    ...
    re_path(r"^.*$", IndexTemplateView.as_view(), name="entry-point"),
]

Как только эти изменения будут выполнены, включите свой NPM Server на вкладке в одну терминал, а затем раскрутите свой сервер Django DEV на другом клемме вкладки, и вы должны быть хорошими, чтобы пойти! Счастливое кодирование 😎.

$ npm run serve
$ (venv) python manage.py runserver

Оригинал: “https://dev.to/saymy__name__/hooking-up-django-and-vue-js-19j3”