Можно ли создать программу на python

Боты повсюду. Кажется, что еще вчера мы даже не подозревали об их существовании, а сейчас уже с трудом можем представить свою жизнь без них. Они стали широко популярны среди многочисленных активных пользователей мессенджеров, поскольку имеют различные сферы применения – от развлекательного контента, включая пошаговые игры и сбор бонусных баллов в ресторанах, до ведения личного плана питания, отслеживания доставки и даже осуществления платежей за различные услуги.

Почему они так популярны? В чем их секрет? Я думаю, что более правильно будет спросить, почему они удобнее, чем приложение. И на это есть несколько причин.

Чем Telegram Bot лучше приложения?

(Этот раздел можно пропустить, если вы и так знаете, почему вам нужен именно бот).

1. Минималистичный и простой дизайн

По сравнению с многочисленными приложениями с различным дизайном, когда приходится запоминать, где и что нажимать, боты более универсальны и просты. Telegram Bot предлагает простое взаимодействие посредством текстов и кнопок.

Можно Ли Делать ИГРЫ на Python?

Вообще, никто не требовал от ботов красочного дизайна. Однако с весны 2022 года Telegram предоставил разработчикам ботов инструменты для создания бесконечно гибких интерфейсов с помощью JavaScript. Теперь, если у вас есть опыт создания ботов для Telegram, знание Python и мотивация, вы можете создать полноценную замену обычному сайту.

2. Минимум рекламы и фокус на потребностях пользователей

Вам не придется устанавливать сотни приложений для каждого сервиса, если всю необходимую помощь вам окажет Telegram Bot. Это особенно полезно для ресторанов и магазинов.

Клиенты редко горят желанием устанавливать приложения из кучи мест, которые они посетили. Из-за этого владельцы бизнеса упускают отзывы клиентов и теряют с ними связь. Если бы у каждого из этих мест был свой бот, доступный в разных мессенджерах, это было бы удобнее и дружелюбнее для пользователей.

Никто не любит заполнять память своего телефона ненужными приложениями, которые будут использоваться один или два раза. Однако клиентам необходимо взаимодействовать с владельцами услуг, и они будут рады сделать это через свой любимый мессенджер.

3. Отсутствие необходимости в регистрации, авторизации и постоянных перелогинах

При настройке Telegram Bot можно использовать Python и его библиотеки для автоматизации авторизации. Это позволяет пользователю пройти авторизацию только один раз при добавлении бота в чат. Клиент может использовать бота столько, сколько нужно, а когда в нем больше нет необходимости, пользователь просто блокирует бота. Вот и все, легко! Больше никаких сбросов пароля.

Не нужно запоминать пароли или используемые логины. Добавление бота на сайт или в приложение увеличивает количество пользовательской аудитории, так как делает общение с клиентами и оказание им помощи намного проще и удобнее.

Кроме того, популярность мессенджера также играет свою роль. А если говорить о ботах в Telegram, то летом 2022 года Telegram объявил, что число ежемесячных активных пользователей превысит 700 миллионов.

Итак, мы описали основные преимущества ботов, и теперь у вас должно появиться желание создать своего собственного бота. Давайте перейдем к практике. Но сначала мы рассмотрим вопросы, которые необходимо решить на этапе проектирования.

Нюансы разработки Telegram Bot

Выше мы определили причины создания бота. В этой части мы планируем рассказать о том, как создать приложение и какие инструменты разработки использовать. Далее мы покажем, как создать Telegram-бота на Python и научим его разворачивать.

Поскольку это статья по Telegram Bot для начинающих, примеры кода не должны быть сложными. Мы запустим сервер с одним эндпоинтом, который будет получать наши сообщения в Telegram и отправлять ответ.

Для этого мы будем использовать следующие инструменты:

  • bottle – для нашего сервера; простой и легкий микро-веб-фреймворк WSGI
  • requests – для отправки запросов в telegram. Библиотека request не нуждается в чрезмерном представлении. Она повсеместно используется во всем мире в самых разных проектах.

Примечание: вам необходимо установить эти инструменты на свой компьютер. Они понадобятся нам позже. Для этого давайте создадим виртуальное окружение в директории проекта и установим необходимые инструменты через pip. Если вы не знакомы с тем, что такое окружение, просто установите необходимые библиотеки, выполнив pip install bottle requests .

python3 -m venv venv . ./venv/bin/activate pip install bottle requests

  • ngrok – это приложение, которое предоставляет нам публичные URL-адреса для взаимодействия с Telegram WebHook на этапе разработки (см. информацию о WebHook ниже). Это полезно, так как Telegram не сможет установить соединение с нашим локальным сервером, потому что мы не можем указать наш локальный адрес в конфигурации Telegram API. Необходимо скачать ngrok с официального сайта и поместить установленное приложение в папку с проектом.

Как насчет того, чтобы создать своего первого бота?

В этой части вы найдете подробное руководство по созданию Telegram Bot. Также мы рассмотрим полезные инструменты для его разработки на Python.

Прежде всего, чтобы создать Telegram-бота, вам нужно зарегистрироваться в Telegram (очевидно). Для тестирования основных концепций я рекомендую использовать веб-клиент Telegram.

  • свой собственный TOKEN
  • URL telegram api – api.telegram.org/
  • ссылка на документацию

Вот, собственно, и все. На данный момент бот на 100% пассивен.

Вам нужно инициализировать диалог с ботом. Откройте поиск и введите имя вашего бота. Начните диалог, нажав на кнопку /start . Введите что-то вроде “Привет”. Это сообщение очень важно, так как это первое обновление, которое получит ваш бот.

Если это ваш первый опыт создания API, вы можете легко понять идею с помощью веб-браузера. Откройте новую вкладку в браузере и используйте URL Telegram api: api.telegram. org/bot/getUpdates .

Когда вы открываете этот URL в браузере, вы делаете запрос на сервер Telegram, который отвечает JSON. Ответ напоминает словарь Python. Вы должны увидеть что-то вроде этого:

<«ok»:true,»result»:[<«update_id»:523349956, «message»:<«message_id»:51,»from»:<«id»:303262877,»first_name»:»YourName»>,»chat»:,»date»:1486829360,»text»:»Hello»>>]>

Примечание редакции: кратко о формате JSON можно почитать в статье “Кодирование JSON на Python”.

Если вы откроете документацию бота и посмотрите раздел метода /sendMessage, то заметите, что этот метод требует 2 дополнительных параметра: chat_id и text . В строке поиска браузера вы можете соединить параметры цепочкой, используя ? для первого и text=test

Попробуйте получить ответ от вашего бота, заменив chat_id на тот, который вы получили, вызвав /getUpdates . В моем случае это 303262877. Текстовый параметр выбирайте сами. Запрос должен выглядеть следующим образом:

api.telegram. org/ bot/sendMessage?chat_id= простое уведомление о событии через HTTP POST.

Читайте также:
Что такое порт программы

Объясню немного подробнее: иногда взаимодействие между приложениями в сети требует немедленной реакции на событие, в то время как решения для постоянных и непрерывных соединений в большинстве случаев громоздки, требовательны и трудно поддерживаются. В этом случае лучшим и самым простым решением является немедленная отправка колбэка через HTTP (чаще всего POST).

Другими словами, это решение обеспечивает реакцию на любое событие внутри одного приложения путем отправки HTTP POST запроса другому подключенному приложению, чтобы проинформировать его или заставить его ответить.

Такая концепция называется WebHook. Она широко используется для:

  • получения данных в режиме реального времени
  • получения данных и их передачи
  • обработки данных и предоставления чего-то взамен

Кажется, что это лучшее решение для взаимодействия клиента Telegram (приложения Telegram) с нашим проектом.

Схематическая иллюстрация концепции WebHook

Написание кода Telegram Bot

Наконец, мы приступаем к самой практической части, где вы сможете написать Telegram-бота.

Основная задача – научить нашего бота отвечать на полученные сообщения.

Во-первых, создайте папку для нашего проекта бота. Во-вторых, создайте в этой папке файл bot.py для сервера бота.

1. Давайте попробуем запустить наш сервер. Для этого откройте bash в папке bot.

python bot.py

В результате вы должны увидеть что-то вроде этого:

2. Затем откройте новую вкладку. В ней мы запустим ngrok ( ./ngrok http ):

./ngrok http 8080

В результате вы увидите что-то вроде этого:

3. Теперь давайте установим WebHook.

Сейчас мы сообщим Телеграму, куда ему отправлять сообщения о событиях в боте. Для этого откройте браузер и перейдите по ссылке

https://api.telegram.org/bot/setWebHook?url=https://.ngrok.io/

  • Примечание: чтобы найти ngrok URL, необходимо запустить ngrok. Затем на экране, подобном приведенному ниже, вы найдете URL (он выделен на нашем скриншоте). Этот URL вы используете в ссылке для установки WebHook.

Ответ на переход по ссылке должен иметь следующий вид:

Давайте проверим, удалось ли вам настроить WebHook. Перейдите по этой ссылке, используя ваш токен:

https://api.telegram.org/bot/getWebhookInfo

Если все правильно, вы увидите перед ключом URL то же значение адреса ngrok, которое вы указали при настройке.

Поздравляем, it’s alive!

Теперь нам нужно реализовать механизм запроса/ответа на сообщение.

По сути, наш эндпоинт получает данные в формате JSON. Поэтому, как правило, вы должны увидеть сообщение с данными.

from bottle import run, post, request as bottle_request #

Вы должны увидеть что-то вроде этого на вкладке консоли, где запущен сервер.

, ‘message’: , ‘from’: , ‘is_bot’: False, ‘first_name’: », ‘last_name’: », ‘username’: », ‘language_code’: ‘en-En’>, ‘chat’: , ‘first_name’: », ‘last_name’: », ‘username’: », ‘type’: ‘private’>, ‘date’: 1535022558, ‘text’: ‘1’>>

Более подробную информацию о параметрах вы можете найти в официальной документации Telegram.

Теперь нам нужно извлечь chat_id и text , чтобы отправить наше сообщение пользователю.

Итак, мы уже подготовили ответ. Давайте отправим его Telegram-боту.

После всех настроек и написания, если все работает, давайте попробуем пообщаться с нашим ботом.

Теперь давайте сделаем наш код более читабельным и реализуем структуру ООП.

import requests from bottle import Bottle, response, request as bottle_request class BotHandlerMixin: BOT_URL = None def get_chat_id(self, data): «»» Method to extract chat id from telegram request. «»» chat_id = data[‘message’][‘chat’][‘id’] return chat_id def get_message(self, data): «»» Method to extract message id from telegram request. «»» message_text = data[‘message’][‘text’] return message_text def send_message(self, prepared_data): «»» Prepared data should be json which includes at least `chat_id` and `text` «»» message_url = self.BOT_URL + ‘sendMessage’ requests.post(message_url, json=prepared_data) class TelegramBot(BotHandlerMixin, Bottle): BOT_URL = ‘https://api.telegram.org/bot000000000:aaaaaaaaaaaaaaaaaaaaaaaaaa/’ def __init__(self, *args, **kwargs): super(TelegramBot, self).__init__() self.route(‘/’, callback=self.post_handler, method=»POST») def change_text_message(self, text): return text[::-1] def prepare_data_for_answer(self, data): message = self.get_message(data) answer = self.change_text_message(message) chat_id = self.get_chat_id(data) json_data = < «chat_id»: chat_id, «text»: answer, >return json_data def post_handler(self): data = bottle_request.json answer_data = self.prepare_data_for_answer(data) self.send_message(answer_data) return response if __name__ == ‘__main__’: app = TelegramBot() app.run(host=’localhost’, port=8080)

Вот, собственно, и все. Теперь вы создали работающего бота для Telegram, на базе Python и даже умеющего писать фразу “racecar” задом наперед. Поздравляем!

Источник: pythonturbo.ru

Python flask фреймворк — правильная структура приложения

Многие фреймворки диктуют свою структуру приложения при разработке. С одной стороны это хорошо: в больших проектах человеку знакомому с фреймворком будет легче и проще вникнуть в проект. С другой стороны — это накладывает определенные ограничения, и иногда вынуждает использовать методы и паттерны без которых вполне можно было обойтись. Во всех таких фреймворках есть определенные инструменты позволяющие разделять приложение на модули. Во flask так же есть подобный инструмент, и называются он blueprints.

Вопреки частому заблуждению, flask прекрасно подходит для больших проектов. В нескольких таких крупных проектах мне даже довелось учавствовать. Поэтому, если вас убеждают, что flask никто не использует не верьте им. Ещё как используют. Flask прекрасный, небольшой фреймворк подходящий для очень широкого круга задач.

В этой статье я расскажу про наиболее популярную, гибкую и правильную на мой взгляд структуру flask приложения. Используя подобную структуру при разработке, вы сможете построить гибкое и удобное приложение модули которого можно будет с легкостью переиспользовать в других проектах. Определенно стоит уточнить, что серебряной пули нет, и далеко не всем может подойти такая структура, но если вы не очень хорошо знакомы с flask, то вам определенно стоит как минимум взять её за основу.

Для тех, кто не знаком с Flask — это небольшой фреймворк написанный на языке python c весьма большим сообществом, и множеством модулей на все случаи жизни. В отличии от, скажем, Django, Flask не навязывает определенное решение той или иной задачи. Вместо этого, он предлагает использовать различные сторонние или собственные решения по вашему усмотрению.

Я ни в коем случае не хочу сказать, что Django плохой фреймворк. Просто в некоторых случаях Django вынуждает писать много лишнего кода попутно залезая все глубже и глубже во внутренности самого фреймворка. Так что flask — это лишь ещё один инструмент, подходящий под определенные задачи.

Disclaimer: в этой статье нет ничего принципиально нового и неизвестного. Все это общеизвестные практики, только собранные в одном месте. Эта статья ориентирована в основном на тех, кто не знаком с flask и новичков.

Introduction

Чаще всего я (да и большинство остальных разработчиков) использую flask совместно со следующими python-библиотеками:

  • Sqlalchemy (используя расширение Flask-Sqlalchemy) — для работы с базой данных;
  • Wtforms — (используя расширение flask-wtf) для обработки html-форм;
  • psycopg2 — прослойка для Sqlalchemy. Необходима для работы postgresql;
  • flask-script — для удобного запуска приложения и различных скриптов;

Конечная структура будет такой:

testproject ├── app │ ├── __init__.py │ ├── database.py │ ├── firstmodule │ │ ├── controllers.py │ │ ├── forms.py │ │ ├── models.py │ ├── static │ │ ├── css │ │ ├── img │ │ └── js │ └── templates │ ├── base.html │ ├── index.html │ └── _list.html │ ├── firstmodule │ │ ├── create.html │ │ ├── delete.html │ │ ├── list.html │ │ ├── update.html │ │ └── view.html ├── config.py ├── env ├── manage.py └── requipments ├── base.txt ├── development.txt └── production.txt

Читайте также:
Программа которая рисует таблицы

Перед началом, убедимся что все нужные пакеты у нас в системе установлены. Нам нужен собственно сам python и pip:

sudo apt-get install python3-pip python3-dev

Кстати, так же не слушайте тех, кто говорит что не стоит использовать python3. Возьмите обогреватель и попробуйте разморозить их. Все нужное давно есть и нет смысла не использовать python3 для новых проектов. Разве что нет какой-то редкой, специфичной библиотекии написать которую самостоятельно не представляется возможным.

До сих пор я не встретил ни одной такой библиотеки хотя писал самые разные приложения.

Основной «скелет» приложения

Сначала создадим наше виртуальное окружение. Создадим директорию, где будет располагаться наш проект. Здесь, и дальше во всей статье я буду предполагать что это директория testproject :

mkdir testproject cd testproject

Создадим виртуальное окружение c помощью virtualenv :

virtualenv -p python3 env

Создадим директорию для кода нашего будущего проекта:

mkdir app

И заодно директорию для шаблонов, и статических файлов:

# Директория для шаблонов mkdir app/templates # Директория для статических файлов (стили, javascript, и т.д.) mkdir -p app/static/

Активируем виртуальное окружение:

source env/bin/activate

Важно: здесь и далее считаем, что все команды выполняются внутри виртуального окружения!

Установим нужные нам пакеты с помощью pip:

pip install flask flask-sqlalchemy flask-wtf flask-script psycopg2

Основной «скелет» приложения готов.

Git

Этот пункт строго обязателен. Разработку любого приложения всегда следует вести с использованием системы контроля версий.

В корневой директории нашего проекта (напомню, это testproject ) создадим файл .gitignore .

touch .gitignore

Он необходим для того, чтобы лишние файлы, такие как кэши не попали в git репозиторий. Добавим в него следующее:

.idea/ .idea/* lib/ lib/* *.py[cod] *.pyc bin/ bin/* share/ share/* local/ local/* include/ include/* env/
git init

И сделаем первый коммит:

git add -A git commit -m ‘Initial commit’

Теперь необходимо указать url git репозитория. Для этого его необходимо сначала создать. Сейчас очень много различных компаний предлагают бесплатный хостинг git репозиториев. Из них можно выделить всем известные github и bitbucket. Лично я для своих проектов предпочитаю последний, т.к. он позволяет создавать скрытые репозитории бесплатно.

После создания репозитория на любом из этих сервисов, будет показана подсказка, в которой будет описано как добавить url репозитория в существующий проект. Сейчас я на этом подробно останавливаться не буду.

Зависимости

Все зависимости приложения необходимо обязательно сохранять. Это необходимо для того, чтобы не забыть какие библиотеки вы использовали при разработке приложения, и это так же знали другие разработчики которые работают над этим приложением. Возможно сейчас вы думаете, что никогда в будущем не будете ничего делать с этим приложением, или вы всегда будете делать его один, но спустя несколько лет успешной работы приложения, вам может понадобиться добавить совсем чуть-чуть новых возможностей и даже может быть будете делать его уже не в одиночку. Поверьте, уже спустя месяц вы не будете помнить какие именно библиотеки вы устанавливали и использовали, и будете неимоверно рады что сохранили все зависимости.

Зависимости мы будем хранить в нескольких различных файлах: по одному для каждого используемого окружения, и один, в котором содержаться общие для всех окружений. Под окружением подразумевается среда, в которой это приложение запущено. В рамках этой статьи мы будем использовать два:

  • development — зависимости, необходимые для разработки;
  • production — зависимости, необходимые только в production окружении;

При желании вы легко сможете добавить сколько угодно необходимых. Сами же файлы с версиями будем хранить в отдельной директории — requipments . Создадим её:

mkdir requipments

Теперь создадим базовый файл, в котором будут содержаться зависимости общие для всех окружений:

pip freeze > requipments/base.txt

Этой командой мы добавим в файл base.txt список всех установленных в данный момент библиотек с их зависимостями. В данный момент мы уже установили в наше виртуальное окружение собственно сам flask , Flask-Sqlalchemy , flask-wtf и psycopg2 . Содержимое файла будет таким:

click==6.6 Flask==0.11 Flask-SQLAlchemy==2.1 Flask-Script==2.0.5 itsdangerous==0.24 Jinja2==2.8 MarkupSafe==0.23 psycopg2==2.6.1 SQLAlchemy==1.0.13 Werkzeug==0.11.10 WTForms==2.1

Для того, чтобы переиспользовать содержимое base.txt в файлах других окружений, в начало каждого из них необходимо добавить:

-r base.txt

А затем остальные зависимости построчно.

Например, во время разработки в development окружении, возможно вы захотите использовать flask-debugtoolbar . В этом случае файл requipments/development.txt может быть таким:

-r base.txt flask-debugtoolbar

В production окружении будет хорошей идеей использовать gunicorn для запуска самого приложения, и содержимое файла requipments/production.txt может быть таким:

-r base.txt gunicorn

Так же не лишнем будет указать версии используемых библиотек аналогично тому, как они указаны в файле requipments/base.txt .

Файл настроек

Перед тем как мы неподсредственно начнем писать модули приложения, необходимо создать файл с конфигурацией и скрипт для запуска приложения.

Настройки будем хранить в файле config.py . В нем аналогично тому, как мы описывали зависимости, опишем базовую конфигурацию для всех окружений и переопределим некоторые настройки под определенные окружения.

import os class Config(object): # Определяет, включен ли режим отладки # В случае если включен, flask будет показывать # подробную отладочную информацию. Если выключен — # — 500 ошибку без какой либо дополнительной информации. DEBUG = False # Включение защиты против «Cross-site Request Forgery (CSRF)» CSRF_ENABLED = True # Случайный ключ, которые будет исползоваться для подписи # данных, например cookies. SECRET_KEY = ‘YOUR_RANDOM_SECRET_KEY’ # URI используемая для подключения к базе данных SQLALCHEMY_DATABASE_URI = os.environ[‘DATABASE_URL’] SQLALCHEMY_TRACK_MODIFICATIONS = False class ProductionConfig(Config): DEBUG = False class DevelopmentConfig(Config): DEVELOPMENT = True DEBUG = True

Сейчас файл выглядит пустоватым, но когда начнете активно разарабывать приложение, количество настроек может очень сильно увеличиться.

Файл запуска приложения

Для запуска приложения мы будем использовать удобное расширение — flask-scripts . Весь необходимый код поместим в файл manage.py в корень проекта. Название не случайно. Кроме того, что оно «говорящее» ещё и довольно привычное многим python-разработчикам.

1 2 3 4 5 6 7 8 9 10 11 12
#!/usr/bin/env python import os from flask_script import Manager from app import create_app app = create_app() app.config.from_object(os.environ[‘APP_SETTINGS’]) manager = Manager(app) if __name__ == ‘__main__’: manager.run()

Само flask приложение мы будем создавать используя «фабрику» — функцию, создающую экземпляр приложения и возвращающую его. Её мы опишем дальше в этой статье.

База данных

Как выше уже говорилось, для работы с базой данных используем sqlalchemy через дополнение Flask-sqlalchemy . Это, пожалуй, самая часто используемая связка. Переменную, в которой будет хранится сессия для работы с базой данных мы будем хранить в отдельном файле — app/database.py . В этом файле почти всегда будет несколько строк, но помещать эти строки в тот же файл, где мы будем инициализировать flask приложение не рекомендуется. Мы же не хотим получать странные сообщения об ошибках во время запуска потому, что случайно сделали круговой импорт модулей (circular import)? Инициализацию же расширения flask-sqlaclhemy мы будем проводить там же, где и инициализацию flask приложения.

Читайте также:
Как удалить строку в программе 1с

Содержимое файла app/database.py :

from flask_sqlalchemy import SQLAlchemy db = SQLAlchemy()

Инициализация приложения

Как я уже выше писал, инициализация приложения будет происходить в функции-фабрике. Под инициализацией подразумевается создание экземпляра flask приложения со всеми необходимыми настройками. Использовать фабрику строго обязательно.

Без этого, в какой-то момент «по запарке» можем выстрелить себе в ногу все теми же «круговыми импортами». Да и тесты иначе не получится нормально писать, а без тестов вообще нельзя. Совсем. Никогда. 🙂

Наша фабрика будет находится в файле app/__init__.py . Вот его содержимое:

import os from flask import Flask from .database import db def create_app(): app = Flask(__name__) app.config.from_object(os.environ[‘APP_SETTINGS’]) db.init_app(app) with app.test_request_context(): db.create_all() import app.firstmodule.controllers as firstmodule app.register_blueprint(firstmodule.module) return app

Обратите внимание, что инициализация расширения flask-sqlaclhemy происходит внутри тела функции, а не просто в файле. Тоже самое касается и импортов blueprint модулей.

Модули (blueprints)

Теперь займемся непосредственно модулями нашего приложения.

Создадим директорию для шаблонов модуля:

mkdir -p app/templates/firstmodule

И директорию для самого модуля:

mkdir -p app/firstmodule

Да, шаблоны используемые модулем лучше хранить в отдельной под-директории для лучшей его (модуля) переносимости.

Вот так выглядит структура модуля:

╰─➤ tree app/firstmodule/ . ├── controllers.py ├── forms.py ├── models.py

  • controllers.py — предназначен для контроллеров;
  • models.py — предназначен для sqlalchemy моделей;
  • forms.py — предназначен для форм;

Теперь более подробно примерное содержимое каждого из файлов.

from flask.ext.wtf import Form from wtforms import ( StringField, TextAreaField, ) from wtforms.validators import DataRequired class EntityCreateForm(Form): name = StringField( ‘Название’, [ DataRequired(message=»Поле обязательно для заполнения») ], description=»Название» ) content = TextAreaField( ‘Содержимое’, [], description=»Содержимое записи», )

Шаблоны

Как я уже выше писал, шаблоны приложения будут находится в app/templates/ . В этой директории надо расположить базовый шаблон, шаблоны страниц с ошибками и какие либо служебные части. Шаблоны отдельных модулей надо помещать в директорию с именем соответствующим имени модуля.

. ├── 403.html ├── 404.html ├── 500.html ├── base.html ├── entity │ ├── create.html │ ├── delete.html │ ├── list.html │ ├── update.html │ └── view.html ├── form-errors.html ├── form-macros.html ├── index.html ├── messages.html ├── pagination.html

Примеры самих шаблонов я приводить не буду, они как правило слишком объёмные.

Определяем переменные окружения

На предыдущих шагах я часто упоминал про окружения. Настройки какого окружения будут использоваться, будет определяться с помощью переменных окружения (без тафтологии никак, да).

В терминале пишем:

Это хорошая практика не хранить нигде логин/пароль в файлах конфигурации. В случае взлома приложения, взломщику будет намного тяжелее получить пароль базы данных. На production сервере в переменной окружения APP_SETTINGS конечно же будет необходимо указать config.ProductionConfig .

Запуск приложения

В примерах кода выше было очень много допущений, поэтому если вы просто копировали их, то ничего не заработает. 🙂 Сделано это специально, т.к. в статье я рассказывал не о том как писать приложения на flask, а как правильно организовывать их структуру. Полностью рабочий пример можете найти в репозитории на github.

Запуск приложения будет выгядеть следующим образом:

# Делаем файл manage.py исполняемым chmod +x manage.py ╰─➤ ./manage.py runserver * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit) * Restarting with stat * Debugger is active! * Debugger pin code: 147-804-358

Главное не забудьте про переменные окружения, иначе ничего тем более не заработает. 🙂

  • Официальная документация flask blueprints;
  • cookiecutter-flask — шаблон для развертывания новых flask-приложений;
  • Законченный пример из статьи.

Источник: the-bosha.ru

Как создать сайт на python без использования фреймворков?

Открываю тайны мироздания: абсолютно любой веб-сайт технически — это программа, которая умеет принимать HTTP запросы и возвращать в ответ на них какие-то данные (в HTTP ответ завёрнутые). На этом всё. Я серьёзно.

Поэтому на верхнем уровне разработка сайта на питоне без использования веб-фреймворков выглядит точно так же, как с их использованием: вы пишете код для каждого маршрута, предполагаемого на вашем сайте, а при развёртывании запускаете программу веб-сервера, которая будет слушать HTTP запросы. Ну или даже HTTPS ещё сразу запилите . Этот процесс будет одинаков, какой бы язык вы ни выбрали, питон, пыхпых, плюсы, шарп, жабу, хаскелл, лисп, пролог, без разницы.

Отличие будет в том, что без фреймворков типа django вам придётся очень много традиционных и ожидаемых для веб-разработки вещей написать с нуля. В стандартных библиотеках Python 3 есть группа модулей http, которые содержат классы для элементарной работы с HTTP запросами, но, судя по тому, что там написано в документации, вам придётся написать самостоятельно вообще всё:

  1. маршрутизацию — парсить строку запроса urllib’ом и по результатам выбирать, какую функцию выполнить;
  2. шаблонизатор — питон это не PHP, для генерации HTML ответов, которые могут быть огромного размера, нужно тоже придумать что-то более удобное, кроме конкатенации строк;
  3. сессии — молитесь на разработчиков питона, что они потрудились написать http.cookies, но всё остальное придётся написать ручками;
  4. парсинг тела запроса — BaseHTTPRequestHandler даёт вам только io.BufferedIOBase поток, вам придётся разобрать вручную, что там вам посылает браузер в теле запроса: JSON, XML, x-www-form-urlencoded или вообще файлы;
  5. генерация правильного HTTP ответа — код статуса и все нужные заголовки, включая печеньки, нужно не забывать проставить в каждом маршруте соответственно тому, какое тело мы возвращаем. Тело возвращается опять же, через поток вывода, а не каким-нибудь более удобным способом.

Я не упоминаю сейчас вообще вопросы фронт-энда: какой HTML будет на веб-страницах и как его генерировать, как организованы CSS стили, будет ли там JS скриптинг и как организовано хранение (генерация?) Javascript кода, это всё придётся решать потом, по мере усложнения ваших веб-страниц. Для веб-сервера это всё побочные вещи, он просто текст в поток вывода пишет.

Если у вас полностью статический веб-сайт, то есть, все веб-страницы хранятся в уже готовых файлах, и ничего, кроме файлов (.html, .css, .js, картинки, шрифты) веб-сервер отдавать не будет, то можно обойтись вот таким кодом с использованием стандартного класса http.server.SimpleHTTPRequestHandler:

import http.server import socketserver ServerAddress = («», 8000) RequestHandler = http.server.SimpleHTTPRequestHandler with socketserver.TCPServer(ServerAddress, RequestHandler) as httpd: httpd.serve_forever()
(полностью украдено из документации)

После того, как вы напишете всю вышеперечисленную базовую функциональность, от современных веб-приложений обычно ожидаются и более сложные вещи, например, защита от CSRF, сложные формы аутентификации типа OAuth2, авторизация по ролям, кэширование и так далее.

Более того, возможно, на определённом этапе функционал или производительность стандартного http.server вас перестанет устраивать, а это значит, что нужно будет опуститься на один уровень абстракции ниже и написать свой HTTP сервер на базе sockerserver.TCPServer, впрочем, если вы будете способны самостоятельно решить такую задачу, на этом уровне вам уже не нужен будет Яндекс.Кью.

Для поддержки всего, что я написал выше, вы напишете, фактически, свой веб-фреймворк. Возможно, это будет оправдано. А возможно, нет.

Источник: yandex.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru