пїЅпїЅпїЅпїЅ пїЅпїЅ пїЅпїЅпїЅпїЅпїЅпїЅпїЅ
По вашему запросу ничего не найдено :(
Убедитесь, что запрос написан правильно, или посмотрите другие
наши статьи:
На сегодняшний день асинхронное программирование имеет первостепенную важность в Python. Если вы являетесь веб-разработчиком, то у вас есть выбор между несколькими потрясающими фреймворками!
На момент написания этой статьи понятие «асинхронность» перестало быть просто «умным» словечком в сообществе Python. Выпустив версию 3.5 своей библиотеки asyncio, Python признал, что Node.js все же влияет на веб-разработку и добавил в язык два новых ключевых слова –
async
и
await
.
Это было очень важное событие, так как Python крайне осторожно относится к расширению базового синтаксиса, если только в этом нет острой необходимости. Это лишний раз показывает, что разработчики Python считали асинхронное программирование принципиально важным.
В результате для асинхронного программирования были открыты все пути: новые и старые библиотеки начали использовать возможности сопрограмм, популярность асинхронных фреймворков резко возросла, а новые продолжают создаваться и по сей день.
Производительность, сопоставимая и даже превосходящая производительность Node.js, не является чем-то баснословным, и если ваша нагрузка не включает в себя огромное количество задач, перегружающих ЦП, то почему бы вам не выполнять по несколько тысяч запросов в секунду.
Но хватит убеждений!
Давайте изучим текущую картину с Python и рассмотрим некоторые из лучших асинхронных фреймворков.
1. Tornado
На удивление, Tornado – вовсе не новый фреймворк. Он был выпущен еще в 2009 году, и с тех пор его основой задачей является обеспечение надежного асинхронного программирования с высоким уровнем параллелизма.
Tornado – это по сути не веб-фреймворк. Это набор асинхронных модулей, которые также используются для создания модулей веб-фреймворка, а именно:
Сопрограммы и прочие примитивы (
tornado.gen
,
tornado.locks
,
tornado.queues
и т.д.)
Сетевые модули (
tornado.ioloop
,
tornado.iostream
и т.д.)
Асинхронные серверы и клиенты (
tornado.httpserver
,
tornado.httpclient
и т.д.)
Они объединены и создают конечные модули фреймворка:
tornado.web
,
tornado.routing
,
tornado.template
и т.д.
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
Tornado имеет сильных и преданных сторонников в сообществе Python. Кроме того, его используют опытные разработчики архитектур для того, чтобы создавать высокопроизводительные системы. Это фреймворк, который уже давно дал отпор проблемам параллелизма, но, вполне возможно, так и не стал популярным, так как не поддерживает стандарт WSGI или из-за слишком большой личной заинтересованности (не забывайте, что большинство библиотек Python по-прежнему являются синхронными).
2. Sanic
Sanic – это в самом буквальном смысле слова «современный» фреймворк. Он не поддерживает Python версии ниже 3.6, но при этом поддерживает простой и универсальный синтаксис
async/await
, и, как следствие, не заставляет вас читать тонны документации и запоминать все пограничные случаи перед тем, как приступить к созданию своего первого HTTP-обработчика.
В итоге синтаксис получился весьма удобным (по крайней мере, я так считаю). Все равно что вы бы написали его с помощью любого другого микрофреймворка (например, Flask, CherryPy) и нескольких функций
async
:
from sanic import Sanic
from sanic.response import json
app = Sanic()
@app.route("/")
async def test(request):
return json({"hello": "world"})
if __name__ == "__main__":
app.run(host="0.0.0.0", port=8000)
Sanic небезосновательно можно назвать самым популярным и любимым асинхронным фреймворком в мире Python. В нем есть практически все функции, необходимые для создания ваших проектов – маршрутизация, межплатформенное ПО, cookie-файлы, управление версиями, макеты, представления на основе классов, статические файлы, потоковая передача, сокеты и т.д. А поскольку на сегодняшний день существует немало асинхронных библиотек для этого фреймворка, в него можно добавить некоторые дополнительные вещи – шаблоны, поддержка баз данных, файловый ввод-вывод, очереди.
3. Vibora
Vibora – это «близкий родственник» Sanic, за исключением того, что он заточен под то, чтобы стать самым быстрым веб-сервером Python. Собственно, при первом посещении их сайта, вы сразу же наткнетесь на сравнение этих фреймворков:
Как видите, Vibora утверждает, что он в несколько раз быстрее, чем классические фреймворки и более чем в два раза быстрее, чем Sanic, который является его ближайшим конкурентом. Ясное дело, ко всему этому следует относится скептически.
Несмотря на то, что Vibora вполне соизмерима с Sanic с точки зрения синтаксиса и функций (или, может быть, даже превосходит, так как объединяет в себе популярные библиотеки и такие вещи, как готовые шаблоны), я все же считаю, что Sanic более развитый, так как давно существует и имеет большое сообщество.
from vibora import Vibora, JsonResponse
app = Vibora()
@app.route('/')
async def home():
return JsonResponse({'hello': 'world'})
if __name__ == '__main__':
app.run(host="0.0.0.0", port=8000)
Если вы любитель высокой производительности, Vibora вам определенно угодит. Несмотря на это на момент написания статьи Vibora полностью переписывалась с целью стать еще быстрее, а ссылка на ее производительную версию гласила, что она находится в стадии «интенсивной разработки». Тех, кто начал использовать Vibora раньше всех, вскоре настигнет разочарование, ведь они столкнуться с серьезными изменениями, но, эй, асинхронный мир Python только зарождается, так что не стоит ждать, что все будет стабильно.
4. Quart
Если вам нравится работать с Flask, но при этом вам не хватает асинхронных функций, вас очень заинтересует Quart.
Quart придерживается стандарта ASGI, который стал заменой известного стандарта WSGI, и предлагает вашему вниманию поддержку асинхронности. Самое интересное в Quart то, что он не только похож на Flask, но и совместим с его API! Автор этого фреймворка хотел сохранить атмосферу Flask и просто добавить к нему поддержку асинхронности, WebSockets и HTTP/2. Таким образом, вы можете изучить Quart с помощью документации Flask, просто принимая во внимание тот факт, что функции в Quart асинхронные.
from quart import Quart
app = Quart(__name__)
@app.route('/')
async def hello():
return 'hello'
app.run()
Очень похоже (почти) на Flask, не так ли?
Так как Quart – это эволюционировавший Flask, в нем есть все функции Flask: маршрутизация, межплатформенное ПО, сеансы, шаблоны, макеты и т.д. По сути, вы даже можете использовать в нем расширения Flask. Единственная загвоздка в том, что он поддерживает Python версии 3.7 и выше, но если вы используете не последнюю версию Python, то, возможно, асинхронные функции не для вас.
Если вы никогда не работали с Flask, то документация вам просто необходима. Впрочем, я могу посоветовать вам Quart, так как это, пожалуй, единственный асинхронный фреймворк, который в скором времени выпустить версию 1.0.
5. FastAPI
Последний (но при этом самый впечатляющий) фреймворк в этом списке – FastAPI. Нет, это не фреймворк для создания API. По сути, FastAPI – это наиболее многофункциональная платформа, обладающая подробной документацией, с которой я познакомился в процессе исследования асинхронных фреймворков Python.
Любопытно, что автор фреймворка в деталях изучил несколько других фреймворков – от ультрасовременных по типу Django до обыкновенных по типу Sanic, а также изучил технологии NestJS (веб-фреймворк Node.js и TypeScript).
Синтаксис здесь довольно удобный. Можно даже сказать, что он гораздо удобнее, чем в других фреймворках, которые мы рассматривали:
rom fastapi import FastAPI
app = FastAPI()
@app.get("/users/me")
async def read_user_me():
return {"user_id": "the current user"}
@app.get("/users/{user_id}")
async def read_user(user_id: str):
return {"user_id": user_id}
А теперь я хочу представить вашему вниманию список ключевых функций:
Автоматическая генерация документации API
. Как только, ваши конечные точки будут написаны, вы можете поэкспериментировать с API, используя пользовательский интерфейс, соответствующий стандарту. Поддерживаются SwaggerUI, ReDoc и прочие.
Кроме того, платформа автоматически документирует модели данных с помощью схемы JSON.
Современная разработка
. Да, понятие «современное» используется довольно часто, но я могу констатировать, что FastAPI действительно ему соответствует. Внедрение зависимостей и подсказки при вводе кода не просто обеспечивают соблюдение правильных принципов написания программного кода, но и предотвращают появление ошибок и путаницы.
Подробная документация
. Не знаю как вы, но я обожаю хорошую документацию. И здесь FastAPI с легкостью всех обходит. Страница за страницей в ней описываются все мелочи, а также моменты, на которые стоит обратить внимание разработчикам всех уровней. В эту документацию вложили всю душу, и единственное сравнение, которое я могу привести, - это документация Django (да, документация FastAPI настолько хороша!).
Дополнительные функции
. FastAPI поддерживает WebSockets, потоковую передачу, а также GraphQL. Помимо этого, об поддерживает все стандартные вспомогательные механизмы, такие как CORS, сеансы, cookie-файлы и т.д.
Так, а что насчет производительности? Что ж, в основе FastAPI лежит потрясающая библиотека Starlette, что обеспечивает производительность сравнимую с Node, а в некоторых случаях даже Go! В общем и целом, у меня есть стойкое ощущение, что FastAPI будет стремиться стать лучшим асинхронным фреймворком Python.
6. BlackSheep
BlackSheep можно использовать для создания серверных и полнофункциональных приложений на базе шаблона MVC.
Вот некоторые из функций, которые предлагает BlackSheep:
API с «богатым» кодом.
Встроенное внедрение зависимостей.
Встроенное создание документации OpenAPI.
Автоматическая привязка обработчиков событий.
Настройка проекта
Давайте создадим простое серверное приложение с помощью BlackSheep. Чтобы настроить проект, запустите команды, приведенные ниже, одну за другой.
python -m venv basic-app
cd basic-app
source bin/activate
pip install blacksheep uvicorn
Настройка проекта завершена. Давайте создадим файл с именем
server.py
и поместим в него следующий код.
from blacksheep import Application
app = Application()
@app.router.get("/")
def home():
return "Hello, World!"
Мы создали самое известное приложение «Hello, World!». На данный момент существует только один маршрут с методом
HTTP GET
и параметром
/
. Функция
home
в BlackSheep называется обработчиком запросов.
Мы использовали декоратор
router
из класса
app
. Помимо этого, существует еще один способ создать маршрут -
route
. В данном случае мы будем использовать
router
. Более подробную информацию о
route
вы можете найти в документации.
Давайте запустим приложение с помощью следующей команды:
uvicorn server:app --port 8000 --reload
Перейдем по следующему адресу в браузере:
http://localhost:8000/
. Вы увидите там надпись «Hello, World!». Давайте немного поговорим о команде, которую мы использовали для запуска приложения.
Для запуска нашего приложения мы использовали пакет
uvicorn
.
server
- это имя файла, которые мы указали сами. Если вы используете другое имя файла, измените его в команде запуска.
Флаг
--port
указывает порт, где будет работать наше приложение.
И наконец, флаг
--reload
позволяет перезагружать приложение в браузере всякий раз, когда мы вносим изменения в файл
server
.
JSON-ответ
В реальных условиях в большинстве случаев нам требуется ответ API в формате JSON. Мы можем его получить из метода, упаковав объект JSON в
json
из пакета
blacksheep
. Давайте посмотрим, как мы можем это сделать.
from blacksheep import Application, json
app = Application()
@app.router.get("/")
def home():
return json({"message": "Hello, World!"})
Мы можем импортировать
json
из
blacksheep
и упаковать с его помощью объект JSON. Проверьте этот код в браузере на наличие JSON-ответа.
Параметры маршрутизации
Иногда нам необходимо принимать параметры маршрутизации для запросов. Мы можем сделать это в BlackSheep, определив их внутри метода HTTP. Давайте посмотрим, как это работает.
@app.router.get("/{name}")
def home(name):
return json({"greetings": f"Hello, {name}!"})
Мы принимаем один параметр маршрутизации под названием
name
. Переходим по адресу
http://localhost:8000/Geekflare
. Метод вернет нам приветствие с именем, указанном в маршруте.
Декоратор
router
передает в функцию
home
параметр с тем же именем, что и параметр, который был передан ему. В данном случае это
name
. Если вы измените его в декораторе, его необходимо изменить и в функции
home
.
Аналогично мы можем принять и большее количество параметров. Давайте посмотрим на небольшой пример.
@app.router.get("/{name}/{info}")
def home(name, info):
return json({"greetings": f"Hello, {name}! Info {info}"})
Мы приняли еще один параметр маршрутизации под названием
info
. переходим по адресу
http://localhost:8000/Geekflare/Chandan
и проверяем.
Параметры запросов
Для того, чтобы принять параметры запроса, нам не нужно предпринимать каких-то дополнительных действий. BlackSheep автоматически отправляет функции параметры запроса в виде списка. Давайте рассмотрим пример.
@app.router.get("/")
def home(name):
print(name)
return json({"greetings": f"Hello, {name[0]}!"})
Перейдем по адресу
http://localhost:8000/?name=Geekflare
и проверим ответ. Если у вас есть несколько параметров запросов с одинаковыми именами, BlackSheep добавит в список все.
Перейдем по адресу
http://localhost:8000/?name=Geekflare&name=Chandan
и проверим вывод в терминале. Вы увидите список из двух параметров:
Geekflare
и
Chadan
, так как мы передали два параметра запросов с одинаковыми именами.
Если вам нужно передать несколько параметров с разными именами, вы также можете это сделать. Просто добавьте в функцию еще один аргумент с именем параметра и делайте с ним все, что посчитаете нужным.
Объект-запрос
Единственное, что осталось из основных вещей, - это проверка других методов HTTP. Прежде чем более подробно рассмотреть все это, давайте проверим объект
request
на наличие API.
Все обработчики запросов в BlackSheep буду иметь аргумент
request
, который содержит всю информацию о входящем запросе. Туда входят заголовки запросов, параметры пути, параметры запроса, данные и т.д.
Давайте посмотрим пример, чтобы увидеть, как это работает.
@app.router.post("/")
def home(request):
print(request)
return "Hello, World!"
В терминале вы увидите следующее:
Мы можем получить доступ к различным вещам из запроса. Мы можем проверить документацию. В таком случае наше внимание должно быть сосредоточено на теле запроса. Давайте посмотрим, как получить доступ к телу запроса из объекта
request
.
@app.router.post("/")
async def home(request):
data = await request.json()
print(data)
return "Hello, World!"
В запросе присутствует метод
json
, который возвращает данные, полученные из запроса. Передайте ему некоторые данные в запросе API и вызовите его. Вы увидите, что в терминале выводятся данные, которые вы передали API.
HTTP-методы
В примере выше мы рассмотрели методы GET и POST. Точно так же вы можете использовать методы PUT, DELETE и т.д. Они довольно простые, так что воспользоваться ими не составит труда.
7. AIOHTTP
aiohttp – это еще один фреймворк. Вот его основные функции:
Он поддерживает WebSockets как стороне сервера, так и на стороне клиента.
Он поддерживает разработку как серверных, так и клиентских приложений.
Его веб-сервер обладает межплатформенным ПО, сигналами и подключаемой маршрутизацией.
Настройка проекта
Давайте создадим простое серверное приложение с помощью aiohttp. Чтобы настроить проект, запустите следующие команды:
python -m venv basic-app
cd basic-app
source bin/activate
pip install aiohttp aiodns
Создаем файл
server.py
и помещаем в него следующий код:
from aiohttp import web
async def home(request):
return web.Response(text="Hello, World!")
app = web.Application()
app.add_routes([web.get('/', home)])
web.run_app(app)
Экземпляр
web.Application
- это наше основное приложение. Мы добавили метод HTTP GET с маршрутом
/
, который возвращает всеми любимый «Hello, World!». Функция
web.run_app
используется для запуска приложения и принимает в качестве аргумента экземпляр
web.Application
.
Функция
home
в aiohttp называется обработчиком запросов. У него есть один единственный аргумент под названием
request
, который содержит всю информацию о входящем запросе.
Запустим приложение с помощью следующей команды. Это все равно что запустить обычную программу на Python.
python3 server.py
Перейдем в браузере по следующему адресу:
http://localhost:8080/
, и вы увидите там надпись «Hello, World!».
JSON-ответ
Мы можем получить ответ в формате JSON, воспользовавшись функцией
web.json_response
. Передадим в нее данные JSON и вернем ответ. Давайте посмотрим пример.
async def home(request):
return web.json_response({"message": "Hello, World!"})
Если вы перейдете по адресу
http://localhost:8080/
, то увидите в браузере объект JSON.
Параметры маршрутизации
Мы можем определить параметры маршрутизации при непосредственном добавлении маршрутов. Доступ к ним можно получить из аргумента
request
обработчика запроса. Давайте посмотрим на пример.
from aiohttp import web
async def home(request):
return web.json_response({"message": f"Hello, {request.match_info['name']}!"})
app = web.Application()
app.add_routes([web.get('/{name}', home)])
web.run_app(app)
Доступ ко всем параметрам можно получить с помощью
request.match_info
(см. пример выше). Перейдем по адресу
http://localhost:8080/Geekflare
и проверим это.
Кроме того, для составления маршрутов мы можем использовать регулярные выражения. Допустим, нам нужно принять только
/{any_number}
. В таком случае мы можем сделать это, заменив
'/{name}'
на
r'/{number:\d+}'
. Мы добавили к параметру маршрутизации параметр пути, который будет приниматься только тогда, когда это регулярное выражение будет передано.
Давайте посмотрим пример.
from aiohttp import web
async def home(request):
return web.json_response({"message": f"Hello, {request.match_info['number']}!"})
app = web.Application()
app.add_routes([web.get(r'/{number:\d+}', home)])
web.run_app(app)
Перейдем по адресу
http://localhost:8080/Geekflare
и увидим ошибку 404, так как
Geekflare
не соответствует шаблону регулярного выражения, который мы указали. А теперь перейдите по этому адресу:
http://localhost:8080/1234567890
, и вы увидите в браузере ответ.
Параметры запроса
Для того, чтобы принять параметры запроса, не нужно ничего добавлять. Мы можем принять параметры запроса из объекта
request.query
. Давайте посмотрим на пример.
from aiohttp import web
async def home(request):
return web.json_response({"message": f"Hello, {request.query.get('name')}"})
app = web.Application()
app.add_routes([web.get('/', home)])
web.run_app(app)
Перейдем по адресу
http://localhost:8080/?name=Geekflare
и проверим результат. Вы увидите, что в ответе присутствует
Geekflare
, который вы приняли из
request.query
.
Мы можем передавать несколько параметров, к которым можно получить доступ по их именам.
HTTP-методы
В примерах, приведенных выше, мы видели, как создается метод HTTP GET. Прежде чем, мы пойдем дальше, нам нужно разобраться, как получить доступ к данным запроса. Давайте посмотрим пример.
from aiohttp import web
async def home(request):
data = await request.json()
print(data)
return web.json_response({"message": f"Hello, World!"})
app = web.Application()
app.add_routes([web.post('/', home)])
web.run_app(app)
В этом примере мы изменили метод API с GET на POST. А доступ к данным запроса мы получили с помощью метода
request.json
.
Отправьте запрос POST на
http://localhost:8080/
, и вы увидите, как в терминале напечатаются данные запроса.
Аналогично вы можете использовать методы PUT, DELETE и т.д. Попробуйте сделать то сами.
Более подробную информацию о фреймворке вы можете найти в его документации.
8. Falcon
Falcon – это фреймворк для создания REST API и микрослужб, придерживающийся стандарта ASGI. Вот его основные функции:
Он поддерживает WebSockets.
Поддерживает межплатформенное ПО и перехватчиков для обработки запросов.
Простая и понятная обработка исключений.
Настройка проекта
Чтобы изучить основы Falcon, давайте создадим проект и настроим его с помощью следующих команд:
python -m venv basic-app
cd basic-app
source bin/activate
pip install falcon uvicorn
Создадим файл
server.py
и добавим в него следующий код:
from falcon import asgi
import falcon
class Home:
async def on_get(self, request, response):
response.status = falcon.HTTP_200 # This is the default status
response.content_type = falcon.MEDIA_TEXT # Default is JSON, so override
response.text = 'Hello, World!'
app = asgi.App()
app.add_route('/', Home())
Мы создали класс с методом
on_get
, который является методом HTTP GET. Метод может принимать два аргумента. Первый – запрос (
request
), а второй – ответ (
response
) (не сложно догадаться по их названиям).
Аргумент
request
содержит всю информацию о входящем запросе, к которой мы можем получить доступ для того, чтобы обработать этот запрос. Аргумент
response
нужен для того, чтобы настраивать различные параметры для отправки ответа.
В отличие от BlackSheep и AIOHTTP, нам не нужно возвращать ответ. Мы можем воспользоваться аргументом
response
и настроить любые детали, которые мы хотим отправить в качестве ответа. В примере выше мы установили следующее: статус – 200, содержимое - текст, текст – «Hello, World!».
Запустим приложение с помощью следующей команды:
uvicorn server:app --reload
Перейдем по адресу
http://localhost:8000/
и увидим, что в качестве ответа выводится «Hello, World!».
JSON-ответ
Мы можем вернуть ответ в формате JSON, преобразовав данные в JSON с помощью метода
json.dumps
. Давайте посмотрим пример.
from falcon import asgi
import falcon
import json
class Home:
async def on_get(self, request, response):
response.text = json.dumps({"greetings": "Hello, World!"})
app = asgi.App()
app.add_route('/', Home())
Перейдем по адресу
http://localhost:8000/
и увидим ответ в формате JSON.
Параметры маршрутизации
Параметры маршрутизации передаются в качестве аргументов методам HTTP. Чтобы было более понятно, взглянем на пример ниже.
from falcon import asgi
import falcon
import json
class Home:
async def on_get(self, request, response, name):
response.text = json.dumps({"greetings": f"Hello, {name}!"})
app = asgi.App()
app.add_route('/{name}/', Home())
Параметр пути
name
передается в качестве аргумента методу
on_get
. Перейдем по адресу
http://localhost:8000/Geekflare/
и проверим ответ. Параметров маршрутизации может быть несколько.
Параметры
запроса
Мы можем получить доступ к параметрам запроса с помощью метода
request.get_param(param_name)
. Изучим пример ниже.
from falcon import asgi
import falcon
import json
class Home:
async def on_get(self, request, response):
response.text = json.dumps({"greetings": f"Hello, {request.get_param('name')}!"})
app = asgi.App()
app.add_route('/', Home())
Перейдем по адресу
http://localhost:8000/?name=Geekflare
и проверим ответ. Параметров запроса может быть несколько.
HTTP-методы
В примере выше мы наблюдали метод GET. Единственное, что нам нужно знать, чтобы использовать другие методы, - это то, как получить доступ к данным запроса. Мы можем это сделать с помощью метода
request.stream.read
. Давайте посмотрим пример.
from falcon import asgi
import falcon
import json
class Home:
async def on_get(self, request, response):
response.text = json.dumps({"greetings": "Hello, World!"})
async def on_post(self, request, response):
data = await request.stream.read()
print(json.loads(data))
response.text = "Hello, World!"
app = asgi.App()
app.add_route('/', Home())
Мы добавили один метод POST, в котором мы получили доступ к данным запроса и после того, как преобразовали их в JSON, распечатали в терминале. Выполните запрос POST с несколькими данными и проверьте результат.
Попробуйте самостоятельно добавить другие методы HTTP, например, DELETE, PUT и т.д. Мы охватили только основы фреймворка Falcon. Но в нем есть еще много чего интересного. Чтобы узнать о нем больше, изучите его документацию.
9. Starlette
Starlette – это легкий фреймворк, придерживающийся стандарта ASGI. Он оснащен практически всеми основными функциями, необходимыми для создания серверных приложений.
Запустите следующие команды и настройте проект:
python -m venv basic-app
cd basic-app
source bin/activate
pip install starlette uvicorn
Процесс создания API с помощью Starlette похож на то, что мы видели, рассматривая предыдущие фреймворки. Отличается только синтаксис и способ создания API, принципы остаются прежними. Итак, мы хотим добавить все в одну программу.
Создаем файл
server.py
и добавляем туда следующий код:
from starlette.applications import Starlette
from starlette.responses import PlainTextResponse, JSONResponse
from starlette.routing import Route
def homepage(request):
return PlainTextResponse('Hello, World!')
def json_response(request):
return JSONResponse({'message': 'Hello, World!'})
def path_params(request):
name = request.path_params['name']
return JSONResponse({'greetings': f'Hello, {name}!'})
def query_params(request):
name = request.query_params['name']
return JSONResponse({'greetings': f'Hello, {name}!'})
async def post_method(request):
data = await request.json()
print(data)
return JSONResponse({'message': f'Hello, World!'})
def startup():
print('Starlette started')
routes = [
Route('/', homepage),
Route('/json', json_response),
Route('/path-params/{name}', path_params),
Route('/query-params', query_params),
Route('/post', post_method, methods=['POST']),
]
app = Starlette(debug=True, routes=routes, on_startup=[startup])
Запускаем приложение с помощью следующей команды:
uvicorn server:app --reload
Проверяем все, что мы видели в предыдущих фреймворках. Больше информации вы можете найти к документации Starlette.
Заключение
Сегодня в асинхронной среде Python происходит огромное количество событий. Появляются новые фреймворки, переписываются старые, развиваются библиотеки, чтобы соответствовать асинхронному принципу поведения. Несмотря на то, что Python имеет встроенную поддержку цикла событий, и вы вполне можете сделать части вашего приложения асинхронными, вы также можете пойти ва-банк и воспользоваться одним из фреймворков, описанных здесь.
Просто не забывайте о долгосрочной перспективе: некоторые из существующих асинхронных фреймворков Python находятся на ранних стадиях разработки и довольно быстро развиваются, что может навредить вашему процессу разработки и увеличить затраты.
Ключевым моментом здесь является осторожность!
Но несмотря на все сказанное и сделанное, когда дело касается веб-фреймворков, Python готов к тому, чтобы обеспечивать высочайший уровень производительности. Если вы уже давно думали о переходе на Node, то теперь вам это точно не нужно!
Всем привет! Сегодня в статье рассмотрим установку CentOS 7 Minimal, первичную настройку сети и установку графического интерфейса под названием Mate. У нас уже есть статья и видео об установке немного иной редакции CentOS 7 – Network Edition, но при установке Minimal есть несколько тонкостей, о них – ниже.
Первое отличие в том, что образ несколько больше - 700 Мб, но это всё равно несравнимо с объемом DVD или Full редакции. Следующее отличие, вытекающее из предыдущего – отсутствует возможность выбрать дополнительный софт для установки (скриншот ниже):
В CentOS 7 также добавилась возможность включить сетевой интерфейс непосредственно во время установки – в 6 версии такого не было, однако, я дополнительно продемонстрирую самый наглядный способ настройки сетевого интерфейса в 7 версии.
Процесс установки
Итак, выполняем все шаги последовательно как указано в нашем видео и статье по установке сетевой версии данной ОС, ждём 15-30 минут и вводим свои логинпароль (предварительно подключившись через терминал).
Первым желанием было проверить, работает ли сетевой интерфейс и был ли ему назначен адрес – я ввёл команду ifconfig, и, как оказалось, данная команда на 7 версии является устаревшей и вместо неё необходимо использовать команду ipaddr для вывода информации об интерфейсах и команду iplinkдля вывода статистики на них же.
Но так все привыкли к стандартным командам пакета net-tools, его необходимо будет установить с помощью команды yum install net-tools. Однако, помня первое ощущение непонимания, когда у меня не работала сеть в минимальной инсталляции на 6 версии, я хочу дополнительно показать очень простой способ её настройки – об этом ниже.
Важно! Команда ifconfig устарела. Для сетевого взаимодействия с сервером рекомендуем пользоваться командой «ip» (ip -a), которая по функциональности (с точки зрения L2 и L3) превосходит «ifconfig».
Настройка сетевых интерфейсов с помощью nmtui
Вводим команду nmtui - в итоге должен запуститься простой графический интерфейс для настройки сети (скриншот ниже):
Я, к примеру, хочу изменить настройки единственного интерфейса – выбираем первую опцию Edit a connection и видим следующую картину:
Выбираем Edit… и делаем с интерфейсом всё, что вздумается :) Как видно на скриншоте ниже, наш сервер получил IP - адрес по DHCP – меня это устраивает и я оставлю всё как есть. Главной целью было продемонстрировать данную утилиту – nmtui
Установка MATE и необходимых пакетов
Итак, почему MATE? Ответ прост – он гораздо легче дефолтного Gnome, очень нетребователен к ресурсам и крайне прост в установке. Итак, производим несколько простых шагов по установке пакетов(ниже):
yum groupinstall "Development Tools" - установка необходимого комплекта пакетов для работы GUI (только если уже не установлены) ;
yum install epel-release - установка EPEL репозитория;
yum groupinstall "X Window system" - установка группового пакета X Window System, это займет около 5 минут. Сам пакет имеет объем 73 Мб;
yum groupinstall "MATE Desktop" - установка непосредственно Mate – довольно объемный пакет - 506 Мб;
Далее, запускаем GUI! Вводим командуsystemctl isolate graphical.target, вводим имя юзера и пароль, и видим графический интерфейс (скриншот ниже):
Если хотите чтобы система по умолчанию запускалась в графическом виде, введите команду
systemctl set-default graphical.target
rm '/etc/systemd/system/default.target'
ln -s '/usr/lib/systemd/system/graphical.target' '/etc/systemd/system/default.target'
В данной статье пойдет речь о модуле под названием Configuration File Editor, модуле, который позволяет редактировать дополнительные (custom) файлы конфигурации в браузере – обычно эти файлы редактируются с помощью CLI или сторонних программ, таких как WinSCP.
Что бы открыть данный модуль, необходимо в выпадающем меню вкладки Admin -> Config Edit
Как видно выше – в модуле можно создать новый файл, и так же доступны две вкладки:
Asterisk Custom Configuration Files – данные файлы можно редактировать, практически все Custom файлы изначально пустые. Кроме того, можно создавать совершенно новые файлы. Важно помнить, что после создания нового файла необходимо будет применить конфиг с помощью кнопки Apply Config
Asterisk System Configuration Files – данные файлы являются системными и их нельзя редактировать в данном модуле
Обратите внимание на надпись «File is not writable» - кнопки «Save» и «Delete» так же неактивны.
Важно:
Для подключения custom файла в оригинальном файле должна быть запись следующего вида:
include ***_custom.conf
Однако, через данный модуль добавить данную строчку невозможно, но, в большинстве системных файлов данные команды уже присутствуют.
Если же вы создадите новый файл, с помощью кнопки + Add New File, то необходимо будет всё же использовать CLI для его подключения. К примеру, для использования файла test_newsettings_custom.conf, необходимо будет в нужный для вас системный .conf файл (который является системным файлом) прописать следующую строку:
include test_newsettings custom.conf
От себя добавлю, что чаще всего данный модуль может пригодиться не для редактирования, а для просмотра нужных вам файлов.
