diff --git a/astro.config.mjs b/astro.config.mjs index f6b2d61..fc2e85d 100644 --- a/astro.config.mjs +++ b/astro.config.mjs @@ -10,6 +10,7 @@ export default defineConfig({ starlight({ title: 'Практическое введение в веб-картографию', description: 'Веб-картография и веб-картографирование: практическое пособие', + favicon: '/icon.png', head: [ { tag: 'script', @@ -18,6 +19,14 @@ export default defineConfig({ 'data-goatcounter': "https://webcartography.goatcounter.com/count", async: true } + }, + { + tag: 'link', + attrs: { + rel: 'icon', + href: '/favicon.ico', + sizes: '32x32', + }, } ], locales: { diff --git a/public/apple-touch-icon.png b/public/apple-touch-icon.png new file mode 100644 index 0000000..c73e523 Binary files /dev/null and b/public/apple-touch-icon.png differ diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000..af8ab0f Binary files /dev/null and b/public/favicon.ico differ diff --git a/public/favicon.svg b/public/favicon.svg deleted file mode 100644 index cba5ac1..0000000 --- a/public/favicon.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/public/icon-192.png b/public/icon-192.png new file mode 100644 index 0000000..fc72a22 Binary files /dev/null and b/public/icon-192.png differ diff --git a/public/icon-512.png b/public/icon-512.png new file mode 100644 index 0000000..3586ebb Binary files /dev/null and b/public/icon-512.png differ diff --git a/public/icon.png b/public/icon.png new file mode 100644 index 0000000..fa44218 Binary files /dev/null and b/public/icon.png differ diff --git a/public/tableau.png b/public/tableau.png new file mode 100644 index 0000000..a517cab Binary files /dev/null and b/public/tableau.png differ diff --git a/src/content/docs/3-api.mdx b/src/content/docs/3-api.mdx index 4620256..9cc13e8 100644 --- a/src/content/docs/3-api.mdx +++ b/src/content/docs/3-api.mdx @@ -3,7 +3,6 @@ title: API --- import { Card, FileTree, LinkCard, TabItem, Tabs } from '@astrojs/starlight/components'; -import Question from '../../components/Question.astro'; import MultipleChoice from '../../components/MultipleChoice.astro'; import Option from '../../components/Option.astro'; diff --git a/src/content/docs/4-backend.mdx b/src/content/docs/4-backend.mdx index 6af7b61..e10e8a8 100644 --- a/src/content/docs/4-backend.mdx +++ b/src/content/docs/4-backend.mdx @@ -4,6 +4,8 @@ draft: true --- import { Card, FileTree, LinkCard, TabItem, Tabs } from '@astrojs/starlight/components'; +import MultipleChoice from '../../components/MultipleChoice.astro'; +import Option from '../../components/Option.astro'; В этой главе мы рассмотрим @@ -16,13 +18,27 @@ import { Card, FileTree, LinkCard, TabItem, Tabs } from '@astrojs/starlight/comp ## Бэкенд -Мы уже знаем, что веб-приложения можно разделить на клиентскую и серверную части. Разработку клиентской части называют фронтендом. Разработку серверной части называют бэкендом. Фронтенд общается с бэкендом через API. Бэкенд предоставляет метода API, а фронтенд к ним обращается. +Мы уже знаем, что веб-приложения можно разделить на клиентскую и серверную части. Разработку клиентской части называют фронтендом. Разработку серверной части называют бэкендом. Фронтенд общается с бэкендом через API. Бэкенд предоставляет методы API, а фронтенд к ним обращается. ![alt text](../../assets/image-17.png) Когда происходит вызов метода API -- запрос определённого URL -- выполняется соответствующая серверная функция. Для программирования серверных функций могут использоваться различные языки программирования Python, Go, Rust и даже JavaScript (NodeJS). -В предыдущем занятии мы обращались к бэкенду через API, а в этот раз разработаем бэкенд сами. Наш бэкенд мы разработаем на языке Python с использованием библиотеки Flask. + + + + + + + + +В предыдущем упражнении мы обращались к бэкенду через готовый API, а в этот раз разработаем бэкенд сами. Наш бэкенд мы разработаем на языке Python с использованием библиотеки Flask. ## Подготовка @@ -158,7 +174,7 @@ def city_by_id(id): ### Подключение данных и CORS -Наш бэкенд возвращает данные в формате GeoJSON, поэтому мы можем сразу подключить их в нашу карту. +Наш бэкенд возвращает данные в формате GeoJSON, поэтому мы можем сразу подключить их в нашу карту. Однако на карте мы не увидим искомых городов. Чтобы узнать почему, проверим вкладку "Сеть" в инструментах разработчика. У запроса к списку городов мы увидим надпись **Ошибка CORS**. ```js title=main.js map.on("load", () => { @@ -199,8 +215,6 @@ map.on("load", () => { }) ``` -Однако на карте мы не увидим искомых городов. Чтобы узнать почему, проверим вкладку "Сеть" в инструментах разработчика. У запроса к списку городов мы увидим надпись **Ошибка CORS**. - Механизм CORS -- Cross-Origin Resource Sharing -- призван повысить безопасность веб-страницы. Нам, чтобы избежать ошибки CORS, надо указать, что API может отвечать на запросы любых веб-страниц. > CORS -- это история про *веб-страницы*, поэтому выполняя запросы к API напрямую мы с ней не сталкивались. @@ -230,7 +244,7 @@ def city_by_id(id): return r ``` -После добавления заголовков о том, что API может обслуживать любые веб-страницы, в ответ мы получаем наш список городов в формате GeoJSON. +После добавления заголовков о том, что API готов отдавать данные на любые веб-страницы, в ответ мы получаем наш список городов в формате GeoJSON, который выводится на карту. ### Выбор года @@ -294,7 +308,7 @@ map.on("load", () => { ``` -При клике будем выполнять запрос к методу API, который возвращает подробную информацию о городе. Здесь мы работаем с асинхронностью самостоятельно. +При клике по точке города на карте будем выполнять запрос к методу API, который возвращает подробную информацию о городе. Здесь мы работаем с асинхронностью самостоятельно. ```js title=main.js map.on("load", () => { @@ -339,8 +353,6 @@ map.on("load", () => { При желании посмотрите [полный код](https://github.com/gtitov/flask-maplibre-map) и [возможный результат](https://gtitov.github.io/flask-maplibre-map/). - - ## Упражнения 1. Создайте метод, который вернёт список доступных годов @@ -351,6 +363,13 @@ map.on("load", () => { Бэкендер: можно убрать из метода для списка городов лишние атрибуты
Фронтендер: на клик по объекту можно не обращаться к серверу, а использовать данные из атрибутов объекта +## Контрольные вопросы + +1. Сформулируйте запрос для получения всех данных из таблицы `cities` базы данных `cities.sqlite` +1. На каком языке программирования сформулирован этот запрос? +1. В каком формате бэкенд возращает подробные данные о городе по идентификатору? +1. Для чего к ответу добавляется заголовок `"Access-Control-Allow-Origin": "*"`? + ## Чтение 1. Что такое CORS / Дока [[↗]](https://doka.guide/tools/cors/)