Compare commits
155 Commits
fc6f9f8df7
...
b24c50a4ee
Author | SHA1 | Date |
---|---|---|
|
b24c50a4ee | 10 hours ago |
|
f235502234 | 1 day ago |
|
b40da4f0d5 | 1 day ago |
|
9aa25fd682 | 1 day ago |
|
8170860322 | 1 day ago |
|
f0da082dd3 | 2 days ago |
|
f97524429d | 2 days ago |
|
6b1e6c5efd | 2 days ago |
|
40f3ab18e0 | 2 days ago |
|
8dfc651e1a | 2 days ago |
|
2eca83fbda | 2 days ago |
|
784f06cb9b | 3 days ago |
|
b5c05893b4 | 3 days ago |
|
44fc67632b | 3 days ago |
|
a84001000e | 3 days ago |
|
382d083e26 | 3 days ago |
|
a7f2dbe976 | 3 days ago |
|
f1e6f978ce | 3 days ago |
|
b01d5c97a0 | 3 days ago |
|
b51ec36f2e | 3 days ago |
|
0bdc3ca373 | 3 days ago |
|
86e515784d | 3 days ago |
|
03123c00f1 | 3 days ago |
|
2dc769b121 | 3 days ago |
|
606a6828e7 | 3 days ago |
|
cd2e1e43bd | 3 days ago |
|
60213f5a31 | 3 days ago |
|
8ede27223e | 3 days ago |
|
0358d3eab5 | 3 days ago |
|
c2c6049b8f | 3 days ago |
|
21aa9d3719 | 3 days ago |
|
9ac56c70f2 | 3 days ago |
|
243f012fd0 | 3 days ago |
|
bc5013cd56 | 3 days ago |
|
14168b43eb | 3 days ago |
|
5fef4d199b | 3 days ago |
|
d2f6b92a83 | 3 days ago |
|
c831cdbde2 | 3 days ago |
|
73841b9976 | 3 days ago |
|
744736af9c | 3 days ago |
|
651603cb37 | 3 days ago |
|
11d424c3dc | 3 days ago |
|
c8a29944f4 | 3 days ago |
|
fe4542279d | 3 days ago |
|
d2da9e8e46 | 3 days ago |
|
9b1234d7d0 | 3 days ago |
|
4c175319f5 | 3 days ago |
|
7095a11056 | 3 days ago |
|
9d7388d9f1 | 3 days ago |
|
f10ed69b97 | 3 days ago |
|
111431295c | 3 days ago |
|
4c9c3b5942 | 3 days ago |
|
ccfca4cb06 | 3 days ago |
|
a95e91e46e | 3 days ago |
|
ee46b851bc | 3 days ago |
|
47acc62e54 | 3 days ago |
|
5c1f87c563 | 6 days ago |
|
805ab1be5b | 6 days ago |
|
a372edf7e8 | 1 week ago |
|
bc1aba7322 | 1 week ago |
|
7563579dc8 | 1 week ago |
|
938dd045fd | 1 week ago |
|
2a446f7151 | 1 week ago |
|
ed45b074b9 | 1 week ago |
|
480cd8f4f9 | 1 week ago |
|
16d75d90eb | 2 weeks ago |
|
a4841de65e | 2 weeks ago |
|
984d646705 | 2 weeks ago |
|
ec087cfa24 | 2 weeks ago |
|
1fe23335ce | 2 weeks ago |
|
d48144a3e7 | 2 weeks ago |
|
3d08a4f3a8 | 2 weeks ago |
|
caa3ccf638 | 2 weeks ago |
|
5226ff90d7 | 3 weeks ago |
|
d597f92482 | 3 weeks ago |
|
43f6115096 | 3 weeks ago |
|
3112e05b77 | 3 weeks ago |
|
4560158502 | 3 weeks ago |
|
2ad28d436f | 3 weeks ago |
|
d7604d16a3 | 3 weeks ago |
|
79c51ad542 | 3 weeks ago |
|
7cf567010d | 3 weeks ago |
|
3d763c8d38 | 3 weeks ago |
|
30a07155fb | 3 weeks ago |
|
bb4772c5aa | 3 weeks ago |
|
3e2dbf9169 | 3 weeks ago |
|
f5b77ff0fc | 3 weeks ago |
|
176cd8c9ef | 3 weeks ago |
|
1884d76f61 | 3 weeks ago |
|
8062aabdaa | 3 weeks ago |
|
ee9ccac1e5 | 3 weeks ago |
|
5cd4c3b6bd | 3 weeks ago |
|
4584f706bd | 3 weeks ago |
|
ba9c8fba0b | 3 weeks ago |
|
d9249c1949 | 3 weeks ago |
|
a973e787af | 3 weeks ago |
|
1088d2abd9 | 3 weeks ago |
|
98ec6a6079 | 3 weeks ago |
|
6b4d292f3a | 3 weeks ago |
|
d4ddcc5878 | 3 weeks ago |
|
0e5832aa6d | 3 weeks ago |
|
ee2acd8abc | 3 weeks ago |
|
e902ed5fc6 | 3 weeks ago |
|
cef1f166df | 3 weeks ago |
|
8e63f75919 | 3 weeks ago |
|
e1b9cc00ca | 3 weeks ago |
|
408b8a9beb | 3 weeks ago |
|
0817c955ec | 3 weeks ago |
|
c55f7138a1 | 3 weeks ago |
|
7653de2715 | 3 weeks ago |
|
784f068aba | 3 weeks ago |
|
6db05770f6 | 4 weeks ago |
|
6be02e3d52 | 4 weeks ago |
|
9cf7b70d7b | 1 month ago |
|
f75c1532f6 | 1 month ago |
|
5c3a70d5b6 | 1 month ago |
|
6a45249303 | 1 month ago |
|
c23051682b | 1 month ago |
|
df779885fa | 1 month ago |
|
9c7abbff43 | 1 month ago |
|
d12c1ac82c | 1 month ago |
|
dbc9d3a0ce | 1 month ago |
|
f1b1449958 | 1 month ago |
|
078324583c | 1 month ago |
|
7df361eb41 | 1 month ago |
|
753bb9fb9f | 2 months ago |
|
ba0f6121b9 | 2 months ago |
|
12b36a048c | 2 months ago |
|
6ccad06081 | 2 months ago |
|
6cee687a79 | 2 months ago |
|
5c8d5214ff | 2 months ago |
|
6df50d40fe | 2 months ago |
|
f736e48ab3 | 2 months ago |
|
c40bd0e426 | 2 months ago |
|
11893d9cea | 2 months ago |
|
37dd99ffe3 | 2 months ago |
|
f8013621cc | 2 months ago |
|
391887db91 | 2 months ago |
|
b42e28753e | 2 months ago |
|
92ea53baca | 2 months ago |
|
2e16e105c9 | 2 months ago |
|
d07159797b | 2 months ago |
|
e7401d2e42 | 2 months ago |
|
6e69d62bfe | 2 months ago |
|
79d2576508 | 2 months ago |
|
1c1c2e8ab9 | 2 months ago |
|
3ad01a1247 | 2 months ago |
|
a0ede1839a | 2 months ago |
|
a9fbc4b8f5 | 2 months ago |
|
1e4f123eb0 | 2 months ago |
|
8abfa0f106 | 2 months ago |
|
cf726c93d9 | 2 months ago |
|
e326cec10e | 2 months ago |
|
8af92a6139 | 2 months ago |
|
b40acb83c9 | 2 months ago |
382 changed files with 9980 additions and 5405 deletions
@ -0,0 +1,19 @@ |
|||
name: "Conflict detector" |
|||
on: |
|||
push: |
|||
pull_request_target: |
|||
types: [synchronize] |
|||
|
|||
jobs: |
|||
main: |
|||
permissions: |
|||
contents: read |
|||
pull-requests: write |
|||
runs-on: ubuntu-latest |
|||
steps: |
|||
- name: Check if PRs have merge conflicts |
|||
uses: eps1lon/actions-label-merge-conflict@v3 |
|||
with: |
|||
dirtyLabel: "conflicts" |
|||
repoToken: "${{ secrets.GITHUB_TOKEN }}" |
|||
commentOnDirty: "This pull request has a merge conflict that needs to be resolved." |
@ -0,0 +1,503 @@ |
|||
# LLM-Testdatei { #llm-test-file } |
|||
|
|||
Dieses Dokument testet, ob das <abbr title="Large Language Model – Großes Sprachmodell">LLM</abbr>, das die Dokumentation übersetzt, den <abbr title="General Prompt – Allgemeiner Prompt">`general_prompt`</abbr> in `scripts/translate.py` und den sprachspezifischen Prompt in `docs/{language code}/llm-prompt.md` versteht. Der sprachspezifische Prompt wird an `general_prompt` angehängt. |
|||
|
|||
Hier hinzugefügte Tests werden von allen Erstellern sprachspezifischer Prompts gesehen. |
|||
|
|||
So verwenden: |
|||
|
|||
* Einen sprachspezifischen Prompt haben – `docs/{language code}/llm-prompt.md`. |
|||
* Eine frische Übersetzung dieses Dokuments in die gewünschte Zielsprache durchführen (siehe z. B. das Kommando `translate-page` der `translate.py`). Dadurch wird die Übersetzung unter `docs/{language code}/docs/_llm-test.md` erstellt. |
|||
* Prüfen Sie, ob in der Übersetzung alles in Ordnung ist. |
|||
* Verbessern Sie bei Bedarf Ihren sprachsspezifischen Prompt, den allgemeinen Prompt oder das englische Dokument. |
|||
* Beheben Sie anschließend manuell die verbleibenden Probleme in der Übersetzung, sodass es eine gute Übersetzung ist. |
|||
* Übersetzen Sie erneut, nachdem die gute Übersetzung vorliegt. Das ideale Ergebnis wäre, dass das LLM an der Übersetzung keine Änderungen mehr vornimmt. Das bedeutet, dass der allgemeine Prompt und Ihr sprachsspezifischer Prompt so gut sind, wie sie sein können (Es wird manchmal ein paar scheinbar zufällige Änderungen machen, der Grund ist, dass <a href="https://doublespeak.chat/#/handbook#deterministic-output" class="external-link" target="_blank">LLMs keine deterministischen Algorithmen sind</a>). |
|||
|
|||
Die Tests: |
|||
|
|||
## Codeschnipsel { #code-snippets} |
|||
|
|||
//// tab | Test |
|||
|
|||
Dies ist ein Codeschnipsel: `foo`. Und dies ist ein weiteres Codeschnipsel: `bar`. Und noch eins: `baz quux`. |
|||
|
|||
//// |
|||
|
|||
//// tab | Info |
|||
|
|||
Der Inhalt von Codeschnipseln sollte unverändert bleiben. |
|||
|
|||
Siehe Abschnitt `### Content of code snippets` im allgemeinen Prompt in `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## Anführungszeichen { #quotes } |
|||
|
|||
//// tab | Test |
|||
|
|||
Gestern schrieb mein Freund: „Wenn man unkorrekt korrekt schreibt, hat man es unkorrekt geschrieben“. Worauf ich antwortete: „Korrekt, aber ‚unkorrekt‘ ist unkorrekterweise nicht ‚„unkorrekt“‘“. |
|||
|
|||
/// note | Hinweis |
|||
|
|||
Das LLM wird dies wahrscheinlich falsch übersetzen. Interessant ist nur, ob es die korrigierte Übersetzung bei einer erneuten Übersetzung beibehält. |
|||
|
|||
/// |
|||
|
|||
//// |
|||
|
|||
//// tab | Info |
|||
|
|||
Der Prompt-Designer kann entscheiden, ob neutrale Anführungszeichen in typografische Anführungszeichen umgewandelt werden sollen. Es ist in Ordnung, sie unverändert zu lassen. |
|||
|
|||
Siehe zum Beispiel den Abschnitt `### Quotes` in `docs/de/llm-prompt.md`. |
|||
|
|||
//// |
|||
|
|||
## Anführungszeichen in Codeschnipseln { #quotes-in-code-snippets} |
|||
|
|||
//// tab | Test |
|||
|
|||
`pip install "foo[bar]"` |
|||
|
|||
Beispiele für Stringliterale in Codeschnipseln: `"this"`, `'that'`. |
|||
|
|||
Ein schwieriges Beispiel für Stringliterale in Codeschnipseln: `f"I like {'oranges' if orange else "apples"}"` |
|||
|
|||
Hardcore: `Yesterday, my friend wrote: "If you spell incorrectly correctly, you have spelled it incorrectly". To which I answered: "Correct, but 'incorrectly' is incorrectly not '"incorrectly"'"` |
|||
|
|||
//// |
|||
|
|||
//// tab | Info |
|||
|
|||
... Allerdings müssen Anführungszeichen in Codeschnipseln unverändert bleiben. |
|||
|
|||
//// |
|||
|
|||
## Codeblöcke { #code-blocks } |
|||
|
|||
//// tab | Test |
|||
|
|||
Ein Bash-Codebeispiel ... |
|||
|
|||
```bash |
|||
# Eine Begrüßung an das Universum ausgeben |
|||
echo "Hello universe" |
|||
``` |
|||
|
|||
... und ein Konsolen-Codebeispiel ... |
|||
|
|||
```console |
|||
$ <font color="#4E9A06">fastapi</font> run <u style="text-decoration-style:solid">main.py</u> |
|||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting server |
|||
Searching for package file structure |
|||
``` |
|||
|
|||
... und noch ein Konsolen-Codebeispiel ... |
|||
|
|||
```console |
|||
// Ein Verzeichnis „Code“ erstellen |
|||
$ mkdir code |
|||
// In dieses Verzeichnis wechseln |
|||
$ cd code |
|||
``` |
|||
|
|||
... und ein Python-Codebeispiel ... |
|||
|
|||
```Python |
|||
wont_work() # Das wird nicht funktionieren 😱 |
|||
works(foo="bar") # Das funktioniert 🎉 |
|||
``` |
|||
|
|||
... und das war's. |
|||
|
|||
//// |
|||
|
|||
//// tab | Info |
|||
|
|||
Code in Codeblöcken sollte nicht verändert werden, mit Ausnahme von Kommentaren. |
|||
|
|||
Siehe Abschnitt `### Content of code blocks` im allgemeinen Prompt in `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## Tabs und farbige Boxen { #tabs-and-colored-boxes } |
|||
|
|||
//// tab | Test |
|||
|
|||
/// info | Info |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// note | Hinweis |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// note | Technische Details |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// check | Testen |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// tip | Tipp |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// warning | Achtung |
|||
Etwas Text |
|||
/// |
|||
|
|||
/// danger | Gefahr |
|||
Etwas Text |
|||
/// |
|||
|
|||
//// |
|||
|
|||
//// tab | Info |
|||
|
|||
Tabs und `Info`/`Note`/`Warning`/usw. Blöcke sollten die Übersetzung ihres Titels nach einem vertikalen Strich (`|`) erhalten. |
|||
|
|||
Siehe die Abschnitte `### Special blocks` und `### Tab blocks` im allgemeinen Prompt in `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## Web- und interne Links { #web-and-internal-links } |
|||
|
|||
//// tab | Test |
|||
|
|||
Der Linktext sollte übersetzt werden, die Linkadresse sollte unverändert bleiben: |
|||
|
|||
* [Link zur Überschrift oben](#code-snippets) |
|||
* [Interner Link](index.md#installation){.internal-link target=_blank} |
|||
* <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">Externer Link</a> |
|||
* <a href="https://fastapi.tiangolo.com/css/styles.css" class="external-link" target="_blank">Link zu einem Stil</a> |
|||
* <a href="https://fastapi.tiangolo.com/js/logic.js" class="external-link" target="_blank">Link zu einem Skript</a> |
|||
* <a href="https://fastapi.tiangolo.com/img/foo.jpg" class="external-link" target="_blank">Link zu einem Bild</a> |
|||
|
|||
Der Linktext sollte übersetzt werden, die Linkadresse sollte auf die Übersetzung zeigen: |
|||
|
|||
* <a href="https://fastapi.tiangolo.com/de/" class="external-link" target="_blank">FastAPI-Link</a> |
|||
|
|||
//// |
|||
|
|||
//// tab | Info |
|||
|
|||
Links sollten übersetzt werden, aber ihre Adresse soll unverändert bleiben. Eine Ausnahme sind absolute Links zu Seiten der FastAPI-Dokumentation. In diesem Fall sollte auf die Übersetzung verlinkt werden. |
|||
|
|||
Siehe Abschnitt `### Links` im allgemeinen Prompt in `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## HTML „abbr“-Elemente { #html-abbr-elements } |
|||
|
|||
//// tab | Test |
|||
|
|||
Hier einige Dinge, die in HTML-„abbr“-Elemente gepackt sind (einige sind erfunden): |
|||
|
|||
### Das abbr gibt eine vollständige Phrase { #the-abbr-gives-a-full-phrase } |
|||
|
|||
* <abbr title="Getting Things Done – Dinge erledigt bekommen">GTD</abbr> |
|||
* <abbr title="less than – kleiner als"><code>lt</code></abbr> |
|||
* <abbr title="XML Web Token">XWT</abbr> |
|||
* <abbr title="Paralleles Server-Gateway-Interface">PSGI</abbr> |
|||
|
|||
### Das abbr gibt eine Erklärung { #the-abbr-gives-an-explanation } |
|||
|
|||
* <abbr title="Eine Gruppe von Maschinen, die so konfiguriert sind, dass sie verbunden sind und in irgendeiner Weise zusammenarbeiten.">Cluster</abbr> |
|||
* <abbr title="Eine Methode des Machine Learning, die künstliche neuronale Netze mit zahlreichen versteckten Schichten zwischen Eingabe- und Ausgabeschicht verwendet und so eine umfassende interne Struktur entwickelt">Deep Learning</abbr> |
|||
|
|||
### Das abbr gibt eine vollständige Phrase und eine Erklärung { #the-abbr-gives-a-full-phrase-and-an-explanation } |
|||
|
|||
* <abbr title="Mozilla Developer Network – Mozilla-Entwicklernetzwerk: Dokumentation für Entwickler, geschrieben von den Firefox-Leuten">MDN</abbr> |
|||
* <abbr title="Input/Output – Eingabe/Ausgabe: Lesen oder Schreiben auf der Festplatte, Netzwerkkommunikation.">I/O</abbr>. |
|||
|
|||
//// |
|||
|
|||
//// tab | Info |
|||
|
|||
„title“-Attribute von „abbr“-Elementen werden nach bestimmten Anweisungen übersetzt. |
|||
|
|||
Übersetzungen können eigene „abbr“-Elemente hinzufügen, die das LLM nicht entfernen soll. Z. B. um englische Wörter zu erklären. |
|||
|
|||
Siehe Abschnitt `### HTML abbr elements` im allgemeinen Prompt in `scripts/translate.py`. |
|||
|
|||
//// |
|||
|
|||
## Überschriften { #headings } |
|||
|
|||
//// tab | Test |
|||
|
|||
### Eine Webapp entwickeln – ein Tutorial { #develop-a-webapp-a-tutorial } |
|||
|
|||
Hallo. |
|||
|
|||
### Typhinweise und -annotationen { #type-hints-and-annotations } |
|||
|
|||
Hallo wieder. |
|||
|
|||
### Super- und Subklassen { #super-and-subclasses } |
|||
|
|||
Hallo wieder. |
|||
|
|||
//// |
|||
|
|||
//// tab | Info |
|||
|
|||
Die einzige strenge Regel für Überschriften ist, dass das LLM den Hash-Teil in geschweiften Klammern unverändert lässt, damit Links nicht kaputtgehen. |
|||
|
|||
Siehe Abschnitt `### Headings` im allgemeinen Prompt in `scripts/translate.py`. |
|||
|
|||
Für einige sprachspezifische Anweisungen, siehe z. B. den Abschnitt `### Headings` in `docs/de/llm-prompt.md`. |
|||
|
|||
//// |
|||
|
|||
## In der Dokumentation verwendete Begriffe { #terms-used-in-the-docs } |
|||
|
|||
//// tab | Test |
|||
|
|||
* Sie |
|||
* Ihr |
|||
|
|||
* z. B. |
|||
* usw. |
|||
|
|||
* `foo` vom Typ `int` |
|||
* `bar` vom Typ `str` |
|||
* `baz` vom Typ `list` |
|||
|
|||
* das Tutorial – Benutzerhandbuch |
|||
* das Handbuch für fortgeschrittene Benutzer |
|||
* die SQLModel-Dokumentation |
|||
* die API-Dokumentation |
|||
* die automatische Dokumentation |
|||
|
|||
* Data Science |
|||
* Deep Learning |
|||
* Machine Learning |
|||
* Dependency Injection |
|||
* HTTP Basic-Authentifizierung |
|||
* HTTP Digest |
|||
* ISO-Format |
|||
* der JSON-Schema-Standard |
|||
* das JSON-Schema |
|||
* die Schema-Definition |
|||
* Password Flow |
|||
* Mobile |
|||
|
|||
* deprecatet |
|||
* designt |
|||
* ungültig |
|||
* on the fly |
|||
* Standard |
|||
* Default |
|||
* Groß-/Kleinschreibung ist relevant |
|||
* Groß-/Kleinschreibung ist nicht relevant |
|||
|
|||
* die Anwendung bereitstellen |
|||
* die Seite ausliefern |
|||
|
|||
* die App |
|||
* die Anwendung |
|||
|
|||
* der Request |
|||
* die Response |
|||
* die Error-Response |
|||
|
|||
* die Pfadoperation |
|||
* der Pfadoperation-Dekorator |
|||
* die Pfadoperation-Funktion |
|||
|
|||
* der Body |
|||
* der Requestbody |
|||
* der Responsebody |
|||
* der JSON-Body |
|||
* der Formularbody |
|||
* der Dateibody |
|||
* der Funktionskörper |
|||
|
|||
* der Parameter |
|||
* der Body-Parameter |
|||
* der Pfad-Parameter |
|||
* der Query-Parameter |
|||
* der Cookie-Parameter |
|||
* der Header-Parameter |
|||
* der Formular-Parameter |
|||
* der Funktionsparameter |
|||
|
|||
* das Event |
|||
* das Startup-Event |
|||
* das Hochfahren des Servers |
|||
* das Shutdown-Event |
|||
* das Lifespan-Event |
|||
|
|||
* der Handler |
|||
* der Eventhandler |
|||
* der Exceptionhandler |
|||
* handhaben |
|||
|
|||
* das Modell |
|||
* das Pydantic-Modell |
|||
* das Datenmodell |
|||
* das Datenbankmodell |
|||
* das Formularmodell |
|||
* das Modellobjekt |
|||
|
|||
* die Klasse |
|||
* die Basisklasse |
|||
* die Elternklasse |
|||
* die Subklasse |
|||
* die Kindklasse |
|||
* die Geschwisterklasse |
|||
* die Klassenmethode |
|||
|
|||
* der Header |
|||
* die Header |
|||
* der Autorisierungsheader |
|||
* der `Authorization`-Header |
|||
* der Forwarded-Header |
|||
|
|||
* das Dependency-Injection-System |
|||
* die Dependency |
|||
* das Dependable |
|||
* der Dependant |
|||
|
|||
* I/O-lastig |
|||
* CPU-lastig |
|||
* Nebenläufigkeit |
|||
* Parallelität |
|||
* Multiprocessing |
|||
|
|||
* die Umgebungsvariable |
|||
* die Umgebungsvariable |
|||
* der `PATH` |
|||
* die `PATH`-Umgebungsvariable |
|||
|
|||
* die Authentifizierung |
|||
* der Authentifizierungsanbieter |
|||
* die Autorisierung |
|||
* das Anmeldeformular |
|||
* der Autorisierungsanbieter |
|||
* der Benutzer authentisiert sich |
|||
* das System authentifiziert den Benutzer |
|||
|
|||
* Das CLI |
|||
* Das Kommandozeileninterface |
|||
|
|||
* der Server |
|||
* der Client |
|||
|
|||
* der Cloudanbieter |
|||
* der Clouddienst |
|||
|
|||
* die Entwicklung |
|||
* die Entwicklungsphasen |
|||
|
|||
* das Dict |
|||
* das Dictionary |
|||
* die Enumeration |
|||
* das Enum |
|||
* das Enum-Member |
|||
|
|||
* der Encoder |
|||
* der Decoder |
|||
* kodieren |
|||
* dekodieren |
|||
|
|||
* die Exception |
|||
* werfen |
|||
|
|||
* der Ausdruck |
|||
* die Anweisung |
|||
|
|||
* das Frontend |
|||
* das Backend |
|||
|
|||
* die GitHub-Diskussion |
|||
* das GitHub-Issue |
|||
|
|||
* die Leistung |
|||
* die Leistungsoptimierung |
|||
|
|||
* der Rückgabetyp |
|||
* der Rückgabewert |
|||
|
|||
* die Sicherheit |
|||
* das Sicherheitsschema |
|||
|
|||
* der Task |
|||
* der Hintergrundtask |
|||
* die Taskfunktion |
|||
|
|||
* das Template |
|||
* die Template-Engine |
|||
|
|||
* die Typannotation |
|||
* der Typhinweis |
|||
|
|||
* der Serverworker |
|||
* der Uvicorn-Worker |
|||
* der Gunicorn-Worker |
|||
* der Workerprozess |
|||
* die Workerklasse |
|||
* die Workload |
|||
|
|||
* das Deployment |
|||
* bereitstellen |
|||
|
|||
* das SDK |
|||
* das Software Development Kit |
|||
|
|||
* der `APIRouter` |
|||
* die `requirements.txt` |
|||
* das Bearer-Token |
|||
* der Breaking Change |
|||
* der Bug |
|||
* der Button |
|||
* das Callable |
|||
* der Code |
|||
* der Commit |
|||
* der Contextmanager |
|||
* die Coroutine |
|||
* die Datenbank-Session |
|||
* die Festplatte |
|||
* die Domain |
|||
* die Engine |
|||
* das Fake-X |
|||
* die HTTP-GET-Methode |
|||
* das Item |
|||
* die Bibliothek |
|||
* der Lifespan |
|||
* der Lock |
|||
* die Middleware |
|||
* die Mobile-Anwendung |
|||
* das Modul |
|||
* das Mounten |
|||
* das Netzwerk |
|||
* das Origin |
|||
* Die Überschreibung |
|||
* die Payload |
|||
* der Prozessor |
|||
* die Property |
|||
* der Proxy |
|||
* der Pull Request |
|||
* die Query |
|||
* der RAM |
|||
* der entfernte Rechner |
|||
* der Statuscode |
|||
* der String |
|||
* der Tag |
|||
* das Webframework |
|||
* die Wildcard |
|||
* zurückgeben |
|||
* validieren |
|||
|
|||
//// |
|||
|
|||
//// tab | Info |
|||
|
|||
Dies ist eine nicht vollständige und nicht normative Liste von (meist) technischen Begriffen, die in der Dokumentation vorkommen. Sie kann dem Prompt-Designer helfen herauszufinden, bei welchen Begriffen das LLM Unterstützung braucht. Zum Beispiel, wenn es eine gute Übersetzung immer wieder auf eine suboptimale Übersetzung zurücksetzt. Oder wenn es Probleme hat, einen Begriff in Ihrer Sprache zu konjugieren/deklinieren. |
|||
|
|||
Siehe z. B. den Abschnitt `### List of English terms and their preferred German translations` in `docs/de/llm-prompt.md`. |
|||
|
|||
//// |
@ -1,3 +1,3 @@ |
|||
# Über |
|||
# Über { #about } |
|||
|
|||
Über FastAPI, sein Design, seine Inspiration und mehr. 🤓 |
|||
|
@ -1,31 +1,31 @@ |
|||
# Response – Statuscode ändern |
|||
# Response – Statuscode ändern { #response-change-status-code } |
|||
|
|||
Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Standard-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen können. |
|||
Sie haben wahrscheinlich schon vorher gelesen, dass Sie einen Default-[Response-Statuscode](../tutorial/response-status-code.md){.internal-link target=_blank} festlegen können. |
|||
|
|||
In manchen Fällen müssen Sie jedoch einen anderen als den Standard-Statuscode zurückgeben. |
|||
In manchen Fällen müssen Sie jedoch einen anderen als den Default-Statuscode zurückgeben. |
|||
|
|||
## Anwendungsfall |
|||
## Anwendungsfall { #use-case } |
|||
|
|||
Stellen Sie sich zum Beispiel vor, Sie möchten standardmäßig den HTTP-Statuscode „OK“ `200` zurückgeben. |
|||
|
|||
Wenn die Daten jedoch nicht vorhanden waren, möchten Sie diese erstellen und den HTTP-Statuscode „CREATED“ `201` zurückgeben. |
|||
Wenn die Daten jedoch nicht vorhanden sind, möchten Sie diese erstellen und den HTTP-Statuscode „CREATED“ `201` zurückgeben. |
|||
|
|||
Sie möchten aber dennoch in der Lage sein, die von Ihnen zurückgegebenen Daten mit einem `response_model` zu filtern und zu konvertieren. |
|||
|
|||
In diesen Fällen können Sie einen `Response`-Parameter verwenden. |
|||
|
|||
## Einen `Response`-Parameter verwenden |
|||
## Einen `Response`-Parameter verwenden { #use-a-response-parameter } |
|||
|
|||
Sie können einen Parameter vom Typ `Response` in Ihrer *Pfadoperation-Funktion* deklarieren (wie Sie es auch für Cookies und Header tun können). |
|||
|
|||
Anschließend können Sie den `status_code` in diesem *vorübergehenden* Response-Objekt festlegen. |
|||
Anschließend können Sie den `status_code` in diesem *vorübergehenden* <abbr title="Response – Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>-Objekt festlegen. |
|||
|
|||
{* ../../docs_src/response_change_status_code/tutorial001.py hl[1,9,12] *} |
|||
|
|||
Und dann können Sie wie gewohnt jedes benötigte Objekt zurückgeben (ein `dict`, ein Datenbankmodell usw.). |
|||
Und dann können Sie jedes benötigte Objekt zurückgeben, wie Sie es normalerweise tun würden (ein `dict`, ein Datenbankmodell usw.). |
|||
|
|||
Und wenn Sie ein `response_model` deklariert haben, wird es weiterhin zum Filtern und Konvertieren des von Ihnen zurückgegebenen Objekts verwendet. |
|||
|
|||
**FastAPI** verwendet diese *vorübergehende* Response, um den Statuscode (auch Cookies und Header) zu extrahieren und fügt diese in die endgültige Response ein, die den von Ihnen zurückgegebenen Wert enthält, gefiltert nach einem beliebigen `response_model`. |
|||
|
|||
Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und den Statuscode darin festlegen. Bedenken Sie jedoch, dass der gewinnt, welcher zuletzt gesetzt wird. |
|||
Sie können den Parameter `Response` auch in Abhängigkeiten deklarieren und den Statuscode darin festlegen. Bedenken Sie jedoch, dass der zuletzt gesetzte gewinnt. |
|||
|
@ -1,5 +1,12 @@ |
|||
# Events testen: Hochfahren – Herunterfahren |
|||
# Events testen: Lifespan und Startup – Shutdown { #testing-events-lifespan-and-startup-shutdown } |
|||
|
|||
Wenn Sie in Ihren Tests Ihre Event-Handler (`startup` und `shutdown`) ausführen wollen, können Sie den `TestClient` mit einer `with`-Anweisung verwenden: |
|||
Wenn Sie `lifespan` in Ihren Tests ausführen müssen, können Sie den `TestClient` mit einer `with`-Anweisung verwenden: |
|||
|
|||
{* ../../docs_src/app_testing/tutorial004.py hl[9:15,18,27:28,30:32,41:43] *} |
|||
|
|||
|
|||
Sie können mehr Details unter [„Lifespan in Tests ausführen in der offiziellen Starlette-Dokumentation.“](https://www.starlette.io/lifespan/#running-lifespan-in-tests) nachlesen. |
|||
|
|||
Für die deprecateten Events <abbr title="Hochfahren">`startup`</abbr> und <abbr title="Herunterfahren">`shutdown`</abbr> können Sie den `TestClient` wie folgt verwenden: |
|||
|
|||
{* ../../docs_src/app_testing/tutorial003.py hl[9:12,20:24] *} |
|||
|
@ -1,17 +1,16 @@ |
|||
# FastAPI-Deployment bei Cloud-Anbietern |
|||
# FastAPI bei Cloudanbietern bereitstellen { #deploy-fastapi-on-cloud-providers } |
|||
|
|||
Sie können praktisch **jeden Cloud-Anbieter** für das <abbr title="Bereitstellen der fertigen Anwendung für die Endbenutzer">Deployment</abbr> Ihrer FastAPI-Anwendung verwenden. |
|||
Sie können praktisch **jeden Cloudanbieter** verwenden, um Ihre FastAPI-Anwendung bereitzustellen. |
|||
|
|||
In den meisten Fällen verfügen die Haupt-Cloud-Anbieter über Anleitungen zum Deployment von FastAPI. |
|||
In den meisten Fällen bieten die großen Cloudanbieter Anleitungen zum Bereitstellen von FastAPI an. |
|||
|
|||
## Cloud-Anbieter – Sponsoren |
|||
## Cloudanbieter – Sponsoren { #cloud-providers-sponsors } |
|||
|
|||
Einige Cloud-Anbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponsern){.internal-link target=_blank} ✨, dies gewährleistet die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem**. |
|||
Einige Cloudanbieter ✨ [**sponsern FastAPI**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, dies stellt die kontinuierliche und gesunde **Entwicklung** von FastAPI und seinem **Ökosystem** sicher. |
|||
|
|||
Und es zeigt deren wahres Engagement für FastAPI und seine **Community** (Sie), da diese Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie über ein **gutes und gesundes Framework** verfügen, FastAPI. 🙇 |
|||
Und es zeigt ihr wahres Engagement für FastAPI und seine **Community** (Sie), da sie Ihnen nicht nur einen **guten Service** bieten möchten, sondern auch sicherstellen möchten, dass Sie ein **gutes und gesundes Framework**, FastAPI, haben. 🙇 |
|||
|
|||
Vielleicht möchten Sie deren Dienste ausprobieren und deren Anleitungen folgen: |
|||
|
|||
* <a href="https://docs.platform.sh/languages/python.html?utm_source=fastapi-signup&utm_medium=banner&utm_campaign=FastAPI-signup-June-2023" class="external-link" target="_blank">Platform.sh</a> |
|||
* <a href="https://docs.porter.run/language-specific-guides/fastapi" class="external-link" target="_blank">Porter</a> |
|||
* <a href="https://docs.withcoherence.com/docs/configuration/frameworks?utm_medium=advertising&utm_source=fastapi&utm_campaign=banner%20january%2024#fast-api-example" class="external-link" target="_blank">Coherence</a> |
|||
* <a href="https://docs.render.com/deploy-fastapi?utm_source=deploydoc&utm_medium=referral&utm_campaign=fastapi" class="external-link" target="_blank">Render</a> |
|||
* <a href="https://docs.railway.com/guides/fastapi?utm_medium=integration&utm_source=docs&utm_campaign=fastapi" class="external-link" target="_blank">Railway</a> |
|||
|
@ -0,0 +1,298 @@ |
|||
# Umgebungsvariablen { #environment-variables } |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Wenn Sie bereits wissen, was „Umgebungsvariablen“ sind und wie man sie verwendet, können Sie dies überspringen. |
|||
|
|||
/// |
|||
|
|||
Eine Umgebungsvariable (auch bekannt als „**env var**“) ist eine Variable, die **außerhalb** des Python-Codes im **Betriebssystem** lebt und von Ihrem Python-Code (oder auch von anderen Programmen) gelesen werden kann. |
|||
|
|||
Umgebungsvariablen können nützlich sein, um **Einstellungen** der Anwendung zu handhaben, als Teil der **Installation** von Python usw. |
|||
|
|||
## Umgebungsvariablen erstellen und verwenden { #create-and-use-env-vars } |
|||
|
|||
Sie können Umgebungsvariablen in der **Shell (Terminal)** erstellen und verwenden, ohne Python zu benötigen: |
|||
|
|||
//// tab | Linux, macOS, Windows Bash |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Sie können eine Umgebungsvariable MY_NAME erstellen mit |
|||
$ export MY_NAME="Wade Wilson" |
|||
|
|||
// Dann können Sie sie mit anderen Programmen verwenden, etwa |
|||
$ echo "Hello $MY_NAME" |
|||
|
|||
Hello Wade Wilson |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows PowerShell |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Erstellen Sie eine Umgebungsvariable MY_NAME |
|||
$ $Env:MY_NAME = "Wade Wilson" |
|||
|
|||
// Verwenden Sie sie mit anderen Programmen, etwa |
|||
$ echo "Hello $Env:MY_NAME" |
|||
|
|||
Hello Wade Wilson |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
## Umgebungsvariablen in Python lesen { #read-env-vars-in-python } |
|||
|
|||
Sie können auch Umgebungsvariablen **außerhalb** von Python erstellen, im Terminal (oder mit jeder anderen Methode) und sie dann **in Python** lesen. |
|||
|
|||
Zum Beispiel könnten Sie eine Datei `main.py` haben mit: |
|||
|
|||
```Python hl_lines="3" |
|||
import os |
|||
|
|||
name = os.getenv("MY_NAME", "World") |
|||
print(f"Hello {name} from Python") |
|||
``` |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Das zweite Argument von <a href="https://docs.python.org/3.8/library/os.html#os.getenv" class="external-link" target="_blank">`os.getenv()`</a> ist der Defaultwert, der zurückgegeben wird. |
|||
|
|||
Wenn er nicht angegeben wird, ist er standardmäßig `None`. Hier geben wir `"World"` als den zu verwendenden Defaultwert an. |
|||
|
|||
/// |
|||
|
|||
Dann könnten Sie das Python-Programm aufrufen: |
|||
|
|||
//// tab | Linux, macOS, Windows Bash |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Hier setzen wir die Umgebungsvariable noch nicht |
|||
$ python main.py |
|||
|
|||
// Da wir die Umgebungsvariable nicht gesetzt haben, erhalten wir den Defaultwert |
|||
|
|||
Hello World from Python |
|||
|
|||
// Aber wenn wir zuerst eine Umgebungsvariable erstellen |
|||
$ export MY_NAME="Wade Wilson" |
|||
|
|||
// Und dann das Programm erneut aufrufen |
|||
$ python main.py |
|||
|
|||
// Jetzt kann es die Umgebungsvariable lesen |
|||
|
|||
Hello Wade Wilson from Python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows PowerShell |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Hier setzen wir die Umgebungsvariable noch nicht |
|||
$ python main.py |
|||
|
|||
// Da wir die Umgebungsvariable nicht gesetzt haben, erhalten wir den Defaultwert |
|||
|
|||
Hello World from Python |
|||
|
|||
// Aber wenn wir zuerst eine Umgebungsvariable erstellen |
|||
$ $Env:MY_NAME = "Wade Wilson" |
|||
|
|||
// Und dann das Programm erneut aufrufen |
|||
$ python main.py |
|||
|
|||
// Jetzt kann es die Umgebungsvariable lesen |
|||
|
|||
Hello Wade Wilson from Python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
Da Umgebungsvariablen außerhalb des Codes gesetzt werden können, aber vom Code gelesen werden können und nicht mit den restlichen Dateien gespeichert (in `git` committet) werden müssen, werden sie häufig für Konfigurationen oder **Einstellungen** verwendet. |
|||
|
|||
Sie können auch eine Umgebungsvariable nur für einen **spezifischen Programmaufruf** erstellen, die nur für dieses Programm und nur für dessen Dauer verfügbar ist. |
|||
|
|||
Um dies zu tun, erstellen Sie sie direkt vor dem Programmaufruf, in derselben Zeile: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
// Erstellen Sie eine Umgebungsvariable MY_NAME in der Zeile für diesen Programmaufruf |
|||
$ MY_NAME="Wade Wilson" python main.py |
|||
|
|||
// Jetzt kann es die Umgebungsvariable lesen |
|||
|
|||
Hello Wade Wilson from Python |
|||
|
|||
// Die Umgebungsvariable existiert danach nicht mehr |
|||
$ python main.py |
|||
|
|||
Hello World from Python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Sie können mehr darüber lesen auf <a href="https://12factor.net/config" class="external-link" target="_blank">The Twelve-Factor App: Config</a>. |
|||
|
|||
/// |
|||
|
|||
## Typen und Validierung { #types-and-validation } |
|||
|
|||
Diese Umgebungsvariablen können nur **Textstrings** handhaben, da sie extern zu Python sind und kompatibel mit anderen Programmen und dem Rest des Systems (und sogar mit verschiedenen Betriebssystemen, wie Linux, Windows, macOS) sein müssen. |
|||
|
|||
Das bedeutet, dass **jeder Wert**, der in Python von einer Umgebungsvariable gelesen wird, **ein `str` sein wird**, und jede Konvertierung in einen anderen Typ oder jede Validierung muss im Code vorgenommen werden. |
|||
|
|||
Sie werden mehr darüber lernen, wie man Umgebungsvariablen zur Handhabung von **Anwendungseinstellungen** verwendet, im [Handbuch für fortgeschrittene Benutzer – Einstellungen und Umgebungsvariablen](./advanced/settings.md){.internal-link target=_blank}. |
|||
|
|||
## `PATH`-Umgebungsvariable { #path-environment-variable } |
|||
|
|||
Es gibt eine **spezielle** Umgebungsvariable namens **`PATH`**, die von den Betriebssystemen (Linux, macOS, Windows) verwendet wird, um Programme zu finden, die ausgeführt werden sollen. |
|||
|
|||
Der Wert der Variable `PATH` ist ein langer String, der aus Verzeichnissen besteht, die auf Linux und macOS durch einen Doppelpunkt `:` und auf Windows durch ein Semikolon `;` getrennt sind. |
|||
|
|||
Zum Beispiel könnte die `PATH`-Umgebungsvariable so aussehen: |
|||
|
|||
//// tab | Linux, macOS |
|||
|
|||
```plaintext |
|||
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin |
|||
``` |
|||
|
|||
Das bedeutet, dass das System nach Programmen in den Verzeichnissen suchen sollte: |
|||
|
|||
* `/usr/local/bin` |
|||
* `/usr/bin` |
|||
* `/bin` |
|||
* `/usr/sbin` |
|||
* `/sbin` |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows |
|||
|
|||
```plaintext |
|||
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32 |
|||
``` |
|||
|
|||
Das bedeutet, dass das System nach Programmen in den Verzeichnissen suchen sollte: |
|||
|
|||
* `C:\Program Files\Python312\Scripts` |
|||
* `C:\Program Files\Python312` |
|||
* `C:\Windows\System32` |
|||
|
|||
//// |
|||
|
|||
Wenn Sie einen **Befehl** im Terminal eingeben, **sucht** das Betriebssystem nach dem Programm in **jedem dieser Verzeichnisse**, die in der `PATH`-Umgebungsvariablen aufgeführt sind. |
|||
|
|||
Zum Beispiel, wenn Sie `python` im Terminal eingeben, sucht das Betriebssystem nach einem Programm namens `python` im **ersten Verzeichnis** in dieser Liste. |
|||
|
|||
Wenn es es findet, wird es **benutzt**. Andernfalls sucht es weiter in den **anderen Verzeichnissen**. |
|||
|
|||
### Python installieren und den `PATH` aktualisieren { #installing-python-and-updating-the-path } |
|||
|
|||
Wenn Sie Python installieren, könnten Sie gefragt werden, ob Sie die `PATH`-Umgebungsvariable aktualisieren möchten. |
|||
|
|||
//// tab | Linux, macOS |
|||
|
|||
Angenommen, Sie installieren Python und es landet in einem Verzeichnis `/opt/custompython/bin`. |
|||
|
|||
Wenn Sie erlauben, die `PATH`-Umgebungsvariable zu aktualisieren, fügt der Installer `/opt/custompython/bin` zur `PATH`-Umgebungsvariable hinzu. |
|||
|
|||
Das könnte so aussehen: |
|||
|
|||
```plaintext |
|||
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/opt/custompython/bin |
|||
``` |
|||
|
|||
Auf diese Weise, wenn Sie `python` im Terminal eingeben, findet das System das Python-Programm in `/opt/custompython/bin` (das letzte Verzeichnis) und verwendet dieses. |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows |
|||
|
|||
Angenommen, Sie installieren Python und es landet in einem Verzeichnis `C:\opt\custompython\bin`. |
|||
|
|||
Wenn Sie erlauben, die `PATH`-Umgebungsvariable zu aktualisieren, fügt der Installer `C:\opt\custompython\bin` zur `PATH`-Umgebungsvariable hinzu. |
|||
|
|||
```plaintext |
|||
C:\Program Files\Python312\Scripts;C:\Program Files\Python312;C:\Windows\System32;C:\opt\custompython\bin |
|||
``` |
|||
|
|||
Auf diese Weise, wenn Sie `python` im Terminal eingeben, findet das System das Python-Programm in `C:\opt\custompython\bin` (das letzte Verzeichnis) und verwendet dieses. |
|||
|
|||
//// |
|||
|
|||
Also, wenn Sie tippen: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// tab | Linux, macOS |
|||
|
|||
Das System wird das `python` Programm in `/opt/custompython/bin` **finden** und es ausführen. |
|||
|
|||
Es wäre ungefähr gleichbedeutend mit der Eingabe von: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ /opt/custompython/bin/python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
//// tab | Windows |
|||
|
|||
Das System wird das `python` Programm in `C:\opt\custompython\bin\python` **finden** und es ausführen. |
|||
|
|||
Es wäre ungefähr gleichbedeutend mit der Eingabe von: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ C:\opt\custompython\bin\python |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
//// |
|||
|
|||
Diese Informationen werden nützlich sein, wenn Sie über [Virtuelle Umgebungen](virtual-environments.md){.internal-link target=_blank} lernen. |
|||
|
|||
## Fazit { #conclusion } |
|||
|
|||
Mit diesem Wissen sollten Sie ein grundlegendes Verständnis davon haben, was **Umgebungsvariablen** sind und wie man sie in Python verwendet. |
|||
|
|||
Sie können auch mehr darüber in der <a href="https://en.wikipedia.org/wiki/Environment_variable" class="external-link" target="_blank">Wikipedia zu Umgebungsvariablen</a> lesen. |
|||
|
|||
In vielen Fällen ist es nicht sehr offensichtlich, wie Umgebungsvariablen nützlich und sofort anwendbar sein könnten. Aber sie tauchen immer wieder in vielen verschiedenen Szenarien auf, wenn Sie entwickeln, deshalb ist es gut, darüber Bescheid zu wissen. |
|||
|
|||
Zum Beispiel werden Sie diese Informationen im nächsten Abschnitt über [Virtuelle Umgebungen](virtual-environments.md) benötigen. |
@ -0,0 +1,75 @@ |
|||
# FastAPI CLI { #fastapi-cli } |
|||
|
|||
**FastAPI CLI** ist ein Kommandozeilenprogramm, mit dem Sie Ihre FastAPI-App bereitstellen, Ihr FastAPI-Projekt verwalten und mehr. |
|||
|
|||
Wenn Sie FastAPI installieren (z. B. mit `pip install "fastapi[standard]"`), wird ein Package namens `fastapi-cli` mitgeliefert, das den Befehl `fastapi` im Terminal bereitstellt. |
|||
|
|||
Um Ihre FastAPI-App für die Entwicklung auszuführen, können Sie den Befehl `fastapi dev` verwenden: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ <font color="#4E9A06">fastapi</font> dev <u style="text-decoration-style:solid">main.py</u> |
|||
|
|||
<span style="background-color:#009485"><font color="#D3D7CF"> FastAPI </font></span> Starting development server 🚀 |
|||
|
|||
Searching for package file structure from directories with |
|||
<font color="#3465A4">__init__.py</font> files |
|||
Importing from <font color="#75507B">/home/user/code/</font><font color="#AD7FA8">awesomeapp</font> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> module </font></span> 🐍 main.py |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> code </font></span> Importing the FastAPI app object from the module with the |
|||
following code: |
|||
|
|||
<u style="text-decoration-style:solid">from </u><u style="text-decoration-style:solid"><b>main</b></u><u style="text-decoration-style:solid"> import </u><u style="text-decoration-style:solid"><b>app</b></u> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> app </font></span> Using import string: <font color="#3465A4">main:app</font> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Server started at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> server </font></span> Documentation at <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000/docs</u></font> |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> tip </font></span> Running in development mode, for production use: |
|||
<b>fastapi run</b> |
|||
|
|||
Logs: |
|||
|
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Will watch for changes in these directories: |
|||
<b>[</b><font color="#4E9A06">'/home/user/code/awesomeapp'</font><b>]</b> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Uvicorn running on <font color="#729FCF"><u style="text-decoration-style:solid">http://127.0.0.1:8000</u></font> <b>(</b>Press CTRL+C to |
|||
quit<b>)</b> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started reloader process <b>[</b><font color="#34E2E2"><b>383138</b></font><b>]</b> using WatchFiles |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Started server process <b>[</b><font color="#34E2E2"><b>383153</b></font><b>]</b> |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Waiting for application startup. |
|||
<span style="background-color:#007166"><font color="#D3D7CF"> INFO </font></span> Application startup complete. |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
Das Kommandozeilenprogramm namens `fastapi` ist das **FastAPI CLI**. |
|||
|
|||
FastAPI CLI nimmt den Pfad zu Ihrem Python-Programm (z. B. `main.py`), erkennt automatisch die `FastAPI`-Instanz (häufig `app` genannt), bestimmt den korrekten Importprozess und stellt sie dann bereit. |
|||
|
|||
Für die Produktion würden Sie stattdessen `fastapi run` verwenden. 🚀 |
|||
|
|||
Intern verwendet das **FastAPI CLI** <a href="https://www.uvicorn.org" class="external-link" target="_blank">Uvicorn</a>, einen leistungsstarken, produktionsreifen, ASGI-Server. 😎 |
|||
|
|||
## `fastapi dev` { #fastapi-dev } |
|||
|
|||
Das Ausführen von `fastapi dev` startet den Entwicklermodus. |
|||
|
|||
Standardmäßig ist **Autoreload** aktiviert, das den Server automatisch neu lädt, wenn Sie Änderungen an Ihrem Code vornehmen. Dies ist ressourcenintensiv und könnte weniger stabil sein als wenn es deaktiviert ist. Sie sollten es nur für die Entwicklung verwenden. Es horcht auch auf der IP-Adresse `127.0.0.1`, die die IP für Ihre Maschine ist, um nur mit sich selbst zu kommunizieren (`localhost`). |
|||
|
|||
## `fastapi run` { #fastapi-run } |
|||
|
|||
Das Ausführen von `fastapi run` startet FastAPI standardmäßig im Produktionsmodus. |
|||
|
|||
Standardmäßig ist **Autoreload** deaktiviert. Es horcht auch auf der IP-Adresse `0.0.0.0`, was alle verfügbaren IP-Adressen bedeutet, so wird es öffentlich zugänglich für jeden, der mit der Maschine kommunizieren kann. So würden Sie es normalerweise in der Produktion ausführen, beispielsweise in einem Container. |
|||
|
|||
In den meisten Fällen würden (und sollten) Sie einen „Terminierungsproxy“ haben, der HTTPS für Sie verwaltet. Dies hängt davon ab, wie Sie Ihre Anwendung bereitstellen. Ihr Anbieter könnte dies für Sie erledigen, oder Sie müssen es selbst einrichten. |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Sie können mehr darüber in der [Deployment-Dokumentation](deployment/index.md){.internal-link target=_blank} erfahren. |
|||
|
|||
/// |
@ -1,39 +1,39 @@ |
|||
# Allgemeines – How-To – Rezepte |
|||
# Allgemeines – How-To – Rezepte { #general-how-to-recipes } |
|||
|
|||
Hier finden Sie mehrere Verweise auf andere Stellen in der Dokumentation, für allgemeine oder häufige Fragen. |
|||
|
|||
## Daten filtern – Sicherheit |
|||
## Daten filtern – Sicherheit { #filter-data-security } |
|||
|
|||
Um sicherzustellen, dass Sie nicht mehr Daten zurückgeben, als Sie sollten, lesen Sie die Dokumentation unter [Tutorial – Responsemodell – Rückgabetyp](../tutorial/response-model.md){.internal-link target=_blank}. |
|||
|
|||
## Dokumentations-Tags – OpenAPI |
|||
## Dokumentations-Tags – OpenAPI { #documentation-tags-openapi } |
|||
|
|||
Um Tags zu Ihren *Pfadoperationen* hinzuzufügen und diese in der Oberfläche der Dokumentation zu gruppieren, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. |
|||
|
|||
## Zusammenfassung und Beschreibung in der Dokumentation – OpenAPI |
|||
## Zusammenfassung und Beschreibung in der Dokumentation – OpenAPI { #documentation-summary-and-description-openapi } |
|||
|
|||
Um Ihren *Pfadoperationen* eine Zusammenfassung und Beschreibung hinzuzufügen und diese in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Zusammenfassung und Beschreibung](../tutorial/path-operation-configuration.md#zusammenfassung-und-beschreibung){.internal-link target=_blank}. |
|||
Um Ihren *Pfadoperationen* eine Zusammenfassung und Beschreibung hinzuzufügen und diese in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Zusammenfassung und Beschreibung](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. |
|||
|
|||
## Beschreibung der Response in der Dokumentation – OpenAPI |
|||
## Beschreibung der Response in der Dokumentation – OpenAPI { #documentation-response-description-openapi } |
|||
|
|||
Um die Beschreibung der Response zu definieren, welche in der Oberfläche der Dokumentation angezeigt wird, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Beschreibung der Response](../tutorial/path-operation-configuration.md#beschreibung-der-response){.internal-link target=_blank}. |
|||
Um die Beschreibung der Response zu definieren, welche in der Oberfläche der Dokumentation angezeigt wird, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Beschreibung der Response](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. |
|||
|
|||
## *Pfadoperation* in der Dokumentation deprecaten – OpenAPI |
|||
## *Pfadoperation* in der Dokumentation deprecaten – OpenAPI { #documentation-deprecate-a-path-operation-openapi } |
|||
|
|||
Um eine *Pfadoperation* zu deprecaten – sie als veraltet zu markieren – und das in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Deprecaten](../tutorial/path-operation-configuration.md#eine-pfadoperation-deprecaten){.internal-link target=_blank}. |
|||
Um eine *Pfadoperation* zu <abbr title="veraltet, obsolet: Es soll nicht mehr verwendet werden">deprecaten</abbr> und das in der Oberfläche der Dokumentation anzuzeigen, lesen Sie die Dokumentation unter [Tutorial – Pfadoperation-Konfiguration – Deprecaten](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. |
|||
|
|||
## Daten in etwas JSON-kompatibles konvertieren |
|||
## Daten in etwas JSON-kompatibles konvertieren { #convert-any-data-to-json-compatible } |
|||
|
|||
Um Daten in etwas JSON-kompatibles zu konvertieren, lesen Sie die Dokumentation unter [Tutorial – JSON-kompatibler Encoder](../tutorial/encoder.md){.internal-link target=_blank}. |
|||
|
|||
## OpenAPI-Metadaten – Dokumentation |
|||
## OpenAPI-Metadaten – Dokumentation { #openapi-metadata-docs } |
|||
|
|||
Um Metadaten zu Ihrem OpenAPI-Schema hinzuzufügen, einschließlich einer Lizenz, Version, Kontakt, usw., lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentationen](../tutorial/metadata.md){.internal-link target=_blank}. |
|||
Um Metadaten zu Ihrem OpenAPI-Schema hinzuzufügen, einschließlich einer Lizenz, Version, Kontakt, usw., lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md){.internal-link target=_blank}. |
|||
|
|||
## Benutzerdefinierte OpenAPI-URL |
|||
## Benutzerdefinierte OpenAPI-URL { #openapi-custom-url } |
|||
|
|||
Um die OpenAPI-URL anzupassen (oder zu entfernen), lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentationen](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. |
|||
Um die OpenAPI-URL anzupassen (oder zu entfernen), lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. |
|||
|
|||
## URLs der OpenAPI-Dokumentationen |
|||
## URLs der OpenAPI-Dokumentationen { #openapi-docs-urls } |
|||
|
|||
Um die URLs zu aktualisieren, die für die automatisch generierten Dokumentations-Oberflächen verwendet werden, lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentationen](../tutorial/metadata.md#urls-der-dokumentationen){.internal-link target=_blank}. |
|||
Um die URLs zu aktualisieren, die für die automatisch generierten Dokumentations-Oberflächen verwendet werden, lesen Sie die Dokumentation unter [Tutorial – Metadaten und URLs der Dokumentation](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. |
|||
|
@ -0,0 +1,7 @@ |
|||
# Eine Datenbank testen { #testing-a-database } |
|||
|
|||
Sie können sich über Datenbanken, SQL und SQLModel in der <a href="https://sqlmodel.tiangolo.com/" class="external-link" target="_blank">SQLModel-Dokumentation</a> informieren. 🤓 |
|||
|
|||
Es gibt ein kurzes <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/" class="external-link" target="_blank">Tutorial zur Verwendung von SQLModel mit FastAPI</a>. ✨ |
|||
|
|||
Dieses Tutorial enthält einen Abschnitt über das <a href="https://sqlmodel.tiangolo.com/tutorial/fastapi/tests/" class="external-link" target="_blank">Testen von SQL-Datenbanken</a>. 😎 |
@ -1,5 +1,5 @@ |
|||
# Lernen |
|||
# Lernen { #learn } |
|||
|
|||
Hier finden Sie die einführenden Kapitel und Tutorials zum Erlernen von **FastAPI**. |
|||
Hier sind die einführenden Abschnitte und Tutorials, um **FastAPI** zu lernen. |
|||
|
|||
Sie könnten dies als **Buch**, als **Kurs**, als **offizielle** und empfohlene Methode zum Erlernen von FastAPI betrachten. 😎 |
|||
|
@ -1,84 +1,28 @@ |
|||
# Projektgenerierung – Vorlage |
|||
|
|||
Sie können einen Projektgenerator für den Einstieg verwenden, welcher einen Großteil der Ersteinrichtung, Sicherheit, Datenbank und einige API-Endpunkte bereits für Sie erstellt. |
|||
|
|||
Ein Projektgenerator verfügt immer über ein sehr spezifisches Setup, das Sie aktualisieren und an Ihre eigenen Bedürfnisse anpassen sollten, aber es könnte ein guter Ausgangspunkt für Ihr Projekt sein. |
|||
|
|||
## Full Stack FastAPI PostgreSQL |
|||
|
|||
GitHub: <a href="https://github.com/tiangolo/full-stack-fastapi-postgresql" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-fastapi-postgresql</a> |
|||
|
|||
### Full Stack FastAPI PostgreSQL – Funktionen |
|||
|
|||
* Vollständige **Docker**-Integration (Docker-basiert). |
|||
* Docker-Schwarmmodus-Deployment. |
|||
* **Docker Compose**-Integration und Optimierung für die lokale Entwicklung. |
|||
* **Produktionsbereit** Python-Webserver, verwendet Uvicorn und Gunicorn. |
|||
* Python <a href="https://github.com/fastapi/fastapi" class="external-link" target="_blank">**FastAPI**</a>-Backend: |
|||
* **Schnell**: Sehr hohe Leistung, auf Augenhöhe mit **NodeJS** und **Go** (dank Starlette und Pydantic). |
|||
* **Intuitiv**: Hervorragende Editor-Unterstützung. <abbr title="Auch bekannt als automatische Vervollständigung, IntelliSense">Codevervollständigung</abbr> überall. Weniger Zeitaufwand für das Debuggen. |
|||
* **Einfach**: Einfach zu bedienen und zu erlernen. Weniger Zeit für das Lesen von Dokumentationen. |
|||
* **Kurz**: Codeverdoppelung minimieren. Mehrere Funktionalitäten aus jeder Parameterdeklaration. |
|||
* **Robust**: Erhalten Sie produktionsbereiten Code. Mit automatischer, interaktiver Dokumentation. |
|||
* **Standards-basiert**: Basierend auf (und vollständig kompatibel mit) den offenen Standards für APIs: <a href="https://github.com/OAI/OpenAPI-Specification" class="external-link" target="_blank">OpenAPI</a> und <a href="https://json-schema.org/" class="external-link" target="_blank">JSON Schema</a>. |
|||
* <a href="https://fastapi.tiangolo.com/features/" class="external-link" target="_blank">**Viele weitere Funktionen**</a>, einschließlich automatischer Validierung, Serialisierung, interaktiver Dokumentation, Authentifizierung mit OAuth2-JWT-Tokens, usw. |
|||
* **Sicheres Passwort**-Hashing standardmäßig. |
|||
* **JWT-Token**-Authentifizierung. |
|||
* **SQLAlchemy**-Modelle (unabhängig von Flask-Erweiterungen, sodass sie direkt mit Celery-Workern verwendet werden können). |
|||
* Grundlegende Startmodelle für Benutzer (ändern und entfernen Sie nach Bedarf). |
|||
* **Alembic**-Migrationen. |
|||
* **CORS** (Cross Origin Resource Sharing). |
|||
* **Celery**-Worker, welche Modelle und Code aus dem Rest des Backends selektiv importieren und verwenden können. |
|||
* REST-Backend-Tests basierend auf **Pytest**, integriert in Docker, sodass Sie die vollständige API-Interaktion unabhängig von der Datenbank testen können. Da es in Docker ausgeführt wird, kann jedes Mal ein neuer Datenspeicher von Grund auf erstellt werden (Sie können also ElasticSearch, MongoDB, CouchDB oder was auch immer Sie möchten verwenden und einfach testen, ob die API funktioniert). |
|||
* Einfache Python-Integration mit **Jupyter-Kerneln** für Remote- oder In-Docker-Entwicklung mit Erweiterungen wie Atom Hydrogen oder Visual Studio Code Jupyter. |
|||
* **Vue**-Frontend: |
|||
* Mit Vue CLI generiert. |
|||
* Handhabung der **JWT-Authentifizierung**. |
|||
* Login-View. |
|||
* Nach der Anmeldung Hauptansicht des Dashboards. |
|||
* Haupt-Dashboard mit Benutzererstellung und -bearbeitung. |
|||
* Bearbeitung des eigenen Benutzers. |
|||
* **Vuex**. |
|||
* **Vue-Router**. |
|||
* **Vuetify** für schöne Material-Designkomponenten. |
|||
* **TypeScript**. |
|||
* Docker-Server basierend auf **Nginx** (konfiguriert, um gut mit Vue-Router zu funktionieren). |
|||
* Mehrstufigen Docker-Erstellung, sodass Sie kompilierten Code nicht speichern oder committen müssen. |
|||
* Frontend-Tests, welche zur Erstellungszeit ausgeführt werden (können auch deaktiviert werden). |
|||
* So modular wie möglich gestaltet, sodass es sofort einsatzbereit ist. Sie können es aber mit Vue CLI neu generieren oder es so wie Sie möchten erstellen und wiederverwenden, was Sie möchten. |
|||
* **PGAdmin** für die PostgreSQL-Datenbank, können Sie problemlos ändern, sodass PHPMyAdmin und MySQL verwendet wird. |
|||
* **Flower** für die Überwachung von Celery-Jobs. |
|||
* Load Balancing zwischen Frontend und Backend mit **Traefik**, sodass Sie beide unter derselben Domain haben können, getrennt durch den Pfad, aber von unterschiedlichen Containern ausgeliefert. |
|||
* Traefik-Integration, einschließlich automatischer Generierung von Let's Encrypt-**HTTPS**-Zertifikaten. |
|||
* GitLab **CI** (kontinuierliche Integration), einschließlich Frontend- und Backend-Testen. |
|||
|
|||
## Full Stack FastAPI Couchbase |
|||
|
|||
GitHub: <a href="https://github.com/tiangolo/full-stack-fastapi-couchbase" class="external-link" target="_blank">https://github.com/tiangolo/full-stack-fastapi-couchbase</a> |
|||
|
|||
⚠️ **WARNUNG** ⚠️ |
|||
|
|||
Wenn Sie ein neues Projekt von Grund auf starten, prüfen Sie die Alternativen hier. |
|||
|
|||
Zum Beispiel könnte der Projektgenerator <a href="https://github.com/tiangolo/full-stack-fastapi-postgresql" class="external-link" target="_blank">Full Stack FastAPI PostgreSQL</a> eine bessere Alternative sein, da er aktiv gepflegt und genutzt wird. Und er enthält alle neuen Funktionen und Verbesserungen. |
|||
|
|||
Es steht Ihnen weiterhin frei, den Couchbase-basierten Generator zu verwenden, wenn Sie möchten. Er sollte wahrscheinlich immer noch gut funktionieren, und wenn Sie bereits ein Projekt damit erstellt haben, ist das auch in Ordnung (und Sie haben es wahrscheinlich bereits an Ihre Bedürfnisse angepasst). |
|||
|
|||
Weitere Informationen hierzu finden Sie in der Dokumentation des Repos. |
|||
|
|||
## Full Stack FastAPI MongoDB |
|||
|
|||
... könnte später kommen, abhängig von meiner verfügbaren Zeit und anderen Faktoren. 😅 🎉 |
|||
|
|||
## Modelle für maschinelles Lernen mit spaCy und FastAPI |
|||
|
|||
GitHub: <a href="https://github.com/microsoft/cookiecutter-spacy-fastapi" class="external-link" target="_blank">https://github.com/microsoft/cookiecutter-spacy-fastapi</a> |
|||
|
|||
### Modelle für maschinelles Lernen mit spaCy und FastAPI – Funktionen |
|||
|
|||
* **spaCy** NER-Modellintegration. |
|||
* **Azure Cognitive Search**-Anforderungsformat integriert. |
|||
* **Produktionsbereit** Python-Webserver, verwendet Uvicorn und Gunicorn. |
|||
* **Azure DevOps** Kubernetes (AKS) CI/CD-Deployment integriert. |
|||
* **Mehrsprachig** Wählen Sie bei der Projekteinrichtung ganz einfach eine der integrierten Sprachen von spaCy aus. |
|||
* **Einfach erweiterbar** auf andere Modellframeworks (Pytorch, Tensorflow), nicht nur auf SpaCy. |
|||
# Full Stack FastAPI Template { #full-stack-fastapi-template } |
|||
|
|||
Vorlagen, die normalerweise mit einem bestimmten Setup geliefert werden, sind so konzipiert, dass sie flexibel und anpassbar sind. Dies ermöglicht es Ihnen, sie zu ändern und an die Anforderungen Ihres Projekts anzupassen und sie somit zu einem hervorragenden Ausgangspunkt zu machen. 🏁 |
|||
|
|||
Sie können diese Vorlage verwenden, um loszulegen, da sie bereits vieles der anfänglichen Einrichtung, Sicherheit, Datenbank und einige API-Endpunkte für Sie eingerichtet hat. |
|||
|
|||
GitHub-Repository: <a href="https://github.com/tiangolo/full-stack-fastapi-template" class="external-link" target="_blank">Full Stack FastAPI Template</a> |
|||
|
|||
## Full Stack FastAPI Template – Technologiestack und Funktionen { #full-stack-fastapi-template-technology-stack-and-features } |
|||
|
|||
- ⚡ [**FastAPI**](https://fastapi.tiangolo.com/de) für die Python-Backend-API. |
|||
- 🧰 [SQLModel](https://sqlmodel.tiangolo.com) für die Interaktion mit der Python-SQL-Datenbank (ORM). |
|||
- 🔍 [Pydantic](https://docs.pydantic.dev), verwendet von FastAPI, für die Datenvalidierung und das Einstellungsmanagement. |
|||
- 💾 [PostgreSQL](https://www.postgresql.org) als SQL-Datenbank. |
|||
- 🚀 [React](https://react.dev) für das Frontend. |
|||
- 💃 Verwendung von TypeScript, Hooks, [Vite](https://vitejs.dev) und anderen Teilen eines modernen Frontend-Stacks. |
|||
- 🎨 [Chakra UI](https://chakra-ui.com) für die Frontend-Komponenten. |
|||
- 🤖 Ein automatisch generierter Frontend-Client. |
|||
- 🧪 [Playwright](https://playwright.dev) für End-to-End-Tests. |
|||
- 🦇 Unterstützung des Dunkelmodus. |
|||
- 🐋 [Docker Compose](https://www.docker.com) für Entwicklung und Produktion. |
|||
- 🔒 Sicheres Passwort-Hashing standardmäßig. |
|||
- 🔑 JWT-Token-Authentifizierung. |
|||
- 📫 E-Mail-basierte Passwortwiederherstellung. |
|||
- ✅ Tests mit [Pytest](https://pytest.org). |
|||
- 📞 [Traefik](https://traefik.io) als Reverse-Proxy / Load Balancer. |
|||
- 🚢 Deployment-Anleitungen unter Verwendung von Docker Compose, einschließlich der Einrichtung eines Frontend-Traefik-Proxys zur Handhabung automatischer HTTPS-Zertifikate. |
|||
- 🏭 CI (kontinuierliche Integration) und CD (kontinuierliche Bereitstellung) basierend auf GitHub Actions. |
|||
|
@ -1,3 +1,3 @@ |
|||
# Ressourcen |
|||
# Ressourcen { #resources } |
|||
|
|||
Zusätzliche Ressourcen, externe Links, Artikel und mehr. ✈️ |
|||
|
@ -0,0 +1,76 @@ |
|||
# Cookie-Parameter-Modelle { #cookie-parameter-models } |
|||
|
|||
Wenn Sie eine Gruppe von **Cookies** haben, die zusammengehören, können Sie ein **Pydantic-Modell** erstellen, um diese zu deklarieren. 🍪 |
|||
|
|||
Damit können Sie das Modell an **mehreren Stellen wiederverwenden** und auch Validierungen und Metadaten für alle Parameter gleichzeitig deklarieren. 😎 |
|||
|
|||
/// note | Hinweis |
|||
|
|||
Dies wird seit FastAPI Version `0.115.0` unterstützt. 🤓 |
|||
|
|||
/// |
|||
|
|||
/// tip | Tipp |
|||
|
|||
Diese gleiche Technik gilt für `Query`, `Cookie` und `Header`. 😎 |
|||
|
|||
/// |
|||
|
|||
## Cookies mit einem Pydantic-Modell { #cookies-with-a-pydantic-model } |
|||
|
|||
Deklarieren Sie die **Cookie**-Parameter, die Sie benötigen, in einem **Pydantic-Modell**, und deklarieren Sie dann den Parameter als `Cookie`: |
|||
|
|||
{* ../../docs_src/cookie_param_models/tutorial001_an_py310.py hl[9:12,16] *} |
|||
|
|||
**FastAPI** wird die Daten für **jedes Feld** aus den im <abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Request</abbr> empfangenen **Cookies** **extrahieren** und Ihnen das von Ihnen definierte Pydantic-Modell bereitstellen. |
|||
|
|||
## Die Dokumentation testen { #check-the-docs } |
|||
|
|||
Sie können die definierten Cookies in der Dokumentationsoberfläche unter `/docs` sehen: |
|||
|
|||
<div class="screenshot"> |
|||
<img src="/img/tutorial/cookie-param-models/image01.png"> |
|||
</div> |
|||
|
|||
/// info | Info |
|||
|
|||
Bitte beachten Sie, dass Browser Cookies auf spezielle Weise und im Hintergrund bearbeiten, sodass sie **nicht** leicht **JavaScript** erlauben, diese zu berühren. |
|||
|
|||
Wenn Sie zur **API-Dokumentationsoberfläche** unter `/docs` gehen, können Sie die **Dokumentation** für Cookies für Ihre *Pfadoperationen* sehen. |
|||
|
|||
Aber selbst wenn Sie die **Daten ausfüllen** und auf „Ausführen“ klicken, werden aufgrund der Tatsache, dass die Dokumentationsoberfläche mit **JavaScript** arbeitet, die Cookies nicht gesendet, und Sie werden eine **Fehlermeldung** sehen, als ob Sie keine Werte eingegeben hätten. |
|||
|
|||
/// |
|||
|
|||
## Zusätzliche Cookies verbieten { #forbid-extra-cookies } |
|||
|
|||
In einigen speziellen Anwendungsfällen (wahrscheinlich nicht sehr häufig) möchten Sie möglicherweise die Cookies, die Sie empfangen möchten, **einschränken**. |
|||
|
|||
Ihre API hat jetzt die Macht, ihre eigene <abbr title="Das ist ein Scherz, nur für den Fall. Es hat nichts mit Cookie-Einwilligungen zu tun, aber es ist witzig, dass selbst die API jetzt die armen Cookies ablehnen kann. Haben Sie einen Keks. 🍪">Cookie-Einwilligung</abbr> zu kontrollieren. 🤪🍪 |
|||
|
|||
Sie können die Modellkonfiguration von Pydantic verwenden, um `extra` Felder zu verbieten (`forbid`): |
|||
|
|||
{* ../../docs_src/cookie_param_models/tutorial002_an_py39.py hl[10] *} |
|||
|
|||
Wenn ein Client versucht, einige **zusätzliche Cookies** zu senden, erhält er eine **Error-<abbr title="Response – Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr>**. |
|||
|
|||
Arme Cookie-Banner, wie sie sich mühen, Ihre Einwilligung zu erhalten, dass die <abbr title="Das ist ein weiterer Scherz. Beachten Sie mich nicht. Trinken Sie einen Kaffee zu Ihrem Keks. ☕">API sie ablehnen darf</abbr>. 🍪 |
|||
|
|||
Wenn der Client beispielsweise versucht, ein `santa_tracker`-Cookie mit einem Wert von `good-list-please` zu senden, erhält der Client eine **Error-Response**, die ihm mitteilt, dass das `santa_tracker` <abbr title="Santa beschwert sich über den Mangel an Cookies. 🎅 Okay, keine Cookie-Witze mehr.">Cookie nicht erlaubt ist</abbr>: |
|||
|
|||
```json |
|||
{ |
|||
"detail": [ |
|||
{ |
|||
"type": "extra_forbidden", |
|||
"loc": ["cookie", "santa_tracker"], |
|||
"msg": "Extra inputs are not permitted", |
|||
"input": "good-list-please", |
|||
} |
|||
] |
|||
} |
|||
``` |
|||
|
|||
## Zusammenfassung { #summary } |
|||
|
|||
Sie können **Pydantic-Modelle** verwenden, um <abbr title="Nehmen Sie einen letzten Keks, bevor Sie gehen. 🍪">**Cookies**</abbr> in **FastAPI** zu deklarieren. 😎 |
@ -1,35 +1,35 @@ |
|||
# Cookie-Parameter |
|||
# Cookie-Parameter { #cookie-parameters } |
|||
|
|||
So wie `Query`- und `Path`-Parameter können Sie auch <abbr title='Cookie – „Keks“: Mechanismus, der kurze Daten in Textform im Browser des Benutzers speichert und abfragt'>Cookie</abbr>-Parameter definieren. |
|||
Sie können Cookie-Parameter auf die gleiche Weise definieren wie `Query`- und `Path`-Parameter. |
|||
|
|||
## `Cookie` importieren |
|||
## `Cookie` importieren { #import-cookie } |
|||
|
|||
Importieren Sie zuerst `Cookie`: |
|||
|
|||
{* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[3] *} |
|||
|
|||
## `Cookie`-Parameter deklarieren |
|||
## `Cookie`-Parameter deklarieren { #declare-cookie-parameters } |
|||
|
|||
Dann deklarieren Sie Ihre Cookie-Parameter, auf die gleiche Weise, wie Sie auch `Path`- und `Query`-Parameter deklarieren. |
|||
Deklarieren Sie dann die Cookie-Parameter mit derselben Struktur wie bei `Path` und `Query`. |
|||
|
|||
Der erste Wert ist der Typ. Sie können `Cookie` die gehabten Extra Validierungs- und Beschreibungsparameter hinzufügen. Danach können Sie einen Defaultwert vergeben: |
|||
Sie können den Defaultwert sowie alle zusätzlichen Validierungen oder Annotierungsparameter definieren: |
|||
|
|||
{* ../../docs_src/cookie_params/tutorial001_an_py310.py hl[9] *} |
|||
|
|||
/// note | Technische Details |
|||
|
|||
`Cookie` ist eine Schwesterklasse von `Path` und `Query`. Sie erbt von derselben gemeinsamen `Param`-Elternklasse. |
|||
`Cookie` ist eine „Schwester“-Klasse von `Path` und `Query`. Sie erbt auch von derselben gemeinsamen `Param`-Klasse. |
|||
|
|||
Aber erinnern Sie sich, dass, wenn Sie `Query`, `Path`, `Cookie` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, welche spezielle Klassen zurückgeben. |
|||
Aber denken Sie daran, dass, wenn Sie `Query`, `Path`, `Cookie` und andere von `fastapi` importieren, diese tatsächlich Funktionen sind, die spezielle Klassen zurückgeben. |
|||
|
|||
/// |
|||
|
|||
/// info |
|||
/// info | Info |
|||
|
|||
Um Cookies zu deklarieren, müssen Sie `Cookie` verwenden, da diese Parameter sonst als Query-Parameter interpretiert werden würden. |
|||
Um Cookies zu deklarieren, müssen Sie `Cookie` verwenden, da die Parameter sonst als Query-Parameter interpretiert würden. |
|||
|
|||
/// |
|||
|
|||
## Zusammenfassung |
|||
## Zusammenfassung { #recap } |
|||
|
|||
Deklarieren Sie Cookies mittels `Cookie`, auf die gleiche Weise wie bei `Query` und `Path`. |
|||
Deklarieren Sie Cookies mit `Cookie` und verwenden Sie dabei das gleiche allgemeine Muster wie bei `Query` und `Path`. |
|||
|
@ -0,0 +1,88 @@ |
|||
# CORS (Cross-Origin Resource Sharing) { #cors-cross-origin-resource-sharing } |
|||
|
|||
<a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">CORS oder <abbr title="Ressourcenfreigabe zwischen Ursprüngen">„Cross-Origin Resource Sharing“</abbr></a> bezieht sich auf Situationen, in denen ein Frontend, das in einem Browser läuft, JavaScript-Code enthält, der mit einem Backend kommuniziert, und das Backend sich in einem anderen „Origin“ als das Frontend befindet. |
|||
|
|||
## Origin { #origin } |
|||
|
|||
Ein <abbr title="Ursprung">Origin</abbr> ist die Kombination aus Protokoll (`http`, `https`), Domain (`myapp.com`, `localhost`, `localhost.tiangolo.com`) und Port (`80`, `443`, `8080`). |
|||
|
|||
Alle folgenden sind also unterschiedliche Origins: |
|||
|
|||
* `http://localhost` |
|||
* `https://localhost` |
|||
* `http://localhost:8080` |
|||
|
|||
Auch wenn sie alle in `localhost` sind, verwenden sie unterschiedliche Protokolle oder Ports, daher sind sie unterschiedliche „Origins“. |
|||
|
|||
## Schritte { #steps } |
|||
|
|||
Angenommen, Sie haben ein Frontend, das in Ihrem Browser unter `http://localhost:8080` läuft, und dessen JavaScript versucht, mit einem Backend zu kommunizieren, das unter `http://localhost` läuft (da wir keinen Port angegeben haben, geht der Browser vom Default-Port `80` aus). |
|||
|
|||
Dann wird der Browser ein HTTP-`OPTIONS`-<abbr title="Request – Anfrage: Daten, die der Client zum Server sendet">Request</abbr> an das `:80`-Backend senden, und wenn das Backend die entsprechenden Header sendet, die die Kommunikation von diesem anderen Origin (`http://localhost:8080`) autorisieren, lässt der `:8080`-Browser das JavaScript im Frontend seinen Request an das `:80`-Backend senden. |
|||
|
|||
Um dies zu erreichen, muss das `:80`-Backend eine Liste von „erlaubten Origins“ haben. |
|||
|
|||
In diesem Fall müsste die Liste `http://localhost:8080` enthalten, damit das `:8080`-Frontend korrekt funktioniert. |
|||
|
|||
## Wildcards { #wildcards } |
|||
|
|||
Es ist auch möglich, die Liste als `"*"` (ein „Wildcard“) zu deklarieren, um anzuzeigen, dass alle erlaubt sind. |
|||
|
|||
Aber das erlaubt nur bestimmte Arten der Kommunikation und schließt alles aus, was Anmeldeinformationen beinhaltet: Cookies, Autorisierungsheader wie die, die mit Bearer Tokens verwendet werden, usw. |
|||
|
|||
Um sicherzustellen, dass alles korrekt funktioniert, ist es besser, die erlaubten Origins explizit anzugeben. |
|||
|
|||
## `CORSMiddleware` verwenden { #use-corsmiddleware } |
|||
|
|||
Sie können das in Ihrer **FastAPI**-Anwendung mit der `CORSMiddleware` konfigurieren. |
|||
|
|||
* Importieren Sie `CORSMiddleware`. |
|||
* Erstellen Sie eine Liste der erlaubten Origins (als Strings). |
|||
* Fügen Sie es als „Middleware“ zu Ihrer **FastAPI**-Anwendung hinzu. |
|||
|
|||
Sie können auch angeben, ob Ihr Backend erlaubt: |
|||
|
|||
* Anmeldeinformationen (Autorisierungsheader, Cookies, usw.). |
|||
* Bestimmte HTTP-Methoden (`POST`, `PUT`) oder alle mit der Wildcard `"*"`. |
|||
* Bestimmte HTTP-Header oder alle mit der Wildcard `"*"`. |
|||
|
|||
{* ../../docs_src/cors/tutorial001.py hl[2,6:11,13:19] *} |
|||
|
|||
Die von der `CORSMiddleware`-Implementierung verwendeten Defaultparameter sind standardmäßig restriktiv, daher müssen Sie bestimmte Origins, Methoden oder Header ausdrücklich aktivieren, damit Browser sie in einem Cross-Domain-Kontext verwenden dürfen. |
|||
|
|||
Die folgenden Argumente werden unterstützt: |
|||
|
|||
* `allow_origins` – Eine Liste von Origins, die Cross-Origin-Requests machen dürfen. z. B. `['https://example.org', 'https://www.example.org']`. Sie können `['*']` verwenden, um jedes Origin zuzulassen. |
|||
* `allow_origin_regex` – Ein Regex-String zum Abgleichen gegen Origins, die Cross-Origin-Requests machen dürfen. z. B. `'https://.*\.example\.org'`. |
|||
* `allow_methods` – Eine Liste von HTTP-Methoden, die für Cross-Origin-Requests erlaubt sein sollen. Standardmäßig `['GET']`. Sie können `['*']` verwenden, um alle Standardmethoden zu erlauben. |
|||
* `allow_headers` – Eine Liste von HTTP-Requestheadern, die für Cross-Origin-Requests unterstützt werden sollten. Standardmäßig `[]`. Sie können `['*']` verwenden, um alle Header zu erlauben. Die Header `Accept`, `Accept-Language`, `Content-Language` und `Content-Type` sind immer für <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#simple_requests" class="external-link" rel="noopener" target="_blank">einfache CORS-Requests</a> erlaubt. |
|||
* `allow_credentials` – Anzeigen, dass Cookies für Cross-Origin-Requests unterstützt werden sollten. Standardmäßig `False`. |
|||
|
|||
Keines der `allow_origins`, `allow_methods` und `allow_headers` kann auf `['*']` gesetzt werden, wenn `allow_credentials` auf `True` gesetzt ist. Alle müssen <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS#credentialed_requests_and_wildcards" class="external-link" rel="noopener" target="_blank">explizit angegeben</a> werden. |
|||
|
|||
* `expose_headers` – Angabe der Responseheader, auf die der Browser zugreifen können soll. Standardmäßig `[]`. |
|||
* `max_age` – Legt eine maximale Zeit in Sekunden fest, die Browser CORS-Responses zwischenspeichern dürfen. Standardmäßig `600`. |
|||
|
|||
Die Middleware antwortet auf zwei besondere Arten von HTTP-Requests ... |
|||
|
|||
### CORS-Preflight-Requests { #cors-preflight-requests } |
|||
|
|||
Dies sind alle `OPTIONS`-Requests mit `Origin`- und `Access-Control-Request-Method`-Headern. |
|||
|
|||
In diesem Fall wird die Middleware den eingehenden Request abfangen und mit entsprechenden CORS-Headern, und entweder einer `200`- oder `400`-<abbr title="Response – Antwort: Daten, die der Server zum anfragenden Client zurücksendet">Response</abbr> zu Informationszwecken antworten. |
|||
|
|||
### Einfache Requests { #simple-requests } |
|||
|
|||
Jeder Request mit einem `Origin`-Header. In diesem Fall wird die Middleware den Request wie gewohnt durchlassen, aber entsprechende CORS-Header in die Response aufnehmen. |
|||
|
|||
## Weitere Informationen { #more-info } |
|||
|
|||
Weitere Informationen zu <abbr title="Cross-Origin Resource Sharing – Ressourcenfreigabe zwischen Ursprüngen">CORS</abbr> finden Sie in der <a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS" class="external-link" target="_blank">Mozilla CORS-Dokumentation</a>. |
|||
|
|||
/// note | Technische Details |
|||
|
|||
Sie könnten auch `from starlette.middleware.cors import CORSMiddleware` verwenden. |
|||
|
|||
**FastAPI** bietet mehrere Middlewares in `fastapi.middleware` nur als Komfort für Sie, den Entwickler. Aber die meisten der verfügbaren Middlewares stammen direkt von Starlette. |
|||
|
|||
/// |
@ -0,0 +1,113 @@ |
|||
# Debugging { #debugging } |
|||
|
|||
Sie können den Debugger in Ihrem Editor verbinden, zum Beispiel mit Visual Studio Code oder PyCharm. |
|||
|
|||
## `uvicorn` aufrufen { #call-uvicorn } |
|||
|
|||
Importieren und führen Sie `uvicorn` direkt in Ihrer FastAPI-Anwendung aus: |
|||
|
|||
{* ../../docs_src/debugging/tutorial001.py hl[1,15] *} |
|||
|
|||
### Über `__name__ == "__main__"` { #about-name-main } |
|||
|
|||
Der Hauptzweck von `__name__ == "__main__"` ist, dass Code ausgeführt wird, wenn Ihre Datei mit folgendem Befehl aufgerufen wird: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python myapp.py |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
aber nicht aufgerufen wird, wenn eine andere Datei sie importiert, wie in: |
|||
|
|||
```Python |
|||
from myapp import app |
|||
``` |
|||
|
|||
#### Weitere Details { #more-details } |
|||
|
|||
Angenommen, Ihre Datei heißt `myapp.py`. |
|||
|
|||
Wenn Sie sie mit folgendem Befehl ausführen: |
|||
|
|||
<div class="termy"> |
|||
|
|||
```console |
|||
$ python myapp.py |
|||
``` |
|||
|
|||
</div> |
|||
|
|||
dann hat in Ihrer Datei die interne Variable `__name__`, die von Python automatisch erstellt wird, als Wert den String `"__main__"`. |
|||
|
|||
Daher wird der Abschnitt: |
|||
|
|||
```Python |
|||
uvicorn.run(app, host="0.0.0.0", port=8000) |
|||
``` |
|||
|
|||
ausgeführt. |
|||
|
|||
--- |
|||
|
|||
Dies wird nicht passieren, wenn Sie das Modul (die Datei) importieren. |
|||
|
|||
Wenn Sie also eine weitere Datei `importer.py` mit folgendem Inhalt haben: |
|||
|
|||
```Python |
|||
from myapp import app |
|||
|
|||
# Hier mehr Code |
|||
``` |
|||
|
|||
wird in diesem Fall in `myapp.py` die automatisch erstellte Variable `__name__` nicht den Wert `"__main__"` haben. |
|||
|
|||
Daher wird die Zeile: |
|||
|
|||
```Python |
|||
uvicorn.run(app, host="0.0.0.0", port=8000) |
|||
``` |
|||
|
|||
nicht ausgeführt. |
|||
|
|||
/// info | Info |
|||
|
|||
Für weitere Informationen besuchen Sie bitte <a href="https://docs.python.org/3/library/__main__.html" class="external-link" target="_blank">die offizielle Python-Dokumentation</a>. |
|||
|
|||
/// |
|||
|
|||
## Ihren Code mit Ihrem Debugger ausführen { #run-your-code-with-your-debugger } |
|||
|
|||
Da Sie den Uvicorn-Server direkt aus Ihrem Code ausführen, können Sie Ihr Python-Programm (Ihre FastAPI-Anwendung) direkt aus dem Debugger aufrufen. |
|||
|
|||
--- |
|||
|
|||
Zum Beispiel können Sie in Visual Studio Code: |
|||
|
|||
* Zum „Debug“-Panel gehen. |
|||
* „Konfiguration hinzufügen ...“ auswählen. |
|||
* „Python“ auswählen. |
|||
* Den Debugger mit der Option „`Python: Current File (Integrated Terminal)`“ ausführen. |
|||
|
|||
Der Server wird dann mit Ihrem **FastAPI**-Code gestartet, an Ihren Haltepunkten angehalten, usw. |
|||
|
|||
So könnte es aussehen: |
|||
|
|||
<img src="/img/tutorial/debugging/image01.png"> |
|||
|
|||
--- |
|||
|
|||
Wenn Sie Pycharm verwenden, können Sie: |
|||
|
|||
* Das Menü „Run“ öffnen. |
|||
* Die Option „Debug ...“ auswählen. |
|||
* Ein Kontextmenü wird angezeigt. |
|||
* Die zu debuggende Datei auswählen (in diesem Fall `main.py`). |
|||
|
|||
Der Server wird dann mit Ihrem **FastAPI**-Code gestartet, an Ihren Haltepunkten angehalten, usw. |
|||
|
|||
So könnte es aussehen: |
|||
|
|||
<img src="/img/tutorial/debugging/image02.png"> |
Some files were not shown because too many files changed in this diff
Loading…
Reference in new issue