标签归档:asyncio

Httpx-Python的下一代HTTP客户端。🦋

HTTPX是Python3的一个功能齐全的HTTP客户端,它提供同步和异步API,并同时支持HTTP/1.1和HTTP/2

注意事项HTTPX应该在测试版中考虑。我们相信我们现在已经使公共API达到了一个稳定点,但是强烈建议将您的依赖项绑定到0.18.*发布,这样您就可以正确地查看API changes between package updates1.0版本预计将在2021年的某个时候发布


我们开始吧

>>> import httpx
>>> r = httpx.get('https://www.example.org/')
>>> r
<Response [200 OK]>
>>> r.status_code
200
>>> r.headers['content-type']
'text/html; charset=UTF-8'
>>> r.text
'<!doctype html>\n<html>\n<head>\n<title>Example Domain</title>...'

或者,使用异步API

使用IPython或Python 3.8+和python -m asyncio以交互方式尝试此代码

>>> import httpx
>>> async with httpx.AsyncClient() as client:
...     r = await client.get('https://www.example.org/')
...
>>> r
<Response [200 OK]>

功能

HTTPX构建在requests,并为您提供:

加上的所有标准功能requests

  • 国际域名和URL
  • 保活和连接池
  • 具有Cookie持久性的会话
  • 浏览器样式的SSL验证
  • 基本/摘要身份验证
  • 精美的密钥/价值Cookie
  • 自动解压
  • 自动内容解码
  • Unicode响应正文
  • 多部分文件上载
  • HTTP(S)代理支持
  • 连接超时
  • 流式下载
  • netrc支持
  • 分块请求

安装

使用pip安装:

$ pip install httpx

或者,要包括可选的HTTP/2支持,请使用:

$ pip install httpx[http2]

HTTPX需要Python 3.6+

文档

有关项目文档,请访问https://www.python-httpx.org/

要浏览所有基础知识,请访问QuickStart

有关更高级的主题,请参阅Advanced Usage部分中,async support节,或HTTP/2部分

这个Developer Interface提供全面的API参考

要了解有关与HTTPX集成的工具的信息,请参阅Third Party Packages

贡献力量

如果您想使用HTTPX做出贡献,请查看Contributing Guide学习如何开始

依赖项

HTTPX项目依赖于这些优秀的库:

  • httpcore-的底层传输实现httpx
    • h11-HTTP/1.1支持
    • h2-HTTP/2支持。(可选)
  • certifi-SSL证书
  • rfc3986-URL解析和规范化
    • idna-支持国际化域名
  • sniffio-异步库自动检测
  • async_generator-后端支持contextlib.asynccontextmanager(仅Python 3.6需要)
  • brotlicffi-解码“brotli”压缩响应。(可选)

巨额信贷应归因于requests对于此工作中的大部分工作所遵循的API布局,以及urllib3有关较低级别的网络细节的大量设计灵感,请参阅

-⭐️-

HTTPX是BSD licensed密码。在英国布赖顿设计和建造

Uvloop-超高速异步事件循环

uvloop是内置异步事件循环的快速插入式替代。uvloop是用Cython实现的,并在幕后使用libuv可以在以下位置找到项目文档here请同时查看wiki

性能

uvloop使异步速度提高2-4倍

上图显示了具有不同消息大小的回应服务器的性能。这个插座基准使用loop.sock_recv()loop.sock_sendall()方法;溪流Benchmark使用异步高级流,由asyncio.start_server()函数;以及协议基准使用loop.create_server()使用简单的回声协议。阅读有关uvloop的更多信息,请参阅blog post关于这件事

安装

uvloop需要Python 3.7或更高版本,并且在PyPI上可用。使用pip安装它:

$ pip install uvloop

请注意,强烈建议您升级pip之前使用以下命令安装uvloop:

$ pip install -U pip

使用uvloop

打电话uvloop.install()在打电话之前asyncio.run()或手动创建异步事件循环:

import asyncio
import uvloop

async def main():
    # Main entry-point.
    ...

uvloop.install()
asyncio.run(main())

从源构建

要构建uvloop,您需要Python 3.7或更高版本:

  1. 克隆存储库:
    $ git clone --recursive git@github.com:MagicStack/uvloop.git
    $ cd uvloop
    
  2. 创建虚拟环境并将其激活:
    $ python3.7 -m venv uvloop-dev
    $ source uvloop-dev/bin/activate
    
  3. 安装开发依赖项:
    $ pip install -e .[dev]
    
  4. 构建和运行测试:
    $ make
    $ make test
    

许可证

uvloop在MIT和Apache 2.0许可下双重许可

Uvicorn-闪电般的ASGI服务器。🦄

闪电般的ASGI服务器

文档https://www.uvicorn.org

要求:Python 3.6+(要支持Python 3.5,请安装版本0.8.6。)

Uvicorn是一个闪电般的ASGI服务器实现,使用uvloophttptools

直到最近,Python还缺乏用于异步框架的最低级别的服务器/应用程序接口。这个ASGI specification填补了这一空白,意味着我们现在能够开始构建一组可在所有异步CIO框架中使用的通用工具

Uvicorn目前支持HTTP/1.1和WebSockets。计划支持HTTP/2

快速入门

使用以下方式安装pip

$ pip install uvicorn

这将安装具有最小(纯Python)依赖项的uvicorn

$ pip install uvicorn[standard]

这将安装带有“基于Cython的”依赖项(如果可能)和其他“可选的附加项”的uvicorn。

在此上下文中,“基于Cython”的含义如下:

  • 事件循环uvloop将在可能的情况下安装和使用
  • http协议将由httptools如果可能的话

此外,“自选额外服务”的意思是:

  • WebSocket协议将由websockets(您是否要使用wsproto如果可能,您需要手动安装)
  • 这个--reloader处于开发模式的标志将使用watchgod
  • Windows用户将拥有colorama为彩色原木安装的
  • python-dotenv如果您要使用--env-file选项
  • PyYAML将被安装,以允许您提供.yaml文件到--log-config,如果需要

创建应用程序,在example.py

async def app(scope, receive, send):
    assert scope['type'] == 'http'

    await send({
        'type': 'http.response.start',
        'status': 200,
        'headers': [
            [b'content-type', b'text/plain'],
        ],
    })
    await send({
        'type': 'http.response.body',
        'body': b'Hello, world!',
    })

运行服务器:

$ uvicorn example:app

Uvicorn是BSD licensed代码
在英国布赖顿设计和建造

-🦄-

Sanic-异步Python 3.7+Web服务器/框架|快速构建

SANIC|快速构建。跑得很快

构建
文档
套餐
支持
统计数据

Sanic是一家Python 3.7+Web服务器和Web框架,它们都是为快速运行而编写的。它允许使用async/awaitPython3.5中添加的语法可使您的代码实现非阻塞和快速

Sanic也符合ASGI,因此您可以使用alternative ASGI webserver

Source code on GitHub|Help and discussion board|User Guide|Chat on Discord

该项目由社区维护,为社区服务。欢迎投稿!

该项目的目标是提供一种简单的方法来设置和运行易于构建、易于扩展并最终可扩展的高性能HTTP服务器

赞助商

使用完整的源代码树上下文在IDE中管理拉请求和执行代码审查。评论任何一行,而不仅仅是不同之处。将跳转到定义、您最喜欢的键绑定和代码智能用于更多工作流

Learn More

感谢我们的赞助商。检查open collective了解有关帮助资助Sanic的更多信息

安装

pip3 install sanic

Sanic利用uvloopujson来帮助提高绩效。如果您不想使用这些软件包,只需添加一个环境变量SANIC_NO_UVLOOP=trueSANIC_NO_UJSON=true在安装时

$ export SANIC_NO_UVLOOP=true
$ export SANIC_NO_UJSON=true
$ pip3 install --no-binary :all: sanic

注意事项

如果您正在全新安装的Fedora 28或更高版本上运行,请确保您有redhat-rpm-config安装软件包,以防您要使用sanic使用ujson依赖性

注意事项

Windows支持目前是“试验性的”,并且是在尽最大努力的基础上。Windows当前也不支持多个工作进程(请参见Issue #1517),但设置workers=1应成功启动服务器

Hello World示例

from sanic import Sanic
from sanic.response import json

app = Sanic("My Hello, world app")

@app.route('/')
async def test(request):
    return json({'hello': 'world'})

if __name__ == '__main__':
    app.run()

SANIC现在可以使用以下工具轻松运行sanic hello.app

[2018-12-30 11:37:41 +0200] [13564] [INFO] Goin' Fast @ http://127.0.0.1:8000
[2018-12-30 11:37:41 +0200] [13564] [INFO] Starting worker [13564]

而且,我们可以验证它是否正常工作:curl localhost:8000 -i

HTTP/1.1 200 OK
Connection: keep-alive
Keep-Alive: 5
Content-Length: 17
Content-Type: application/json

{"hello":"world"}

现在,让我们快点造点东西吧!

最低Python版本为3.7。如果您需要Python 3.6支持,请使用v20.12LTS

文档

User GuideAPI Documentation

更改日志

Release Changelogs

问题和讨论

Ask a question or join the conversation

贡献

我们总是很高兴有新的贡献。我们有marked issues good for anyone looking to get started,欢迎您的到来questions on the forums请看一下我们的Contribution guidelines

Fastapi-FastAPI框架,高性能,易学,编码速度快,可投入生产

FastAPI框架,高性能,易学,编码速度快,可投入生产


文档https://fastapi.tiangolo.com

源代码https://github.com/tiangolo/fastapi


FastAPI是一种现代、快速(高性能)的Web框架,用于使用Python 3.6+基于标准Python类型提示构建API

主要功能包括:

  • 快地:非常高的性能,可与节点JS(多亏了斯塔莱特和皮丹蒂克)One of the fastest Python frameworks available
  • 快速编码:提高功能开发速度约200%至300%。*
  • 更少的错误:减少约40%的人为(开发人员)引起的错误。*
  • 直观:强大的编辑支持。无处不在的完成度。调试时间更短
  • 简单易懂:设计成易于使用和学习。减少阅读文档的时间
  • 短的:最大限度地减少代码重复。来自每个参数声明的多个功能。更少的错误
  • 健壮:获取可投入生产的代码。使用自动交互文档
  • 基于标准的:基于(并完全兼容)API开放标准:OpenAPI(以前称为Swagger)和JSON Schema

*基于对内部开发团队、构建生产应用程序的测试进行估计

意见

[.]我在用FastAPI这几天有一吨多。[.]实际上我正计划把它用在我所有团队的微软的ML服务他们中的一些人正在融入核心窗口产品和一些办公室产品

卡比尔汗-微软(ref)

我们采用了FastAPI库以派生睡觉可以查询获取的服务器预测[路德维希]

皮耶罗·莫利诺,雅罗斯拉夫·杜丁和赛苏曼斯·米利亚拉-优步(Uber)(ref)

Netflix我很高兴地宣布我们的危机管理编排框架:派单好了![使用以下组件构建FastAPI]

凯文·格利森,马克·维拉诺瓦,福里斯特·蒙森-Netflix(ref)

我欣喜若狂FastAPI太好玩了!

布莱恩·奥肯-Python Bytes播客主持人(ref)

老实说,你建造的东西看起来非常坚固和精美。在很多方面,这是我想要的拥抱一下是-看到有人建造这样的建筑真的很鼓舞人心

蒂莫西·克罗斯利-Hug创建者(ref)

如果你想学一门现代框架要构建睡觉API,请查看FastAPI[.]它快速、易用、易学。

我们已经切换到FastAPI为了我们的API接口[.]我想你会喜欢的。

Ines Montani-Matthew Honnibal-Explosion AI创始人-spaCy创作者(ref)(ref)

要求

Python 3.6+

FastAPI站在巨人的肩膀上:

安装

$ pip install fastapi

---> 100%

您还需要一台ASGI服务器用于生产,例如UvicornHypercorn

$ pip install uvicorn[standard]

---> 100%

示例

创建它

  • 创建文件main.py使用:
from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}
或使用async def

如果您的代码使用async/await,使用async def

from typing import Optional

from fastapi import FastAPI

app = FastAPI()


@app.get("/")
async def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
async def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}

注意事项

如果您不知道,请查看“赶时间?”部分关于async and await in the docs

运行它

使用以下命令运行服务器:

$ uvicorn main:app --reload

INFO:     Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit)
INFO:     Started reloader process [28720]
INFO:     Started server process [28722]
INFO:     Waiting for application startup.
INFO:     Application startup complete.
关于命令uvicorn main:app --reload

该命令uvicorn main:app指的是:

  • main:文件main.py(Python“模块”)
  • app:在中创建的对象main.py用这条线app = FastAPI()
  • --reload:使服务器在代码更改后重新启动。这样做只是为了发展。

检查一下

在以下位置打开您的浏览器http://127.0.0.1:8000/items/5?q=somequery

您将看到JSON响应为:

{"item_id": 5, "q": "somequery"}

您已经创建了一个API,该API:

  • 中接收HTTP请求。路径//items/{item_id}
  • 两者都有路径拿走GET运营(也称为HTTP方法:)
  • 这个路径/items/{item_id}有一个路径参数item_id这应该是一个int
  • 这个路径/items/{item_id}有一个可选的str查询参数q

交互式API文档

现在转到http://127.0.0.1:8000/docs

您将看到自动交互API文档(由提供Swagger UI):

替代API文档

现在,请转到http://127.0.0.1:8000/redoc

您将看到替代自动文档(由提供ReDoc):

示例升级

现在修改该文件main.py接收来自PUT请求

使用标准Python类型声明Body,这要归功于Pydatics

from typing import Optional

from fastapi import FastAPI
from pydantic import BaseModel

app = FastAPI()


class Item(BaseModel):
    name: str
    price: float
    is_offer: Optional[bool] = None


@app.get("/")
def read_root():
    return {"Hello": "World"}


@app.get("/items/{item_id}")
def read_item(item_id: int, q: Optional[str] = None):
    return {"item_id": item_id, "q": q}


@app.put("/items/{item_id}")
def update_item(item_id: int, item: Item):
    return {"item_name": item.name, "item_id": item_id}

服务器应自动重新加载(因为您添加了--reload发送到uvicorn上述命令)

Interactive API文档升级

现在转到http://127.0.0.1:8000/docs

  • 交互API文档将自动更新,包括新的Body:

  • 点击[试用]按钮,即可填写参数,直接与接口交互:

  • 然后点击“执行”按钮,用户界面将与您的API进行通信,发送参数,得到结果并显示在屏幕上:

备用API文档升级

现在,请转到http://127.0.0.1:8000/redoc

  • 替代文档还将反映新的查询参数和正文:

概述

总而言之,您声明一次作为函数参数的参数类型、正文等

您可以使用标准的现代Python类型来实现这一点

您不必学习新语法、特定库的方法或类等

只是标准的Python 3.6+

例如,对于int

item_id: int

或者对于更复杂的Item型号:

item: Item

有了这一份声明,你就会得到:

  • 编辑器支持,包括:
    • 完成
    • 类型检查
  • 数据验证:
    • 数据无效时自动清除错误
    • 即使是针对深度嵌套的JSON对象的验证也是如此
  • 输入数据的转换:从网络到Python数据和类型的转换。阅读自:
    • JSON
    • 路径参数
    • 查询参数
    • 曲奇饼
    • 标题
    • 表格
    • 文件
  • 输出数据转换:从Python数据和类型转换为网络数据(如JSON):
    • 转换Python类型(strintfloatboollist等)
    • datetime对象
    • UUID对象
    • 数据库模型
    • 还有更多
  • 自动交互式API文档,包括2个替代用户界面:
    • 大摇大摆的UI
    • 复单

回到前面的代码示例,FastAPI将:

  • 验证是否存在item_id在用于的路径中GETPUT请求
  • 验证item_id类型为intGETPUT请求
    • 如果不是,客户端将看到一个有用的、明确的错误
  • 检查是否存在名为的可选查询参数q(如图所示http://127.0.0.1:8000/items/foo?q=somequery)用于GET请求
    • 作为q参数是用= None,它是可选的
    • 如果没有None这将是必需的(就像在具有以下情况的情况下的身体一样PUT)
  • PUT请求/items/{item_id},将正文读作JSON:
    • 检查它是否具有必需的属性name这应该是一个str
    • 检查它是否具有必需的属性price那一定是一个float
    • 检查它是否具有可选属性is_offer,那应该是一个bool,如果存在
    • 所有这些也适用于深度嵌套的JSON对象
  • 自动从JSON转换为JSON或自动转换为JSON
  • 使用OpenAPI记录可由以下人员使用的所有内容:
    • 交互式文档系统
    • 自动客户端代码生成系统,适用于多种语言
  • 直接提供2个交互式文档web界面

我们只是触及了皮毛,但您已经对它的工作原理有了大致的了解

尝试使用以下命令更改行:

    return {"item_name": item.name, "item_id": item_id}

出发地:

        ... "item_name": item.name ...

收件人:

        ... "item_price": item.price ...

并查看您的编辑器将如何自动完成属性并了解其类型:

有关包含更多功能的更完整示例,请参阅Tutorial – User Guide

剧透警报:教程-用户指南包括:

  • 的声明参数从其他不同的地方,如:标题曲奇饼表单域文件
  • 如何设置验证约束作为maximum_lengthregex
  • 一款功能非常强大且易于使用的依赖项注入系统
  • 安全性和身份验证,包括支持OAuth2使用JWT代币HTTP Basic身份验证
  • 更高级(但同样简单)的声明技术深度嵌套的JSON模型(多亏了皮丹蒂克)
  • 许多额外功能(感谢Starlette),如:
    • WebSockets
    • 图形QL
    • 极其简单的测试,基于requestspytest
    • CORS
    • Cookie会话
    • 还有更多

性能

独立TechEmpower基准显示FastAPI在Uvicorn AS下运行的应用程序one of the fastest Python frameworks available,仅低于Starlette和Uvicorn本身(由FastAPI内部使用)。(*)

要了解更多信息,请参阅小节Benchmarks

可选依赖项

由Pydtic使用:

由Starlette使用:

  • requests-如果要使用TestClient
  • aiofiles-如果要使用,则为必填项FileResponseStaticFiles
  • jinja2-如果要使用默认模板配置,则为必填项
  • python-multipart-如果您想支持表单“解析”,则为必填项,带有request.form()
  • itsdangerous-需要用于SessionMiddleware支持
  • pyyaml-Starlette的必填项SchemaGenerator支持(FastAPI可能不需要)
  • graphene-需要用于GraphQLApp支持
  • ujson-如果要使用,则为必填项UJSONResponse

由FastAPI/Starlette使用:

  • uvicorn-对于加载和服务您的应用程序的服务器
  • orjson-如果要使用,则为必填项ORJSONResponse

您可以使用以下命令安装所有这些组件pip install fastapi[all]

许可证

这个项目是根据麻省理工学院的许可条款授权的。

Core-🏡开源家庭自动化,将本地控制和隐私放在首位

家庭助理

开源家庭自动化,将本地控制和隐私放在首位。由世界各地的修补工人和DIY爱好者社区提供动力。非常适合在Raspberry PI或本地服务器上运行

检查home-assistant.ioa
demo
installation instructionstutorialsdocumentation

特色集成

该系统使用模块化方法构建,因此可以轻松实现对其他设备或操作的支持。另请参阅section on architecture以及section on creating your own
components

如果在使用Home Assistant或开发组件期间遇到问题,请检查Home Assistant help section有关更多帮助和信息,请访问我们的网站