Skip to content

Commit c1722be

Browse files
authored
Merge branch 'master' into tutorial/handling-errors
2 parents 6fe9976 + 39ec5b3 commit c1722be

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+4321
-316
lines changed

.github/actions/notify-translations/app/main.py

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
import logging
2+
import time
23
from pathlib import Path
4+
import random
35
from typing import Dict, Optional
46

57
import yaml
@@ -45,8 +47,11 @@ class PartialGitHubEvent(BaseModel):
4547
github_event = PartialGitHubEvent.parse_raw(contents)
4648
translations_map: Dict[str, int] = yaml.safe_load(translations_path.read_text())
4749
logging.debug(f"Using translations map: {translations_map}")
50+
sleep_time = random.random() * 10 # random number between 0 and 10 seconds
4851
pr = repo.get_pull(github_event.pull_request.number)
49-
logging.debug(f"Processing PR: {pr.number}")
52+
logging.debug(
53+
f"Processing PR: {pr.number}, with anti-race condition sleep time: {sleep_time}"
54+
)
5055
if pr.state == "open":
5156
logging.debug(f"PR is open: {pr.number}")
5257
label_strs = set([label.name for label in pr.get_labels()])
@@ -67,19 +72,31 @@ class PartialGitHubEvent(BaseModel):
6772
for lang in langs:
6873
if lang in translations_map:
6974
num = translations_map[lang]
70-
logging.info(f"Found a translation issue for language: {lang} in issue: {num}")
75+
logging.info(
76+
f"Found a translation issue for language: {lang} in issue: {num}"
77+
)
7178
issue = repo.get_issue(num)
7279
message = f"Good news everyone! 😉 There's a new translation PR to be reviewed: #{pr.number} 🎉"
7380
already_notified = False
74-
logging.info(f"Checking current comments in issue: {num} to see if already notified about this PR: {pr.number}")
81+
time.sleep(sleep_time)
82+
logging.info(
83+
f"Sleeping for {sleep_time} seconds to avoid race conditions and multiple comments"
84+
)
85+
logging.info(
86+
f"Checking current comments in issue: {num} to see if already notified about this PR: {pr.number}"
87+
)
7588
for comment in issue.get_comments():
7689
if message in comment.body:
7790
already_notified = True
7891
if not already_notified:
79-
logging.info(f"Writing comment in issue: {num} about PR: {pr.number}")
92+
logging.info(
93+
f"Writing comment in issue: {num} about PR: {pr.number}"
94+
)
8095
issue.create_comment(message)
8196
else:
82-
logging.info(f"Issue: {num} was already notified of PR: {pr.number}")
97+
logging.info(
98+
f"Issue: {num} was already notified of PR: {pr.number}"
99+
)
83100
else:
84101
logging.info(
85102
f"Changing labels in a closed PR doesn't trigger comments, PR: {pr.number}"

.github/workflows/test.yml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@ name: Test
22

33
on:
44
push:
5+
branches:
6+
- master
57
pull_request:
68
types: [opened, synchronize]
79

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
<em>FastAPI framework, high performance, easy to learn, fast to code, ready for production</em>
66
</p>
77
<p align="center">
8-
<a href="https://github.com/tiangolo/fastapi/actions?query=workflow%3ATest" target="_blank">
9-
<img src="https://github.com/tiangolo/fastapi/workflows/Test/badge.svg" alt="Test">
8+
<a href="https://github.com/tiangolo/fastapi/actions?query=workflow%3ATest+event%3Apush+branch%3Amaster" target="_blank">
9+
<img src="https://github.com/tiangolo/fastapi/workflows/Test/badge.svg?event=push&branch=master" alt="Test">
1010
</a>
1111
<a href="https://codecov.io/gh/tiangolo/fastapi" target="_blank">
1212
<img src="https://img.shields.io/codecov/c/github/tiangolo/fastapi?color=%2334D058" alt="Coverage">
@@ -50,6 +50,7 @@ The key features are:
5050
<a href="https://www.vim.so/?utm_source=FastAPI" target="_blank" title="We help you master vim with interactive exercises"><img src="https://fastapi.tiangolo.com/img/sponsors/vimso.png"></a>
5151
<a href="https://talkpython.fm/fastapi-sponsor" target="_blank" title="FastAPI video courses on demand from people you trust"><img src="https://fastapi.tiangolo.com/img/sponsors/talkpython.png"></a>
5252
<a href="https://testdriven.io/courses/tdd-fastapi/" target="_blank" title="Learn to build high-quality web apps with best practices"><img src="https://fastapi.tiangolo.com/img/sponsors/testdriven.svg"></a>
53+
<a href="https://github.com/deepset-ai/haystack/" target="_blank" title="Build powerful search from composable, open source building blocks"><img src="https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg"></a>
5354

5455
<!-- /sponsors -->
5556

@@ -315,7 +316,7 @@ And now, go to <a href="http://127.0.0.1:8000/redoc" class="external-link" targe
315316

316317
### Recap
317318

318-
In summary, you declare **once** the types of parameters, body, etc. as function parameters.
319+
In summary, you declare **once** the types of parameters, body, etc. as function parameters.
319320

320321
You do that with standard modern Python types.
321322

@@ -372,7 +373,7 @@ Coming back to the previous code example, **FastAPI** will:
372373
* As the `q` parameter is declared with `= None`, it is optional.
373374
* Without the `None` it would be required (as is the body in the case with `PUT`).
374375
* For `PUT` requests to `/items/{item_id}`, Read the body as JSON:
375-
* Check that it has a required attribute `name` that should be a `str`.
376+
* Check that it has a required attribute `name` that should be a `str`.
376377
* Check that it has a required attribute `price` that has to be a `float`.
377378
* Check that it has an optional attribute `is_offer`, that should be a `bool`, if present.
378379
* All this would also work for deeply nested JSON objects.
@@ -417,9 +418,9 @@ For a more complete example including more features, see the <a href="https://fa
417418
* A very powerful and easy to use **<abbr title="also known as components, resources, providers, services, injectables">Dependency Injection</abbr>** system.
418419
* Security and authentication, including support for **OAuth2** with **JWT tokens** and **HTTP Basic** auth.
419420
* More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic).
421+
* **GraphQL** integration with <a href="https://strawberry.rocks" class="external-link" target="_blank">Strawberry</a> and other libraries.
420422
* Many extra features (thanks to Starlette) as:
421423
* **WebSockets**
422-
* **GraphQL**
423424
* extremely easy tests based on `requests` and `pytest`
424425
* **CORS**
425426
* **Cookie Sessions**
@@ -446,7 +447,6 @@ Used by Starlette:
446447
* <a href="https://andrew-d.github.io/python-multipart/" target="_blank"><code>python-multipart</code></a> - Required if you want to support form <abbr title="converting the string that comes from an HTTP request into Python data">"parsing"</abbr>, with `request.form()`.
447448
* <a href="https://pythonhosted.org/itsdangerous/" target="_blank"><code>itsdangerous</code></a> - Required for `SessionMiddleware` support.
448449
* <a href="https://pyyaml.org/wiki/PyYAMLDocumentation" target="_blank"><code>pyyaml</code></a> - Required for Starlette's `SchemaGenerator` support (you probably don't need it with FastAPI).
449-
* <a href="https://graphene-python.org/" target="_blank"><code>graphene</code></a> - Required for `GraphQLApp` support.
450450
* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - Required if you want to use `UJSONResponse`.
451451

452452
Used by FastAPI / Starlette:

docs/de/docs/features.md

Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
# Merkmale
2+
3+
## FastAPI Merkmale
4+
5+
**FastAPI** ermöglicht Ihnen folgendes:
6+
7+
### Basiert auf offenen Standards
8+
9+
* <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank"><strong>OpenAPI</strong></a> für API-Erstellung, zusammen mit Deklarationen von <abbr title="auch genannt: Endpunkte, Routen">Pfad</abbr> <abbr title="gemeint sind: HTTP-Methoden, wie POST, GET, PUT, DELETE">Operationen</abbr>, Parameter, Nachrichtenrumpf-Anfragen (englisch: body request), Sicherheit, etc.
10+
* Automatische Dokumentation der Datenentitäten mit dem <a href="https://json-schema.org/" class="external-link" target="_blank"><strong>JSON Schema</strong></a> (OpenAPI basiert selber auf dem JSON Schema).
11+
* Entworfen auf Grundlage dieser Standards nach einer sorgfältigen Studie, statt einer nachträglichen Schicht über diesen Standards.
12+
* Dies ermöglicht automatische **Quellcode-Generierung auf Benutzerebene** in vielen Sprachen.
13+
14+
### Automatische Dokumentation
15+
16+
Mit einer interaktiven API-Dokumentation und explorativen webbasierten Benutzerschnittstellen. Da FastAPI auf OpenAPI basiert, gibt es hierzu mehrere Optionen, wobei zwei standartmäßig vorhanden sind.
17+
18+
* <a href="https://github.com/swagger-api/swagger-ui" class="external-link" target="_blank"><strong>Swagger UI</strong></a>, bietet interaktive Exploration: testen und rufen Sie ihre API direkt vom Webbrowser auf.
19+
20+
![Swagger UI Interaktion](https://fastapi.tiangolo.com/img/index/index-03-swagger-02.png)
21+
22+
* Alternative API-Dokumentation mit <a href="https://github.com/Rebilly/ReDoc" class="external-link" target="_blank"><strong>ReDoc</strong></a>.
23+
24+
![ReDoc](https://fastapi.tiangolo.com/img/index/index-06-redoc-02.png)
25+
26+
### Nur modernes Python
27+
28+
Alles basiert auf **Python 3.6 Typ**-Deklarationen (dank Pydantic). Es muss keine neue Syntax gelernt werden, nur standardisiertes modernes Python.
29+
30+
31+
32+
Wenn Sie eine kurze, zweiminütige, Auffrischung in der Benutzung von Python Typ-Deklarationen benötigen (auch wenn Sie FastAPI nicht nutzen), schauen Sie sich diese kurze Einführung an (Englisch): Python Types{.internal-link target=_blank}.
33+
34+
Sie schreiben Standard-Python mit Typ-Deklarationen:
35+
36+
```Python
37+
from typing import List, Dict
38+
from datetime import date
39+
40+
from pydantic import BaseModel
41+
42+
# Deklariere eine Variable als str
43+
# und bekomme Editor-Unterstütung innerhalb der Funktion
44+
def main(user_id: str):
45+
return user_id
46+
47+
48+
# Ein Pydantic model
49+
class User(BaseModel):
50+
id: int
51+
name: str
52+
joined: date
53+
```
54+
55+
Dies kann nun wiefolgt benutzt werden:
56+
57+
```Python
58+
my_user: User = User(id=3, name="John Doe", joined="2018-07-19")
59+
60+
second_user_data = {
61+
"id": 4,
62+
"name": "Mary",
63+
"joined": "2018-11-30",
64+
}
65+
66+
my_second_user: User = User(**second_user_data)
67+
```
68+
69+
!!! info
70+
`**second_user_data` bedeutet:
71+
72+
Übergebe die Schlüssel und die zugehörigen Werte des `second_user_data` Datenwörterbuches direkt als Schlüssel-Wert Argumente, äquivalent zu: `User(id=4, name="Mary", joined="2018-11-30")`
73+
74+
### Editor Unterstützung
75+
76+
FastAPI wurde so entworfen, dass es einfach und intuitiv zu benutzen ist; alle Entscheidungen wurden auf mehreren Editoren getestet (sogar vor der eigentlichen Implementierung), um so eine best mögliche Entwicklererfahrung zu gewährleisten.
77+
78+
In der letzen Python Entwickler Umfrage stellte sich heraus, dass <a href="https://www.jetbrains.com/research/python-developers-survey-2017/#tools-and-features" class="external-link" target="_blank">die meist genutzte Funktion die "Autovervollständigung" ist</a>.
79+
80+
Die gesamte Struktur von **FastAPI** soll dem gerecht werden. Autovervollständigung funktioniert überall.
81+
82+
Sie müssen selten in die Dokumentation schauen.
83+
84+
So kann ihr Editor Sie unterstützen:
85+
86+
* in <a href="https://code.visualstudio.com/" class="external-link" target="_blank">Visual Studio Code</a>:
87+
88+
![editor support](https://fastapi.tiangolo.com/img/vscode-completion.png)
89+
90+
* in <a href="https://www.jetbrains.com/pycharm/" class="external-link" target="_blank">PyCharm</a>:
91+
92+
![editor support](https://fastapi.tiangolo.com/img/pycharm-completion.png)
93+
94+
Sie bekommen Autovervollständigung an Stellen, an denen Sie dies vorher nicht für möglich gehalten hätten. Zum Beispiel der `price` Schlüssel aus einem JSON Datensatz (dieser könnte auch verschachtelt sein) aus einer Anfrage.
95+
96+
Hierdurch werden Sie nie wieder einen falschen Schlüsselnamen benutzen und sparen sich lästiges Suchen in der Dokumentation, um beispielsweise herauszufinden ob Sie `username` oder `user_name` als Schlüssel verwenden.
97+
98+
### Kompakt
99+
100+
FastAPI nutzt für alles sensible **Standard-Einstellungen**, welche optional überall konfiguriert werden können. Alle Parameter können ganz genau an Ihre Bedürfnisse angepasst werden, sodass sie genau die API definieren können, die sie brachen.
101+
102+
Aber standartmäßig, **"funktioniert einfach"** alles.
103+
104+
### Validierung
105+
106+
* Validierung für die meisten (oder alle?) Python **Datentypen**, hierzu gehören:
107+
* JSON Objekte (`dict`).
108+
* JSON Listen (`list`), die den Typ ihrer Elemente definieren.
109+
* Zeichenketten (`str`), mit definierter minimaler und maximaler Länge.
110+
* Zahlen (`int`, `float`) mit minimaler und maximaler Größe, usw.
111+
112+
* Validierung für ungewögnliche Typen, wie:
113+
* URL.
114+
* Email.
115+
* UUID.
116+
* ... und andere.
117+
118+
Die gesamte Validierung übernimmt das etablierte und robuste **Pydantic**.
119+
120+
### Sicherheit und Authentifizierung
121+
122+
Sicherheit und Authentifizierung integriert. Ohne einen Kompromiss aufgrund einer Datenbank oder den Datenentitäten.
123+
124+
Unterstützt alle von OpenAPI definierten Sicherheitsschemata, hierzu gehören:
125+
126+
* HTTP Basis Authentifizierung.
127+
* **OAuth2** (auch mit **JWT Zugriffstokens**). Schauen Sie sich hierzu dieses Tutorial an: [OAuth2 mit JWT](tutorial/security/oauth2-jwt.md){.internal-link target=_blank}.
128+
* API Schlüssel in:
129+
* Kopfzeile (HTTP Header).
130+
* Anfrageparametern.
131+
* Cookies, etc.
132+
133+
Zusätzlich gibt es alle Sicherheitsfunktionen von Starlette (auch **session cookies**).
134+
135+
Alles wurde als wiederverwendbare Werkzeuge und Komponenten geschaffen, die einfach in ihre Systeme, Datenablagen, relationale und nicht-relationale Datenbanken, ..., integriert werden können.
136+
137+
### Einbringen von Abhängigkeiten (meist: Dependency Injection)
138+
139+
FastAPI enthält ein extrem einfaches, aber extrem mächtiges <abbr title='oft verwendet im Zusammenhang von: Komponenten, Resourcen, Diensten, Dienstanbieter'><strong>Dependency Injection</strong></abbr> System.
140+
141+
* Selbst Abhängigkeiten können Abhängigkeiten haben, woraus eine Hierachie oder ein **"Graph" von Abhängigkeiten** entsteht.
142+
* **Automatische Umsetzung** durch FastAPI.
143+
* Alle abhängigen Komponenten könnten Daten von Anfragen, **Erweiterungen der Pfadoperations-**Einschränkungen und der automatisierten Dokumentation benötigen.
144+
* **Automatische Validierung** selbst für *Pfadoperationen*-Parameter, die in den Abhängigkeiten definiert wurden.
145+
* Unterstütz komplexe Benutzerauthentifizierungssysteme, mit **Datenbankverbindungen**, usw.
146+
* **Keine Kompromisse** bei Datenbanken, Eingabemasken, usw. Sondern einfache Integration von allen.
147+
148+
### Unbegrenzte Erweiterungen
149+
150+
Oder mit anderen Worten, sie werden nicht benötigt. Importieren und nutzen Sie Quellcode nach Bedarf.
151+
152+
Jede Integration wurde so entworfen, dass sie einfach zu nutzen ist (mit Abhängigkeiten), sodass Sie eine Erweiterung für Ihre Anwendung mit nur zwei Zeilen an Quellcode implementieren können. Hierbei nutzen Sie die selbe Struktur und Syntax, wie bei Pfadoperationen.
153+
154+
### Getestet
155+
156+
* 100% <abbr title="Die Anzahl an Code, die automatisch getestet wird">Testabdeckung</abbr>.
157+
* 100% <abbr title="Python Typ Annotationen, mit dennen Ihr Editor und andere exteren Werkezuge Sie besser unterstützen können">Typen annotiert</abbr>.
158+
* Verwendet in Produktionsanwendungen.
159+
160+
## Starlette's Merkmale
161+
162+
**FastAPI** ist vollkommen kompatibel (und basiert auf) <a href="https://www.starlette.io/" class="external-link" target="_blank"><strong>Starlette</strong></a>. Das bedeutet, auch ihr eigner Starlett Quellcode funktioniert.
163+
164+
`FastAPI` ist eigentlich eine Unterklasse von `Starlette`. Wenn sie also bereits Starlette kennen oder benutzen, können Sie das meiste Ihres Wissen direkt anwenden.
165+
166+
Mit **FastAPI** bekommen Sie viele von **Starlette**'s Funktionen (da FastAPI nur Starlette auf Steroiden ist):
167+
168+
* Stark beeindruckende Performanz. Es ist <a href="https://github.com/encode/starlette#performance" class="external-link" target="_blank">eines der schnellsten Python frameworks, auf Augenhöhe mit **NodeJS** und **Go**</a>.
169+
* **WebSocket**-Unterstützung.
170+
* Hintergrundaufgaben im selben Prozess.
171+
* Ereignisse für das Starten und Herunterfahren.
172+
* Testclient basierend auf `requests`.
173+
* **CORS**, GZip, statische Dateien, Antwortfluss.
174+
* **Sitzungs und Cookie** Unterstützung.
175+
* 100% Testabdeckung.
176+
* 100% Typen annotiert.
177+
178+
## Pydantic's Merkmale
179+
180+
**FastAPI** ist vollkommen kompatibel (und basiert auf) <a href="https://pydantic-docs.helpmanual.io" class="external-link" target="_blank"><strong>Pydantic</strong></a>. Das bedeutet, auch jeder zusätzliche Pydantic Quellcode funktioniert.
181+
182+
Verfügbar sind ebenso externe auf Pydantic basierende Bibliotheken, wie <abbr title="Object-Relational Mapper (Abbildung von Objekten auf relationale Strukturen)">ORM</abbr>s, <abbr title="Object-Document Mapper (Abbildung von Objekten auf nicht-relationale Strukturen)">ODM</abbr>s für Datenbanken.
183+
184+
Daher können Sie in vielen Fällen das Objekt einer Anfrage **direkt zur Datenbank** schicken, weil alles automatisch validiert wird.
185+
186+
Das selbe gilt auch für die andere Richtung: Sie können jedes Objekt aus der Datenbank **direkt zum Klienten** schicken.
187+
188+
Mit **FastAPI** bekommen Sie alle Funktionen von **Pydantic** (da FastAPI für die gesamte Datenverarbeitung Pydantic nutzt):
189+
190+
* **Kein Kopfzerbrechen**:
191+
* Sie müssen keine neue Schemadefinitionssprache lernen.
192+
* Wenn Sie mit Python's Typisierung arbeiten können, können Sie auch mit Pydantic arbeiten.
193+
* Gutes Zusammenspiel mit Ihrer/Ihrem **<abbr title="Integrierten Entwicklungsumgebung, ähnlich zu (Quellcode-)Editor">IDE</abbr>/<abbr title="Ein Programm, was Fehler im Quellcode sucht">linter</abbr>/Gehirn**:
194+
* Weil Datenstrukturen von Pydantic einfach nur Instanzen ihrer definierten Klassen sind, sollten Autovervollständigung, Linting, mypy und ihre Intuition einwandfrei funktionieren.
195+
* **Schnell**:
196+
* In <a href="https://pydantic-docs.helpmanual.io/#benchmarks-tag" class="external-link" target="_blank">Vergleichen</a> ist Pydantic schneller als jede andere getestete Bibliothek.
197+
* Validierung von **komplexen Strukturen**:
198+
* Benutzung von hierachischen Pydantic Schemata, Python `typing`’s `List` und `Dict`, etc.
199+
* Validierungen erlauben klare und einfache Datenschemadefinition, überprüft und dokumentiert als JSON Schema.
200+
* Sie können stark **verschachtelte JSON** Objekte haben und diese sind trotzdem validiert und annotiert.
201+
* **Erweiterbar**:
202+
* Pydantic erlaubt die Definition von eigenen Datentypen oder sie können die Validierung mit einer `validator` dekorierten Methode erweitern..
203+
* 100% Testabdeckung.

docs/de/docs/index.md

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,6 @@ For a more complete example including more features, see the <a href="https://fa
425425
* More advanced (but equally easy) techniques for declaring **deeply nested JSON models** (thanks to Pydantic).
426426
* Many extra features (thanks to Starlette) as:
427427
* **WebSockets**
428-
* **GraphQL**
429428
* extremely easy tests based on `requests` and `pytest`
430429
* **CORS**
431430
* **Cookie Sessions**
@@ -452,7 +451,6 @@ Used by Starlette:
452451
* <a href="https://andrew-d.github.io/python-multipart/" target="_blank"><code>python-multipart</code></a> - Required if you want to support form <abbr title="converting the string that comes from an HTTP request into Python data">"parsing"</abbr>, with `request.form()`.
453452
* <a href="https://pythonhosted.org/itsdangerous/" target="_blank"><code>itsdangerous</code></a> - Required for `SessionMiddleware` support.
454453
* <a href="https://pyyaml.org/wiki/PyYAMLDocumentation" target="_blank"><code>pyyaml</code></a> - Required for Starlette's `SchemaGenerator` support (you probably don't need it with FastAPI).
455-
* <a href="https://graphene-python.org/" target="_blank"><code>graphene</code></a> - Required for `GraphQLApp` support.
456454
* <a href="https://github.com/esnme/ultrajson" target="_blank"><code>ujson</code></a> - Required if you want to use `UJSONResponse`.
457455

458456
Used by FastAPI / Starlette:

docs/de/mkdocs.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ nav:
5454
- tr: /tr/
5555
- uk: /uk/
5656
- zh: /zh/
57+
- features.md
5758
markdown_extensions:
5859
- toc:
5960
permalink: true

0 commit comments

Comments
 (0)