Ответ
Как правило, для обработки запросов к статическим ресурсам (файлам) обращение к базе данных не требуется.
Статические ресурсы — это файлы, содержимое которых не меняется от запроса к запросу. Примеры: style.css
, logo.png
, bundle.js
, about.html
.
Процесс их обработки выглядит так:
- Веб-сервер (например, Nginx или встроенный в Go) получает запрос на URL, сопоставленный со статическим файлом.
- Сервер находит этот файл в файловой системе.
- Содержимое файла с соответствующими HTTP-заголовками (например,
Content-Type
) отправляется клиенту.
Бизнес-логика приложения и база данных в этом процессе не участвуют, что делает его очень быстрым и эффективным.
Примеры реализации в Go:
-
Отдача одного файла с помощью
http.ServeFile
:http.HandleFunc("/robots.txt", func(w http.ResponseWriter, r *http.Request) { // Напрямую отдаём файл из файловой системы http.ServeFile(w, r, "./static/robots.txt") })
-
Отдача целой директории с помощью
http.FileServer
:// Создаём обработчик для всех файлов в директории "assets" fs := http.FileServer(http.Dir("./assets")) // Привязываем его к URL-пути /static/ // http.StripPrefix убирает "/static/" из пути, чтобы FileServer искал файлы в корне ./assets http.Handle("/static/", http.StripPrefix("/static/", fs))
Исключения (гибридные случаи):
Иногда обращение к БД всё же может потребоваться, даже если URL выглядит как статический. Например:
- Проверка прав доступа: Перед отдачей файла (например,
GET /downloads/private-report.pdf
) приложение должно проверить в базе данных, имеет ли текущий пользователь право на его скачивание. - Подсчёт скачиваний: Приложение может логировать каждое скачивание файла в базу данных.
В таких случаях запрос сначала обрабатывается логикой приложения, которая обращается к БД, и только после этого файл отдаётся клиенту.