Как заставить Flask видеть файлы сборки Vue без использования веб-пакета? - PullRequest
1 голос
/ 22 мая 2019

Я довольно новичок в Vue и современной веб-разработке в целом, поэтому заранее прошу прощения.Вот ситуация.

Я пытаюсь создать простое приложение Flask, которое использует Vue и Vuetify на внешнем интерфейсе.Когда я смотрю учебники о том, как жениться на Flask и Vue (например, one ), он опирается на веб-пакет, и я могу заставить его работать нормально.Когда я попытался добавить Vuetify в проект в соответствии с инструкциями их Краткое руководство по началу работы , я обнаружил, что вам необходимо следовать руководству Existing Applications, так как проект не был инициализирован с помощью vue-cli3 (см.отчет об ошибке здесь ).Я попытался следовать этим инструкциям, но сдался после нескольких непонятных часов безрезультатно.

После прочтения веб-пакета я решил, что для своего конкретного приложения я могу позволить себе его не использовать.Поэтому я вернулся к руководству Vuetify Quick Start и, следуя инструкциям New Applications, запустил Flask, и вот что я получаю:

127.0.0.1 - - [21/May/2019 18:31:20] "GET / HTTP/1.1" 200 -
127.0.0.1 - - [21/May/2019 18:31:20] "GET /js/app.c12f4ec0.js HTTP/1.1" 404 -
127.0.0.1 - - [21/May/2019 18:31:20] "GET /css/chunk-vendors.b7bc2226.css HTTP/1.1" 404 -
127.0.0.1 - - [21/May/2019 18:31:20] "GET /js/chunk-vendors.2eb58769.js HTTP/1.1" 404 -
127.0.0.1 - - [21/May/2019 18:31:21] "GET /js/app.c12f4ec0.js HTTP/1.1" 404 -
127.0.0.1 - - [21/May/2019 18:38:22] "GET /index.html HTTP/1.1" 404 -

Код, о котором идет речь:

from flask import Flask, render_template

app = Flask(__name__,
            static_folder="./test/dist",
            template_folder="./test/dist")

@app.route('/')
def index():
    return render_template("index.html")

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)

По большей части код Vue - это просто новый проект с установленным Vuetify.Единственное изменение, которое я сделал, было в main.js, где я изменил разделители, чтобы они не конфликтовали с Jinja2.

import Vue from 'vue'
import './plugins/vuetify'
import App from './App.vue'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
  delimiters: ["[[", "]]"],
}).$mount('#app')

Мои три основных вопроса:

  1. Что не так с путем, который использует Flask для поиска статических файлов и файлов шаблонов?
  2. Можно ли использовать Vue с Flask без веб-пакета?
  3. Если это невозможно, будет ликто-то любезно делает eli5 о том, как интегрировать Vuetify в проект Vue на основе веб-пакета?

Заранее спасибо!

Ответы [ 2 ]

0 голосов
/ 24 мая 2019

Хорошо, так что я нашел ответ, и оказалось, что это было намного проще, чем я это делал. Чтобы было проще повторить мои шаги, я собираюсь начать сверху.

app.py

from flask import Flask, render_template

app = Flask(__name__,
            static_folder="./test/dist", # place that webpack builds to
            template_folder="./test/dist")

@app.route('/')
def index():
    return render_template("index.html")

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=5000, debug=True)

В том же каталоге, что и app.py, выполните следующие команды (при условии, что у вас уже установлен vue-cli):

$ vue init webpack vue-app-name
$ cd vue-app-name
$ yarn add vuetify # or use npm install vuetify --save

Теперь вы просто следуете инструкциям из раздела Existing Applications страницы быстрого запуска Vuetify :

Top of main.js

import Vue from 'vue'
import App from './App'
import Vuetify from 'vuetify'
import 'vuetify/dist/vuetify.min.css' // Ensure you are using css-loader


Vue.config.productionTip = false
Vue.use(Vuetify)

<head> раздел index.html

<head>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width,initial-scale=1.0">
  <title>frontend</title>
  <link href='https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons' rel="stylesheet">
</head>

И, наконец, в разделе сборки файла index.js измените каталог, в котором веб-пакет выводит свою сборку:

// Template for index.html
index: path.resolve(__dirname, '../../dist/index.html'),

// Paths
assetsRoot: path.resolve(__dirname, '../../dist'),

На этом этапе, если вы запустите

$ yarn build # or npm run build
$ cd ..
$ python app.py

и откройте ваш веб-браузер, вы должны увидеть страницу Vue HelloWorld по умолчанию, и у вас есть Flask, работающий с Vue, Vuetify и webpack все в одном.

Здесь я запутался. Если вы следуете инструкциям для нового проекта Vuetify и запускаете сервер dev, у них есть собственная настраиваемая страница Hello World. Однако, поскольку страница Hello World по-прежнему была страницей Vue по умолчанию, я понял, что Vuetify не был установлен. На самом деле происходит то, что у них разные файлы App.vue и HelloWorld.vue. Если вы замените обычные файлы App.vue и HelloWorld.vue на файлы Vuetify, скопируете файл logo.svg в папку активов и перезапустите сервер dev, вы получите целевую страницу Vuetify.

В любом случае, я чувствую себя идиотом, но, надеюсь, это поможет другому новичку Flask / Vue / Vuetify / Webpack.

Это было сделано с использованием python 3.7.3 и vue-cli 3.7.0

0 голосов
/ 23 мая 2019

У меня есть несколько проектов с Vue и Flask, и я обнаружил, что веб-пакет - лучший подход.Мне не понравился Vue-CLI, потому что было слишком сложно указывать пути локальных файлов и связанных файлов при сборке.Я знаю, что сначала это кривая обучения, но стоит потратить день или два, если вы потратите время.

Вы должны использовать Flask-Webpack, чтобы позволить колбе находить активы, которые были хэшированы и связаны.Наряду с плагином webpack для создания манифеста JSON, который предоставляет ссылку.При использовании колбы с веб-пакетом вам также необходимо указать пути к папкам напрямую, как вы это сделали.

У меня есть эта настройка в моей конфигурации веб-пакета:

const ManifestPlugin = require('webpack-manifest-plugin')
...
plugins: [
    new ManifestPlugin({
      writeToFileEmit: true,
      seed: {
        publicPath: '/'
      },
      generate: (seed, files) => ({
        ...seed,
        'assets': files.reduce((manifest, { name, path }) => ({ ...manifest, 
        [name]: path }), {})
      })
   })
]

это создает файл manifest.json, которыйвыглядит следующим образом:

{"assets":{"base_css.css":"static/css/base_css.1bf3ff18.css",
           "base_css.js":"static/js/base_css.1e6b291b.js",
           "chunk-vendors.js":"static/js/chunkvendors.f92da40c.js",},
 "publicPath":"/"}

После настройки вашего проекта, я предполагаю, что довольно просто добавить Vuetify после добавления в существующий проект, используя npm и import.

Обратите внимание, чтопри использовании Vue-Cli и / или веб-пакета вы не можете изменить разделители vue.Из документации API по разделителям: «Ограничения: эта опция доступна только в полной сборке с компиляцией в браузере».

Но этот последний пункт не должен быть проблемой, так как ваши HTML-шаблоныи шаблоны vue будут отдельно развязаны, поэтому кроссоверы {{}} не имеют значения, они контекстуальны.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...