Flask – это компактный, но функциональный фреймворк для создания web-приложений, который позволяет реализовать много возможностей. С его помощью создаются как классические приложения, которые открываются в браузере, так и продвинутые Телеграм-боты. Очевидно, что работа с веб-приложениями невозможна без создания URL-адресов. Сегодня рассмотрим, какой инструментарий имеет эта библиотека для того, чтобы создавать URL-адреса как статические, так и динамические.
Чем отличается статический URL от динамического?
Flask умеет работать как со статическими адресами, так и динамическими. Перед тем, как мы научимся это делать, необходимо разобраться, в чем отличия этих типов. Динамический URL характерен тем, что при обращении пользователя информация выдается в обновленном варианте.
То есть, контент страницы зависит от того, какой URL указан. Но идея в том, что конечный адрес зависит в зависимости от того, какой запрос был получен сервером.
Что касается статического URL, то адрес не изменяется, независимо от того, какой ответ сервера на запрос клиента был получен. Динамический URL, на первый взгляд, – это удобно. На самом же деле, есть ряд недостатков. Например, к таким адреса поисковики не очень лояльны.
Если требуется SEO-оптимизация веб-приложения, это плохой фактор. Если большая часть страниц получают адрес по ходу, то просто поисковая система не понимает, чем этот ресурс может быть интересным для посетителей.
Поэтому, несмотря на то, что сегодня будут рассмотрены и правила генерации динамических URL-адресов, все же необходимо тщательно подумать перед тем, как выбирать этот тип ссылок.
Когда может быть полезным динамический URL? Например, если надо предотвратить появление большого количества веб-страниц, схожих по наполнению.
Динамический URL будет полезным в следующих случаях:
- Если надо создать интернет-магазин с фильтрами или другими способами сортировки.
- Использование других скриптов, влияющих на отображение страницы интерактивно.
Простыми словами, динамические адреса сайта нужны, если необходимо быстро изменять содержимое страницы в зависимости от действий пользователя.
Помимо этого, динамические URL позволяют значительно упростить разработку сайта. Для масштабных интернет-магазинов динамические URL дают возможность уменьшить время, требуемое для разработки, внесения коррективов в базу данных и, следовательно, поддержания актуальности страницы.
Помимо описанных выше недостатков, динамические URL имеют следующие:
- Кликабельность. Статические URL больше нравятся и пользователям. Дело в том, что они могут по адресу понять, что содержится в той или иной странице. Например, если вводится запрос «телевизор», то сайт типа http://example.com/tv будет больше нравиться пользователям, чем ресурс http://example.com/goods.php?cat=6. Последний – это набор букв и цифр, которые не говорят ничего для клиента.
- Сложность копирования ссылки. Если происходит копирование и вставка ссылки, то она может быть обрезана. Это приводит к тому, что пользователь может попасть на ошибку 404.
- Низкая релевантность ключевым словам.
- Статические URL проще напечатать на визитке или диктовать по телефону. А динамические – более проблемно.
- Трудность для запоминания.
- Нет возможности для анкорной оптимизации.
Как формируются динамические URL с технической точки зрения?
В отличие от статических URL, динамические не привязаны к конкретной странице, которая хранится на сервере. Все сведения, которые загружаются в браузере, находятся в определенной базе данных. В ответ на определенный запрос, создается динамический URL, в котором указан набор фильтров и параметров. Так, при запросе «Холодильники, стоимость от 25 тысяч рублей» пользователь увидит просто перечень холодильников, соответствующий этим параметрам.
Знак ? в адресе сайта означает, что используется несколько разных параметров. Он выступает в качестве разделителя.
Для поисковой системы динамическим URL является любой адрес, содержащий символы разделителей и другие специальные символы. То есть, если в адресе есть знаки ?, =, &, то такой адрес считается динамическим.
Динамические URL и поисковая оптимизация
Чтобы сделать страницу более привлекательной для поисковых систем, некоторые вебмастеры маскируют динамические URL под статические. При этом представители Google говорят, что так делать не стоит. При этом они сами заявляют, что статические URL имеют определенное преимущество.
А переписывать динамические адреса в статические не стоит по следующим причинам:
- Технически довольно непросто обеспечить корректность изменения динамических URL в статические.
- Googlebot, в целом, успешно справляется с тем, чтобы индексировать динамические адреса сайтов и осуществлять интерпретацию различных параметров.
- Если изменять URL, бот не получает некоторых важных для ранжирования параметров.
Вообще, многие вебмастеры не разделяют это мнение. Некоторые специалисты по SEO-оптимизации считают, что все статические URL для поисковой оптимизации лучше.
В этом плане, они правы. Если начать разбираться в вопросе, то оказывается, что Google давала рекомендации для вебмастеров, которые не настолько хорошо разбираются в SEO и в попытках самостоятельной адаптации ресурса могут сделать множество ошибок. Просто Google говорит, что на релевантность для пользователя динамические URL не влияют в такой большой степени. Тем не менее, это лишь один из факторов, который поисковик берет в учет.
Таким образом, динамические URL все же влияют негативно для поискового продвижения ресурса по сравнению со статическими.
Создание адресов в Python
После того, как разобрались в разнице между статическими и динамическими URL и когда какой тип лучше использовать, настало время понять, как они вообще генерируются с помощью Flask.
Генерация URL осуществляется с использованием функции url_for(), которая находится в пакете flask. Возможно ручное задание URL и функциях представления, но такая практика не очень хорошо подходит для реальных задач. Допустим, появилась надобность в том, чтобы изменить структуру ссылок для блога с /<id>/<post-title>/ на /<id>/post/<post-title>/. При ручном задании URL в шаблонах и функциях приходится самостоятельно осуществлять их редактирование во всех местах. С помощью функции url_for() это делается буквально в один клик.
Эта функция принимает конечную точку и возвращает URL в привычном нам виде. Следует напомнить, что конечная точка ссылается на уникальное имя URL. Как правило, в качестве него выступает функция представления. Например, сейчас main2.py имеет определенный корневой путь.
#... @app.route('/') def index(): return render_template('index.html', name='Jerry') #...
Для генерации корневого URL, необходимо вызвать функцию url_for() таким образом: url_for(‘index’). Функцией в этом случае будет возвращено значение ‘/’. Если эту функцию нужно использовать в консоли, то необходимо использовать код, подобный этому.
>>> from main2 import app >>> from flask import url_for >>> >>> with app.test_request_context('/api'): # путь /api выбран произвольно ... url_for('index') ... '/' >>>
Учтите, что изначально создается контекст запроса (и контекст приложения таким образом). Если использовать эту функцию без вызова контекста, то будет выдана ошибка.
Если функции url_for() не удается создать URL, то тогда появляется такая ошибка.
>>> >>> with app.test_request_context('/api'): ... url_for('/api') ... Traceback (most recent call last): ... werkzeug.routing.BuildError: Could not build url for endpoint '/api Did you mean 'static' instead?
Эта функция также может сгенерировать полный URL. Для этого нужно использовать аргумент external=True в функции url_for().
>>> >>> with app.test_request_context('/api'): ... url_for('index', _external=True) ... 'https://localhost:5000/' >>>
Не стоит прописывать URL в функции redirect, поскольку есть для этого функция url_for(). Например.
@app.route('/admin/') def admin(): if not loggedin: return redirect(url_for('login')) # если не залогинен, выполнять редирект на страницу входа return render_template('admin.html')
Чтобы создать URL для динамического адреса, необходимо передать динамические части в виде аргументов-ключевых слов. Например.
>>> >>> with app.test_request_context('/api'): ... url_for('user_profile', user_id = 100) ... '/user/100/' >>> >>> >>> with app.test_request_context('/api'): ... url_for('books', genre='biography') ... '/books/biography/' >>>
Если использовать дополнительные аргументы, выступающие ключевыми словами, которые передаются функции url_for(), то они добавляются к URL в виде строки запроса.
>>> >>> with app.test_request_context('/api'): ... url_for('books', genre='biography', page=2, sort_by='date-published') ... '/books/biography/?page=2&sort_by=date-published' >>>
Также эта функция может использоваться внутри шаблона. Для такой генерации URL необходимо просто вызвать функцию url_for() внутри фигурных скобок.
<a href="{{ url_for('books', genre='biography') }}">Books</a>
Заключение
Таким образом, с помощью фреймворка Flask можно генерировать как статические, так и динамические URL. Теперь вы знаете не только то, как это технически сделать, но и когда какой тип адресов лучше использовать. Это важно для полного понимания веб-разработки. Ведь оптимизация сайта или веб-приложения под поисковые системы начинается уже в процессе его создания. Особенности технической реализации страниц выступают важным фактором внутренней оптимизации ресурса.