diff --git a/.gitignore b/.gitignore index eb16985..d636a67 100644 --- a/.gitignore +++ b/.gitignore @@ -12,6 +12,7 @@ app/data/preprocess/*.json flaskenv algolia.json *.scss.css +*.scss.css.map node_modules/** # Byte-compiled / optimized / DLL files diff --git a/client/.editorconfig b/client/.editorconfig deleted file mode 100644 index c24743d..0000000 --- a/client/.editorconfig +++ /dev/null @@ -1,7 +0,0 @@ -[*.{js,jsx,ts,tsx,vue}] -indent_style = space -indent_size = 2 -end_of_line = lf -trim_trailing_whitespace = true -insert_final_newline = true -max_line_length = 100 diff --git a/client/package-lock.json b/client/package-lock.json index af33a01..434c8c5 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -1122,6 +1122,16 @@ "integrity": "sha1-K1o6s/kYzKSKjHVMCBaOPwPrphs=", "dev": true }, + "@nuxt/opencollective": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.3.0.tgz", + "integrity": "sha512-Vf09BxCdj1iT2IRqVwX5snaY2WCTkvM0O4cWWSO1ThCFuc4if0Q/nNwAgCxRU0FeYHJ7DdyMUNSdswCLKlVqeg==", + "requires": { + "chalk": "^2.4.2", + "consola": "^2.10.1", + "node-fetch": "^2.6.0" + } + }, "@soda/friendly-errors-webpack-plugin": { "version": "1.7.1", "resolved": "https://registry.npm.taobao.org/@soda/friendly-errors-webpack-plugin/download/@soda/friendly-errors-webpack-plugin-1.7.1.tgz", @@ -2019,7 +2029,6 @@ "version": "3.2.1", "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.1.tgz", "integrity": "sha1-QfuyAkPlCxK+DwS43tvwdSDOhB0=", - "dev": true, "requires": { "color-convert": "^1.9.0" } @@ -2266,6 +2275,43 @@ "integrity": "sha1-oXs6jqgRBg501H0wYSJACtRJeuI=", "dev": true }, + "axios": { + "version": "0.18.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", + "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", + "requires": { + "follow-redirects": "1.5.10", + "is-buffer": "^2.0.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "follow-redirects": { + "version": "1.5.10", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", + "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", + "requires": { + "debug": "=3.1.0" + } + }, + "is-buffer": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.4.tgz", + "integrity": "sha512-Kq1rokWXOPXWuaMAqZiJW4XxsmD9zGx9q4aePabbn3qCRGedtH7Cm+zV8WETitMfu1wdh+Rvd6w5egwSngUX2A==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, "babel-eslint": { "version": "10.1.0", "resolved": "https://registry.npm.taobao.org/babel-eslint/download/babel-eslint-10.1.0.tgz", @@ -2499,6 +2545,23 @@ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", "dev": true }, + "bootstrap": { + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.1.tgz", + "integrity": "sha512-bxUooHBSbvefnIZfjD0LE8nfdPKrtiFy2sgrxQwUZ0UpFzpjVbVMUxaGIoo9XWT4B2LG1HX6UQg0UMOakT0prQ==" + }, + "bootstrap-vue": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.16.0.tgz", + "integrity": "sha512-gLETwPmeRHCe5WHmhGxzb5PtTEuKqQPGl0TFvZ2Odbkg/7UuIHdqIexrJRerpnomP4ZzDQ+qYGL91Ls9lcQsJQ==", + "requires": { + "@nuxt/opencollective": "^0.3.0", + "bootstrap": ">=4.5.0 <5.0.0", + "popper.js": "^1.16.1", + "portal-vue": "^2.1.7", + "vue-functional-data-merge": "^3.1.0" + } + }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.11.tgz", @@ -2908,7 +2971,6 @@ "version": "2.4.2", "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.4.2.tgz?cache=0&sync_timestamp=1591687183344&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fchalk%2Fdownload%2Fchalk-2.4.2.tgz", "integrity": "sha1-zUJUFnelQzPPVBpJEIwUMrRMlCQ=", - "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -3227,7 +3289,6 @@ "version": "1.9.3", "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.3.tgz", "integrity": "sha1-u3GFBpDh8TZWfeYp0tVHHe2kweg=", - "dev": true, "requires": { "color-name": "1.1.3" } @@ -3235,8 +3296,7 @@ "color-name": { "version": "1.1.3", "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", - "dev": true + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" }, "color-string": { "version": "1.5.3", @@ -3358,6 +3418,11 @@ "integrity": "sha1-izIIk1kwjRERFdgcrT/Oq4iPl7w=", "dev": true }, + "consola": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.14.0.tgz", + "integrity": "sha512-A2j1x4u8d6SIVikhZROfpFJxQZie+cZOfQMyI/tu2+hWXe8iAv7R6FW6s6x04/7zBCst94lPddztot/d6GJiuQ==" + }, "console-browserify": { "version": "1.2.0", "resolved": "https://registry.npm.taobao.org/console-browserify/download/console-browserify-1.2.0.tgz", @@ -4531,8 +4596,7 @@ "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz?cache=0&sync_timestamp=1587627212242&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fescape-string-regexp%2Fdownload%2Fescape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", - "dev": true + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "eslint": { "version": "6.8.0", @@ -5750,8 +5814,7 @@ "has-flag": { "version": "3.0.0", "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", - "dev": true + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" }, "has-symbols": { "version": "1.0.1", @@ -7536,6 +7599,11 @@ "lower-case": "^1.1.1" } }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, "node-forge": { "version": "0.9.0", "resolved": "https://registry.npm.taobao.org/node-forge/download/node-forge-0.9.0.tgz", @@ -8182,6 +8250,16 @@ "ts-pnp": "^1.1.6" } }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portal-vue": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.7.tgz", + "integrity": "sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==" + }, "portfinder": { "version": "1.0.28", "resolved": "https://registry.npm.taobao.org/portfinder/download/portfinder-1.0.28.tgz", @@ -10342,7 +10420,6 @@ "version": "5.5.0", "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-5.5.0.tgz?cache=0&sync_timestamp=1573220230429&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsupports-color%2Fdownload%2Fsupports-color-5.5.0.tgz", "integrity": "sha1-4uaaRKyHcveKHsCzW2id9lMO/I8=", - "dev": true, "requires": { "has-flag": "^3.0.0" } @@ -11084,6 +11161,11 @@ } } }, + "vue-functional-data-merge": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-3.1.0.tgz", + "integrity": "sha512-leT4kdJVQyeZNY1kmnS1xiUlQ9z1B/kdBFCILIjYYQDqZgLqCLa0UhjSSeRX6c3mUe6U5qYeM8LrEqkHJ1B4LA==" + }, "vue-hot-reload-api": { "version": "2.3.4", "resolved": "https://registry.npm.taobao.org/vue-hot-reload-api/download/vue-hot-reload-api-2.3.4.tgz", diff --git a/client/package.json b/client/package.json index d18b362..4b91747 100644 --- a/client/package.json +++ b/client/package.json @@ -8,6 +8,9 @@ "lint": "vue-cli-service lint" }, "dependencies": { + "axios": "^0.18.1", + "bootstrap": "^4.3.1", + "bootstrap-vue": "^2.16.0", "core-js": "^3.6.5", "vue": "^2.6.11", "vue-router": "^3.2.0" @@ -37,7 +40,14 @@ "parserOptions": { "parser": "babel-eslint" }, - "rules": {} + "rules": { + "max-len": [ + 2, + { + "code": 120 + } + ] + } }, "browserslist": [ "> 1%", diff --git a/client/src/App.vue b/client/src/App.vue index 7de07d6..a006d6b 100644 --- a/client/src/App.vue +++ b/client/src/App.vue @@ -1,5 +1,23 @@ + + diff --git a/client/src/components/Books.vue b/client/src/components/Books.vue deleted file mode 100644 index 8d4200e..0000000 --- a/client/src/components/Books.vue +++ /dev/null @@ -1,36 +0,0 @@ - diff --git a/client/src/components/Ping.vue b/client/src/components/Ping.vue deleted file mode 100644 index fe9a5aa..0000000 --- a/client/src/components/Ping.vue +++ /dev/null @@ -1,28 +0,0 @@ - diff --git a/client/src/components/SeasonList.vue b/client/src/components/SeasonList.vue new file mode 100644 index 0000000..4fe9f3a --- /dev/null +++ b/client/src/components/SeasonList.vue @@ -0,0 +1,111 @@ + + + + + diff --git a/client/src/main.js b/client/src/main.js index 09c5368..feab568 100644 --- a/client/src/main.js +++ b/client/src/main.js @@ -1,11 +1,13 @@ import 'bootstrap/dist/css/bootstrap.css'; import Vue from 'vue'; +import BootstrapVue from 'bootstrap-vue'; import App from './App.vue'; import router from './router'; +Vue.use(BootstrapVue); Vue.config.productionTip = false; new Vue({ router, - render: h => h(App), + render: (h) => h(App), }).$mount('#app'); diff --git a/client/src/router.js b/client/src/router.js index a2fbee8..1355f21 100644 --- a/client/src/router.js +++ b/client/src/router.js @@ -1,7 +1,5 @@ import Vue from 'vue'; import Router from 'vue-router'; -import Books from './components/Books.vue'; -import Ping from './components/Ping.vue'; Vue.use(Router); @@ -9,15 +7,5 @@ export default new Router({ mode: 'history', base: process.env.BASE_URL, routes: [ - { - path: '/', - name: 'Books', - component: Books, - }, - { - path: '/ping', - name: 'Ping', - component: Ping, - }, ], }); diff --git a/package-lock.json b/package-lock.json index a2d2930..fdca5bc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2,6 +2,24 @@ "requires": true, "lockfileVersion": 1, "dependencies": { + "@nuxt/opencollective": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@nuxt/opencollective/-/opencollective-0.2.2.tgz", + "integrity": "sha512-ie50SpS47L+0gLsW4yP23zI/PtjsDRglyozX2G09jeiUazC1AJlGPZo0JUs9iuCDUoIgsDEf66y7/bSfig0BpA==", + "requires": { + "chalk": "^2.4.1", + "consola": "^2.3.0", + "node-fetch": "^2.3.0" + } + }, + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, "axios": { "version": "0.18.0", "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz", @@ -12,19 +30,116 @@ } }, "bootstrap": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.3.1.tgz", - "integrity": "sha512-rXqOmH1VilAt2DyPzluTi2blhk17bO7ef+zLLPlWvG494pDxcM234pJ8wTc/6R40UWizAIIMgxjvxZg5kmsbag==" + "version": "4.5.1", + "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-4.5.1.tgz", + "integrity": "sha512-bxUooHBSbvefnIZfjD0LE8nfdPKrtiFy2sgrxQwUZ0UpFzpjVbVMUxaGIoo9XWT4B2LG1HX6UQg0UMOakT0prQ==" + }, + "bootstrap-vue": { + "version": "2.0.0-rc.19", + "resolved": "https://registry.npmjs.org/bootstrap-vue/-/bootstrap-vue-2.0.0-rc.19.tgz", + "integrity": "sha512-OCbRwqKb0F+RGr162m+RyKI4yNM0VjfxOGI32CMgHfCnnc0MZ0wF2Svg2E3Q7AWCq0N8LgD/EsF/K7Vg3kdDyw==", + "requires": { + "@nuxt/opencollective": "^0.2.2", + "bootstrap": "^4.3.1", + "core-js": ">=2.6.5 <3.0.0", + "popper.js": "^1.15.0", + "portal-vue": "^2.1.1", + "vue-functional-data-merge": "^2.0.7" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "consola": { + "version": "2.14.0", + "resolved": "https://registry.npmjs.org/consola/-/consola-2.14.0.tgz", + "integrity": "sha512-A2j1x4u8d6SIVikhZROfpFJxQZie+cZOfQMyI/tu2+hWXe8iAv7R6FW6s6x04/7zBCst94lPddztot/d6GJiuQ==" + }, + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" }, "follow-redirects": { "version": "1.12.1", "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==" }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" + }, "is-buffer": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + }, + "popper.js": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/popper.js/-/popper.js-1.16.1.tgz", + "integrity": "sha512-Wb4p1J4zyFTbM+u6WuO4XstYx4Ky9Cewe4DWrel7B0w6VVICvPwdOpotjzcf6eD8TsckVnIMNONQyPIUFOUbCQ==" + }, + "portal-vue": { + "version": "2.1.7", + "resolved": "https://registry.npmjs.org/portal-vue/-/portal-vue-2.1.7.tgz", + "integrity": "sha512-+yCno2oB3xA7irTt0EU5Ezw22L2J51uKAacE/6hMPMoO/mx3h4rXFkkBkT4GFsMDv/vEe8TNKC3ujJJ0PTwb6g==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + }, + "vue-functional-data-merge": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/vue-functional-data-merge/-/vue-functional-data-merge-2.0.7.tgz", + "integrity": "sha512-pvLc+H+x2prwBj/uSEIITyxjz/7ZUVVK8uYbrYMmhDvMXnzh9OvQvVEwcOSBQjsubd4Eq41/CSJaWzy4hemMNQ==" } } } diff --git a/server/__init__.py b/server/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/server/api.py b/server/api.py index 2803752..1f8243b 100644 --- a/server/api.py +++ b/server/api.py @@ -3,15 +3,46 @@ api.py Provides a accessible protected backend API. JSON I/O only, CSRF protected. """ +import json +import os + import flask_wtf from flask import current_app, jsonify +BASE_DIR = os.path.dirname(os.path.abspath(__file__)) +with open(os.path.join(BASE_DIR, 'data', 'data.json'), 'r', encoding='utf-8') as file: + data = json.load(file) + @current_app.route('/api/csrf/') -def csrf(): +def api_csrf(): """ Page used for refreshing expired CSRF tokens via AJAX. Probably secure: https://medium.com/@iaincollins/csrf-tokens-via-ajax-a885c7305d4a """ return jsonify(flask_wtf.csrf.generate_csrf()) + + +@current_app.route('/api/episodes/') +def api_episodes(): + """ + Returns a list of episodes with basic information (no quotes). + Used for the left side season bar. + """ + seasons = [] + copy = list(data) + for season in copy: + for episode in season.get('episodes'): + if 'scenes' in episode.keys(): + del episode['scenes'] + seasons.append(season) + return jsonify(seasons) + + +@current_app.route('/api/all/') +def api_data(): + """ + Season data route + """ + return jsonify(data) diff --git a/server/create_app.py b/server/create_app.py index 83e5960..8ac0a72 100644 --- a/server/create_app.py +++ b/server/create_app.py @@ -15,7 +15,6 @@ from werkzeug.exceptions import HTTPException from server.config import configs csrf = CSRFProtect() -BASE_DIR = os.path.dirname(os.path.abspath(__file__)) cors = CORS(resources={r'/*': {'origins': '*'}}) @@ -65,6 +64,7 @@ def create_app(env=None): @app.context_processor def inject_data(): + BASE_DIR = os.path.dirname(os.path.abspath(__file__)) with open(os.path.join(BASE_DIR, 'data', 'data.json'), 'r', encoding='utf-8') as file: return dict(data=json.load(file)) @@ -72,5 +72,7 @@ def create_app(env=None): with app.app_context(): # noinspection PyUnresolvedReferences from server import routes + # noinspection PyUnresolvedReferences + from server import api return app diff --git a/server/templates/base.html b/server/templates/base.html index 9211d4e..17dbbec 100644 --- a/server/templates/base.html +++ b/server/templates/base.html @@ -54,6 +54,7 @@ {% endfor %} +