[](https://github.com/Neoteroi/BlackSheep/actions)
[](https://pypi.org/project/BlackSheep/)
[](https://github.com/robertoprevato/blacksheep)
[](https://codecov.io/gh/Neoteroi/BlackSheep)
[](https://github.com/Neoteroi/blacksheep/blob/main/LICENSE) [](https://gitter.im/Neoteroi/BlackSheep?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://www.neoteroi.dev/blacksheep/)
# BlackSheep
BlackSheep is an asynchronous web framework to build event based web
applications with Python. It is inspired by
[Flask](https://palletsprojects.com/p/flask/), [ASP.NET
Core](https://docs.microsoft.com/en-us/aspnet/core/), and the work by [Yury
Selivanov](https://magic.io/blog/uvloop-blazing-fast-python-networking/).
<p align="left">
<a href="#blacksheep"><img width="320" height="271" src="https://www.neoteroi.dev/blacksheep/img/blacksheep.png" alt="Black Sheep"></a>
</p>
```bash
pip install blacksheep
```
---
```python
from datetime import datetime
from blacksheep import Application, get
app = Application()
@get("/")
async def home():
return f"Hello, World! {datetime.utcnow().isoformat()}"
```
## Getting started using the CLI ✨
BlackSheep offers a CLI to bootstrap new projects rapidly.
To try it, first install the `blacksheep-cli` package:
```bash
pip install blacksheep-cli
```
Then use the `blacksheep create` command to bootstrap a project
using one of the supported templates.

The CLI includes a help, and supports custom templates, using the
same sources supported by `Cookiecutter`.
## Getting started with the documentation
The documentation offers getting started tutorials:
* [Getting started:
basics](https://www.neoteroi.dev/blacksheep/getting-started/)
* [Getting started: the MVC project
template](https://www.neoteroi.dev/blacksheep/mvc-project-template/)
These project templates can be used to start new applications faster:
* [MVC project
template](https://github.com/Neoteroi/BlackSheepMVC)
* [Empty project
template](https://github.com/Neoteroi/BlackSheepEmptyProject)
## Requirements
[Python](https://www.python.org): any version listed in the project's
classifiers. The current list is:
[](https://github.com/robertoprevato/blacksheep)
BlackSheep belongs to the category of
[ASGI](https://asgi.readthedocs.io/en/latest/) web frameworks, so it requires
an ASGI HTTP server to run, such as [uvicorn](http://www.uvicorn.org/), or
[hypercorn](https://pgjones.gitlab.io/hypercorn/). For example, to use it with
uvicorn:
```bash
$ pip install uvicorn
```
To run an application like in the example above, use the methods provided by
the ASGI HTTP Server:
```bash
# if the BlackSheep app is defined in a file `server.py`
$ uvicorn server:app
```
To run for production, refer to the documentation of the chosen ASGI server
(i.e. for [uvicorn](https://www.uvicorn.org/#running-with-gunicorn)).
## Automatic bindings and dependency injection
BlackSheep supports automatic binding of values for request handlers, by type
annotation or by conventions. See [more
here](https://www.neoteroi.dev/blacksheep/requests/).
```python
from dataclasses import dataclass
from blacksheep import Application, FromJSON, FromQuery, get, post
app = Application()
@dataclass
class CreateCatInput:
name: str
@post("/api/cats")
async def example(data: FromJSON[CreateCatInput]):
# in this example, data is bound automatically reading the JSON
# payload and creating an instance of `CreateCatInput`
...
@get("/:culture_code/:area")
async def home(culture_code, area):
# in this example, both parameters are obtained from routes with
# matching names
return f"Request for: {culture_code} {area}"
@get("/api/products")
def get_products(
page: int = 1,
size: int = 30,
search: str = "",
):
# this example illustrates support for implicit query parameters with
# default values
# since the source of page, size, and search is not specified and no
# route parameter matches their name, they are obtained from query string
...
@get("/api/products2")
def get_products2(
page: FromQuery[int] = FromQuery(1),
size: FromQuery[int] = FromQuery(30),
search: FromQuery[str] = FromQuery(""),
):
# this example illustrates support for explicit query parameters with
# default values
# in this case, parameters are explicitly read from query string
...
```
It also supports [dependency
injection](https://www.neoteroi.dev/blacksheep/dependency-injection/), a
feature that provides a consistent and clean way to use dependencies in request
handlers.
## Generation of OpenAPI Documentation
[Generation of OpenAPI Documentation](https://www.neoteroi.dev/blacksheep/openapi/).
## Strategies to handle authentication and authorization
BlackSheep implements strategies to handle authentication and authorization.
These features are documented here:
* [Authentication](https://www.neoteroi.dev/blacksheep/authentication/)
* [Authorization](https://www.neoteroi.dev/blacksheep/authorization/)
```python
app.use_authentication()\
.add(ExampleAuthenticationHandler())
app.use_authorization()\
.add(AdminsPolicy())
@auth("admin")
@get("/")
async def only_for_admins():
...
@auth()
@get("/")
async def only_for_authenticated_users():
...
```
Since version `1.2.1`, BlackSheep implements:
* [Built-in support for OpenID Connect authentication](https://www.neoteroi.dev/blacksheep/authentication/#oidc)
* [Built-in support for JWT Bearer authentication](https://www.neoteroi.dev/blacksheep/authentication/#jwt-bearer)
Meaning that it is easy to integrate with services such as:
* [Auth0](https://auth0.com)
* [Azure Active Directory](https://azure.microsoft.com/en-us/services/active-directory/)
* [Azure Active Directory B2C](https://docs.microsoft.com/en-us/azure/active-directory-b2c/overview)
* [Okta](https://www.okta.com)
Refer to the documentation and to [BlackSheep-Examples](https://github.com/Neoteroi/BlackSheep-Examples)
for more details and examples.
## Web framework features
* [ASGI compatibility](https://www.neoteroi.dev/blacksheep/asgi/)
* [Routing](https://www.neoteroi.dev/blacksheep/routing/)
* Request handlers can be [defined as
functions](https://www.neoteroi.dev/blacksheep/request-handlers/), or [class
methods](https://www.neoteroi.dev/blacksheep/controllers/)
* [Middlewares](https://www.neoteroi.dev/blacksheep/middlewares/)
* [WebSocket](https://www.neoteroi.dev/blacksheep/websocket/)
* [Server-Sent Events (SSE)](https://www.neoteroi.dev/blacksheep/server-sent-events/)
* [Built-in support for dependency
injection](https://www.neoteroi.dev/blacksheep/dependency-injection/)
* [Support for automatic binding of route and query parameters to request
handlers methods
calls](https://www.neoteroi.dev/blacksheep/getting-started/#handling-route-parameters)
* [Strategy to handle
exceptions](https://www.neoteroi.dev/blacksheep/application/#configuring-exceptions-handlers)
* [Strategy to handle authentication and
authorization](https://www.neoteroi.dev/blacksheep/authentication/)
* [Built-in support for OpenID Connect authentication using OIDC
discovery](https://www.neoteroi.dev/blacksheep/authentication/#oidc)
* [Built-in support for JWT Bearer authentication using OIDC discovery and
other sources of
JWKS](https://www.neoteroi.dev/blacksheep/authentication/#jwt-bearer)
* [Handlers
normalization](https://www.neoteroi.dev/blacksheep/request-handlers/)
* [Serving static
files](https://www.neoteroi.dev/blacksheep/static-files/)
* [Integration with
Jinja2](https://www.neoteroi.dev/blacksheep/templating/)
* [Support for serving SPAs that use HTML5 History API for client side
routing](https://www.neoteroi.dev/blacksheep/static-files/#how-to-serve-spas-that-use-html5-history-api)
* [Support for automatic generation of OpenAPI
Documentation](https://www.neoteroi.dev/blacksheep/openapi/)
* [Strategy to handle CORS settings](https://www.neoteroi.dev/blacksheep/cors/)
* [Sessions](https://www.neoteroi.dev/blacksheep/sessions/)
* Support for automatic binding of `dataclasses` and
[`pydantic`](https://pydantic-docs.helpmanual.io) models to handle the
request body payload expected by request handlers
* [`TestClient` class to simplify testing of applications](https://www.neoteroi.dev/blacksheep/testing/)
* [Anti Forgery validation](https://www.neoteroi.dev/blacksheep/anti-request-forgery) to protect against Cross-Site Request Forgery (XSRF/CSRF) attacks
## Client features
BlackSheep includes an HTTP Client.
**Example:**
```python
import asyncio
from blacksheep.client import ClientSession
async def client_example():
async with ClientSession() as client:
response = await client.get("https://docs.python.org/3/")
text = await response.text()
print(text)
asyncio.run(client_example())
```
## Supported platforms and runtimes
* Python: all versions included in the build matrix
* Ubuntu
* Windows 10
* macOS
## Documentation
Please refer to the [documentation website](https://www.neoteroi.dev/blacksheep/).
## Communication
[BlackSheep community in Gitter](https://gitter.im/Neoteroi/BlackSheep).
## Branches
The _main_ branch contains the currently developed version, which is version 2. The _v1_ branch contains version 1 of the web framework, for bugs fixes
and maintenance.
Raw data
{
"_id": null,
"home_page": null,
"name": "blacksheep",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.7",
"maintainer_email": null,
"keywords": "blacksheep, web framework, asyncio",
"author": null,
"author_email": "Roberto Prevato <roberto.prevato@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/83/0e/f05f5ccb5bcd743b53cf583070529b8d5df8240b75944ccd5bbd65626be3/blacksheep-2.0.8.tar.gz",
"platform": null,
"description": "[](https://github.com/Neoteroi/BlackSheep/actions)\n[](https://pypi.org/project/BlackSheep/)\n[](https://github.com/robertoprevato/blacksheep)\n[](https://codecov.io/gh/Neoteroi/BlackSheep)\n[](https://github.com/Neoteroi/blacksheep/blob/main/LICENSE) [](https://gitter.im/Neoteroi/BlackSheep?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) [](https://www.neoteroi.dev/blacksheep/)\n\n# BlackSheep\nBlackSheep is an asynchronous web framework to build event based web\napplications with Python. It is inspired by\n[Flask](https://palletsprojects.com/p/flask/), [ASP.NET\nCore](https://docs.microsoft.com/en-us/aspnet/core/), and the work by [Yury\nSelivanov](https://magic.io/blog/uvloop-blazing-fast-python-networking/).\n\n<p align=\"left\">\n <a href=\"#blacksheep\"><img width=\"320\" height=\"271\" src=\"https://www.neoteroi.dev/blacksheep/img/blacksheep.png\" alt=\"Black Sheep\"></a>\n</p>\n\n```bash\npip install blacksheep\n```\n\n---\n\n```python\nfrom datetime import datetime\n\nfrom blacksheep import Application, get\n\n\napp = Application()\n\n@get(\"/\")\nasync def home():\n return f\"Hello, World! {datetime.utcnow().isoformat()}\"\n\n```\n\n## Getting started using the CLI \u2728\n\nBlackSheep offers a CLI to bootstrap new projects rapidly.\nTo try it, first install the `blacksheep-cli` package:\n\n```bash\npip install blacksheep-cli\n```\n\nThen use the `blacksheep create` command to bootstrap a project\nusing one of the supported templates.\n\n\n\nThe CLI includes a help, and supports custom templates, using the\nsame sources supported by `Cookiecutter`.\n\n## Getting started with the documentation\n\nThe documentation offers getting started tutorials:\n* [Getting started:\n basics](https://www.neoteroi.dev/blacksheep/getting-started/)\n* [Getting started: the MVC project\n template](https://www.neoteroi.dev/blacksheep/mvc-project-template/)\n\nThese project templates can be used to start new applications faster:\n\n* [MVC project\n template](https://github.com/Neoteroi/BlackSheepMVC)\n* [Empty project\n template](https://github.com/Neoteroi/BlackSheepEmptyProject)\n\n## Requirements\n\n[Python](https://www.python.org): any version listed in the project's\nclassifiers. The current list is:\n\n[](https://github.com/robertoprevato/blacksheep)\n\n\nBlackSheep belongs to the category of\n[ASGI](https://asgi.readthedocs.io/en/latest/) web frameworks, so it requires\nan ASGI HTTP server to run, such as [uvicorn](http://www.uvicorn.org/), or\n[hypercorn](https://pgjones.gitlab.io/hypercorn/). For example, to use it with\nuvicorn:\n\n```bash\n$ pip install uvicorn\n```\n\nTo run an application like in the example above, use the methods provided by\nthe ASGI HTTP Server:\n\n```bash\n# if the BlackSheep app is defined in a file `server.py`\n\n$ uvicorn server:app\n```\n\nTo run for production, refer to the documentation of the chosen ASGI server\n(i.e. for [uvicorn](https://www.uvicorn.org/#running-with-gunicorn)).\n\n## Automatic bindings and dependency injection\nBlackSheep supports automatic binding of values for request handlers, by type\nannotation or by conventions. See [more\nhere](https://www.neoteroi.dev/blacksheep/requests/).\n\n```python\nfrom dataclasses import dataclass\n\nfrom blacksheep import Application, FromJSON, FromQuery, get, post\n\n\napp = Application()\n\n\n@dataclass\nclass CreateCatInput:\n name: str\n\n\n@post(\"/api/cats\")\nasync def example(data: FromJSON[CreateCatInput]):\n # in this example, data is bound automatically reading the JSON\n # payload and creating an instance of `CreateCatInput`\n ...\n\n\n@get(\"/:culture_code/:area\")\nasync def home(culture_code, area):\n # in this example, both parameters are obtained from routes with\n # matching names\n return f\"Request for: {culture_code} {area}\"\n\n\n@get(\"/api/products\")\ndef get_products(\n page: int = 1,\n size: int = 30,\n search: str = \"\",\n):\n # this example illustrates support for implicit query parameters with\n # default values\n # since the source of page, size, and search is not specified and no\n # route parameter matches their name, they are obtained from query string\n ...\n\n\n@get(\"/api/products2\")\ndef get_products2(\n page: FromQuery[int] = FromQuery(1),\n size: FromQuery[int] = FromQuery(30),\n search: FromQuery[str] = FromQuery(\"\"),\n):\n # this example illustrates support for explicit query parameters with\n # default values\n # in this case, parameters are explicitly read from query string\n ...\n\n```\n\nIt also supports [dependency\ninjection](https://www.neoteroi.dev/blacksheep/dependency-injection/), a\nfeature that provides a consistent and clean way to use dependencies in request\nhandlers.\n\n## Generation of OpenAPI Documentation\n[Generation of OpenAPI Documentation](https://www.neoteroi.dev/blacksheep/openapi/).\n\n## Strategies to handle authentication and authorization\nBlackSheep implements strategies to handle authentication and authorization.\nThese features are documented here:\n\n* [Authentication](https://www.neoteroi.dev/blacksheep/authentication/)\n* [Authorization](https://www.neoteroi.dev/blacksheep/authorization/)\n\n```python\napp.use_authentication()\\\n .add(ExampleAuthenticationHandler())\n\n\napp.use_authorization()\\\n .add(AdminsPolicy())\n\n\n@auth(\"admin\")\n@get(\"/\")\nasync def only_for_admins():\n ...\n\n\n@auth()\n@get(\"/\")\nasync def only_for_authenticated_users():\n ...\n```\n\nSince version `1.2.1`, BlackSheep implements:\n\n* [Built-in support for OpenID Connect authentication](https://www.neoteroi.dev/blacksheep/authentication/#oidc)\n* [Built-in support for JWT Bearer authentication](https://www.neoteroi.dev/blacksheep/authentication/#jwt-bearer)\n\nMeaning that it is easy to integrate with services such as:\n* [Auth0](https://auth0.com)\n* [Azure Active Directory](https://azure.microsoft.com/en-us/services/active-directory/)\n* [Azure Active Directory B2C](https://docs.microsoft.com/en-us/azure/active-directory-b2c/overview)\n* [Okta](https://www.okta.com)\n\nRefer to the documentation and to [BlackSheep-Examples](https://github.com/Neoteroi/BlackSheep-Examples)\nfor more details and examples.\n\n## Web framework features\n\n* [ASGI compatibility](https://www.neoteroi.dev/blacksheep/asgi/)\n* [Routing](https://www.neoteroi.dev/blacksheep/routing/)\n* Request handlers can be [defined as\n functions](https://www.neoteroi.dev/blacksheep/request-handlers/), or [class\n methods](https://www.neoteroi.dev/blacksheep/controllers/)\n* [Middlewares](https://www.neoteroi.dev/blacksheep/middlewares/)\n* [WebSocket](https://www.neoteroi.dev/blacksheep/websocket/)\n* [Server-Sent Events (SSE)](https://www.neoteroi.dev/blacksheep/server-sent-events/)\n* [Built-in support for dependency\n injection](https://www.neoteroi.dev/blacksheep/dependency-injection/)\n* [Support for automatic binding of route and query parameters to request\n handlers methods\n calls](https://www.neoteroi.dev/blacksheep/getting-started/#handling-route-parameters)\n* [Strategy to handle\n exceptions](https://www.neoteroi.dev/blacksheep/application/#configuring-exceptions-handlers)\n* [Strategy to handle authentication and\n authorization](https://www.neoteroi.dev/blacksheep/authentication/)\n* [Built-in support for OpenID Connect authentication using OIDC\n discovery](https://www.neoteroi.dev/blacksheep/authentication/#oidc)\n* [Built-in support for JWT Bearer authentication using OIDC discovery and\n other sources of\n JWKS](https://www.neoteroi.dev/blacksheep/authentication/#jwt-bearer)\n* [Handlers\n normalization](https://www.neoteroi.dev/blacksheep/request-handlers/)\n* [Serving static\n files](https://www.neoteroi.dev/blacksheep/static-files/)\n* [Integration with\n Jinja2](https://www.neoteroi.dev/blacksheep/templating/)\n* [Support for serving SPAs that use HTML5 History API for client side\n routing](https://www.neoteroi.dev/blacksheep/static-files/#how-to-serve-spas-that-use-html5-history-api)\n* [Support for automatic generation of OpenAPI\n Documentation](https://www.neoteroi.dev/blacksheep/openapi/)\n* [Strategy to handle CORS settings](https://www.neoteroi.dev/blacksheep/cors/)\n* [Sessions](https://www.neoteroi.dev/blacksheep/sessions/)\n* Support for automatic binding of `dataclasses` and\n [`pydantic`](https://pydantic-docs.helpmanual.io) models to handle the\n request body payload expected by request handlers\n* [`TestClient` class to simplify testing of applications](https://www.neoteroi.dev/blacksheep/testing/)\n* [Anti Forgery validation](https://www.neoteroi.dev/blacksheep/anti-request-forgery) to protect against Cross-Site Request Forgery (XSRF/CSRF) attacks\n\n## Client features\n\nBlackSheep includes an HTTP Client.\n\n**Example:**\n```python\nimport asyncio\n\nfrom blacksheep.client import ClientSession\n\n\nasync def client_example():\n async with ClientSession() as client:\n response = await client.get(\"https://docs.python.org/3/\")\n text = await response.text()\n print(text)\n\n\nasyncio.run(client_example())\n```\n\n## Supported platforms and runtimes\n* Python: all versions included in the build matrix\n* Ubuntu\n* Windows 10\n* macOS\n\n## Documentation\nPlease refer to the [documentation website](https://www.neoteroi.dev/blacksheep/).\n\n## Communication\n[BlackSheep community in Gitter](https://gitter.im/Neoteroi/BlackSheep).\n\n## Branches\nThe _main_ branch contains the currently developed version, which is version 2. The _v1_ branch contains version 1 of the web framework, for bugs fixes\nand maintenance.\n",
"bugtrack_url": null,
"license": null,
"summary": "Fast web framework for Python asyncio",
"version": "2.0.8",
"project_urls": {
"Bug Tracker": "https://github.com/Neoteroi/BlackSheep/issues",
"Homepage": "https://github.com/Neoteroi/BlackSheep"
},
"split_keywords": [
"blacksheep",
" web framework",
" asyncio"
],
"urls": [
{
"comment_text": null,
"digests": {
"blake2b_256": "6b2ce44cb383bdcbac8678c8ddcff32f444d4c7933bc44ca0a4242ba59f2826e",
"md5": "83aab8e9e909d2f627ced00f185d7e4d",
"sha256": "4886005a2b686d554758a6cb8e3bee9f3e66d18ce221b71a257ab1253f6e25ff"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp310-cp310-macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "83aab8e9e909d2f627ced00f185d7e4d",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 2325125,
"upload_time": "2025-01-25T16:27:23",
"upload_time_iso_8601": "2025-01-25T16:27:23.383486Z",
"url": "https://files.pythonhosted.org/packages/6b/2c/e44cb383bdcbac8678c8ddcff32f444d4c7933bc44ca0a4242ba59f2826e/blacksheep-2.0.8-cp310-cp310-macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "562df155ed782b973f75b0804fe5976e50486f102ad54871d09c160388bc4560",
"md5": "107f1a2bce80e59318e41fea9ef52eaf",
"sha256": "4b1af35f0fab104badf2ddb57684b1198b0f2cf05cdeb7f461ff4b1209cc9f7a"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "107f1a2bce80e59318e41fea9ef52eaf",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 4433412,
"upload_time": "2025-01-25T16:27:27",
"upload_time_iso_8601": "2025-01-25T16:27:27.789046Z",
"url": "https://files.pythonhosted.org/packages/56/2d/f155ed782b973f75b0804fe5976e50486f102ad54871d09c160388bc4560/blacksheep-2.0.8-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5b132885b10e5cc20e64b46e130ba02143e7ce125ba97ee79df5d3ff15a325ab",
"md5": "21050e1770c9f51925598ea7489c34d7",
"sha256": "fe1876a99f36f2dae10d2fce34b7461fb6ef3b946aec0011b211195297490167"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp310-cp310-win_amd64.whl",
"has_sig": false,
"md5_digest": "21050e1770c9f51925598ea7489c34d7",
"packagetype": "bdist_wheel",
"python_version": "cp310",
"requires_python": ">=3.7",
"size": 1699174,
"upload_time": "2025-01-25T16:27:30",
"upload_time_iso_8601": "2025-01-25T16:27:30.942538Z",
"url": "https://files.pythonhosted.org/packages/5b/13/2885b10e5cc20e64b46e130ba02143e7ce125ba97ee79df5d3ff15a325ab/blacksheep-2.0.8-cp310-cp310-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4efc577d984cf69b16bedec6cdbbc1924ddd196713360b71c7ce3ffe41bcfede",
"md5": "db44a6f4ac64bcb842876d9090f1028e",
"sha256": "27eff32444c63c8882e135e6346167c7e74298c6a0598d419039717e775ec0ab"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp311-cp311-macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "db44a6f4ac64bcb842876d9090f1028e",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 2335751,
"upload_time": "2025-01-25T16:27:32",
"upload_time_iso_8601": "2025-01-25T16:27:32.593759Z",
"url": "https://files.pythonhosted.org/packages/4e/fc/577d984cf69b16bedec6cdbbc1924ddd196713360b71c7ce3ffe41bcfede/blacksheep-2.0.8-cp311-cp311-macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "08acddd628d56e12a7e58aac18804fe264a6a4a82696cd077f8e046e7b131c2d",
"md5": "24f6e23765108cad932a1e3cbe354578",
"sha256": "fc1423de67d7c8cc46076d82dd01d3646f2f962ce487fd9ae32d4c871f1b016c"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "24f6e23765108cad932a1e3cbe354578",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 4717100,
"upload_time": "2025-01-25T16:27:34",
"upload_time_iso_8601": "2025-01-25T16:27:34.181583Z",
"url": "https://files.pythonhosted.org/packages/08/ac/ddd628d56e12a7e58aac18804fe264a6a4a82696cd077f8e046e7b131c2d/blacksheep-2.0.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "cd9650f4e016a1b2daf6f15a5a20db6d549a9f3aaf67b10248a1762b88634d59",
"md5": "dd50a8f8b0435400eab3367171232bbc",
"sha256": "bdee2613ede8f2854dd62c1987a353816e11e55d18deed02a2ecc23667742fa5"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp311-cp311-win_amd64.whl",
"has_sig": false,
"md5_digest": "dd50a8f8b0435400eab3367171232bbc",
"packagetype": "bdist_wheel",
"python_version": "cp311",
"requires_python": ">=3.7",
"size": 1701774,
"upload_time": "2025-01-25T16:27:36",
"upload_time_iso_8601": "2025-01-25T16:27:36.497122Z",
"url": "https://files.pythonhosted.org/packages/cd/96/50f4e016a1b2daf6f15a5a20db6d549a9f3aaf67b10248a1762b88634d59/blacksheep-2.0.8-cp311-cp311-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "5013045bd2f1a22f6e2d4b33b774ff2dd4bee60e050594f2db57c5a726486507",
"md5": "e0687c42ad3419b256b7f75b365b3c8c",
"sha256": "6db1dd2eadb12b8fe5ddb2176dc35284efd2f283d7552f291479117634b9b426"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp312-cp312-macosx_10_13_universal2.whl",
"has_sig": false,
"md5_digest": "e0687c42ad3419b256b7f75b365b3c8c",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 2323811,
"upload_time": "2025-01-25T16:27:38",
"upload_time_iso_8601": "2025-01-25T16:27:38.628310Z",
"url": "https://files.pythonhosted.org/packages/50/13/045bd2f1a22f6e2d4b33b774ff2dd4bee60e050594f2db57c5a726486507/blacksheep-2.0.8-cp312-cp312-macosx_10_13_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c8f24639e4dc56391749c65b985778830c944e8376b0912d2bd430d5433ccb18",
"md5": "42bbab5bb183f5bcfb8930f17654621f",
"sha256": "0480f7c42f246323e54f7553f5fae1efc2395fbb69794906123e46584f74ee2b"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "42bbab5bb183f5bcfb8930f17654621f",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 5107131,
"upload_time": "2025-01-25T16:27:40",
"upload_time_iso_8601": "2025-01-25T16:27:40.974858Z",
"url": "https://files.pythonhosted.org/packages/c8/f2/4639e4dc56391749c65b985778830c944e8376b0912d2bd430d5433ccb18/blacksheep-2.0.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "8a89b50523a383baf02a636a9a255c8718e485d95880f98fdb5eaed9814f0bea",
"md5": "2f8027190784eefa8299b5ffd618c4d0",
"sha256": "942c5d7541fc8fe9d08bcca55f23a5d27cd5384c5d918938a83c7f6a097aefac"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp312-cp312-win_amd64.whl",
"has_sig": false,
"md5_digest": "2f8027190784eefa8299b5ffd618c4d0",
"packagetype": "bdist_wheel",
"python_version": "cp312",
"requires_python": ">=3.7",
"size": 1694787,
"upload_time": "2025-01-25T16:27:42",
"upload_time_iso_8601": "2025-01-25T16:27:42.461867Z",
"url": "https://files.pythonhosted.org/packages/8a/89/b50523a383baf02a636a9a255c8718e485d95880f98fdb5eaed9814f0bea/blacksheep-2.0.8-cp312-cp312-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "2d99f36c4977b336c5cb6b8026a5509ed5447f4bd2d6dcbd99f95a114c140731",
"md5": "70b6286bdb67d8426681fd7ec0f7c4de",
"sha256": "4dc7b0c56b562c596b8f2be04a94a4f6cd9ff078a8c69426a8be471ee57838d0"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp313-cp313-macosx_10_13_universal2.whl",
"has_sig": false,
"md5_digest": "70b6286bdb67d8426681fd7ec0f7c4de",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.7",
"size": 2308303,
"upload_time": "2025-01-25T16:27:43",
"upload_time_iso_8601": "2025-01-25T16:27:43.962172Z",
"url": "https://files.pythonhosted.org/packages/2d/99/f36c4977b336c5cb6b8026a5509ed5447f4bd2d6dcbd99f95a114c140731/blacksheep-2.0.8-cp313-cp313-macosx_10_13_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "c4e703c308a940e5d8fe3d5b2f98c474685be0cfc2fef32aeaeca2ebeddb0a35",
"md5": "e6df9b5ab99c39c3c66f4d9752b4f252",
"sha256": "6befad366809c7a04def4be36ab5948e8484f9b06da0528553a99d93186373c1"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "e6df9b5ab99c39c3c66f4d9752b4f252",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.7",
"size": 5039826,
"upload_time": "2025-01-25T16:27:46",
"upload_time_iso_8601": "2025-01-25T16:27:46.470157Z",
"url": "https://files.pythonhosted.org/packages/c4/e7/03c308a940e5d8fe3d5b2f98c474685be0cfc2fef32aeaeca2ebeddb0a35/blacksheep-2.0.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "46866aacd90f948a8f6e47906bf57cfc72b307b2c89e6da9c906e92179b4a161",
"md5": "e5647e2f74f89ecd256688d939c71765",
"sha256": "2d0e196dceb0c47e2f4ba7d1d5175ae2e8583d537a9a975066e67a4d65113e4b"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp313-cp313-win_amd64.whl",
"has_sig": false,
"md5_digest": "e5647e2f74f89ecd256688d939c71765",
"packagetype": "bdist_wheel",
"python_version": "cp313",
"requires_python": ">=3.7",
"size": 1691410,
"upload_time": "2025-01-25T16:27:48",
"upload_time_iso_8601": "2025-01-25T16:27:48.821241Z",
"url": "https://files.pythonhosted.org/packages/46/86/6aacd90f948a8f6e47906bf57cfc72b307b2c89e6da9c906e92179b4a161/blacksheep-2.0.8-cp313-cp313-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "4726e7c9ed32b314f833475e55d5ca444eda3904798fb46c762741ea18c0d995",
"md5": "fcb0b9eeac494aab286b38f32cf7ae03",
"sha256": "41a16fd950f4172fb235ca9746e7c7b72f7498a8acc83c75c32104385e7d0ded"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp38-cp38-macosx_11_0_universal2.whl",
"has_sig": false,
"md5_digest": "fcb0b9eeac494aab286b38f32cf7ae03",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 2328233,
"upload_time": "2025-01-25T16:27:50",
"upload_time_iso_8601": "2025-01-25T16:27:50.364749Z",
"url": "https://files.pythonhosted.org/packages/47/26/e7c9ed32b314f833475e55d5ca444eda3904798fb46c762741ea18c0d995/blacksheep-2.0.8-cp38-cp38-macosx_11_0_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "ace3e52fd2eea04c05d9755b73e99ba13d439c9e0705a99c2ef98816f700161e",
"md5": "958b5f85f153a35faef1f681e36a16d3",
"sha256": "d0a5af23e8ce1729ea22e50ac358da012f6b20a93daf2bfc29543de3c12a5fd2"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "958b5f85f153a35faef1f681e36a16d3",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 4688608,
"upload_time": "2025-01-25T16:27:52",
"upload_time_iso_8601": "2025-01-25T16:27:52.986005Z",
"url": "https://files.pythonhosted.org/packages/ac/e3/e52fd2eea04c05d9755b73e99ba13d439c9e0705a99c2ef98816f700161e/blacksheep-2.0.8-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b922337b8b117334bfb0190b93d256dd1efbf35a706953974477d73e8b02d1bf",
"md5": "969b61449540d9e43cb92d98b3eef6ba",
"sha256": "3345e5bb077b4dc6f83960a3286e8b137f2a20e4854e6deb3b7de72020d34e0d"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp38-cp38-win_amd64.whl",
"has_sig": false,
"md5_digest": "969b61449540d9e43cb92d98b3eef6ba",
"packagetype": "bdist_wheel",
"python_version": "cp38",
"requires_python": ">=3.7",
"size": 1702370,
"upload_time": "2025-01-25T16:27:55",
"upload_time_iso_8601": "2025-01-25T16:27:55.427661Z",
"url": "https://files.pythonhosted.org/packages/b9/22/337b8b117334bfb0190b93d256dd1efbf35a706953974477d73e8b02d1bf/blacksheep-2.0.8-cp38-cp38-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "e72a99684934635f3867927aa5dbcd0e4cf423d4fc9b9b8e6ef177269d628ddf",
"md5": "f4701ba947433375963a9b0d050c176b",
"sha256": "16bcf5a0b14922911e5c02ed883d7213fbbb42c4cae4192bec51626c596c8141"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp39-cp39-macosx_10_9_universal2.whl",
"has_sig": false,
"md5_digest": "f4701ba947433375963a9b0d050c176b",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 2327520,
"upload_time": "2025-01-25T16:27:58",
"upload_time_iso_8601": "2025-01-25T16:27:58.407397Z",
"url": "https://files.pythonhosted.org/packages/e7/2a/99684934635f3867927aa5dbcd0e4cf423d4fc9b9b8e6ef177269d628ddf/blacksheep-2.0.8-cp39-cp39-macosx_10_9_universal2.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "b06bfacc1a674e1a5992601e223ad4bc010604d1d4df8bf1aaac5ae9a3696ef4",
"md5": "8fefd9119c420284cf9539e9963b7a60",
"sha256": "f9dbf9e32232ae0a20519d7bd67f6645a6944919c59958387e8d7faf30810a3c"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"has_sig": false,
"md5_digest": "8fefd9119c420284cf9539e9963b7a60",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 4446152,
"upload_time": "2025-01-25T16:28:00",
"upload_time_iso_8601": "2025-01-25T16:28:00.036251Z",
"url": "https://files.pythonhosted.org/packages/b0/6b/facc1a674e1a5992601e223ad4bc010604d1d4df8bf1aaac5ae9a3696ef4/blacksheep-2.0.8-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "256f80f3ac8e77dce8fbf1094be0a218ba194f097a235f65d946b5d9bcde852f",
"md5": "5897c27327dfba428fe4e4f7abe17e78",
"sha256": "bedd5c8408a3e75e07a79e5df50c19a8a2d1448e060d7b537cdd81d6b71b56aa"
},
"downloads": -1,
"filename": "blacksheep-2.0.8-cp39-cp39-win_amd64.whl",
"has_sig": false,
"md5_digest": "5897c27327dfba428fe4e4f7abe17e78",
"packagetype": "bdist_wheel",
"python_version": "cp39",
"requires_python": ">=3.7",
"size": 1701546,
"upload_time": "2025-01-25T16:28:01",
"upload_time_iso_8601": "2025-01-25T16:28:01.581114Z",
"url": "https://files.pythonhosted.org/packages/25/6f/80f3ac8e77dce8fbf1094be0a218ba194f097a235f65d946b5d9bcde852f/blacksheep-2.0.8-cp39-cp39-win_amd64.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": null,
"digests": {
"blake2b_256": "830ef05f5ccb5bcd743b53cf583070529b8d5df8240b75944ccd5bbd65626be3",
"md5": "1e3f381174edb4ea034324c8ff5358fc",
"sha256": "825da67d857d470a2a75f7936bbe224e57d83da153ae85e4ba8567826cd995f3"
},
"downloads": -1,
"filename": "blacksheep-2.0.8.tar.gz",
"has_sig": false,
"md5_digest": "1e3f381174edb4ea034324c8ff5358fc",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.7",
"size": 1180488,
"upload_time": "2025-01-25T16:28:03",
"upload_time_iso_8601": "2025-01-25T16:28:03.091558Z",
"url": "https://files.pythonhosted.org/packages/83/0e/f05f5ccb5bcd743b53cf583070529b8d5df8240b75944ccd5bbd65626be3/blacksheep-2.0.8.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2025-01-25 16:28:03",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "Neoteroi",
"github_project": "BlackSheep",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"requirements": [
{
"name": "annotated-types",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "asgiref",
"specs": [
[
"==",
"3.8.1"
]
]
},
{
"name": "attrs",
"specs": [
[
"==",
"24.2.0"
]
]
},
{
"name": "blinker",
"specs": [
[
"==",
"1.8.2"
]
]
},
{
"name": "certifi",
"specs": [
[
"==",
"2024.12.14"
]
]
},
{
"name": "cffi",
"specs": [
[
"==",
"1.17.1"
]
]
},
{
"name": "charset-normalizer",
"specs": [
[
"==",
"3.4.0"
]
]
},
{
"name": "click",
"specs": [
[
"==",
"8.1.7"
]
]
},
{
"name": "coverage",
"specs": [
[
"==",
"7.6.1"
]
]
},
{
"name": "cryptography",
"specs": [
[
"==",
"44.0.0"
]
]
},
{
"name": "Cython",
"specs": [
[
"==",
"3.0.11"
]
]
},
{
"name": "essentials",
"specs": [
[
"==",
"1.1.5"
]
]
},
{
"name": "essentials-openapi",
"specs": [
[
"==",
"1.0.9"
]
]
},
{
"name": "Flask",
"specs": [
[
"==",
"3.0.3"
]
]
},
{
"name": "gevent",
"specs": [
[
"==",
"24.2.1"
]
]
},
{
"name": "greenlet",
"specs": [
[
"==",
"3.1.1"
]
]
},
{
"name": "guardpost",
"specs": [
[
"==",
"1.0.2"
]
]
},
{
"name": "h11",
"specs": [
[
"==",
"0.14.0"
]
]
},
{
"name": "h2",
"specs": [
[
"==",
"4.1.0"
]
]
},
{
"name": "hpack",
"specs": [
[
"==",
"4.0.0"
]
]
},
{
"name": "httptools",
"specs": [
[
"==",
"0.6.4"
]
]
},
{
"name": "hypercorn",
"specs": [
[
"==",
"0.14.4"
]
]
},
{
"name": "hyperframe",
"specs": [
[
"==",
"6.0.1"
]
]
},
{
"name": "idna",
"specs": [
[
"==",
"3.10"
]
]
},
{
"name": "iniconfig",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "itsdangerous",
"specs": [
[
"==",
"2.2.0"
]
]
},
{
"name": "Jinja2",
"specs": [
[
"==",
"3.1.4"
]
]
},
{
"name": "MarkupSafe",
"specs": [
[
"==",
"2.1.5"
]
]
},
{
"name": "mccabe",
"specs": [
[
"==",
"0.7.0"
]
]
},
{
"name": "packaging",
"specs": [
[
"==",
"24.2"
]
]
},
{
"name": "pluggy",
"specs": [
[
"==",
"1.5.0"
]
]
},
{
"name": "priority",
"specs": [
[
"==",
"2.0.0"
]
]
},
{
"name": "py",
"specs": [
[
"==",
"1.11.0"
]
]
},
{
"name": "pycparser",
"specs": [
[
"==",
"2.22"
]
]
},
{
"name": "pydantic",
"specs": [
[
"==",
"2.10.3"
]
]
},
{
"name": "pydantic-core",
"specs": [
[
"==",
"2.27.1"
]
]
},
{
"name": "PyJWT",
"specs": [
[
"==",
"2.9.0"
]
]
},
{
"name": "pyparsing",
"specs": [
[
"==",
"3.1.4"
]
]
},
{
"name": "pytest",
"specs": [
[
"==",
"8.3.4"
]
]
},
{
"name": "pytest-asyncio",
"specs": [
[
"==",
"0.21.1"
]
]
},
{
"name": "pytest-cov",
"specs": [
[
"==",
"5.0.0"
]
]
},
{
"name": "python-dateutil",
"specs": [
[
"==",
"2.9.0.post0"
]
]
},
{
"name": "PyYAML",
"specs": [
[
"==",
"6.0.2"
]
]
},
{
"name": "regex",
"specs": [
[
"==",
"2024.11.6"
]
]
},
{
"name": "requests",
"specs": [
[
"==",
"2.32.3"
]
]
},
{
"name": "rodi",
"specs": [
[
"==",
"2.0.6"
]
]
},
{
"name": "setuptools",
"specs": [
[
"==",
"75.3.0"
]
]
},
{
"name": "six",
"specs": [
[
"==",
"1.17.0"
]
]
},
{
"name": "toml",
"specs": [
[
"==",
"0.10.2"
]
]
},
{
"name": "tomli",
"specs": [
[
"==",
"2.2.1"
]
]
},
{
"name": "typing-extensions",
"specs": [
[
"==",
"4.12.2"
]
]
},
{
"name": "urllib3",
"specs": [
[
"==",
"2.2.3"
]
]
},
{
"name": "uvicorn",
"specs": [
[
"==",
"0.33.0"
]
]
},
{
"name": "wcwidth",
"specs": [
[
"==",
"0.2.13"
]
]
},
{
"name": "websockets",
"specs": [
[
"==",
"13.1"
]
]
},
{
"name": "Werkzeug",
"specs": [
[
"==",
"3.0.6"
]
]
},
{
"name": "wsproto",
"specs": [
[
"==",
"1.2.0"
]
]
},
{
"name": "zope.event",
"specs": [
[
"==",
"5.0"
]
]
},
{
"name": "zope.interface",
"specs": [
[
"==",
"7.2"
]
]
},
{
"name": "build",
"specs": [
[
"==",
"1.2.2.post1"
]
]
}
],
"lcname": "blacksheep"
}