committed by
GitHub
62 changed files with 1951 additions and 441 deletions
@ -29,21 +29,20 @@ jobs: |
|||
run_id: ${{ github.event.workflow_run.id }} |
|||
name: docs-site |
|||
path: ./site/ |
|||
- name: Deploy to Netlify |
|||
- name: Deploy to Cloudflare Pages |
|||
if: steps.download.outputs.found_artifact == 'true' |
|||
id: netlify |
|||
uses: nwtgck/[email protected] |
|||
id: deploy |
|||
uses: cloudflare/pages-action@v1 |
|||
with: |
|||
publish-dir: './site' |
|||
production-deploy: ${{ github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' }} |
|||
github-token: ${{ secrets.FASTAPI_PREVIEW_DOCS_NETLIFY }} |
|||
enable-commit-comment: false |
|||
env: |
|||
NETLIFY_AUTH_TOKEN: ${{ secrets.NETLIFY_AUTH_TOKEN }} |
|||
NETLIFY_SITE_ID: ${{ secrets.NETLIFY_SITE_ID }} |
|||
apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} |
|||
accountId: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }} |
|||
projectName: fastapitiangolo |
|||
directory: './site' |
|||
gitHubToken: ${{ secrets.GITHUB_TOKEN }} |
|||
branch: ${{ ( github.event.workflow_run.head_repository.full_name == github.repository && github.event.workflow_run.head_branch == 'master' && 'main' ) || ( github.event.workflow_run.head_sha ) }} |
|||
- name: Comment Deploy |
|||
if: steps.netlify.outputs.deploy-url != '' |
|||
if: steps.deploy.outputs.url != '' |
|||
uses: ./.github/actions/comment-docs-preview-in-pr |
|||
with: |
|||
token: ${{ secrets.FASTAPI_PREVIEW_DOCS_COMMENT_DEPLOY }} |
|||
deploy_url: "${{ steps.netlify.outputs.deploy-url }}" |
|||
deploy_url: "${{ steps.deploy.outputs.url }}" |
|||
|
@ -19,6 +19,10 @@ jobs: |
|||
if: github.repository_owner == 'tiangolo' |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Dump GitHub context |
|||
env: |
|||
GITHUB_CONTEXT: ${{ toJson(github) }} |
|||
run: echo "$GITHUB_CONTEXT" |
|||
- uses: tiangolo/[email protected] |
|||
with: |
|||
token: ${{ secrets.FASTAPI_ISSUE_MANAGER }} |
|||
|
Before Width: | Height: | Size: 249 KiB After Width: | Height: | Size: 40 KiB |
@ -0,0 +1,34 @@ |
|||
# Глобальные зависимости |
|||
|
|||
Для некоторых типов приложений может потребоваться добавить зависимости ко всему приложению. |
|||
|
|||
Подобно тому, как вы можете [добавлять зависимости через параметр `dependencies` в *декораторах операций пути*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, вы можете добавлять зависимости сразу ко всему `FastAPI` приложению. |
|||
|
|||
В этом случае они будут применяться ко всем *операциям пути* в приложении: |
|||
|
|||
=== "Python 3.9+" |
|||
|
|||
```Python hl_lines="16" |
|||
{!> ../../../docs_src/dependencies/tutorial012_an_py39.py!} |
|||
``` |
|||
|
|||
=== "Python 3.6+" |
|||
|
|||
```Python hl_lines="16" |
|||
{!> ../../../docs_src/dependencies/tutorial012_an.py!} |
|||
``` |
|||
|
|||
=== "Python 3.6 non-Annotated" |
|||
|
|||
!!! tip "Подсказка" |
|||
Рекомендуется использовать 'Annotated' версию, если это возможно. |
|||
|
|||
```Python hl_lines="15" |
|||
{!> ../../../docs_src/dependencies/tutorial012.py!} |
|||
``` |
|||
|
|||
Все способы [добавления зависимостей в *декораторах операций пути*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} по-прежнему применимы, но в данном случае зависимости применяются ко всем *операциям пути* приложения. |
|||
|
|||
## Зависимости для групп *операций пути* |
|||
|
|||
Позднее, читая о том, как структурировать более крупные [приложения, содержащие много файлов](../../tutorial/bigger-applications.md){.internal-link target=_blank}, вы узнаете, как объявить один параметр dependencies для целой группы *операций пути*. |
@ -0,0 +1,101 @@ |
|||
# Настройка авторизации |
|||
|
|||
Существует множество способов обеспечения безопасности, аутентификации и авторизации. |
|||
|
|||
Обычно эта тема является достаточно сложной и трудной. |
|||
|
|||
Во многих фреймворках и системах только работа с определением доступов к приложению и аутентификацией требует значительных затрат усилий и написания множества кода (во многих случаях его объём может составлять более 50% от всего написанного кода). |
|||
|
|||
**FastAPI** предоставляет несколько инструментов, которые помогут вам настроить **Авторизацию** легко, быстро, стандартным способом, без необходимости изучать все её тонкости. |
|||
|
|||
Но сначала давайте рассмотрим некоторые небольшие концепции. |
|||
|
|||
## Куда-то торопишься? |
|||
|
|||
Если вам не нужна информация о каких-либо из следующих терминов и вам просто нужно добавить защиту с аутентификацией на основе логина и пароля *прямо сейчас*, переходите к следующим главам. |
|||
|
|||
## OAuth2 |
|||
|
|||
OAuth2 - это протокол, который определяет несколько способов обработки аутентификации и авторизации. |
|||
|
|||
Он довольно обширен и охватывает несколько сложных вариантов использования. |
|||
|
|||
OAuth2 включает в себя способы аутентификации с использованием "третьей стороны". |
|||
|
|||
Это то, что используют под собой все кнопки "вход с помощью Facebook, Google, Twitter, GitHub" на страницах авторизации. |
|||
|
|||
### OAuth 1 |
|||
|
|||
Ранее использовался протокол OAuth 1, который сильно отличается от OAuth2 и является более сложным, поскольку он включал прямые описания того, как шифровать сообщение. |
|||
|
|||
В настоящее время он не очень популярен и не используется. |
|||
|
|||
OAuth2 не указывает, как шифровать сообщение, он ожидает, что ваше приложение будет обслуживаться по протоколу HTTPS. |
|||
|
|||
!!! tip "Подсказка" |
|||
В разделе **Развертывание** вы увидите [как настроить протокол HTTPS бесплатно, используя Traefik и Let's Encrypt.](https://fastapi.tiangolo.com/ru/deployment/https/) |
|||
|
|||
|
|||
## OpenID Connect |
|||
|
|||
OpenID Connect - это еще один протокол, основанный на **OAuth2**. |
|||
|
|||
Он просто расширяет OAuth2, уточняя некоторые вещи, не имеющие однозначного определения в OAuth2, в попытке сделать его более совместимым. |
|||
|
|||
Например, для входа в Google используется OpenID Connect (который под собой использует OAuth2). |
|||
|
|||
Но вход в Facebook не поддерживает OpenID Connect. У него есть собственная вариация OAuth2. |
|||
|
|||
### OpenID (не "OpenID Connect") |
|||
|
|||
Также ранее использовался стандарт "OpenID", который пытался решить ту же проблему, что и **OpenID Connect**, но не был основан на OAuth2. |
|||
|
|||
Таким образом, это была полноценная дополнительная система. |
|||
|
|||
В настоящее время не очень популярен и не используется. |
|||
|
|||
## OpenAPI |
|||
|
|||
OpenAPI (ранее известный как Swagger) - это открытая спецификация для создания API (в настоящее время является частью Linux Foundation). |
|||
|
|||
**FastAPI** основан на **OpenAPI**. |
|||
|
|||
Это то, что делает возможным наличие множества автоматических интерактивных интерфейсов документирования, сгенерированного кода и т.д. |
|||
|
|||
В OpenAPI есть способ использовать несколько "схем" безопасности. |
|||
|
|||
Таким образом, вы можете воспользоваться преимуществами Всех этих стандартных инструментов, включая интерактивные системы документирования. |
|||
|
|||
OpenAPI может использовать следующие схемы авторизации: |
|||
|
|||
* `apiKey`: уникальный идентификатор для приложения, который может быть получен из: |
|||
* Параметров запроса. |
|||
* Заголовка. |
|||
* Cookies. |
|||
* `http`: стандартные системы аутентификации по протоколу HTTP, включая: |
|||
* `bearer`: заголовок `Authorization` со значением `Bearer {уникальный токен}`. Это унаследовано от OAuth2. |
|||
* Базовая аутентификация по протоколу HTTP. |
|||
* HTTP Digest и т.д. |
|||
* `oauth2`: все способы обеспечения безопасности OAuth2 называемые "потоки" (англ. "flows"). |
|||
* Некоторые из этих "потоков" подходят для реализации аутентификации через сторонний сервис использующий OAuth 2.0 (например, Google, Facebook, Twitter, GitHub и т.д.): |
|||
* `implicit` |
|||
* `clientCredentials` |
|||
* `authorizationCode` |
|||
* Но есть один конкретный "поток", который может быть идеально использован для обработки аутентификации непосредственно в том же приложении: |
|||
* `password`: в некоторых следующих главах будут рассмотрены примеры этого. |
|||
* `openIdConnect`: способ определить, как автоматически обнаруживать данные аутентификации OAuth2. |
|||
* Это автоматическое обнаружение определено в спецификации OpenID Connect. |
|||
|
|||
|
|||
!!! tip "Подсказка" |
|||
Интеграция сторонних сервисов для аутентификации/авторизации таких как Google, Facebook, Twitter, GitHub и т.д. осуществляется достаточно легко. |
|||
|
|||
Самой сложной проблемой является создание такого провайдера аутентификации/авторизации, но **FastAPI** предоставляет вам инструменты, позволяющие легко это сделать, выполняя при этом всю тяжелую работу за вас. |
|||
|
|||
## Преимущества **FastAPI** |
|||
|
|||
Fast API предоставляет несколько инструментов для каждой из этих схем безопасности в модуле `fastapi.security`, которые упрощают использование этих механизмов безопасности. |
|||
|
|||
В следующих главах вы увидите, как обезопасить свой API, используя инструменты, предоставляемые **FastAPI**. |
|||
|
|||
И вы также увидите, как он автоматически интегрируется в систему интерактивной документации. |
@ -0,0 +1,52 @@ |
|||
# بینچ مارکس |
|||
|
|||
انڈیپنڈنٹ ٹیک امپور بینچ مارک **FASTAPI** Uvicorn کے تحت چلنے والی ایپلی کیشنز کو <a href="https://www.techempower.com/benchmarks/#section=test&runid=7464e520-0dc2-473d-bd34-dbdfd7e85911&hw=ph&test=query&l=zijzen-7" class="external-link" target="_blank"> ایک تیز رفتار Python فریم ورک میں سے ایک </a> ، صرف Starlette اور Uvicorn کے نیچے ( FASTAPI کے ذریعہ اندرونی طور پر استعمال کیا جاتا ہے ) (*) |
|||
|
|||
لیکن جب بینچ مارک اور موازنہ کی جانچ پڑتال کرتے ہو تو آپ کو مندرجہ ذیل بات ذہن میں رکھنی چاہئے. |
|||
|
|||
## بینچ مارک اور رفتار |
|||
|
|||
جب آپ بینچ مارک کی جانچ کرتے ہیں تو ، مساوی کے مقابلے میں مختلف اقسام کے متعدد اوزار دیکھنا عام ہے. |
|||
|
|||
خاص طور پر ، Uvicorn, Starlette اور FastAPI کو دیکھنے کے لئے ( بہت سے دوسرے ٹولز ) کے ساتھ موازنہ کیا گیا. |
|||
|
|||
ٹول کے ذریعہ حل ہونے والا آسان مسئلہ ، اس کی بہتر کارکردگی ہوگی. اور زیادہ تر بینچ مارک ٹول کے ذریعہ فراہم کردہ اضافی خصوصیات کی جانچ نہیں کرتے ہیں. |
|||
|
|||
درجہ بندی کی طرح ہے: |
|||
|
|||
<ul style="direction: rtl;"> |
|||
<li><div style="text-align: right;">ASGI :<b>Uvicorn</b> سرور</div></li> |
|||
<ul> |
|||
<li><div style="text-align: right;"><b>Starlette</b>: (Uvicorn استعمال کرتا ہے) ایک ویب مائیکرو فریم ورک </div></li> |
|||
<ul> |
|||
<li><div style="text-align: right;"><b>FastAPI</b>: (Starlette کا استعمال کرتا ہے) ایک API مائکرو فریم ورک جس میں APIs بنانے کے لیے کئی اضافی خصوصیات ہیں، ڈیٹا کی توثیق وغیرہ کے ساتھ۔</div></li> |
|||
</ul> |
|||
</ul> |
|||
</ul> |
|||
|
|||
<ul style="direction: rtl;"> |
|||
<li><div style="text-align: right;"><b>Uvicorn</b>:</div></li> |
|||
<ul> |
|||
<li><div style="text-align: right;">بہترین کارکردگی ہوگی، کیونکہ اس میں سرور کے علاوہ زیادہ اضافی کوڈ نہیں ہے۔</div></li> |
|||
<li><div style="text-align: right;">آپ براہ راست Uvicorn میں درخواست نہیں لکھیں گے۔ اس کا مطلب یہ ہوگا کہ آپ کے کوڈ میں کم و بیش، کم از کم، Starlette (یا <b>FastAPI</b>) کی طرف سے فراہم کردہ تمام کوڈ شامل کرنا ہوں گے۔ اور اگر آپ نے ایسا کیا تو، آپ کی حتمی ایپلیکیشن کا وہی اوور ہیڈ ہوگا جیسا کہ ایک فریم ورک استعمال کرنے اور آپ کے ایپ کوڈ اور کیڑے کو کم سے کم کرنا۔</div></li> |
|||
<li><div style="text-align: right;">اگر آپ Uvicorn کا موازنہ کر رہے ہیں تو اس کا موازنہ Daphne، Hypercorn، uWSGI وغیرہ ایپلیکیشن سرورز سے کریں۔</div></li> |
|||
</ul> |
|||
</ul> |
|||
<ul style="direction: rtl;"> |
|||
<li><div style="text-align: right;"><b>Starlette</b>:</div></li> |
|||
<ul> |
|||
<li><div style="text-align: right;">Uvicorn کے بعد اگلی بہترین کارکردگی ہوگی۔ درحقیقت، Starlette چلانے کے لیے Uvicorn کا استعمال کرتی ہے۔ لہذا، یہ شاید زیادہ کوڈ پر عمل درآمد کرکے Uvicorn سے "سست" ہوسکتا ہے۔</div></li> |
|||
<li><div style="text-align: right;">لیکن یہ آپ کو آسان ویب ایپلیکیشنز بنانے کے لیے ٹولز فراہم کرتا ہے، راستوں پر مبنی روٹنگ کے ساتھ، وغیرہ۔</div></li> |
|||
<li><div style="text-align: right;">اگر آپ سٹارلیٹ کا موازنہ کر رہے ہیں تو اس کا موازنہ Sanic، Flask، Django وغیرہ سے کریں۔ ویب فریم ورکس (یا مائیکرو فریم ورکس)</div></li> |
|||
</ul> |
|||
</ul> |
|||
<ul style="direction: rtl;"> |
|||
<li><div style="text-align: right;"><b>FastAPI</b>:</div></li> |
|||
<ul> |
|||
<li><div style="text-align: right;">جس طرح سے Uvicorn Starlette کا استعمال کرتا ہے اور اس سے تیز نہیں ہو سکتا، Starlette <b>FastAPI</b> کا استعمال کرتا ہے، اس لیے یہ اس سے تیز نہیں ہو سکتا۔</div></li> |
|||
<li><div style="text-align: right;">Starlette FastAPI کے اوپری حصے میں مزید خصوصیات فراہم کرتا ہے۔ وہ خصوصیات جن کی آپ کو APIs بناتے وقت تقریباً ہمیشہ ضرورت ہوتی ہے، جیسے ڈیٹا کی توثیق اور سیریلائزیشن۔ اور اسے استعمال کرنے سے، آپ کو خودکار دستاویزات مفت میں مل جاتی ہیں (خودکار دستاویزات چلنے والی ایپلی کیشنز میں اوور ہیڈ کو بھی شامل نہیں کرتی ہیں، یہ اسٹارٹ اپ پر تیار ہوتی ہیں)۔</div></li> |
|||
<li><div style="text-align: right;">اگر آپ نے FastAPI کا استعمال نہیں کیا ہے اور Starlette کو براہ راست استعمال کیا ہے (یا کوئی دوسرا ٹول، جیسے Sanic، Flask، Responder، وغیرہ) آپ کو تمام ڈیٹا کی توثیق اور سیریلائزیشن کو خود نافذ کرنا ہوگا۔ لہذا، آپ کی حتمی ایپلیکیشن اب بھی وہی اوور ہیڈ ہوگی جیسا کہ اسے FastAPI کا استعمال کرتے ہوئے بنایا گیا تھا۔ اور بہت سے معاملات میں، یہ ڈیٹا کی توثیق اور سیریلائزیشن ایپلی کیشنز میں لکھے گئے کوڈ کی سب سے بڑی مقدار ہے۔</div></li> |
|||
<li><div style="text-align: right;">لہذا، FastAPI کا استعمال کرکے آپ ترقیاتی وقت، Bugs، کوڈ کی لائنوں کی بچت کر رہے ہیں، اور شاید آپ کو وہی کارکردگی (یا بہتر) ملے گی اگر آپ اسے استعمال نہیں کرتے (جیسا کہ آپ کو یہ سب اپنے کوڈ میں لاگو کرنا ہوگا۔ )</div></li> |
|||
<li><div style="text-align: right;">اگر آپ FastAPI کا موازنہ کر رہے ہیں، تو اس کا موازنہ ویب ایپلیکیشن فریم ورک (یا ٹولز کے سیٹ) سے کریں جو ڈیٹا کی توثیق، سیریلائزیشن اور دستاویزات فراہم کرتا ہے، جیسے Flask-apispec، NestJS، Molten، وغیرہ۔ مربوط خودکار ڈیٹا کی توثیق، سیریلائزیشن اور دستاویزات کے ساتھ فریم ورک۔</div></li> |
|||
</ul> |
|||
</ul> |
@ -0,0 +1 @@ |
|||
INHERIT: ../en/mkdocs.yml |
@ -0,0 +1,77 @@ |
|||
import pytest |
|||
from fastapi import FastAPI |
|||
from fastapi.testclient import TestClient |
|||
|
|||
from .utils import needs_pydanticv2 |
|||
|
|||
|
|||
@pytest.fixture(name="client") |
|||
def get_client(): |
|||
app = FastAPI() |
|||
|
|||
from pydantic import BaseModel, computed_field |
|||
|
|||
class Rectangle(BaseModel): |
|||
width: int |
|||
length: int |
|||
|
|||
@computed_field |
|||
@property |
|||
def area(self) -> int: |
|||
return self.width * self.length |
|||
|
|||
@app.get("/") |
|||
def read_root() -> Rectangle: |
|||
return Rectangle(width=3, length=4) |
|||
|
|||
client = TestClient(app) |
|||
return client |
|||
|
|||
|
|||
@needs_pydanticv2 |
|||
def test_get(client: TestClient): |
|||
response = client.get("/") |
|||
assert response.status_code == 200, response.text |
|||
assert response.json() == {"width": 3, "length": 4, "area": 12} |
|||
|
|||
|
|||
@needs_pydanticv2 |
|||
def test_openapi_schema(client: TestClient): |
|||
response = client.get("/openapi.json") |
|||
assert response.status_code == 200, response.text |
|||
assert response.json() == { |
|||
"openapi": "3.1.0", |
|||
"info": {"title": "FastAPI", "version": "0.1.0"}, |
|||
"paths": { |
|||
"/": { |
|||
"get": { |
|||
"summary": "Read Root", |
|||
"operationId": "read_root__get", |
|||
"responses": { |
|||
"200": { |
|||
"description": "Successful Response", |
|||
"content": { |
|||
"application/json": { |
|||
"schema": {"$ref": "#/components/schemas/Rectangle"} |
|||
} |
|||
}, |
|||
} |
|||
}, |
|||
} |
|||
} |
|||
}, |
|||
"components": { |
|||
"schemas": { |
|||
"Rectangle": { |
|||
"properties": { |
|||
"width": {"type": "integer", "title": "Width"}, |
|||
"length": {"type": "integer", "title": "Length"}, |
|||
"area": {"type": "integer", "title": "Area", "readOnly": True}, |
|||
}, |
|||
"type": "object", |
|||
"required": ["width", "length", "area"], |
|||
"title": "Rectangle", |
|||
} |
|||
} |
|||
}, |
|||
} |
Loading…
Reference in new issue