создаем адаптивный сайт для GitHub Pages
Flask – микрофреймворк: это означает, что в стандартную поставку входит только самое необходимое, а все остальное при необходимости легко подключается. Поэтому приставка «микро» не должна вводить в заблуждение – при желании на Flask можно реализовать серьезный, масштабируемый проект. А для реализации таких небольших веб-приложений, как наш сайт, Flask подходит как нельзя лучше.
Обзор проекта
Готовый сайт находится здесь. У сайта несколько секций:
- Главная
- Резюме
- Портфолио
- Блог
- Контакты
Переключение между секциями создает иллюзию многостраничности, но в «живой» версии сайт – одностраничный. Бэкенд включает в себя модуль Frozen Flask, который превращает приложение в генератор статических сайтов (SSG): все страницы, необходимые для адекватного представления сайта в статической версии, создаются автоматически.
Готовый сайт на GitHub PagesФронтенд сделан на Bootstrap с несколькими дополнительными JS скриптами – например, записи в блоге фильтруются (без перезагрузки страницы) по тегам с помощью скрипта isotope.js
, при этом теги для фильтра скрипт получает из расширения Flask –
Первый этап
На этом этапе мы установим Flask вместе со всеми нужными расширениями и зависимостями, напишем первый вариант кода для блога и сделаем два простейших шаблона.
Установка Flask
Сначала нужно создать папку для проекта и активировать виртуальное окружение:
mkdir flask_project cd flask_project mkdir . venv pipenv shell
Папка .venv – служебная: менеджер pipenv автоматически разместит все нужные зависимости там, и они не будут загромождать корневую директорию проекта. Виртуальное окружение активируется командой pipenv shell
, для выхода нужно выполнить exit
.
Click==7.0 Flask==1.1.1 Flask-FlatPages==0.7.1 Frozen-Flask==0.15 itsdangerous==1.1.0 Jinja2==2.10.3 Markdown==3.1.1 MarkupSafe==1.1.1 Pygments==2.4.2 PyYAML==5.1.2 Werkzeug==0.16.0
Поместите файл в директорию проекта и выполните команду:
pipenv install -r requirements.txt
Для быстрого знакомства с принципами работы Flask мы сначала создадим тестовый блог, а затем перейдем к реализации нашего проекта.
Больше полезных материалов вы найдете на нашем телеграм-канале «Библиотека питониста»
Интересно, перейти к каналу
Структура Flask проекта
Начнем с создания структуры проекта:
├── mysite.py ├── content │ └── posts │ ├── static └── templates
В папке content/posts будут размещаться Markdown файлы, в templates – шаблоны, в static – CSS стили, изображения и JS-скрипты. Весь код приложения мы напишем в файле mysite.py – сначала импортируем нужные модули, затем определим основные параметры, после пропишем маршруты к шаблонам и запустим сервер. Простейший вариант кода mysite.py выглядит так:
import sys from flask import Flask, render_template from flask_flatpages import FlatPages, pygments_style_defs from flask_frozen import Freezer DEBUG = True FLATPAGES_AUTO_RELOAD = DEBUG FLATPAGES_EXTENSION = '.md' FLATPAGES_ROOT = 'content' POST_DIR = 'posts' app = Flask(__name__) flatpages = FlatPages(app) freezer = Freezer(app) app. config.from_object(__name__) @app.route("/") def index(): posts = [p for p in flatpages if p.path.startswith(POST_DIR)] posts.sort(key=lambda item: item['date'], reverse=True) return render_template('index.html', posts=posts, bigheader=True) @app.route('/posts/<name>/') def post(name): path = '{}/{}'.format(POST_DIR, name) post = flatpages.get_or_404(path) return render_template('post.html', post=post) if __name__ == "__main__": if len(sys.argv) > 1 and sys.argv[1] == "build": freezer.freeze() else: app.run(host='127.0.0.1', port=8000, debug=True)
В это трудно поверить, но основной код блога действительно занимает всего 28 строк. Это возможно благодаря модулям FlatPages и Flask Frozen: первый избавляет от необходимости хранить посты в базе данных, проводит рендеринг Markdown-файлов в html, обеспечивает вывод записей и обращение к их свойствам, что будет заметно при создании шаблонов.
Добавим в папку posts два-три тестовых поста – в YAML части обязательно должны быть метаданные title, date, description, потому что Jinja будет вызывать их в шаблонах. Markdown посты можно писать в любом редакторе – хоть в Блокноте, хоть в Sublime Text; можно обзавестись и специальным редактором – MarkdownPad для Windows, Mou для macOS.
Теперь создадим два простейших шаблона. Это код для index.html:
{% block content %} <h3>Блог - тестовый запуск</h3> {% for post in posts %} <small>{{ post.date }}</small> <p> <h4> {{ post.title }} </h4> <p> <i>{{ post. description }}</i> </p> <p>{{ post.html[:100]|safe }}</p> <a href="{{ url_for('post', name=post.path.replace('posts/', '')) }}"><span>Читать</span></a> </p> {% endfor %} {% endblock %}
А это шаблон для вывода записи на отдельной странице post.html:
{{ post.date }} {{ post.title }} {{ post.dеscription }} {{ post.html|safe }}
Оба шаблона мы доработаем на следующем этапе, а пока запустим приложение python mysite.py
и посмотрим на результат.
Второй этап
На этом этапе мы сделаем первые шаблоны и подключим файл с настройками.
Шаблонизатор Jinja2
Flask использует шаблонизатор Jinja2. Синтаксис Jinja2 идентичен шаблонизатору Django и напоминает Python. Если вам еще не приходилось работать с Django, на этом этапе достаточно знать, что логика в Jinja2 заключается в такие фигурные скобки {% %}
, а переменные – в такие {{ }}
.
Шаблон Jinja2 представляет собой обычный html-файл, в котором блоки с логикой и переменными размещаются в уже упомянутых скобках. К шаблону можно подключать любые JS-скрипты, иконки, шрифты. Большое количество переменных можно передать в шаблон в виде словаря:
@app.route("/") def index(): variables = {"title":"Это мой сайт", "description":"Разработчик, дизайнер, автор ИТ-курсов" "keywords":"Разработка на Python, курсы по Django" } return render_template('index.html', **variables)
В шаблоне index.html, в свою очередь, эти переменные можно вставить в нужные теги:
<title>{{ title }}</title> <meta content="{{ description }}" name="description"> <meta content="{{ keywords }}" name="keywords">
Если же переменных очень много, имеет смысл вынести словарь в отдельный файл – в дальнейшем мы воспользуемся именно этим вариантом.
Jinja2 поддерживает наследование и включение шаблонов – это позволяет разбить шаблон объемной страницы на несколько секций, которые проще редактировать по отдельности. Наш сайт состоит из одной страницы с несколькими разделами, которые целесообразно вынести в отдельные шаблоны:
- base.html
- index.html
- header.html
- resume.html
- counters.html
- skills.html
- interests.html
- portfolio.html
- card.html
- blog.html
- post.html
- contacts.html
Jinja2 не диктует каких-то жестких правил: при желании можно обойтись всего двумя шаблонами – index.html и post.html. И, конечно, можно не выносить переменные в отдельный файл, а вписать весь текст резюме и портфолио прямо в index.
html. Но поддерживать сайт проще, если хранить всю потенциально изменяемую информацию в Markdown-файлах и текстовом файле конфигурации – в этом случае для изменения данных нужно будет внести поправки только один раз: переменные в шаблонах обеспечат обновление текста во всех разделах сайта. Кроме того, ненужные разделы сайта очень просто удалить, если они находятся в отдельных шаблонах.Первый шаблон, который мы создадим – base.html. Он будет получать переменные из бэкенда. Для передачи данных в шаблон создайте файл settings.txt и сохраните в нем словарь:
{"site_url":"http://localhost:8000", "site_title": "John Doe: Python разработчик и автор контента", "description": "Джон Доу - портфолио, резюме и блог Python разработчика", "keywords": "Веб-разработка на Python, бэкенд на Django и Flask"}
Теперь добавьте импорт
и загрузку данных из файла в mysite. py:
@app.route("/") def index(): posts = [p for p in flatpages if p.path.startswith(POST_DIR)] posts.sort(key=lambda item: item['date'], reverse=True) with open('settings.txt', encoding='utf8') as config: data = config.read() settings = json.loads(data) return render_template('index.html', posts=posts, bigheader=True, **settings)
Сохраните этот код в templates/base.html:
<!DOCTYPE html> <html lang="ru"> <head> <meta charset="utf-8"> <meta content="width=device-width, initial-scale=1.0" name="viewport"> <title>{{ site_title }}</title> <meta content="{{ description }}" name="description"> <meta content="{{ keywords }}" name="keywords"> <link href="{{ url_for('static', filename='img/favicon.png') }}" rel="icon"> <link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,600,600i,700,700i|Raleway:300,300i,400,400i,500,500i,600,600i,700,700i|Poppins:300,300i,400,400i,500,500i,600,600i,700,700i" rel="stylesheet"> <link href="{{ url_for('static', filename='assets/bootstrap/css/bootstrap. min.css') }}" rel="stylesheet"> <link href="{{ url_for('static', filename='assets/bootstrap-icons/bootstrap-icons.css') }}" rel="stylesheet"> <link href="{{ url_for('static', filename='assets/boxicons/css/boxicons.min.css') }}" rel="stylesheet"> <link href="{{ url_for('static', filename='assets/glightbox/css/glightbox.min.css') }}" rel="stylesheet"> <link href="{{ url_for('static', filename='assets/remixicon/remixicon.css') }}" rel="stylesheet"> <link href="{{ url_for('static', filename='assets/swiper/swiper-bundle.min.css') }}" rel="stylesheet"> <script src="https://kit.fontawesome.com/69e2443572.js" crossorigin="anonymous"></script> <link href="{{ url_for('static', filename='css/style.css') }}" rel="stylesheet"> </head> <body> <main> {% block content %} <!-- вложенные шаблоны --> {% endblock %} </main> <!-- Скрипты --> <script src="{{ url_for('static', filename='assets/purecounter/purecounter. js') }}"></script> <script src="{{ url_for('static', filename='assets/bootstrap/js/bootstrap.bundle.min.js') }}"></script> <script src="{{ url_for('static', filename='assets/glightbox/js/glightbox.min.js') }}"></script> <script src="{{ url_for('static', filename='assets/isotope-layout/isotope.pkgd.min.js') }}"></script> <script src="{{ url_for('static', filename='assets/swiper/swiper-bundle.min.js') }}"></script> <script src="{{ url_for('static', filename='assets/waypoints/noframework.waypoints.js') }}"></script> <script src="{{ url_for('static', filename='js/main.js') }}"></script> </body> </html>
А этот – в templates/index.html:
{% extends "base.html" %} {% block content %} <h2>Здесь будет сайт</h2> {% endblock %}
Сохраните в папке static все эти ассеты. Теперь можно запускать сервер python mysite.py
– скелет сайта готов:
Перейдем к созданию первого шаблона, расширяющего index.html – header.html. Добавьте переменные в файл settings.txt:
"site_url":"http://localhost:8000", "tag1":"Разработчик и автор", "tag2":"курсов по Django", "sect1":"Главная", "sect2":"Резюме", "sect3":"Портфолио", "sect4":"Блог", "sect5":"Контакты", "telegram":"https://t.me/johndoe", "facebook":"ttps://facebook.com/john.doe", "vk":"https://vk.com/john_doe", "email":"mailto:[email protected]"
И отредактируйте файл index.html – теперь он будет включать в себя header.html с помощью include
:
{% extends "base.html" %} {% block content %} {% block header %} {% include "header.html" %} {% endblock %} {% endblock %}
Перезагрузите страницу:
Хэдер включен в index. htmlВесь код и контент для этого этапа – здесь. Во второй части туториала мы завершим работу над приложением и загрузим статическую копию сайта на GitHub Pages.
***
Материалы по теме
- 🐍🚀 Django с нуля. Часть 1: пишем многопользовательский блог для клуба любителей задач Python
- 🐍🚀 Django с нуля. Часть 2: регистрация, авторизация, ограничение доступа
- 🐍🚀 Django с нуля. Часть 3: создание профилей, сжатие изображений, CRUD и пагинация
Как сделать Форму регистрации
❮ Назад Дальше ❯
Узнайте, как создать форму регистрации с помощью CSS.
Пожалуйста, заполните эту форму, чтобы создать учетную запись.
Password
Repeat PasswordBy creating an account you agree to our Terms & Privacy.
Already have an account? Sign in
Шаг 1) добавить HTML:
Используйте элемент <form> для обработки входных данных. Вы можете узнать больше об этом в нашем учебнике PHP. Затем добавьте входные данные (с соответствующей меткой) для каждого поля:
Пример
<form action=»action_page.php»><div class=»container»>
<h2>Register</h2>
<p>Please fill in this form to create an account.</p>
<hr>
<label for=»email»><b>Email</b></label>
<input type=»text» placeholder=»Enter Email» name=»email» required>
<label for=»psw»><b>Password</b></label>
<input type=»password»
placeholder=»Enter Password» name=»psw» required>
<label for=»psw-repeat»><b>Repeat Password</b></label>
<input
type=»password» placeholder=»Repeat Password» name=»psw-repeat» required>
<hr>
<p>By creating an account you agree to
our <a href=»#»>Terms & Privacy</a>.</p>
<button type=»submit»>Register</button>
</div>
<div>
<p>Already
have an account? <a href=»#»>Sign in</a>. </p>
</div>
</form>
Шаг 2) добавить CSS:
Пример
* {box-sizing: border-box}/* Add padding to containers */
.container {
padding: 16px;
}
/* Full-width input fields */
input[type=text],
input[type=password] {
width: 100%;
padding: 15px;
margin: 5px 0 22px 0;
display: inline-block;
border: none;
background: #f1f1f1;
}
input[type=text]:focus, input[type=password]:focus {
background-color: #ddd;
outline: none;
}
/* Overwrite default styles of hr */
hr
{
border: 1px solid #f1f1f1;
margin-bottom: 25px;
}
/* Set a
style for the submit/register button */
.registerbtn {
background-color:
#4CAF50;
color: white;
padding: 16px 20px;
margin: 8px 0;
border: none;
cursor: pointer;
width: 100%;
opacity: 0.9;
}
.registerbtn:hover
{
opacity:1;
}
/* Add a blue text color to links */
a {
color: dodgerblue;
}
/* Set a grey background color and center the
text of the «sign in» section */
. signin {
background-color:
#f1f1f1;
text-align: center;
}
Совет: Пойдите к нашему учебнику формы HTML для того чтобы выучить больше о формах HTML.
Совет: Перейдите в наш CSS Form учебник, чтобы узнать больше о том, как стиль элементов формы.
❮ Назад Дальше ❯
бесплатных веб-шаблонов с HTML-кодом 2502 .html .css .js файлы
Сортировать по: По умолчанию В тренде Новейшие Рекомендовать Релевантные Популярные Непопулярные Запросить дизайн
html css галерея портфолио компании простая личная информация веб-страница страница jquery гостевая книга слайдер лайтбокс html5 деловые контакты о блоге услуги профиль веб-решение простые шаблоны шаблон веб-сайта fontawesome
[ веб-шаблоны ] одностраничный адаптивный html-шаблон ( .html .css .js 4.32MB ) Мону Зира [веб-шаблоны] серый ящик (.html, .css, .js, 1,84 МБ) верхняя пластина [ Веб-шаблоны ] оранжевый ( . html .css .js 1,86 МБ ) верхняя пластина [Веб-шаблоны] интерактивны (.html, .css, .js, 1,43 МБ) верхняя пластина [веб-шаблоны] портфолио (.html .css .js 217.98 КБ) Templatemo.com [веб-шаблоны] высота (.html, .css, .js, 2,32 МБ) по шаблону [веб-шаблоны] агломерат ( .html .css .js 527,97 КБ ) по шаблону [Веб-шаблоны] крупный бизнес (.html, .css, .js, 345,53 КБ) по шаблону [веб-шаблоны] сборка ( .html .css .js 641,99 КБ ) по шаблону [Веб-шаблоны] анодированный ( .html .css .js 355,58 КБ ) по шаблону [Веб-шаблоны] cerulean ( .html .css .js 471,04 КБ ) по шаблону [ Веб-шаблоны ] clearfigure ( .html .css .js 914,71 КБ ) по шаблону [веб-шаблоны] введите (. html .css .js 40,78 КБ) www.freecsstemplates.org [веб-шаблоны] green age (.html, .css, .js, 1,65 МБ) верхняя пластина [веб-шаблоны] персональный дизайн (.html, .css, .js, 1,50 МБ) верхняя пластина [ Веб-шаблоны ] корпоративный синий ( .html .css .js 1,21 МБ ) плита [Веб-шаблоны] удача ( .html .css .js 117,50 КБ ) Templatemo.com [ Веб-шаблоны ] водный ( .html .css .js 1020,06 КБ ) по шаблону [веб-шаблоны] жирность v2 (.html .css .js 749,65 КБ) по шаблону [Веб-шаблоны] крупный бизнес 20 ( .html .css .js 637,48 КБ ) по шаблону [ Веб-шаблоны ] атмосфера ( .html .css .js 312,33 КБ ) по шаблону [Веб-шаблоны] портфель ( .html .css .js 553,28 КБ ) по шаблону [Веб-шаблоны] citrusy ( . html .css .js 933,55 КБ ) по шаблону [Веб-шаблоны] жирность ( .html .css .js 593,40 КБ) по шаблону [веб-шаблоны] гекса боке (.html, .css, .js, 2,27 МБ) верхняя пластина [ Веб-шаблоны ] магазин кожи ( .html .css .js 900.03KB ) верхняя пластина [веб-шаблоны] сервисный ящик (.html, .css, .js, 1,36 МБ) верхняя пластина [ Веб-шаблоны ] мини-социальные сети ( .html .css .js 214,86 КБ ) Templatemo.com [веб-шаблоны] синее пламя (.html, .css, .js, 1,47 МБ) верхняя пластина [веб-шаблоны] автономность (.html, .css, .js, 1,60 МБ) по шаблону [веб-шаблоны] blackwhite (.html .css .js 352,80 КБ) по шаблону [ Веб-шаблоны ] баскетбол ( .html .css .js 703,49 КБ ) по шаблону [веб-шаблоны] в сборе (. html, .css, .js, 365,08 КБ) по шаблону [ Веб-шаблоны ] хворост ( .html .css .js 927.15KB ) по шаблону [Веб-шаблоны] clarion ( .html .css .js 493,22 КБ) по шаблонуcode html html code html 5 бесплатные html css шаблоны личный шаблон веб-сайта html черный html бесплатные html и css шаблоны бесплатные html шаблоны портфолио голубой html темный html шаблон бесплатно скачать html шаблоны сайта бесплатные чистые html шаблоны html код путешествия простые шаблоны html и css красный цвет html шаблон html код скачать художественный html
[веб-шаблоны] мизинец (.html, .css, .js, 2,04 МБ) плита [веб-шаблоны] железная лихорадка (.html, .css, .js, 1,89 МБ) верхняя пластина [веб-шаблоны] слайд-стена (.html, .css, .js, 2,13 МБ) верхняя пластина [ Веб-шаблоны ] путешествие ( . html .css .js 160,18 КБ ) Templatemo.com [Веб-шаблоны] игра (.html .css .js 97,85 КБ) Templatemo.com [ Веб-шаблоны ] angulartheme ( .html .css .js 256,67 КБ ) по шаблону [Веб-шаблоны] blackpolish ( .html .css .js 542,81 КБ ) по шаблону [Веб-шаблоны] barnanimals ( .html .css .js 538,48 КБ ) по шаблону [веб-шаблоны] искусственный ( .html .css .js 510,53 КБ ) по шаблону [ Веб-шаблоны ] бабочка ( .html .css .js 302,37 КБ ) по шаблону [ Веб-шаблоны ] объявления ( .html .css .js 489,23 КБ ) по шаблонуpriobox продукты креатив черный nivo слайдер технологии droptron решения сервис маркетинг разработка магазин localscroll slidertron прокрутка к музыке зеленый pirobox поддержка фотография дизайнер javascript картинки сайты веб-дизайн пирог блог СМИ социальные сети контакты звуковые шаблоны выпадающее меню бабочки студия паркет осень осенние листья silder два столбца один столбец skel панели строительные материалы серый сайт агентства poptrox
[веб-шаблоны] отображение (. html, .css, .js, 1,79 МБ) верхняя пластина [ Веб-шаблоны ] тема мелодии ( .html .css .js 679,22 КБ ) верхняя пластина [веб-шаблоны] бизнес-шаблон (.html, .css, .js, 299,84 КБ) верхняя пластина [веб-шаблоны] блог докладчика (.html, .css, .js, 174,10 КБ) Templatemo.com [Веб-шаблоны] greeny ( .html .css .js 214,37 КБ ) Templatemo.com [веб-шаблоны] амариллис ( .html .css .js 475,63 КБ ) по шаблону [веб-шаблоны] blackcoffee (.html, .css, .js, 262,76 КБ) по шаблону [ Веб-шаблоны ] колючий цветок ( .html .css .js 536,46 КБ ) по шаблону [Веб-шаблоны] argon ( .html .css .js 379,69 КБ ) по шаблону [Веб-шаблоны] captivegreen (.html, .css, .js, 380,10 КБ) по шаблону [веб-шаблоны] clearcut (. html, .css, .js, 586,46 КБ) по шаблонуЗагрузка дополнительных элементов, пожалуйста, подождите…
Загрузка дополнительных элементов, подождите…
Критерий поиска: Тип поиска:Совпадение с любымСовпадение со всеми
Искать в:ВекторыИконкиФотоШрифтыШаблоны сайтовPSD
Лицензия:Все лицензииРазрешить коммерческое использование
Результат сортировки:Сначала лучшее совпадениеСначала новыеСначала много загрузокСначала меньше загрузок
- Дом
- Лицензии
- Срок
- Конфиденциальность
- О
- Связаться с
Overleaf, онлайн-редактор LaTeX
Простой в использовании онлайн-редактор LaTeX для совместной работы
Overleaf используют более 11 миллионов студентов и преподавателей в 6800 учебных заведениях по всему миру
Просто хочу сказать, что я я очень благодарен за На оборотной стороне это позволило мне провести множество исследований и педагогических разработок в моей работе, которые раньше были бы раздражающе трудными. Даже люди, не знакомые с LaTeX, участвуют вместе со мной в исследовательских предложениях, и это кое о чем говорит, если вы знаете, что такое LaTeX для непосвященных. Спасибо. И спасибо за поддержку!!
Профессор Джеймс Френд из Лаборатории передовых медицинских устройств Калифорнийского университета в Сан-Диего
Overleaf используется в учреждениях по всему миру, в том числе:
Посмотреть другие учреждения, использующие Overleaf нашу галерею шаблонов, так что начать работу очень просто, независимо от того, пишете ли вы журнальную статью, диссертацию, резюме или что-то еще.
Просмотр шаблонов
Для вас нет ничего сложного и сложного в установке, и вы можете начните использовать LaTeX прямо сейчас , даже если вы никогда раньше его не видели. Overleaf поставляется с полной, готовой к работе средой LaTeX, которая работает на наших серверах.
С Overleaf вы получаете одинаковые настройки LaTeX, куда бы вы ни пошли. Работая со своими коллегами и студентами над Overleaf, вы знаете, что не столкнетесь с несоответствиями версий или конфликтами пакетов.
Мы поддерживаем почти все функции LaTeX, включая вставку изображений, библиографий, уравнений и многое другое! Прочитайте обо всех интересных вещах, которые вы можете сделать с помощью Overleaf, в наших руководствах по LaTeX.
Совместная работа
Overleaf гарантирует, что вы всегда будете в курсе ваших сотрудников и того, что они делают. Существует только одна главная версия каждого документа, к которой имеет доступ каждый. Невозможно внести противоречивые изменения, и вам не нужно ждать, пока ваши коллеги пришлют вам последний черновик, прежде чем вы сможете продолжить работу.
Если над документом одновременно хотят работать несколько человек, это не проблема. Вы можете видеть, что ваши коллеги печатают прямо в редакторе, и их изменения немедленно отображаются на вашем экране.
\begin{document}Работайте напрямую с вашими сотрудниками
\end{document}
Работа с пользователями Word
Начать работу с Overleaf настолько просто, что вы сможете пригласить коллег, не владеющих LaTeX, для непосредственного участия в ваших документах LaTeX.