From 256426ede130cad32a8f6c08d6242f47f56c6a6d Mon Sep 17 00:00:00 2001 From: Alejandra <90076947+alejsdev@users.noreply.github.com> Date: Sat, 1 Jun 2024 16:05:52 -0500 Subject: [PATCH 001/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20note=20in=20`pa?= =?UTF-8?q?th-params-numeric-validations.md`=20(#11672)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/tutorial/path-params-numeric-validations.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/docs/en/docs/tutorial/path-params-numeric-validations.md b/docs/en/docs/tutorial/path-params-numeric-validations.md index b5b13cfbe..ca86ad226 100644 --- a/docs/en/docs/tutorial/path-params-numeric-validations.md +++ b/docs/en/docs/tutorial/path-params-numeric-validations.md @@ -92,11 +92,7 @@ For example, to declare a `title` metadata value for the path parameter `item_id ``` !!! note - A path parameter is always required as it has to be part of the path. - - So, you should declare it with `...` to mark it as required. - - Nevertheless, even if you declared it with `None` or set a default value, it would not affect anything, it would still be always required. + A path parameter is always required as it has to be part of the path. Even if you declared it with `None` or set a default value, it would not affect anything, it would still be always required. ## Order the parameters as you need From bcb8e64f6784d7357c685dfee8d88ca5cc065d38 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 1 Jun 2024 21:06:19 +0000 Subject: [PATCH 002/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 19cffb807..92432458d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 📝 Update note in `path-params-numeric-validations.md`. PR [#11672](https://github.com/tiangolo/fastapi/pull/11672) by [@alejsdev](https://github.com/alejsdev). * 📝 Tweak intro docs about `Annotated` and `Query()` params. PR [#11664](https://github.com/tiangolo/fastapi/pull/11664) by [@tiangolo](https://github.com/tiangolo). * 📝 Update JWT auth documentation to use PyJWT instead of pyhon-jose. PR [#11589](https://github.com/tiangolo/fastapi/pull/11589) by [@estebanx64](https://github.com/estebanx64). * 📝 Update docs. PR [#11603](https://github.com/tiangolo/fastapi/pull/11603) by [@alejsdev](https://github.com/alejsdev). From e37dd75485ad083ec2755fb8192347e728d871bf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 2 Jun 2024 20:09:53 -0500 Subject: [PATCH 003/284] =?UTF-8?q?=F0=9F=91=A5=20Update=20FastAPI=20Peopl?= =?UTF-8?q?e=20(#11669)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: github-actions --- docs/en/data/github_sponsors.yml | 134 +++--- docs/en/data/people.yml | 744 +++++++++++++++---------------- 2 files changed, 418 insertions(+), 460 deletions(-) diff --git a/docs/en/data/github_sponsors.yml b/docs/en/data/github_sponsors.yml index cd7ea52ac..5f0be61c2 100644 --- a/docs/en/data/github_sponsors.yml +++ b/docs/en/data/github_sponsors.yml @@ -17,6 +17,9 @@ sponsors: - login: cryptapi avatarUrl: https://avatars.githubusercontent.com/u/44925437?u=61369138589bc7fee6c417f3fbd50fbd38286cc4&v=4 url: https://github.com/cryptapi + - login: Kong + avatarUrl: https://avatars.githubusercontent.com/u/962416?v=4 + url: https://github.com/Kong - login: codacy avatarUrl: https://avatars.githubusercontent.com/u/1834093?v=4 url: https://github.com/codacy @@ -48,7 +51,7 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/74335107?v=4 url: https://github.com/xoflare - login: marvin-robot - avatarUrl: https://avatars.githubusercontent.com/u/41086007?u=091c5cb75af363123d66f58194805a97220ee1a7&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/41086007?u=b9fcab402d0cd0aec738b6574fe60855cb0cd36d&v=4 url: https://github.com/marvin-robot - login: BoostryJP avatarUrl: https://avatars.githubusercontent.com/u/57932412?v=4 @@ -68,9 +71,6 @@ sponsors: - login: mainframeindustries avatarUrl: https://avatars.githubusercontent.com/u/55092103?v=4 url: https://github.com/mainframeindustries - - login: AccentDesign - avatarUrl: https://avatars.githubusercontent.com/u/2429332?v=4 - url: https://github.com/AccentDesign - login: mangualero avatarUrl: https://avatars.githubusercontent.com/u/3422968?u=c59272d7b5a912d6126fd6c6f17db71e20f506eb&v=4 url: https://github.com/mangualero @@ -86,7 +86,10 @@ sponsors: - login: povilasb avatarUrl: https://avatars.githubusercontent.com/u/1213442?u=b11f58ed6ceea6e8297c9b310030478ebdac894d&v=4 url: https://github.com/povilasb -- - login: upciti +- - login: jhundman + avatarUrl: https://avatars.githubusercontent.com/u/24263908?v=4 + url: https://github.com/jhundman + - login: upciti avatarUrl: https://avatars.githubusercontent.com/u/43346262?v=4 url: https://github.com/upciti - - login: samuelcolvin @@ -116,9 +119,6 @@ sponsors: - login: ProteinQure avatarUrl: https://avatars.githubusercontent.com/u/33707203?v=4 url: https://github.com/ProteinQure - - login: wdwinslow - avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=dc01daafb354135603a263729e3d26d939c0c452&v=4 - url: https://github.com/wdwinslow - login: catherinenelson1 avatarUrl: https://avatars.githubusercontent.com/u/11951946?u=e714b957185b8cf3d301cced7fc3ad2842122c6a&v=4 url: https://github.com/catherinenelson1 @@ -149,12 +149,6 @@ sponsors: - login: RaamEEIL avatarUrl: https://avatars.githubusercontent.com/u/20320552?v=4 url: https://github.com/RaamEEIL - - login: CodeProcessor - avatarUrl: https://avatars.githubusercontent.com/u/24785073?u=b4dd0ef3f42ced86412a060dd2bd6c8caaf771aa&v=4 - url: https://github.com/CodeProcessor - - login: patsatsia - avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4 - url: https://github.com/patsatsia - login: anthonycepeda avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4 url: https://github.com/anthonycepeda @@ -167,6 +161,9 @@ sponsors: - login: DelfinaCare avatarUrl: https://avatars.githubusercontent.com/u/83734439?v=4 url: https://github.com/DelfinaCare + - login: Eruditis + avatarUrl: https://avatars.githubusercontent.com/u/95244703?v=4 + url: https://github.com/Eruditis - login: jugeeem avatarUrl: https://avatars.githubusercontent.com/u/116043716?u=ae590d79c38ac79c91b9c5caa6887d061e865a3d&v=4 url: https://github.com/jugeeem @@ -188,9 +185,9 @@ sponsors: - login: prodhype avatarUrl: https://avatars.githubusercontent.com/u/60444672?u=3f278cff25ea37ead487d7861d4a984795de819e&v=4 url: https://github.com/prodhype - - login: koconder - avatarUrl: https://avatars.githubusercontent.com/u/25068?u=582657b23622aaa3dfe68bd028a780f272f456fa&v=4 - url: https://github.com/koconder + - login: patsatsia + avatarUrl: https://avatars.githubusercontent.com/u/61111267?u=3271b85f7a37b479c8d0ae0a235182e83c166edf&v=4 + url: https://github.com/patsatsia - login: tcsmith avatarUrl: https://avatars.githubusercontent.com/u/989034?u=7d8d741552b3279e8f4d3878679823a705a46f8f&v=4 url: https://github.com/tcsmith @@ -209,6 +206,21 @@ sponsors: - login: Shark009 avatarUrl: https://avatars.githubusercontent.com/u/3163309?u=0c6f4091b0eda05c44c390466199826e6dc6e431&v=4 url: https://github.com/Shark009 + - login: dblackrun + avatarUrl: https://avatars.githubusercontent.com/u/3528486?v=4 + url: https://github.com/dblackrun + - login: zsinx6 + avatarUrl: https://avatars.githubusercontent.com/u/3532625?u=ba75a5dc744d1116ccfeaaf30d41cb2fe81fe8dd&v=4 + url: https://github.com/zsinx6 + - login: kennywakeland + avatarUrl: https://avatars.githubusercontent.com/u/3631417?u=7c8f743f1ae325dfadea7c62bbf1abd6a824fc55&v=4 + url: https://github.com/kennywakeland + - login: simw + avatarUrl: https://avatars.githubusercontent.com/u/6322526?v=4 + url: https://github.com/simw + - login: koconder + avatarUrl: https://avatars.githubusercontent.com/u/25068?u=582657b23622aaa3dfe68bd028a780f272f456fa&v=4 + url: https://github.com/koconder - login: jstanden avatarUrl: https://avatars.githubusercontent.com/u/63288?u=c3658d57d2862c607a0e19c2101c3c51876e36ad&v=4 url: https://github.com/jstanden @@ -224,9 +236,6 @@ sponsors: - login: ericof avatarUrl: https://avatars.githubusercontent.com/u/306014?u=cf7c8733620397e6584a451505581c01c5d842d7&v=4 url: https://github.com/ericof - - login: falquaddoomi - avatarUrl: https://avatars.githubusercontent.com/u/312923?u=aab6efa665ed9495ce37371af1cd637ec554772f&v=4 - url: https://github.com/falquaddoomi - login: wshayes avatarUrl: https://avatars.githubusercontent.com/u/365303?u=07ca03c5ee811eb0920e633cc3c3db73dbec1aa5&v=4 url: https://github.com/wshayes @@ -239,12 +248,6 @@ sponsors: - login: mintuhouse avatarUrl: https://avatars.githubusercontent.com/u/769950?u=ecfbd79a97d33177e0d093ddb088283cf7fe8444&v=4 url: https://github.com/mintuhouse - - login: dblackrun - avatarUrl: https://avatars.githubusercontent.com/u/3528486?v=4 - url: https://github.com/dblackrun - - login: simw - avatarUrl: https://avatars.githubusercontent.com/u/6322526?v=4 - url: https://github.com/simw - login: Rehket avatarUrl: https://avatars.githubusercontent.com/u/7015688?u=3afb0ba200feebbc7f958950e92db34df2a3c172&v=4 url: https://github.com/Rehket @@ -254,12 +257,9 @@ sponsors: - login: TrevorBenson avatarUrl: https://avatars.githubusercontent.com/u/9167887?u=afdd1766fdb79e04e59094cc6a54cd011ee7f686&v=4 url: https://github.com/TrevorBenson - - login: zsinx6 - avatarUrl: https://avatars.githubusercontent.com/u/3532625?u=ba75a5dc744d1116ccfeaaf30d41cb2fe81fe8dd&v=4 - url: https://github.com/zsinx6 - - login: kennywakeland - avatarUrl: https://avatars.githubusercontent.com/u/3631417?u=7c8f743f1ae325dfadea7c62bbf1abd6a824fc55&v=4 - url: https://github.com/kennywakeland + - login: wdwinslow + avatarUrl: https://avatars.githubusercontent.com/u/11562137?u=dc01daafb354135603a263729e3d26d939c0c452&v=4 + url: https://github.com/wdwinslow - login: aacayaco avatarUrl: https://avatars.githubusercontent.com/u/3634801?u=eaadda178c964178fcb64886f6c732172c8f8219&v=4 url: https://github.com/aacayaco @@ -269,6 +269,9 @@ sponsors: - login: jgreys avatarUrl: https://avatars.githubusercontent.com/u/4136890?u=096820d1ef89877d57d0f68e669ead8b0fde84df&v=4 url: https://github.com/jgreys + - login: Ryandaydev + avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=48f68868db8886fce31a1d802c1003914c6cd7c6&v=4 + url: https://github.com/Ryandaydev - login: jaredtrog avatarUrl: https://avatars.githubusercontent.com/u/4381365?v=4 url: https://github.com/jaredtrog @@ -308,9 +311,6 @@ sponsors: - login: rlnchow avatarUrl: https://avatars.githubusercontent.com/u/28018479?u=a93ca9cf1422b9ece155784a72d5f2fdbce7adff&v=4 url: https://github.com/rlnchow - - login: dvlpjrs - avatarUrl: https://avatars.githubusercontent.com/u/32254642?u=fbd6ad0324d4f1eb6231cf775be1c7bd4404e961&v=4 - url: https://github.com/dvlpjrs - login: engineerjoe440 avatarUrl: https://avatars.githubusercontent.com/u/33275230?u=eb223cad27017bb1e936ee9b429b450d092d0236&v=4 url: https://github.com/engineerjoe440 @@ -320,9 +320,9 @@ sponsors: - login: DevOpsKev avatarUrl: https://avatars.githubusercontent.com/u/36336550?u=6ccd5978fdaab06f37e22f2a14a7439341df7f67&v=4 url: https://github.com/DevOpsKev - - login: Zuzah - avatarUrl: https://avatars.githubusercontent.com/u/10934846?u=1ef43e075ddc87bd1178372bf4d95ee6175cae27&v=4 - url: https://github.com/Zuzah + - login: petercool + avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=81c525232bb35780945a68e88afd96bb2cdad9c4&v=4 + url: https://github.com/petercool - login: JimFawkes avatarUrl: https://avatars.githubusercontent.com/u/12075115?u=dc58ecfd064d72887c34bf500ddfd52592509acd&v=4 url: https://github.com/JimFawkes @@ -338,18 +338,24 @@ sponsors: - login: jangia avatarUrl: https://avatars.githubusercontent.com/u/17927101?u=9261b9bb0c3e3bb1ecba43e8915dc58d8c9a077e&v=4 url: https://github.com/jangia + - login: jackleeio + avatarUrl: https://avatars.githubusercontent.com/u/20477587?u=c5184dab6d021733d10c8f975b20e391856303d6&v=4 + url: https://github.com/jackleeio - login: shuheng-liu avatarUrl: https://avatars.githubusercontent.com/u/22414322?u=813c45f30786c6b511b21a661def025d8f7b609e&v=4 url: https://github.com/shuheng-liu - login: pers0n4 avatarUrl: https://avatars.githubusercontent.com/u/24864600?u=f211a13a7b572cbbd7779b9c8d8cb428cc7ba07e&v=4 url: https://github.com/pers0n4 + - login: curegit + avatarUrl: https://avatars.githubusercontent.com/u/37978051?u=1733c322079118c0cdc573c03d92813f50a9faec&v=4 + url: https://github.com/curegit - login: fernandosmither - avatarUrl: https://avatars.githubusercontent.com/u/66154723?u=a76a037b5d674938a75d2cff862fb6dfd63ec214&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/66154723?u=f79753eb207d01cca5bbb91ac62db6123e7622d1&v=4 url: https://github.com/fernandosmither - - login: romabozhanovgithub - avatarUrl: https://avatars.githubusercontent.com/u/67696229?u=e4b921eef096415300425aca249348f8abb78ad7&v=4 - url: https://github.com/romabozhanovgithub + - login: PunRabbit + avatarUrl: https://avatars.githubusercontent.com/u/70463212?u=1a835cfbc99295a60c8282f6aa6199d1b42241a5&v=4 + url: https://github.com/PunRabbit - login: PelicanQ avatarUrl: https://avatars.githubusercontent.com/u/77930606?v=4 url: https://github.com/PelicanQ @@ -359,12 +365,6 @@ sponsors: - login: zk-Call avatarUrl: https://avatars.githubusercontent.com/u/147117264?v=4 url: https://github.com/zk-Call - - login: petercool - avatarUrl: https://avatars.githubusercontent.com/u/37613029?u=81c525232bb35780945a68e88afd96bb2cdad9c4&v=4 - url: https://github.com/petercool - - login: curegit - avatarUrl: https://avatars.githubusercontent.com/u/37978051?u=1733c322079118c0cdc573c03d92813f50a9faec&v=4 - url: https://github.com/curegit - login: kristiangronberg avatarUrl: https://avatars.githubusercontent.com/u/42678548?v=4 url: https://github.com/kristiangronberg @@ -380,15 +380,18 @@ sponsors: - login: ArtyomVancyan avatarUrl: https://avatars.githubusercontent.com/u/44609997?v=4 url: https://github.com/ArtyomVancyan + - login: harol97 + avatarUrl: https://avatars.githubusercontent.com/u/49042862?u=2b18e115ab73f5f09a280be2850f93c58a12e3d2&v=4 + url: https://github.com/harol97 - login: hgalytoby avatarUrl: https://avatars.githubusercontent.com/u/50397689?u=62c7ff3519858423579676cd0efbd7e3f1ffe63a&v=4 url: https://github.com/hgalytoby - login: conservative-dude avatarUrl: https://avatars.githubusercontent.com/u/55538308?u=f250c44942ea6e73a6bd90739b381c470c192c11&v=4 url: https://github.com/conservative-dude - - login: tochikuji - avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4 - url: https://github.com/tochikuji + - login: Joaopcamposs + avatarUrl: https://avatars.githubusercontent.com/u/57376574?u=699d5ba5ee66af1d089df6b5e532b97169e73650&v=4 + url: https://github.com/Joaopcamposs - login: browniebroke avatarUrl: https://avatars.githubusercontent.com/u/861044?u=5abfca5588f3e906b31583d7ee62f6de4b68aa24&v=4 url: https://github.com/browniebroke @@ -407,9 +410,6 @@ sponsors: - login: cbonoz avatarUrl: https://avatars.githubusercontent.com/u/2351087?u=fd3e8030b2cc9fbfbb54a65e9890c548a016f58b&v=4 url: https://github.com/cbonoz - - login: anthonycorletti - avatarUrl: https://avatars.githubusercontent.com/u/3477132?u=dfe51d2080fbd3fee81e05911cd8d50da9dcc709&v=4 - url: https://github.com/anthonycorletti - login: ddanier avatarUrl: https://avatars.githubusercontent.com/u/113563?u=ed1dc79de72f93bd78581f88ebc6952b62f472da&v=4 url: https://github.com/ddanier @@ -431,6 +431,9 @@ sponsors: - login: securancy avatarUrl: https://avatars.githubusercontent.com/u/606673?v=4 url: https://github.com/securancy + - login: tochikuji + avatarUrl: https://avatars.githubusercontent.com/u/851759?v=4 + url: https://github.com/tochikuji - login: KentShikama avatarUrl: https://avatars.githubusercontent.com/u/6329898?u=8b236810db9b96333230430837e1f021f9246da1&v=4 url: https://github.com/KentShikama @@ -450,7 +453,7 @@ sponsors: avatarUrl: https://avatars.githubusercontent.com/u/9369632?u=8c988f1b008a3f601385a3616f9327820f66e3a5&v=4 url: https://github.com/msehnout - login: xncbf - avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=ee91e210ae93b9cdd8f248b21cb028316cc0b747&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/9462045?u=2ef1ede118a72c170805f50b9ad07341fd16a354&v=4 url: https://github.com/xncbf - login: DMantis avatarUrl: https://avatars.githubusercontent.com/u/9536869?v=4 @@ -473,6 +476,9 @@ sponsors: - login: dzoladz avatarUrl: https://avatars.githubusercontent.com/u/10561752?u=5ee314d54aa79592c18566827ad8914debd5630d&v=4 url: https://github.com/dzoladz + - login: Zuzah + avatarUrl: https://avatars.githubusercontent.com/u/10934846?u=1ef43e075ddc87bd1178372bf4d95ee6175cae27&v=4 + url: https://github.com/Zuzah - login: Alisa-lisa avatarUrl: https://avatars.githubusercontent.com/u/4137964?u=e7e393504f554f4ff15863a1e01a5746863ef9ce&v=4 url: https://github.com/Alisa-lisa @@ -503,24 +509,24 @@ sponsors: - - login: danburonline avatarUrl: https://avatars.githubusercontent.com/u/34251194?u=94935cccfbec58083ab1e535212d54f1bf2c978a&v=4 url: https://github.com/danburonline + - login: AliYmn + avatarUrl: https://avatars.githubusercontent.com/u/18416653?u=0de5a262e8b4dc0a08d065f30f7a39941e246530&v=4 + url: https://github.com/AliYmn - login: sadikkuzu avatarUrl: https://avatars.githubusercontent.com/u/23168063?u=d179c06bb9f65c4167fcab118526819f8e0dac17&v=4 url: https://github.com/sadikkuzu - - login: Mehver - avatarUrl: https://avatars.githubusercontent.com/u/75297777?u=dcd857f4278df055d98cd3486c2ce8bad368eb50&v=4 - url: https://github.com/Mehver + - login: tran-hai-long + avatarUrl: https://avatars.githubusercontent.com/u/119793901?u=3b173a845dcf099b275bdc9713a69cbbc36040ce&v=4 + url: https://github.com/tran-hai-long - login: rwxd avatarUrl: https://avatars.githubusercontent.com/u/40308458?u=cd04a39e3655923be4f25c2ba8a5a07b3da3230a&v=4 url: https://github.com/rwxd - - login: zee229 - avatarUrl: https://avatars.githubusercontent.com/u/48365508?u=eac8e8bb968ed3391439a98490d3e6e5f6f2826b&v=4 - url: https://github.com/zee229 - - login: Patechoc - avatarUrl: https://avatars.githubusercontent.com/u/2376641?u=23b49e9eda04f078cb74fa3f93593aa6a57bb138&v=4 - url: https://github.com/Patechoc - login: ssbarnea avatarUrl: https://avatars.githubusercontent.com/u/102495?u=c2efbf6fea2737e21dfc6b1113c4edc9644e9eaa&v=4 url: https://github.com/ssbarnea - login: yuawn avatarUrl: https://avatars.githubusercontent.com/u/5111198?u=5315576f3fe1a70fd2d0f02181588f4eea5d353d&v=4 url: https://github.com/yuawn + - login: dongzhenye + avatarUrl: https://avatars.githubusercontent.com/u/5765843?u=fe420c9a4c41e5b060faaf44029f5485616b470d&v=4 + url: https://github.com/dongzhenye diff --git a/docs/en/data/people.yml b/docs/en/data/people.yml index 01f97b2ce..02d1779e0 100644 --- a/docs/en/data/people.yml +++ b/docs/en/data/people.yml @@ -1,12 +1,12 @@ maintainers: - login: tiangolo - answers: 1880 - prs: 570 + answers: 1885 + prs: 577 avatarUrl: https://avatars.githubusercontent.com/u/1326112?u=740f11212a731f56798f558ceddb0bd07642afa7&v=4 url: https://github.com/tiangolo experts: - login: Kludex - count: 600 + count: 608 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: dmontagu @@ -14,7 +14,7 @@ experts: avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 url: https://github.com/dmontagu - login: jgould22 - count: 240 + count: 241 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: Mause @@ -23,7 +23,7 @@ experts: url: https://github.com/Mause - login: ycd count: 217 - avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=45aa6ef58220a3f1e8a3c3cd5f1b75a1a0a73347&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=29682e4b6ac7d5293742ccf818188394b9a82972&v=4 url: https://github.com/ycd - login: JarroVGIT count: 193 @@ -41,24 +41,24 @@ experts: count: 126 avatarUrl: https://avatars.githubusercontent.com/u/331403?v=4 url: https://github.com/phy25 +- login: YuriiMotov + count: 104 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 + url: https://github.com/YuriiMotov - login: raphaelauv count: 83 avatarUrl: https://avatars.githubusercontent.com/u/10202690?u=e6f86f5c0c3026a15d6b51792fa3e532b12f1371&v=4 url: https://github.com/raphaelauv -- login: YuriiMotov - count: 75 - avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 - url: https://github.com/YuriiMotov -- login: ghandic - count: 71 - avatarUrl: https://avatars.githubusercontent.com/u/23500353?u=e2e1d736f924d9be81e8bfc565b6d8836ba99773&v=4 - url: https://github.com/ghandic - login: ArcLightSlavik count: 71 avatarUrl: https://avatars.githubusercontent.com/u/31127044?u=b0f2c37142f4b762e41ad65dc49581813422bd71&v=4 url: https://github.com/ArcLightSlavik +- login: ghandic + count: 71 + avatarUrl: https://avatars.githubusercontent.com/u/23500353?u=e2e1d736f924d9be81e8bfc565b6d8836ba99773&v=4 + url: https://github.com/ghandic - login: JavierSanchezCastro - count: 60 + count: 64 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: falkben @@ -66,7 +66,7 @@ experts: avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4 url: https://github.com/falkben - login: n8sty - count: 54 + count: 56 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty - login: acidjunk @@ -81,26 +81,26 @@ experts: count: 49 avatarUrl: https://avatars.githubusercontent.com/u/516999?u=437c0c5038558c67e887ccd863c1ba0f846c03da&v=4 url: https://github.com/sm-Fifteen -- login: Dustyposa - count: 45 - avatarUrl: https://avatars.githubusercontent.com/u/27180793?u=5cf2877f50b3eb2bc55086089a78a36f07042889&v=4 - url: https://github.com/Dustyposa - login: insomnes count: 45 avatarUrl: https://avatars.githubusercontent.com/u/16958893?u=f8be7088d5076d963984a21f95f44e559192d912&v=4 url: https://github.com/insomnes +- login: Dustyposa + count: 45 + avatarUrl: https://avatars.githubusercontent.com/u/27180793?u=5cf2877f50b3eb2bc55086089a78a36f07042889&v=4 + url: https://github.com/Dustyposa - login: adriangb count: 45 avatarUrl: https://avatars.githubusercontent.com/u/1755071?u=612704256e38d6ac9cbed24f10e4b6ac2da74ecb&v=4 url: https://github.com/adriangb -- login: odiseo0 - count: 43 - avatarUrl: https://avatars.githubusercontent.com/u/87550035?u=241a71f6b7068738b81af3e57f45ffd723538401&v=4 - url: https://github.com/odiseo0 - login: frankie567 count: 43 avatarUrl: https://avatars.githubusercontent.com/u/1144727?u=c159fe047727aedecbbeeaa96a1b03ceb9d39add&v=4 url: https://github.com/frankie567 +- login: odiseo0 + count: 43 + avatarUrl: https://avatars.githubusercontent.com/u/87550035?u=241a71f6b7068738b81af3e57f45ffd723538401&v=4 + url: https://github.com/odiseo0 - login: includeamin count: 40 avatarUrl: https://avatars.githubusercontent.com/u/11836741?u=8bd5ef7e62fe6a82055e33c4c0e0a7879ff8cfb6&v=4 @@ -125,6 +125,10 @@ experts: count: 28 avatarUrl: https://avatars.githubusercontent.com/u/28061158?u=72309cc1f2e04e40fa38b29969cb4e9d3f722e7b&v=4 url: https://github.com/prostomarkeloff +- login: hasansezertasan + count: 27 + avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 + url: https://github.com/hasansezertasan - login: dbanty count: 26 avatarUrl: https://avatars.githubusercontent.com/u/43723790?u=9bcce836bbce55835291c5b2ac93a4e311f4b3c3&v=4 @@ -141,18 +145,14 @@ experts: count: 23 avatarUrl: https://avatars.githubusercontent.com/u/9435877?u=719327b7d2c4c62212456d771bfa7c6b8dbb9eac&v=4 url: https://github.com/SirTelemak -- login: hasansezertasan +- login: nymous count: 22 - avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 - url: https://github.com/hasansezertasan + avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 + url: https://github.com/nymous - login: chrisK824 count: 22 avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 url: https://github.com/chrisK824 -- login: nymous - count: 21 - avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 - url: https://github.com/nymous - login: rafsaf count: 21 avatarUrl: https://avatars.githubusercontent.com/u/51059348?u=5fe59a56e1f2f9ccd8005d71752a8276f133ae1a&v=4 @@ -199,130 +199,106 @@ experts: url: https://github.com/dstlny last_month_experts: - login: YuriiMotov - count: 33 + count: 29 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov -- login: jgould22 - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 - url: https://github.com/jgould22 +- login: killjoy1221 + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=723662989f2027755e67d200137c13c53ae154ac&v=4 + url: https://github.com/killjoy1221 +- login: Kludex + count: 7 + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 + url: https://github.com/Kludex - login: JavierSanchezCastro count: 5 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro -- login: sehraramiz - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/14166324?v=4 - url: https://github.com/sehraramiz -- login: estebanx64 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 - url: https://github.com/estebanx64 -- login: ryanisn - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/53449841?v=4 - url: https://github.com/ryanisn -- login: acidjunk +- login: hasansezertasan + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 + url: https://github.com/hasansezertasan +- login: PhysicallyActive count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 - url: https://github.com/acidjunk -- login: pprunty - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/58374462?u=5736576e586429abc97a803b8bcd4a6d828b8a2f&v=4 - url: https://github.com/pprunty + avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 + url: https://github.com/PhysicallyActive - login: n8sty count: 2 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty -- login: angely-dev - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/4362224?v=4 - url: https://github.com/angely-dev -- login: mastizada - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1975818?u=0751a06d7271c8bf17cb73b1b845644ab4d2c6dc&v=4 - url: https://github.com/mastizada -- login: Kludex - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 - url: https://github.com/Kludex -- login: Jackiexiao - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/18050469?u=a2003e21a7780477ba00bf87a9abef8af58e91d1&v=4 - url: https://github.com/Jackiexiao -- login: hasansezertasan +- login: pedroconceicao count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 - url: https://github.com/hasansezertasan -- login: sm-Fifteen + avatarUrl: https://avatars.githubusercontent.com/u/32837064?u=5a0e6559bc391442629a28b6923790b54deb4464&v=4 + url: https://github.com/pedroconceicao +- login: PREPONDERANCE count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/516999?u=437c0c5038558c67e887ccd863c1ba0f846c03da&v=4 - url: https://github.com/sm-Fifteen -- login: methane + avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 + url: https://github.com/PREPONDERANCE +- login: aanchlia count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/199592?v=4 - url: https://github.com/methane -- login: konstantinos1981 + avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 + url: https://github.com/aanchlia +- login: 0sahil count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/39465388?v=4 - url: https://github.com/konstantinos1981 -- login: fabianfalon + avatarUrl: https://avatars.githubusercontent.com/u/58521386?u=ac00b731c07c712d0baa57b8b70ac8422acf183c&v=4 + url: https://github.com/0sahil +- login: jgould22 count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/3700760?u=95f69e31280b17ac22299cdcd345323b142fe0af&v=4 - url: https://github.com/fabianfalon + avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 + url: https://github.com/jgould22 three_months_experts: - login: YuriiMotov - count: 75 + count: 101 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov +- login: JavierSanchezCastro + count: 20 + avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 + url: https://github.com/JavierSanchezCastro - login: Kludex - count: 31 + count: 17 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: jgould22 - count: 28 + count: 14 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 -- login: JavierSanchezCastro - count: 22 - avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 - url: https://github.com/JavierSanchezCastro -- login: n8sty - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 - url: https://github.com/n8sty -- login: estebanx64 - count: 7 - avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 - url: https://github.com/estebanx64 +- login: killjoy1221 + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=723662989f2027755e67d200137c13c53ae154ac&v=4 + url: https://github.com/killjoy1221 - login: hasansezertasan - count: 5 + count: 8 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan -- login: acidjunk - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 - url: https://github.com/acidjunk +- login: PhysicallyActive + count: 6 + avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 + url: https://github.com/PhysicallyActive +- login: n8sty + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 + url: https://github.com/n8sty - login: sehraramiz count: 4 avatarUrl: https://avatars.githubusercontent.com/u/14166324?v=4 url: https://github.com/sehraramiz -- login: GodMoonGoodman - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/29688727?u=7b251da620d999644c37c1feeb292d033eed7ad6&v=4 - url: https://github.com/GodMoonGoodman -- login: flo-at +- login: acidjunk count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/564288?v=4 - url: https://github.com/flo-at -- login: PhysicallyActive + avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 + url: https://github.com/acidjunk +- login: estebanx64 count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 - url: https://github.com/PhysicallyActive -- login: angely-dev + avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 + url: https://github.com/estebanx64 +- login: PREPONDERANCE count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/4362224?v=4 - url: https://github.com/angely-dev + avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 + url: https://github.com/PREPONDERANCE +- login: chrisK824 + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 + url: https://github.com/chrisK824 - login: ryanisn count: 3 avatarUrl: https://avatars.githubusercontent.com/u/53449841?v=4 @@ -335,42 +311,50 @@ three_months_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/15116058?u=4b64c643fad49225d854e1aaecd1ffc6f9071a1b&v=4 url: https://github.com/omarcruzpantoja -- login: ahmedabdou14 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/104530599?u=05365b155a1ff911532e8be316acfad2e0736f98&v=4 - url: https://github.com/ahmedabdou14 +- login: mskrip + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/17459600?u=10019d5c38ae3374dd4a6743b0223e56a78d4855&v=4 + url: https://github.com/mskrip +- login: pedroconceicao + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/32837064?u=5a0e6559bc391442629a28b6923790b54deb4464&v=4 + url: https://github.com/pedroconceicao +- login: Jackiexiao + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/18050469?u=a2003e21a7780477ba00bf87a9abef8af58e91d1&v=4 + url: https://github.com/Jackiexiao +- login: aanchlia + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 + url: https://github.com/aanchlia +- login: moreno-p + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/164261630?v=4 + url: https://github.com/moreno-p +- login: 0sahil + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/58521386?u=ac00b731c07c712d0baa57b8b70ac8422acf183c&v=4 + url: https://github.com/0sahil +- login: patrick91 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/667029?u=e35958a75ac1f99c81b4bc99e22db8cd665ae7f0&v=4 + url: https://github.com/patrick91 - login: pprunty count: 2 avatarUrl: https://avatars.githubusercontent.com/u/58374462?u=5736576e586429abc97a803b8bcd4a6d828b8a2f&v=4 url: https://github.com/pprunty -- login: leonidktoto - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/159561986?v=4 - url: https://github.com/leonidktoto -- login: JonnyBootsNpants - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/155071540?u=2d3a72b74a2c4c8eaacdb625c7ac850369579352&v=4 - url: https://github.com/JonnyBootsNpants -- login: richin13 +- login: angely-dev count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/8370058?u=8e37a4cdbc78983a5f4b4847f6d1879fb39c851c&v=4 - url: https://github.com/richin13 + avatarUrl: https://avatars.githubusercontent.com/u/4362224?v=4 + url: https://github.com/angely-dev - login: mastizada count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1975818?u=0751a06d7271c8bf17cb73b1b845644ab4d2c6dc&v=4 url: https://github.com/mastizada -- login: Jackiexiao - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/18050469?u=a2003e21a7780477ba00bf87a9abef8af58e91d1&v=4 - url: https://github.com/Jackiexiao - login: sm-Fifteen count: 2 avatarUrl: https://avatars.githubusercontent.com/u/516999?u=437c0c5038558c67e887ccd863c1ba0f846c03da&v=4 url: https://github.com/sm-Fifteen -- login: JoshYuJump - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/5901894?u=cdbca6296ac4cdcdf6945c112a1ce8d5342839ea&v=4 - url: https://github.com/JoshYuJump - login: methane count: 2 avatarUrl: https://avatars.githubusercontent.com/u/199592?v=4 @@ -387,10 +371,6 @@ three_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/3700760?u=95f69e31280b17ac22299cdcd345323b142fe0af&v=4 url: https://github.com/fabianfalon -- login: admo1 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/14835916?v=4 - url: https://github.com/admo1 - login: VatsalJagani count: 2 avatarUrl: https://avatars.githubusercontent.com/u/20964366?u=43552644be05c9107c029e26d5ab3be5a1920f45&v=4 @@ -399,103 +379,71 @@ three_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/45245894?u=49ed5056426a149a5af29d385d8bd3847101d3a4&v=4 url: https://github.com/khaledadrani -- login: chrisK824 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 - url: https://github.com/chrisK824 - login: ThirVondukr count: 2 avatarUrl: https://avatars.githubusercontent.com/u/50728601?u=167c0bd655e52817082e50979a86d2f98f95b1a3&v=4 url: https://github.com/ThirVondukr -- login: hussein-awala - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/21311487?u=cbbc60943d3fedfb869e49b604020a821f589659&v=4 - url: https://github.com/hussein-awala -- login: falkben - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/653031?u=ad9838e089058c9e5a0bab94c0eec7cc181e0cd0&v=4 - url: https://github.com/falkben -- login: mielvds - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1032980?u=722c96b0a234752df23f04df150ef36441ceb43c&v=4 - url: https://github.com/mielvds -- login: pbasista - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/1535892?u=e9a8bd5b3b2f95340cfeb4bc97886e9334911669&v=4 - url: https://github.com/pbasista -- login: DJoepie - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/78362619?u=fe6e8d05f94d8d4c0679a4da943955a686f96177&v=4 - url: https://github.com/DJoepie -- login: msehnout - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/9369632?u=8c988f1b008a3f601385a3616f9327820f66e3a5&v=4 - url: https://github.com/msehnout six_months_experts: -- login: Kludex - count: 101 - avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 - url: https://github.com/Kludex - login: YuriiMotov - count: 75 + count: 104 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov -- login: jgould22 - count: 53 - avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 - url: https://github.com/jgould22 +- login: Kludex + count: 104 + avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 + url: https://github.com/Kludex - login: JavierSanchezCastro count: 40 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro +- login: jgould22 + count: 40 + avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 + url: https://github.com/jgould22 - login: hasansezertasan - count: 18 + count: 21 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: n8sty - count: 17 + count: 19 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty +- login: killjoy1221 + count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=723662989f2027755e67d200137c13c53ae154ac&v=4 + url: https://github.com/killjoy1221 +- login: aanchlia + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 + url: https://github.com/aanchlia - login: estebanx64 count: 7 avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 url: https://github.com/estebanx64 +- login: PhysicallyActive + count: 6 + avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 + url: https://github.com/PhysicallyActive - login: dolfinus count: 6 avatarUrl: https://avatars.githubusercontent.com/u/4661021?u=a51b39001a2e5e7529b45826980becf786de2327&v=4 url: https://github.com/dolfinus -- login: aanchlia - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 - url: https://github.com/aanchlia - login: Ventura94 count: 6 avatarUrl: https://avatars.githubusercontent.com/u/43103937?u=ccb837005aaf212a449c374618c4339089e2f733&v=4 url: https://github.com/Ventura94 -- login: acidjunk - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 - url: https://github.com/acidjunk - login: sehraramiz count: 5 avatarUrl: https://avatars.githubusercontent.com/u/14166324?v=4 url: https://github.com/sehraramiz +- login: acidjunk + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 + url: https://github.com/acidjunk - login: shashstormer count: 5 avatarUrl: https://avatars.githubusercontent.com/u/90090313?v=4 url: https://github.com/shashstormer -- login: yinziyan1206 - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4 - url: https://github.com/yinziyan1206 -- login: nymous - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 - url: https://github.com/nymous -- login: JoshYuJump - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/5901894?u=cdbca6296ac4cdcdf6945c112a1ce8d5342839ea&v=4 - url: https://github.com/JoshYuJump - login: GodMoonGoodman count: 4 avatarUrl: https://avatars.githubusercontent.com/u/29688727?u=7b251da620d999644c37c1feeb292d033eed7ad6&v=4 @@ -504,10 +452,14 @@ six_months_experts: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/564288?v=4 url: https://github.com/flo-at -- login: PhysicallyActive +- login: PREPONDERANCE count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 - url: https://github.com/PhysicallyActive + avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 + url: https://github.com/PREPONDERANCE +- login: chrisK824 + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 + url: https://github.com/chrisK824 - login: angely-dev count: 3 avatarUrl: https://avatars.githubusercontent.com/u/4362224?v=4 @@ -520,14 +472,10 @@ six_months_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/53449841?v=4 url: https://github.com/ryanisn -- login: theobouwman - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/16098190?u=dc70db88a7a99b764c9a89a6e471e0b7ca478a35&v=4 - url: https://github.com/theobouwman -- login: amacfie +- login: JoshYuJump count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/889657?u=d70187989940b085bcbfa3bedad8dbc5f3ab1fe7&v=4 - url: https://github.com/amacfie + avatarUrl: https://avatars.githubusercontent.com/u/5901894?u=cdbca6296ac4cdcdf6945c112a1ce8d5342839ea&v=4 + url: https://github.com/JoshYuJump - login: pythonweb2 count: 3 avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 @@ -541,25 +489,61 @@ six_months_experts: avatarUrl: https://avatars.githubusercontent.com/u/92912507?v=4 url: https://github.com/bogdan-coman-uv - login: ahmedabdou14 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/104530599?u=05365b155a1ff911532e8be316acfad2e0736f98&v=4 - url: https://github.com/ahmedabdou14 -- login: chrisK824 - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 - url: https://github.com/chrisK824 -- login: WilliamStam - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/182800?v=4 - url: https://github.com/WilliamStam -- login: pprunty + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/104530599?u=05365b155a1ff911532e8be316acfad2e0736f98&v=4 + url: https://github.com/ahmedabdou14 +- login: mskrip count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/58374462?u=5736576e586429abc97a803b8bcd4a6d828b8a2f&v=4 - url: https://github.com/pprunty + avatarUrl: https://avatars.githubusercontent.com/u/17459600?u=10019d5c38ae3374dd4a6743b0223e56a78d4855&v=4 + url: https://github.com/mskrip - login: leonidktoto count: 2 avatarUrl: https://avatars.githubusercontent.com/u/159561986?v=4 url: https://github.com/leonidktoto +- login: pedroconceicao + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/32837064?u=5a0e6559bc391442629a28b6923790b54deb4464&v=4 + url: https://github.com/pedroconceicao +- login: hwong557 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/460259?u=7d2f1b33ea5bda4d8e177ab3cb924a673d53087e&v=4 + url: https://github.com/hwong557 +- login: Jackiexiao + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/18050469?u=a2003e21a7780477ba00bf87a9abef8af58e91d1&v=4 + url: https://github.com/Jackiexiao +- login: admo1 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/14835916?v=4 + url: https://github.com/admo1 +- login: binbjz + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=22b68b7a0d5bf5e09c02084c0f5f53d7503114cd&v=4 + url: https://github.com/binbjz +- login: nameer + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/3931725?u=6199fb065df098fc13ac0a5e649f89672b586732&v=4 + url: https://github.com/nameer +- login: moreno-p + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/164261630?v=4 + url: https://github.com/moreno-p +- login: 0sahil + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/58521386?u=ac00b731c07c712d0baa57b8b70ac8422acf183c&v=4 + url: https://github.com/0sahil +- login: nymous + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 + url: https://github.com/nymous +- login: patrick91 + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/667029?u=e35958a75ac1f99c81b4bc99e22db8cd665ae7f0&v=4 + url: https://github.com/patrick91 +- login: pprunty + count: 2 + avatarUrl: https://avatars.githubusercontent.com/u/58374462?u=5736576e586429abc97a803b8bcd4a6d828b8a2f&v=4 + url: https://github.com/pprunty - login: JonnyBootsNpants count: 2 avatarUrl: https://avatars.githubusercontent.com/u/155071540?u=2d3a72b74a2c4c8eaacdb625c7ac850369579352&v=4 @@ -572,38 +556,14 @@ six_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/1975818?u=0751a06d7271c8bf17cb73b1b845644ab4d2c6dc&v=4 url: https://github.com/mastizada -- login: MRigal - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/2190327?u=557f399ee90319da7bc4a7d9274e110836b0bd60&v=4 - url: https://github.com/MRigal -- login: WSH032 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/126865849?v=4 - url: https://github.com/WSH032 -- login: Jackiexiao - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/18050469?u=a2003e21a7780477ba00bf87a9abef8af58e91d1&v=4 - url: https://github.com/Jackiexiao -- login: osangu - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/80697064?u=de9bae685e2228bffd4e202274e1df1afaf54a0d&v=4 - url: https://github.com/osangu - login: sm-Fifteen count: 2 avatarUrl: https://avatars.githubusercontent.com/u/516999?u=437c0c5038558c67e887ccd863c1ba0f846c03da&v=4 url: https://github.com/sm-Fifteen -- login: goharShoukat - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/25367760?u=50ced9bb83eca72813fb907b7b201defde635d33&v=4 - url: https://github.com/goharShoukat -- login: elijahsgh - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/3681218?u=d46e61b498776e3e21815a46f52ceee08c3f2184&v=4 - url: https://github.com/elijahsgh -- login: jw-00000 +- login: amacfie count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/2936?u=93c349e055ad517dc1d83f30bdf6fa9211d7f6a9&v=4 - url: https://github.com/jw-00000 + avatarUrl: https://avatars.githubusercontent.com/u/889657?u=d70187989940b085bcbfa3bedad8dbc5f3ab1fe7&v=4 + url: https://github.com/amacfie - login: garg10may count: 2 avatarUrl: https://avatars.githubusercontent.com/u/8787120?u=7028d2b3a2a26534c1806eb76c7425a3fac9732f&v=4 @@ -620,41 +580,33 @@ six_months_experts: count: 2 avatarUrl: https://avatars.githubusercontent.com/u/160344534?v=4 url: https://github.com/druidance -- login: fabianfalon - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/3700760?u=95f69e31280b17ac22299cdcd345323b142fe0af&v=4 - url: https://github.com/fabianfalon -- login: admo1 - count: 2 - avatarUrl: https://avatars.githubusercontent.com/u/14835916?v=4 - url: https://github.com/admo1 one_year_experts: - login: Kludex - count: 208 + count: 207 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: jgould22 - count: 130 + count: 118 avatarUrl: https://avatars.githubusercontent.com/u/4335847?u=ed77f67e0bb069084639b24d812dbb2a2b1dc554&v=4 url: https://github.com/jgould22 - login: YuriiMotov - count: 75 + count: 104 avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 url: https://github.com/YuriiMotov - login: JavierSanchezCastro - count: 60 + count: 59 avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 url: https://github.com/JavierSanchezCastro - login: n8sty - count: 38 + count: 40 avatarUrl: https://avatars.githubusercontent.com/u/2964996?v=4 url: https://github.com/n8sty - login: hasansezertasan - count: 22 + count: 27 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: chrisK824 - count: 22 + count: 16 avatarUrl: https://avatars.githubusercontent.com/u/79946379?u=03d85b22d696a58a9603e55fbbbe2de6b0f4face&v=4 url: https://github.com/chrisK824 - login: ahmedabdou14 @@ -665,22 +617,26 @@ one_year_experts: count: 12 avatarUrl: https://avatars.githubusercontent.com/u/22227620?v=4 url: https://github.com/arjwilliams -- login: nymous - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 - url: https://github.com/nymous -- login: abhint - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/25699289?u=b5d219277b4d001ac26fb8be357fddd88c29d51b&v=4 - url: https://github.com/abhint -- login: iudeen +- login: killjoy1221 count: 10 - avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4 - url: https://github.com/iudeen + avatarUrl: https://avatars.githubusercontent.com/u/3409962?u=723662989f2027755e67d200137c13c53ae154ac&v=4 + url: https://github.com/killjoy1221 - login: WilliamStam count: 10 avatarUrl: https://avatars.githubusercontent.com/u/182800?v=4 url: https://github.com/WilliamStam +- login: iudeen + count: 10 + avatarUrl: https://avatars.githubusercontent.com/u/10519440?u=2843b3303282bff8b212dcd4d9d6689452e4470c&v=4 + url: https://github.com/iudeen +- login: nymous + count: 9 + avatarUrl: https://avatars.githubusercontent.com/u/4216559?u=360a36fb602cded27273cbfc0afc296eece90662&v=4 + url: https://github.com/nymous +- login: aanchlia + count: 8 + avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 + url: https://github.com/aanchlia - login: estebanx64 count: 7 avatarUrl: https://avatars.githubusercontent.com/u/10840422?u=45f015f95e1c0f06df602be4ab688d4b854cc8a8&v=4 @@ -689,14 +645,18 @@ one_year_experts: count: 7 avatarUrl: https://avatars.githubusercontent.com/u/32141163?v=4 url: https://github.com/pythonweb2 -- login: yinziyan1206 +- login: romabozhanovgithub count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4 - url: https://github.com/yinziyan1206 -- login: acidjunk + avatarUrl: https://avatars.githubusercontent.com/u/67696229?u=e4b921eef096415300425aca249348f8abb78ad7&v=4 + url: https://github.com/romabozhanovgithub +- login: PhysicallyActive count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 - url: https://github.com/acidjunk + avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 + url: https://github.com/PhysicallyActive +- login: mikeedjones + count: 6 + avatarUrl: https://avatars.githubusercontent.com/u/4087139?u=cc4a242896ac2fcf88a53acfaf190d0fe0a1f0c9&v=4 + url: https://github.com/mikeedjones - login: dolfinus count: 6 avatarUrl: https://avatars.githubusercontent.com/u/4661021?u=a51b39001a2e5e7529b45826980becf786de2327&v=4 @@ -705,14 +665,6 @@ one_year_experts: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/100039558?u=e2c672da5a7977fd24d87ce6ab35f8bf5b1ed9fa&v=4 url: https://github.com/ebottos94 -- login: aanchlia - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/2835374?u=3c3ed29aa8b09ccaf8d66def0ce82bc2f7e5aab6&v=4 - url: https://github.com/aanchlia -- login: romabozhanovgithub - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/67696229?u=e4b921eef096415300425aca249348f8abb78ad7&v=4 - url: https://github.com/romabozhanovgithub - login: Ventura94 count: 6 avatarUrl: https://avatars.githubusercontent.com/u/43103937?u=ccb837005aaf212a449c374618c4339089e2f733&v=4 @@ -721,22 +673,18 @@ one_year_experts: count: 6 avatarUrl: https://avatars.githubusercontent.com/u/31826970?u=8625355dc25ddf9c85a8b2b0b9932826c4c8f44c&v=4 url: https://github.com/White-Mask -- login: mikeedjones - count: 6 - avatarUrl: https://avatars.githubusercontent.com/u/4087139?u=cc4a242896ac2fcf88a53acfaf190d0fe0a1f0c9&v=4 - url: https://github.com/mikeedjones - login: sehraramiz count: 5 avatarUrl: https://avatars.githubusercontent.com/u/14166324?v=4 url: https://github.com/sehraramiz +- login: acidjunk + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/685002?u=b5094ab4527fc84b006c0ac9ff54367bdebb2267&v=4 + url: https://github.com/acidjunk - login: JoshYuJump count: 5 avatarUrl: https://avatars.githubusercontent.com/u/5901894?u=cdbca6296ac4cdcdf6945c112a1ce8d5342839ea&v=4 url: https://github.com/JoshYuJump -- login: nzig - count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/7372858?u=e769add36ed73c778cdb136eb10bf96b1e119671&v=4 - url: https://github.com/nzig - login: alex-pobeditel-2004 count: 5 avatarUrl: https://avatars.githubusercontent.com/u/14791483?v=4 @@ -749,10 +697,10 @@ one_year_experts: count: 5 avatarUrl: https://avatars.githubusercontent.com/u/52145145?u=f8c9e5c8c259d248e1683fedf5027b4ee08a0967&v=4 url: https://github.com/wu-clan -- login: amacfie - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/889657?u=d70187989940b085bcbfa3bedad8dbc5f3ab1fe7&v=4 - url: https://github.com/amacfie +- login: abhint + count: 5 + avatarUrl: https://avatars.githubusercontent.com/u/25699289?u=b5d219277b4d001ac26fb8be357fddd88c29d51b&v=4 + url: https://github.com/abhint - login: anthonycepeda count: 4 avatarUrl: https://avatars.githubusercontent.com/u/72019805?u=60bdf46240cff8fca482ff0fc07d963fd5e1a27c&v=4 @@ -765,6 +713,14 @@ one_year_experts: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/564288?v=4 url: https://github.com/flo-at +- login: yinziyan1206 + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/37829370?u=da44ca53aefd5c23f346fab8e9fd2e108294c179&v=4 + url: https://github.com/yinziyan1206 +- login: amacfie + count: 4 + avatarUrl: https://avatars.githubusercontent.com/u/889657?u=d70187989940b085bcbfa3bedad8dbc5f3ab1fe7&v=4 + url: https://github.com/amacfie - login: commonism count: 4 avatarUrl: https://avatars.githubusercontent.com/u/164513?v=4 @@ -773,18 +729,34 @@ one_year_experts: count: 4 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 url: https://github.com/dmontagu -- login: djimontyp - count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/53098395?u=583bade70950b277c322d35f1be2b75c7b0f189c&v=4 - url: https://github.com/djimontyp - login: sanzoghenzo count: 4 avatarUrl: https://avatars.githubusercontent.com/u/977953?v=4 url: https://github.com/sanzoghenzo -- login: PhysicallyActive +- login: lucasgadams count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/160476156?u=7a8e44f4a43d3bba636f795bb7d9476c9233b4d8&v=4 - url: https://github.com/PhysicallyActive + avatarUrl: https://avatars.githubusercontent.com/u/36425095?v=4 + url: https://github.com/lucasgadams +- login: NeilBotelho + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/39030675?u=16fea2ff90a5c67b974744528a38832a6d1bb4f7&v=4 + url: https://github.com/NeilBotelho +- login: hhartzer + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/100533792?v=4 + url: https://github.com/hhartzer +- login: binbjz + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/8213913?u=22b68b7a0d5bf5e09c02084c0f5f53d7503114cd&v=4 + url: https://github.com/binbjz +- login: PREPONDERANCE + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/112809059?u=30ab12dc9ddba2f94ab90e6ad4ad8bc5cfa7fccd&v=4 + url: https://github.com/PREPONDERANCE +- login: nameer + count: 3 + avatarUrl: https://avatars.githubusercontent.com/u/3931725?u=6199fb065df098fc13ac0a5e649f89672b586732&v=4 + url: https://github.com/nameer - login: angely-dev count: 3 avatarUrl: https://avatars.githubusercontent.com/u/4362224?v=4 @@ -797,10 +769,6 @@ one_year_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/53449841?v=4 url: https://github.com/ryanisn -- login: NeilBotelho - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/39030675?u=16fea2ff90a5c67b974744528a38832a6d1bb4f7&v=4 - url: https://github.com/NeilBotelho - login: theobouwman count: 3 avatarUrl: https://avatars.githubusercontent.com/u/16098190?u=dc70db88a7a99b764c9a89a6e471e0b7ca478a35&v=4 @@ -809,22 +777,6 @@ one_year_experts: count: 3 avatarUrl: https://avatars.githubusercontent.com/u/199592?v=4 url: https://github.com/methane -- login: omarcruzpantoja - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/15116058?u=4b64c643fad49225d854e1aaecd1ffc6f9071a1b&v=4 - url: https://github.com/omarcruzpantoja -- login: bogdan-coman-uv - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/92912507?v=4 - url: https://github.com/bogdan-coman-uv -- login: hhartzer - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/100533792?v=4 - url: https://github.com/hhartzer -- login: nameer - count: 3 - avatarUrl: https://avatars.githubusercontent.com/u/3931725?u=6199fb065df098fc13ac0a5e649f89672b586732&v=4 - url: https://github.com/nameer top_contributors: - login: nilslindemann count: 130 @@ -850,6 +802,10 @@ top_contributors: count: 22 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex +- login: hasansezertasan + count: 22 + avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 + url: https://github.com/hasansezertasan - login: dmontagu count: 17 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 @@ -870,25 +826,21 @@ top_contributors: count: 12 avatarUrl: https://avatars.githubusercontent.com/u/15695000?u=f5a4944c6df443030409c88da7d7fa0b7ead985c&v=4 url: https://github.com/AlertRED -- login: hasansezertasan - count: 12 - avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 - url: https://github.com/hasansezertasan - login: Smlep count: 11 avatarUrl: https://avatars.githubusercontent.com/u/16785985?v=4 url: https://github.com/Smlep +- login: alejsdev + count: 11 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=9ca449ad5161af12766ddd1a22988e9b14315f5c&v=4 + url: https://github.com/alejsdev - login: hard-coders count: 10 avatarUrl: https://avatars.githubusercontent.com/u/9651103?u=95db33927bbff1ed1c07efddeb97ac2ff33068ed&v=4 url: https://github.com/hard-coders -- login: alejsdev - count: 10 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=1ee3a9fbef27abc9448ef5951350f99c7d76f7af&v=4 - url: https://github.com/alejsdev - login: KaniKim count: 10 - avatarUrl: https://avatars.githubusercontent.com/u/19832624?u=db09b15514eaf86c30e56401aaeb1e6ec0e31b71&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/19832624?u=40f8f7f3f36d5f2365ba2ad0b40693e60958ce70&v=4 url: https://github.com/KaniKim - login: xzmeng count: 9 @@ -936,7 +888,7 @@ top_contributors: url: https://github.com/Attsun1031 - login: ComicShrimp count: 5 - avatarUrl: https://avatars.githubusercontent.com/u/43503750?u=f440bc9062afb3c43b9b9c6cdfdcfe31d58699ef&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/43503750?u=d2fbf412e7730183ce91686ca48d4147e1b7dc74&v=4 url: https://github.com/ComicShrimp - login: rostik1410 count: 5 @@ -956,7 +908,7 @@ top_contributors: url: https://github.com/jfunez - login: ycd count: 4 - avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=45aa6ef58220a3f1e8a3c3cd5f1b75a1a0a73347&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=29682e4b6ac7d5293742ccf818188394b9a82972&v=4 url: https://github.com/ycd - login: komtaki count: 4 @@ -1012,7 +964,7 @@ top_contributors: url: https://github.com/pawamoy top_reviewers: - login: Kludex - count: 156 + count: 158 avatarUrl: https://avatars.githubusercontent.com/u/7353520?u=62adc405ef418f4b6c8caa93d3eb8ab107bc4927&v=4 url: https://github.com/Kludex - login: BilalAlpaslan @@ -1020,7 +972,7 @@ top_reviewers: avatarUrl: https://avatars.githubusercontent.com/u/47563997?u=63ed66e304fe8d765762c70587d61d9196e5c82d&v=4 url: https://github.com/BilalAlpaslan - login: yezz123 - count: 84 + count: 85 avatarUrl: https://avatars.githubusercontent.com/u/52716203?u=d7062cbc6eb7671d5dc9cc0e32a24ae335e0f225&v=4 url: https://github.com/yezz123 - login: iudeen @@ -1035,6 +987,10 @@ top_reviewers: count: 50 avatarUrl: https://avatars.githubusercontent.com/u/85196001?u=f8e2dc7e5104f109cef944af79050ea8d1b8f914&v=4 url: https://github.com/Xewus +- login: hasansezertasan + count: 50 + avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 + url: https://github.com/hasansezertasan - login: waynerv count: 47 avatarUrl: https://avatars.githubusercontent.com/u/39515546?u=ec35139777597cdbbbddda29bf8b9d4396b429a9&v=4 @@ -1045,19 +1001,15 @@ top_reviewers: url: https://github.com/Laineyzhang55 - login: ycd count: 45 - avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=45aa6ef58220a3f1e8a3c3cd5f1b75a1a0a73347&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=29682e4b6ac7d5293742ccf818188394b9a82972&v=4 url: https://github.com/ycd - login: cikay count: 41 avatarUrl: https://avatars.githubusercontent.com/u/24587499?u=e772190a051ab0eaa9c8542fcff1892471638f2b&v=4 url: https://github.com/cikay -- login: hasansezertasan - count: 41 - avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 - url: https://github.com/hasansezertasan - login: alejsdev count: 38 - avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=1ee3a9fbef27abc9448ef5951350f99c7d76f7af&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/90076947?u=9ca449ad5161af12766ddd1a22988e9b14315f5c&v=4 url: https://github.com/alejsdev - login: JarroVGIT count: 34 @@ -1083,6 +1035,10 @@ top_reviewers: count: 27 avatarUrl: https://avatars.githubusercontent.com/u/39375566?u=260ad6b1a4b34c07dbfa728da5e586f16f6d1824&v=4 url: https://github.com/komtaki +- login: YuriiMotov + count: 25 + avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 + url: https://github.com/YuriiMotov - login: Ryandaydev count: 25 avatarUrl: https://avatars.githubusercontent.com/u/4292423?u=48f68868db8886fce31a1d802c1003914c6cd7c6&v=4 @@ -1091,10 +1047,6 @@ top_reviewers: count: 24 avatarUrl: https://avatars.githubusercontent.com/u/16273730?u=095b66f243a2cd6a0aadba9a095009f8aaf18393&v=4 url: https://github.com/LorhanSohaky -- login: YuriiMotov - count: 24 - avatarUrl: https://avatars.githubusercontent.com/u/109919500?u=e83a39697a2d33ab2ec9bfbced794ee48bc29cec&v=4 - url: https://github.com/YuriiMotov - login: dmontagu count: 23 avatarUrl: https://avatars.githubusercontent.com/u/35119617?u=540f30c937a6450812628b9592a1dfe91bbe148e&v=4 @@ -1119,6 +1071,10 @@ top_reviewers: count: 19 avatarUrl: https://avatars.githubusercontent.com/u/63915557?u=47debaa860fd52c9b98c97ef357ddcec3b3fb399&v=4 url: https://github.com/0417taehyun +- login: JavierSanchezCastro + count: 19 + avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 + url: https://github.com/JavierSanchezCastro - login: Smlep count: 17 avatarUrl: https://avatars.githubusercontent.com/u/16785985?v=4 @@ -1135,10 +1091,6 @@ top_reviewers: count: 17 avatarUrl: https://avatars.githubusercontent.com/u/32584628?u=a66902b40c13647d0ed0e573d598128240a4dd04&v=4 url: https://github.com/peidrao -- login: JavierSanchezCastro - count: 17 - avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 - url: https://github.com/JavierSanchezCastro - login: yanever count: 16 avatarUrl: https://avatars.githubusercontent.com/u/21978760?v=4 @@ -1163,6 +1115,14 @@ top_reviewers: count: 16 avatarUrl: https://avatars.githubusercontent.com/u/87962045?u=08e10fa516e844934f4b3fc7c38b33c61697e4a1&v=4 url: https://github.com/DevDae +- login: Aruelius + count: 16 + avatarUrl: https://avatars.githubusercontent.com/u/25380989?u=574f8cfcda3ea77a3f81884f6b26a97068e36a9d&v=4 + url: https://github.com/Aruelius +- login: OzgunCaglarArslan + count: 16 + avatarUrl: https://avatars.githubusercontent.com/u/86166426?v=4 + url: https://github.com/OzgunCaglarArslan - login: pedabraham count: 15 avatarUrl: https://avatars.githubusercontent.com/u/16860088?u=abf922a7b920bf8fdb7867d8b43e091f1e796178&v=4 @@ -1171,18 +1131,14 @@ top_reviewers: count: 15 avatarUrl: https://avatars.githubusercontent.com/u/63476957?u=6c86e59b48e0394d4db230f37fc9ad4d7e2c27c7&v=4 url: https://github.com/delhi09 -- login: Aruelius - count: 15 - avatarUrl: https://avatars.githubusercontent.com/u/25380989?u=574f8cfcda3ea77a3f81884f6b26a97068e36a9d&v=4 - url: https://github.com/Aruelius +- login: wdh99 + count: 14 + avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 + url: https://github.com/wdh99 - login: sh0nk count: 13 avatarUrl: https://avatars.githubusercontent.com/u/6478810?u=af15d724875cec682ed8088a86d36b2798f981c0&v=4 url: https://github.com/sh0nk -- login: wdh99 - count: 13 - avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 - url: https://github.com/wdh99 - login: r0b2g1t count: 13 avatarUrl: https://avatars.githubusercontent.com/u/5357541?u=6428442d875d5d71aaa1bb38bb11c4be1a526bc2&v=4 @@ -1203,10 +1159,6 @@ top_reviewers: count: 11 avatarUrl: https://avatars.githubusercontent.com/u/46193920?u=789927ee09cfabd752d3bd554fa6baf4850d2777&v=4 url: https://github.com/solomein-sv -- login: dpinezich - count: 11 - avatarUrl: https://avatars.githubusercontent.com/u/3204540?u=a2e1465e3ee10d537614d513589607eddefde09f&v=4 - url: https://github.com/dpinezich top_translations_reviewers: - login: s111d count: 146 @@ -1221,7 +1173,7 @@ top_translations_reviewers: avatarUrl: https://avatars.githubusercontent.com/u/41147016?u=55010621aece725aa702270b54fed829b6a1fe60&v=4 url: https://github.com/tokusumi - login: hasansezertasan - count: 84 + count: 91 avatarUrl: https://avatars.githubusercontent.com/u/13135006?u=99f0b0f0fc47e88e8abb337b4447357939ef93e7&v=4 url: https://github.com/hasansezertasan - login: AlertRED @@ -1252,6 +1204,10 @@ top_translations_reviewers: count: 45 avatarUrl: https://avatars.githubusercontent.com/u/39375566?u=260ad6b1a4b34c07dbfa728da5e586f16f6d1824&v=4 url: https://github.com/komtaki +- login: alperiox + count: 42 + avatarUrl: https://avatars.githubusercontent.com/u/34214152?u=2c5acad3461d4dbc2d48371ba86cac56ae9b25cc&v=4 + url: https://github.com/alperiox - login: Winand count: 40 avatarUrl: https://avatars.githubusercontent.com/u/53390?u=bb0e71a2fc3910a8e0ee66da67c33de40ea695f8&v=4 @@ -1260,10 +1216,6 @@ top_translations_reviewers: count: 38 avatarUrl: https://avatars.githubusercontent.com/u/46193920?u=789927ee09cfabd752d3bd554fa6baf4850d2777&v=4 url: https://github.com/solomein-sv -- login: alperiox - count: 37 - avatarUrl: https://avatars.githubusercontent.com/u/34214152?u=2c5acad3461d4dbc2d48371ba86cac56ae9b25cc&v=4 - url: https://github.com/alperiox - login: lsglucas count: 36 avatarUrl: https://avatars.githubusercontent.com/u/61513630?u=320e43fe4dc7bc6efc64e9b8f325f8075634fd20&v=4 @@ -1288,6 +1240,10 @@ top_translations_reviewers: count: 32 avatarUrl: https://avatars.githubusercontent.com/u/132477732?v=4 url: https://github.com/romashevchenko +- login: wdh99 + count: 31 + avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 + url: https://github.com/wdh99 - login: LorhanSohaky count: 30 avatarUrl: https://avatars.githubusercontent.com/u/16273730?u=095b66f243a2cd6a0aadba9a095009f8aaf18393&v=4 @@ -1296,10 +1252,6 @@ top_translations_reviewers: count: 29 avatarUrl: https://avatars.githubusercontent.com/u/3127847?u=a08022b191ddbd0a6159b2981d9d878b6d5bb71f&v=4 url: https://github.com/cassiobotaro -- login: wdh99 - count: 29 - avatarUrl: https://avatars.githubusercontent.com/u/108172295?u=8a8fb95d5afe3e0fa33257b2aecae88d436249eb&v=4 - url: https://github.com/wdh99 - login: pedabraham count: 28 avatarUrl: https://avatars.githubusercontent.com/u/16860088?u=abf922a7b920bf8fdb7867d8b43e091f1e796178&v=4 @@ -1312,6 +1264,10 @@ top_translations_reviewers: count: 28 avatarUrl: https://avatars.githubusercontent.com/u/26196675?u=e2966887124e67932853df4f10f86cb526edc7b0&v=4 url: https://github.com/dedkot01 +- login: hsuanchi + count: 28 + avatarUrl: https://avatars.githubusercontent.com/u/24913710?u=0b094ae292292fee093818e37ceb645c114d2bff&v=4 + url: https://github.com/hsuanchi - login: dpinezich count: 28 avatarUrl: https://avatars.githubusercontent.com/u/3204540?u=a2e1465e3ee10d537614d513589607eddefde09f&v=4 @@ -1348,13 +1304,17 @@ top_translations_reviewers: count: 21 avatarUrl: https://avatars.githubusercontent.com/u/86262613?u=3c21606ab8d210a061a1673decff1e7d5592b380&v=4 url: https://github.com/AGolicyn +- login: OzgunCaglarArslan + count: 21 + avatarUrl: https://avatars.githubusercontent.com/u/86166426?v=4 + url: https://github.com/OzgunCaglarArslan - login: Attsun1031 count: 20 avatarUrl: https://avatars.githubusercontent.com/u/1175560?v=4 url: https://github.com/Attsun1031 - login: ycd count: 20 - avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=45aa6ef58220a3f1e8a3c3cd5f1b75a1a0a73347&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/62724709?u=29682e4b6ac7d5293742ccf818188394b9a82972&v=4 url: https://github.com/ycd - login: delhi09 count: 20 @@ -1374,7 +1334,7 @@ top_translations_reviewers: url: https://github.com/sattosan - login: ComicShrimp count: 18 - avatarUrl: https://avatars.githubusercontent.com/u/43503750?u=f440bc9062afb3c43b9b9c6cdfdcfe31d58699ef&v=4 + avatarUrl: https://avatars.githubusercontent.com/u/43503750?u=d2fbf412e7730183ce91686ca48d4147e1b7dc74&v=4 url: https://github.com/ComicShrimp - login: junah201 count: 18 @@ -1388,19 +1348,11 @@ top_translations_reviewers: count: 18 avatarUrl: https://avatars.githubusercontent.com/u/36765187?u=c6e0ba571c1ccb6db9d94e62e4b8b5eda811a870&v=4 url: https://github.com/ivan-abc +- login: JavierSanchezCastro + count: 18 + avatarUrl: https://avatars.githubusercontent.com/u/72013291?u=ae5679e6bd971d9d98cd5e76e8683f83642ba950&v=4 + url: https://github.com/JavierSanchezCastro - login: bezaca count: 17 avatarUrl: https://avatars.githubusercontent.com/u/69092910?u=4ac58eab99bd37d663f3d23551df96d4fbdbf760&v=4 url: https://github.com/bezaca -- login: lbmendes - count: 17 - avatarUrl: https://avatars.githubusercontent.com/u/80999926?u=646619e2f07ac5a7c3f65fe7834197461a4fff9f&v=4 - url: https://github.com/lbmendes -- login: rostik1410 - count: 17 - avatarUrl: https://avatars.githubusercontent.com/u/11443899?u=e26a635c2ba220467b308a326a579b8ccf4a8701&v=4 - url: https://github.com/rostik1410 -- login: spacesphere - count: 17 - avatarUrl: https://avatars.githubusercontent.com/u/34628304?u=cde91f6002dd33156e1bf8005f11a7a3ed76b790&v=4 - url: https://github.com/spacesphere From 54ab928acd1c2b929980b887edb11493cada8629 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 3 Jun 2024 01:11:29 +0000 Subject: [PATCH 004/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 92432458d..4a0168b51 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -42,6 +42,7 @@ hide: ### Internal +* 👥 Update FastAPI People. PR [#11669](https://github.com/tiangolo/fastapi/pull/11669) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add sponsor Kong. PR [#11662](https://github.com/tiangolo/fastapi/pull/11662) by [@tiangolo](https://github.com/tiangolo). * 👷 Update Smokeshow, fix sync download artifact and smokeshow configs. PR [#11563](https://github.com/tiangolo/fastapi/pull/11563) by [@tiangolo](https://github.com/tiangolo). * 👷 Update Smokeshow download artifact GitHub Action. PR [#11562](https://github.com/tiangolo/fastapi/pull/11562) by [@tiangolo](https://github.com/tiangolo). From 3641c1ea5563aa91cd7e58f8fbf5b30c7c2f6f55 Mon Sep 17 00:00:00 2001 From: Alejandra <90076947+alejsdev@users.noreply.github.com> Date: Sun, 2 Jun 2024 20:35:46 -0500 Subject: [PATCH 005/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20`security/first?= =?UTF-8?q?-steps.md`=20(#11673)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: pre-commit-ci[bot] <66853113+pre-commit-ci[bot]@users.noreply.github.com> --- docs/en/docs/tutorial/security/first-steps.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/en/docs/tutorial/security/first-steps.md b/docs/en/docs/tutorial/security/first-steps.md index 7d86e453e..1ec31b408 100644 --- a/docs/en/docs/tutorial/security/first-steps.md +++ b/docs/en/docs/tutorial/security/first-steps.md @@ -45,18 +45,18 @@ Copy the example in a file `main.py`: ## Run it !!! info - First install `python-multipart`. + The `python-multipart` package is automatically installed with **FastAPI** when you run the `pip install fastapi` command. - E.g. `pip install python-multipart`. + However, if you use the `pip install fastapi-slim` command, the `python-multipart` package is not included by default. To install it manually, use the following command: - This is because **OAuth2** uses "form data" for sending the `username` and `password`. + `pip install python-multipart` Run the example with:
```console -$ uvicorn main:app --reload +$ fastapi dev main.py INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) ``` From e3d9f8cfc7b956cf8383a02752e716a645ad949c Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 3 Jun 2024 01:36:06 +0000 Subject: [PATCH 006/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4a0168b51..062c5b080 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 📝 Update `security/first-steps.md`. PR [#11673](https://github.com/tiangolo/fastapi/pull/11673) by [@alejsdev](https://github.com/alejsdev). * 📝 Update note in `path-params-numeric-validations.md`. PR [#11672](https://github.com/tiangolo/fastapi/pull/11672) by [@alejsdev](https://github.com/alejsdev). * 📝 Tweak intro docs about `Annotated` and `Query()` params. PR [#11664](https://github.com/tiangolo/fastapi/pull/11664) by [@tiangolo](https://github.com/tiangolo). * 📝 Update JWT auth documentation to use PyJWT instead of pyhon-jose. PR [#11589](https://github.com/tiangolo/fastapi/pull/11589) by [@estebanx64](https://github.com/estebanx64). From 00ebe9c8412866cbfc544a0aaec6a44ee77c11ab Mon Sep 17 00:00:00 2001 From: Alejandra <90076947+alejsdev@users.noreply.github.com> Date: Sun, 2 Jun 2024 20:48:20 -0500 Subject: [PATCH 007/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20`security/first?= =?UTF-8?q?-steps.md`=20(#11674)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/tutorial/security/first-steps.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/en/docs/tutorial/security/first-steps.md b/docs/en/docs/tutorial/security/first-steps.md index 1ec31b408..a769cc0e6 100644 --- a/docs/en/docs/tutorial/security/first-steps.md +++ b/docs/en/docs/tutorial/security/first-steps.md @@ -51,6 +51,8 @@ Copy the example in a file `main.py`: `pip install python-multipart` + This is because **OAuth2** uses "form data" for sending the `username` and `password`. + Run the example with:
From aed266a7ef6059814018b85bab423fc890b2aa39 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 3 Jun 2024 01:48:39 +0000 Subject: [PATCH 008/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 062c5b080..ed74220f8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 📝 Update `security/first-steps.md`. PR [#11674](https://github.com/tiangolo/fastapi/pull/11674) by [@alejsdev](https://github.com/alejsdev). * 📝 Update `security/first-steps.md`. PR [#11673](https://github.com/tiangolo/fastapi/pull/11673) by [@alejsdev](https://github.com/alejsdev). * 📝 Update note in `path-params-numeric-validations.md`. PR [#11672](https://github.com/tiangolo/fastapi/pull/11672) by [@alejsdev](https://github.com/alejsdev). * 📝 Tweak intro docs about `Annotated` and `Query()` params. PR [#11664](https://github.com/tiangolo/fastapi/pull/11664) by [@tiangolo](https://github.com/tiangolo). From e1068116dfd14be141b1d338f6bcb6bcc73cb5ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hasan=20Sezer=20Ta=C5=9Fan?= <13135006+hasansezertasan@users.noreply.github.com> Date: Wed, 5 Jun 2024 03:05:51 +0300 Subject: [PATCH 009/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Turkish=20translat?= =?UTF-8?q?ion=20for=20`docs/tr/docs/advanced/index.md`=20(#11606)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tr/docs/advanced/index.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 docs/tr/docs/advanced/index.md diff --git a/docs/tr/docs/advanced/index.md b/docs/tr/docs/advanced/index.md new file mode 100644 index 000000000..c0a566d12 --- /dev/null +++ b/docs/tr/docs/advanced/index.md @@ -0,0 +1,33 @@ +# Gelişmiş Kullanıcı Rehberi + +## Ek Özellikler + +[Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank} sayfası **FastAPI**'ın tüm ana özelliklerini tanıtmaya yetecektir. + +İlerleyen bölümlerde diğer seçenekler, konfigürasyonlar ve ek özellikleri göreceğiz. + +!!! tip "İpucu" + Sonraki bölümler **mutlaka "gelişmiş" olmak zorunda değildir**. + + Kullanım şeklinize bağlı olarak, çözümünüz bu bölümlerden birinde olabilir. + +## Önce Öğreticiyi Okuyun + +[Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank} sayfasındaki bilgilerle **FastAPI**'nın çoğu özelliğini kullanabilirsiniz. + +Sonraki bölümler bu sayfayı okuduğunuzu ve bu ana fikirleri bildiğinizi varsayarak hazırlanmıştır. + +## Diğer Kurslar + +[Tutorial - User Guide](../tutorial/index.md){.internal-link target=_blank} sayfası ve bu **Gelişmiş Kullanıcı Rehberi**, öğretici bir kılavuz (bir kitap gibi) şeklinde yazılmıştır ve **FastAPI'ı öğrenmek** için yeterli olsa da, ek kurslarla desteklemek isteyebilirsiniz. + +Belki de öğrenme tarzınıza daha iyi uyduğu için başka kursları tercih edebilirsiniz. + +Bazı kurs sağlayıcıları ✨ [**FastAPI destekçileridir**](../help-fastapi.md#sponsor-the-author){.internal-link target=_blank} ✨, bu FastAPI ve **ekosisteminin** sürekli ve sağlıklı bir şekilde **gelişmesini** sağlar. + +Ayrıca, size **iyi bir öğrenme deneyimi** sağlamakla kalmayıp, **iyi ve sağlıklı bir framework** olan FastAPI'a ve ve **topluluğuna** (yani size) olan gerçek bağlılıklarını gösterir. + +Onların kurslarını denemek isteyebilirsiniz: + +* Talk Python Training +* Test-Driven Development From 72346962b035748aaf004b0c93a133195bed9cd5 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 5 Jun 2024 00:06:12 +0000 Subject: [PATCH 010/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index ed74220f8..98bc7f012 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -27,6 +27,7 @@ hide: ### Translations +* 🌐 Add Turkish translation for `docs/tr/docs/advanced/index.md`. PR [#11606](https://github.com/tiangolo/fastapi/pull/11606) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/deployment/cloud.md`. PR [#11610](https://github.com/tiangolo/fastapi/pull/11610) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/advanced/security/index.md`. PR [#11609](https://github.com/tiangolo/fastapi/pull/11609) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/advanced/testing-websockets.md`. PR [#11608](https://github.com/tiangolo/fastapi/pull/11608) by [@hasansezertasan](https://github.com/hasansezertasan). From c5bcb806bbb0a5696da9c3bdc8274df2d08a7681 Mon Sep 17 00:00:00 2001 From: Max Su Date: Wed, 5 Jun 2024 08:07:01 +0800 Subject: [PATCH 011/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Traditional=20Chin?= =?UTF-8?q?ese=20translation=20for=20`docs/zh-hant/docs/fastapi-people.md`?= =?UTF-8?q?=20(#11639)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh-hant/docs/fastapi-people.md | 236 ++++++++++++++++++++++++++++ 1 file changed, 236 insertions(+) create mode 100644 docs/zh-hant/docs/fastapi-people.md diff --git a/docs/zh-hant/docs/fastapi-people.md b/docs/zh-hant/docs/fastapi-people.md new file mode 100644 index 000000000..0bc00f9c6 --- /dev/null +++ b/docs/zh-hant/docs/fastapi-people.md @@ -0,0 +1,236 @@ +--- +hide: + - navigation +--- + +# FastAPI 社群 + +FastAPI 有一個非常棒的社群,歡迎來自不同背景的朋友參與。 + +## 作者 + +嘿! 👋 + +關於我: + +{% if people %} +
+{% for user in people.maintainers %} + +
@{{ user.login }}
解答問題: {{ user.answers }}
Pull Requests: {{ user.prs }}
+{% endfor %} + +
+{% endif %} + +我是 **FastAPI** 的作者。你可以在[幫助 FastAPI - 獲得幫助 - 與作者聯繫](help-fastapi.md#connect-with-the-author){.internal-link target=_blank} 中閱讀更多相關資訊。 + +...但在這裡,我想向你介紹這個社群。 + +--- + +**FastAPI** 獲得了許多社群的大力支持。我想特別表揚他們的貢獻。 + +這些人包括: + +* [在 GitHub 中幫助他人解答問題](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}。 +* [建立 Pull Requests](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}。 +* 審查 Pull Requests,[尤其是翻譯方面的貢獻](contributing.md#translations){.internal-link target=_blank}。 + +讓我們為他們熱烈鼓掌。 👏 🙇 + +## FastAPI 專家 + +這些是在 [GitHub 中幫助其他人解決問題最多的用戶](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}。 🙇 + +他們透過幫助其他人,證明了自己是 **FastAPI 專家**。 ✨ + +!!! 提示 + 你也可以成為官方的 FastAPI 專家! + + 只需要在 [GitHub 中幫助他人解答問題](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}。 🤓 + +你可以查看這些期間的 **FastAPI 專家**: + +* [上個月](#fastapi-experts-last-month) 🤓 +* [過去 3 個月](#fastapi-experts-3-months) 😎 +* [過去 6 個月](#fastapi-experts-6-months) 🧐 +* [過去 1 年](#fastapi-experts-1-year) 🧑‍🔬 +* [**所有時間**](#fastapi-experts-all-time) 🧙 + +### FastAPI 專家 - 上個月 + +上個月在 [GitHub 中幫助他人解決問題最多的](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}用戶。 🤓 + +{% if people %} +
+{% for user in people.last_month_experts[:10] %} + +
@{{ user.login }}
回答問題數: {{ user.count }}
+{% endfor %} + +
+{% endif %} + +### FastAPI 專家 - 過去 3 個月 + +過去三個月在 [GitHub 中幫助他人解決問題最多的](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}用戶。 😎 + +{% if people %} +
+{% for user in people.three_months_experts[:10] %} + +
@{{ user.login }}
回答問題數: {{ user.count }}
+{% endfor %} + +
+{% endif %} + +### FastAPI 專家 - 過去 6 個月 + +過去六個月在 [GitHub 中幫助他人解決問題最多的](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}用戶。 🧐 + +{% if people %} +
+{% for user in people.six_months_experts[:10] %} + +
@{{ user.login }}
回答問題數: {{ user.count }}
+{% endfor %} + +
+{% endif %} + +### FastAPI 專家 - 過去一年 + +過去一年在 [GitHub 中幫助他人解決最多問題的](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}用戶。 🧑‍🔬 + +{% if people %} +
+{% for user in people.one_year_experts[:20] %} + +
@{{ user.login }}
回答問題數: {{ user.count }}
+{% endfor %} + +
+{% endif %} + +### FastAPI 專家 - 全部時間 + +以下是全部時間的 **FastAPI 專家**。 🤓🤯 + +過去在 [GitHub 中幫助他人解決問題最多的](help-fastapi.md#help-others-with-questions-in-github){.internal-link target=_blank}用戶。 🧙 + +{% if people %} +
+{% for user in people.experts[:50] %} + +
@{{ user.login }}
回答問題數: {{ user.count }}
+{% endfor %} + +
+{% endif %} + +## 主要貢獻者 + +以下是**主要貢獻者**。 👷 + +這些用戶[建立了最多已被**合併**的 Pull Requests](help-fastapi.md#create-a-pull-request){.internal-link target=_blank}。 + +他們貢獻了原始碼、文件和翻譯等。 📦 + +{% if people %} +
+{% for user in people.top_contributors[:50] %} + +
@{{ user.login }}
Pull Requests: {{ user.count }}
+{% endfor %} + +
+{% endif %} + +還有許多其他的貢獻者(超過一百位),你可以在 FastAPI GitHub 貢獻者頁面查看。 👷 + +## 主要翻譯審核者 + +以下是 **主要翻譯審核者**。 🕵️ + +我只會講幾種語言(而且不是很流利 😅),所以審核者[**擁有批准翻譯**](contributing.md#translations){.internal-link target=_blank}文件的權限。沒有他們,就不會有多語言版本的文件。 + +{% if people %} +
+{% for user in people.top_translations_reviewers[:50] %} + +
@{{ user.login }}
Reviews: {{ user.count }}
+{% endfor %} + +
+{% endif %} + +## 贊助者 + +以下是**贊助者**。 😎 + +他們主要透過 GitHub Sponsors 支持我在 **FastAPI**(以及其他項目)上的工作。 + +{% if sponsors %} + +{% if sponsors.gold %} + +### 金牌贊助商 + +{% for sponsor in sponsors.gold -%} + +{% endfor %} +{% endif %} + +{% if sponsors.silver %} + +### 銀牌贊助商 + +{% for sponsor in sponsors.silver -%} + +{% endfor %} +{% endif %} + +{% if sponsors.bronze %} + +### 銅牌贊助商 + +{% for sponsor in sponsors.bronze -%} + +{% endfor %} +{% endif %} + +{% endif %} + +### 個人贊助商 + +{% if github_sponsors %} +{% for group in github_sponsors.sponsors %} + +
+ +{% for user in group %} +{% if user.login not in sponsors_badge.logins %} + + + +{% endif %} +{% endfor %} + +
+ +{% endfor %} +{% endif %} + +## 關於數據 - 技術細節 + +這個頁面的主要目的是突顯社群幫助他人所做的努力 + +特別是那些通常不太顯眼但往往更加艱辛的工作,例如幫助他人解答問題和審查包含翻譯的 Pull Requests。 + +這些數據每月計算一次,你可以在這查看原始碼。 + +此外,我也特別表揚贊助者的貢獻。 + +我也保留更新演算法、章節、門檻值等的權利(以防萬一 🤷)。 From a9819dfd8da39a754837cc134df4aca6c0a9a3f6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 5 Jun 2024 00:08:22 +0000 Subject: [PATCH 012/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 98bc7f012..0540f654a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -27,6 +27,7 @@ hide: ### Translations +* 🌐 Add Traditional Chinese translation for `docs/zh-hant/docs/fastapi-people.md`. PR [#11639](https://github.com/tiangolo/fastapi/pull/11639) by [@hsuanchi](https://github.com/hsuanchi). * 🌐 Add Turkish translation for `docs/tr/docs/advanced/index.md`. PR [#11606](https://github.com/tiangolo/fastapi/pull/11606) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/deployment/cloud.md`. PR [#11610](https://github.com/tiangolo/fastapi/pull/11610) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/advanced/security/index.md`. PR [#11609](https://github.com/tiangolo/fastapi/pull/11609) by [@hasansezertasan](https://github.com/hasansezertasan). From 6fa46e4256d14809c1d18239cf3e864c63e02610 Mon Sep 17 00:00:00 2001 From: Ishan Anand Date: Thu, 6 Jun 2024 03:07:59 +0530 Subject: [PATCH 013/284] =?UTF-8?q?=F0=9F=93=9D=20Add=20External=20Link:?= =?UTF-8?q?=20Deploy=20a=20Serverless=20FastAPI=20App=20with=20Neon=20Post?= =?UTF-8?q?gres=20and=20AWS=20App=20Runner=20at=20any=20scale=20(#11633)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/external_links.yml | 3 +++ 1 file changed, 3 insertions(+) diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml index 827581de5..33c43a682 100644 --- a/docs/en/data/external_links.yml +++ b/docs/en/data/external_links.yml @@ -1,5 +1,8 @@ Articles: English: + - author: Stephen Siegert - Neon + link: https://neon.tech/blog/deploy-a-serverless-fastapi-app-with-neon-postgres-and-aws-app-runner-at-any-scale + title: Deploy a Serverless FastAPI App with Neon Postgres and AWS App Runner at any scale - author: Kurtis Pykes - NVIDIA link: https://developer.nvidia.com/blog/building-a-machine-learning-microservice-with-fastapi/ title: Building a Machine Learning Microservice with FastAPI From ceaed0a447ed27a1e8049b7158d7d18249741090 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 5 Jun 2024 21:38:20 +0000 Subject: [PATCH 014/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0540f654a..c84af77e5 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 📝 Add External Link: Deploy a Serverless FastAPI App with Neon Postgres and AWS App Runner at any scale. PR [#11633](https://github.com/tiangolo/fastapi/pull/11633) by [@ananis25](https://github.com/ananis25). * 📝 Update `security/first-steps.md`. PR [#11674](https://github.com/tiangolo/fastapi/pull/11674) by [@alejsdev](https://github.com/alejsdev). * 📝 Update `security/first-steps.md`. PR [#11673](https://github.com/tiangolo/fastapi/pull/11673) by [@alejsdev](https://github.com/alejsdev). * 📝 Update note in `path-params-numeric-validations.md`. PR [#11672](https://github.com/tiangolo/fastapi/pull/11672) by [@alejsdev](https://github.com/alejsdev). From 99a491e95c75f75394267c819797f0870d3b40f5 Mon Sep 17 00:00:00 2001 From: Walid B <76976556+mwb-u@users.noreply.github.com> Date: Sun, 9 Jun 2024 02:01:51 +0000 Subject: [PATCH 015/284] =?UTF-8?q?=F0=9F=93=9D=20Fix=20typo=20in=20`docs/?= =?UTF-8?q?en/docs/tutorial/body-multiple-params.md`=20(#11698)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/tutorial/body-multiple-params.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/tutorial/body-multiple-params.md b/docs/en/docs/tutorial/body-multiple-params.md index ebef8eeaa..689db7ece 100644 --- a/docs/en/docs/tutorial/body-multiple-params.md +++ b/docs/en/docs/tutorial/body-multiple-params.md @@ -97,7 +97,7 @@ So, it will then use the parameter names as keys (field names) in the body, and Notice that even though the `item` was declared the same way as before, it is now expected to be inside of the body with a key `item`. -**FastAPI** will do the automatic conversion from the request, so that the parameter `item` receives it's specific content and the same for `user`. +**FastAPI** will do the automatic conversion from the request, so that the parameter `item` receives its specific content and the same for `user`. It will perform the validation of the compound data, and will document it like that for the OpenAPI schema and automatic docs. From 60d87c0ccbd2d3f28c3a42c4b11edbf1e12903e3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 9 Jun 2024 02:02:11 +0000 Subject: [PATCH 016/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c84af77e5..e71637d50 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 📝 Fix typo in `docs/en/docs/tutorial/body-multiple-params.md`. PR [#11698](https://github.com/tiangolo/fastapi/pull/11698) by [@mwb-u](https://github.com/mwb-u). * 📝 Add External Link: Deploy a Serverless FastAPI App with Neon Postgres and AWS App Runner at any scale. PR [#11633](https://github.com/tiangolo/fastapi/pull/11633) by [@ananis25](https://github.com/ananis25). * 📝 Update `security/first-steps.md`. PR [#11674](https://github.com/tiangolo/fastapi/pull/11674) by [@alejsdev](https://github.com/alejsdev). * 📝 Update `security/first-steps.md`. PR [#11673](https://github.com/tiangolo/fastapi/pull/11673) by [@alejsdev](https://github.com/alejsdev). From 706d2499b5ca8f47866c33afc18832757d699523 Mon Sep 17 00:00:00 2001 From: Ayrton Date: Tue, 11 Jun 2024 20:49:51 -0300 Subject: [PATCH 017/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/advanced/fastapi-cli.md`=20(#11641?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/fastapi-cli.md | 84 +++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 docs/pt/docs/fastapi-cli.md diff --git a/docs/pt/docs/fastapi-cli.md b/docs/pt/docs/fastapi-cli.md new file mode 100644 index 000000000..a4dfda660 --- /dev/null +++ b/docs/pt/docs/fastapi-cli.md @@ -0,0 +1,84 @@ +# FastAPI CLI + +**FastAPI CLI** é uma interface por linha de comando do `fastapi` que você pode usar para rodar sua app FastAPI, gerenciar seu projeto FastAPI e mais. + +Quando você instala o FastAPI (ex.: com `pip install fastapi`), isso inclui um pacote chamado `fastapi-cli`. Esse pacote disponibiliza o comando `fastapi` no terminal. + +Para rodar seu app FastAPI em desenvolvimento, você pode usar o comando `fastapi dev`: + +
+ +```console +$ fastapi dev main.py +INFO Using path main.py +INFO Resolved absolute path /home/user/code/awesomeapp/main.py +INFO Searching for package file structure from directories with __init__.py files +INFO Importing from /home/user/code/awesomeapp + + ╭─ Python module file ─╮ + │ │ + │ 🐍 main.py │ + │ │ + ╰──────────────────────╯ + +INFO Importing module main +INFO Found importable FastAPI app + + ╭─ Importable FastAPI app ─╮ + │ │ + │ from main import app │ + │ │ + ╰──────────────────────────╯ + +INFO Using import string main:app + + ╭────────── FastAPI CLI - Development mode ───────────╮ + │ │ + │ Serving at: http://127.0.0.1:8000 │ + │ │ + │ API docs: http://127.0.0.1:8000/docs │ + │ │ + │ Running in development mode, for production use: │ + │ │ + fastapi run + │ │ + ╰─────────────────────────────────────────────────────╯ + +INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp'] +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [2265862] using WatchFiles +INFO: Started server process [2265873] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +Aquele commando por linha de programa chamado `fastapi` é o **FastAPI CLI**. + +O FastAPI CLI recebe o caminho do seu programa Python, detecta automaticamente a variável com o FastAPI (comumente nomeada `app`) e como importá-la, e então a serve. + +Para produção você usaria `fastapi run` no lugar. 🚀 + +Internamente, **FastAPI CLI** usa Uvicorn, um servidor ASGI de alta performance e pronto para produção. 😎 + +## `fastapi dev` + +Quando você roda `fastapi dev`, isso vai executar em modo de desenvolvimento. + +Por padrão, teremos o **recarregamento automático** ativo, então o programa irá recarregar o servidor automaticamente toda vez que você fizer mudanças no seu código. Isso usa muitos recursos e pode ser menos estável. Você deve apenas usá-lo em modo de desenvolvimento. + +O servidor de desenvolvimento escutará no endereço de IP `127.0.0.1` por padrão, este é o IP que sua máquina usa para se comunicar com ela mesma (`localhost`). + +## `fastapi run` + +Quando você rodar `fastapi run`, isso executará em modo de produção por padrão. + +Este modo terá **recarregamento automático desativado** por padrão. + +Isso irá escutar no endereço de IP `0.0.0.0`, o que significa todos os endereços IP disponíveis, dessa forma o programa estará acessível publicamente para qualquer um que consiga se comunicar com a máquina. Isso é como você normalmente roda em produção em um contêiner, por exemplo. + +Em muitos casos você pode ter (e deveria ter) um "proxy de saída" tratando HTTPS no topo, isso dependerá de como você fará o deploy da sua aplicação, seu provedor pode fazer isso pra você ou talvez seja necessário fazer você mesmo. + +!!! tip + Você pode aprender mais sobre em [documentação de deployment](deployment/index.md){.internal-link target=_blank}. From 695601dff46066165d9e90ace7dbdee917875ce9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 11 Jun 2024 23:50:18 +0000 Subject: [PATCH 018/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index e71637d50..4f1b897c9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -29,6 +29,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/fastapi-cli.md`. PR [#11641](https://github.com/tiangolo/fastapi/pull/11641) by [@ayr-ton](https://github.com/ayr-ton). * 🌐 Add Traditional Chinese translation for `docs/zh-hant/docs/fastapi-people.md`. PR [#11639](https://github.com/tiangolo/fastapi/pull/11639) by [@hsuanchi](https://github.com/hsuanchi). * 🌐 Add Turkish translation for `docs/tr/docs/advanced/index.md`. PR [#11606](https://github.com/tiangolo/fastapi/pull/11606) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Turkish translation for `docs/tr/docs/deployment/cloud.md`. PR [#11610](https://github.com/tiangolo/fastapi/pull/11610) by [@hasansezertasan](https://github.com/hasansezertasan). From ad2a09f9f5af74bea210e996d3d6276f17a37573 Mon Sep 17 00:00:00 2001 From: Eduardo Zepeda Date: Tue, 11 Jun 2024 18:45:46 -0600 Subject: [PATCH 019/284] =?UTF-8?q?=F0=9F=93=9D=20Add=20External=20Link:?= =?UTF-8?q?=20Tutorial=20de=20FastAPI,=20=C2=BFel=20mejor=20framework=20de?= =?UTF-8?q?=20Python=3F=20(#11618)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/external_links.yml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml index 33c43a682..7f1a82ac8 100644 --- a/docs/en/data/external_links.yml +++ b/docs/en/data/external_links.yml @@ -350,6 +350,11 @@ Articles: author_link: http://editor.leonh.space/ link: https://editor.leonh.space/2022/tortoise/ title: 'Tortoise ORM / FastAPI 整合快速筆記' + Spanish: + - author: Eduardo Zepeda + author_link: https://coffeebytes.dev/en/authors/eduardo-zepeda/ + link: https://coffeebytes.dev/es/python-fastapi-el-mejor-framework-de-python/ + title: 'Tutorial de FastAPI, ¿el mejor framework de Python?' Podcasts: English: - author: Real Python From 6bc235b2bb649428d908189338841bd2a3573e0d Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 12 Jun 2024 00:46:09 +0000 Subject: [PATCH 020/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4f1b897c9..cfffacaff 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 📝 Add External Link: Tutorial de FastAPI, ¿el mejor framework de Python?. PR [#11618](https://github.com/tiangolo/fastapi/pull/11618) by [@EduardoZepeda](https://github.com/EduardoZepeda). * 📝 Fix typo in `docs/en/docs/tutorial/body-multiple-params.md`. PR [#11698](https://github.com/tiangolo/fastapi/pull/11698) by [@mwb-u](https://github.com/mwb-u). * 📝 Add External Link: Deploy a Serverless FastAPI App with Neon Postgres and AWS App Runner at any scale. PR [#11633](https://github.com/tiangolo/fastapi/pull/11633) by [@ananis25](https://github.com/ananis25). * 📝 Update `security/first-steps.md`. PR [#11674](https://github.com/tiangolo/fastapi/pull/11674) by [@alejsdev](https://github.com/alejsdev). From 7030237306028fbd9919de6a6ba5f7d5227592ff Mon Sep 17 00:00:00 2001 From: Devon Ray <46196252+devon2018@users.noreply.github.com> Date: Wed, 12 Jun 2024 02:47:57 +0200 Subject: [PATCH 021/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20External=20Link?= =?UTF-8?q?s=20=20(#11500)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/external_links.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml index 7f1a82ac8..e3d475d2f 100644 --- a/docs/en/data/external_links.yml +++ b/docs/en/data/external_links.yml @@ -260,6 +260,10 @@ Articles: author_link: https://medium.com/@krishnardt365 link: https://medium.com/@krishnardt365/fastapi-docker-and-postgres-91943e71be92 title: Fastapi, Docker(Docker compose) and Postgres + - author: Devon Ray + author_link: https://devonray.com + link: https://devonray.com/blog/deploying-a-fastapi-project-using-aws-lambda-aurora-cdk + title: Deployment using Docker, Lambda, Aurora, CDK & GH Actions German: - author: Marcel Sander (actidoo) author_link: https://www.actidoo.com From 57c8490b0a103cfa6f6afb078196bec8a0c140bf Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 12 Jun 2024 00:49:10 +0000 Subject: [PATCH 022/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index cfffacaff..47198e4e3 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 📝 Update External Links . PR [#11500](https://github.com/tiangolo/fastapi/pull/11500) by [@devon2018](https://github.com/devon2018). * 📝 Add External Link: Tutorial de FastAPI, ¿el mejor framework de Python?. PR [#11618](https://github.com/tiangolo/fastapi/pull/11618) by [@EduardoZepeda](https://github.com/EduardoZepeda). * 📝 Fix typo in `docs/en/docs/tutorial/body-multiple-params.md`. PR [#11698](https://github.com/tiangolo/fastapi/pull/11698) by [@mwb-u](https://github.com/mwb-u). * 📝 Add External Link: Deploy a Serverless FastAPI App with Neon Postgres and AWS App Runner at any scale. PR [#11633](https://github.com/tiangolo/fastapi/pull/11633) by [@ananis25](https://github.com/ananis25). From 40bb8fac5bdad5dbf29636c51ac8671ef16673f1 Mon Sep 17 00:00:00 2001 From: Nayeon Kim <98254573+nayeonkinn@users.noreply.github.com> Date: Wed, 12 Jun 2024 21:49:35 +0900 Subject: [PATCH 023/284] =?UTF-8?q?=F0=9F=8C=90=20Fix=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/body-nested-models.md`=20(#11?= =?UTF-8?q?710)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/body-nested-models.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/ko/docs/tutorial/body-nested-models.md b/docs/ko/docs/tutorial/body-nested-models.md index edf1a5f77..10af0a062 100644 --- a/docs/ko/docs/tutorial/body-nested-models.md +++ b/docs/ko/docs/tutorial/body-nested-models.md @@ -48,7 +48,7 @@ my_list: List[str] ## 집합 타입 -그런데 생각해보니 태그는 반복되면 안 돼고, 고유한(Unique) 문자열이어야 할 것 같습니다. +그런데 생각해보니 태그는 반복되면 안 되고, 고유한(Unique) 문자열이어야 할 것 같습니다. 그리고 파이썬은 집합을 위한 특별한 데이터 타입 `set`이 있습니다. From a883442ee00211a0f94d0ab2347993f0ddae052f Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 12 Jun 2024 12:49:59 +0000 Subject: [PATCH 024/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 47198e4e3..f47bda30b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -31,6 +31,7 @@ hide: ### Translations +* 🌐 Fix Korean translation for `docs/ko/docs/tutorial/body-nested-models.md`. PR [#11710](https://github.com/tiangolo/fastapi/pull/11710) by [@nayeonkinn](https://github.com/nayeonkinn). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/fastapi-cli.md`. PR [#11641](https://github.com/tiangolo/fastapi/pull/11641) by [@ayr-ton](https://github.com/ayr-ton). * 🌐 Add Traditional Chinese translation for `docs/zh-hant/docs/fastapi-people.md`. PR [#11639](https://github.com/tiangolo/fastapi/pull/11639) by [@hsuanchi](https://github.com/hsuanchi). * 🌐 Add Turkish translation for `docs/tr/docs/advanced/index.md`. PR [#11606](https://github.com/tiangolo/fastapi/pull/11606) by [@hasansezertasan](https://github.com/hasansezertasan). From 5422612008bf174ee9f897f0852ec797f0a4190f Mon Sep 17 00:00:00 2001 From: Alejandra <90076947+alejsdev@users.noreply.github.com> Date: Wed, 12 Jun 2024 18:39:50 -0500 Subject: [PATCH 025/284] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Update=20`docs/en/?= =?UTF-8?q?docs/fastapi-cli.md`=20(#11715)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/fastapi-cli.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/docs/fastapi-cli.md b/docs/en/docs/fastapi-cli.md index deff6f875..f5b0a6448 100644 --- a/docs/en/docs/fastapi-cli.md +++ b/docs/en/docs/fastapi-cli.md @@ -1,6 +1,6 @@ # FastAPI CLI -**FastAPI CLI** is a command line program `fastapi` that you can use to serve your FastAPI app, manage your FastAPI project, and more. +**FastAPI CLI** is a command line program that you can use to serve your FastAPI app, manage your FastAPI project, and more. When you install FastAPI (e.g. with `pip install fastapi`), it includes a package called `fastapi-cli`, this package provides the `fastapi` command in the terminal. From 6257afe304853e6cb16c933a9413194b9e189033 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 12 Jun 2024 23:40:10 +0000 Subject: [PATCH 026/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f47bda30b..7c78bff9a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* ✏️ Update `docs/en/docs/fastapi-cli.md`. PR [#11715](https://github.com/tiangolo/fastapi/pull/11715) by [@alejsdev](https://github.com/alejsdev). * 📝 Update External Links . PR [#11500](https://github.com/tiangolo/fastapi/pull/11500) by [@devon2018](https://github.com/devon2018). * 📝 Add External Link: Tutorial de FastAPI, ¿el mejor framework de Python?. PR [#11618](https://github.com/tiangolo/fastapi/pull/11618) by [@EduardoZepeda](https://github.com/EduardoZepeda). * 📝 Fix typo in `docs/en/docs/tutorial/body-multiple-params.md`. PR [#11698](https://github.com/tiangolo/fastapi/pull/11698) by [@mwb-u](https://github.com/mwb-u). From e4d08e9e1ff7e3cbe93c3d8bd3234060d808f99b Mon Sep 17 00:00:00 2001 From: Nayeon Kim <98254573+nayeonkinn@users.noreply.github.com> Date: Fri, 14 Jun 2024 11:45:10 +0900 Subject: [PATCH 027/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/extra-data-types.md`=20(#1171?= =?UTF-8?q?1)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/extra-data-types.md | 130 ++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 docs/ko/docs/tutorial/extra-data-types.md diff --git a/docs/ko/docs/tutorial/extra-data-types.md b/docs/ko/docs/tutorial/extra-data-types.md new file mode 100644 index 000000000..673cf5b73 --- /dev/null +++ b/docs/ko/docs/tutorial/extra-data-types.md @@ -0,0 +1,130 @@ +# 추가 데이터 자료형 + +지금까지 일반적인 데이터 자료형을 사용했습니다. 예를 들면 다음과 같습니다: + +* `int` +* `float` +* `str` +* `bool` + +하지만 더 복잡한 데이터 자료형 또한 사용할 수 있습니다. + +그리고 지금까지와 같은 기능들을 여전히 사용할 수 있습니다. + +* 훌륭한 편집기 지원. +* 들어오는 요청의 데이터 변환. +* 응답 데이터의 데이터 변환. +* 데이터 검증. +* 자동 어노테이션과 문서화. + +## 다른 데이터 자료형 + +아래의 추가적인 데이터 자료형을 사용할 수 있습니다: + +* `UUID`: + * 표준 "범용 고유 식별자"로, 많은 데이터베이스와 시스템에서 ID로 사용됩니다. + * 요청과 응답에서 `str`로 표현됩니다. +* `datetime.datetime`: + * 파이썬의 `datetime.datetime`. + * 요청과 응답에서 `2008-09-15T15:53:00+05:00`와 같은 ISO 8601 형식의 `str`로 표현됩니다. +* `datetime.date`: + * 파이썬의 `datetime.date`. + * 요청과 응답에서 `2008-09-15`와 같은 ISO 8601 형식의 `str`로 표현됩니다. +* `datetime.time`: + * 파이썬의 `datetime.time`. + * 요청과 응답에서 `14:23:55.003`와 같은 ISO 8601 형식의 `str`로 표현됩니다. +* `datetime.timedelta`: + * 파이썬의 `datetime.timedelta`. + * 요청과 응답에서 전체 초(seconds)의 `float`로 표현됩니다. + * Pydantic은 "ISO 8601 시차 인코딩"으로 표현하는 것 또한 허용합니다. 더 많은 정보는 이 문서에서 확인하십시오.. +* `frozenset`: + * 요청과 응답에서 `set`와 동일하게 취급됩니다: + * 요청 시, 리스트를 읽어 중복을 제거하고 `set`로 변환합니다. + * 응답 시, `set`는 `list`로 변환됩니다. + * 생성된 스키마는 (JSON 스키마의 `uniqueItems`를 이용해) `set`의 값이 고유함을 명시합니다. +* `bytes`: + * 표준 파이썬의 `bytes`. + * 요청과 응답에서 `str`로 취급됩니다. + * 생성된 스키마는 이것이 `binary` "형식"의 `str`임을 명시합니다. +* `Decimal`: + * 표준 파이썬의 `Decimal`. + * 요청과 응답에서 `float`와 동일하게 다뤄집니다. +* 여기에서 모든 유효한 pydantic 데이터 자료형을 확인할 수 있습니다: Pydantic 데이터 자료형. + +## 예시 + +위의 몇몇 자료형을 매개변수로 사용하는 *경로 작동* 예시입니다. + +=== "Python 3.10+" + + ```Python hl_lines="1 3 12-16" + {!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="1 3 12-16" + {!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="1 3 13-17" + {!> ../../../docs_src/extra_data_types/tutorial001_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="1 2 11-15" + {!> ../../../docs_src/extra_data_types/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="1 2 12-16" + {!> ../../../docs_src/extra_data_types/tutorial001.py!} + ``` + +함수 안의 매개변수가 그들만의 데이터 자료형을 가지고 있으며, 예를 들어, 다음과 같이 날짜를 조작할 수 있음을 참고하십시오: + +=== "Python 3.10+" + + ```Python hl_lines="18-19" + {!> ../../../docs_src/extra_data_types/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="18-19" + {!> ../../../docs_src/extra_data_types/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="19-20" + {!> ../../../docs_src/extra_data_types/tutorial001_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="17-18" + {!> ../../../docs_src/extra_data_types/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="18-19" + {!> ../../../docs_src/extra_data_types/tutorial001.py!} + ``` From 343f5539bd9280ebccc05619a744c96a85af21ab Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 14 Jun 2024 02:45:32 +0000 Subject: [PATCH 028/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7c78bff9a..c6ee5168a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-data-types.md`. PR [#11711](https://github.com/tiangolo/fastapi/pull/11711) by [@nayeonkinn](https://github.com/nayeonkinn). * 🌐 Fix Korean translation for `docs/ko/docs/tutorial/body-nested-models.md`. PR [#11710](https://github.com/tiangolo/fastapi/pull/11710) by [@nayeonkinn](https://github.com/nayeonkinn). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/fastapi-cli.md`. PR [#11641](https://github.com/tiangolo/fastapi/pull/11641) by [@ayr-ton](https://github.com/ayr-ton). * 🌐 Add Traditional Chinese translation for `docs/zh-hant/docs/fastapi-people.md`. PR [#11639](https://github.com/tiangolo/fastapi/pull/11639) by [@hsuanchi](https://github.com/hsuanchi). From 9d1f0e3512711ccaec66bbf746d0939ff4842ed9 Mon Sep 17 00:00:00 2001 From: Nayeon Kim <98254573+nayeonkinn@users.noreply.github.com> Date: Sat, 15 Jun 2024 00:06:53 +0900 Subject: [PATCH 029/284] =?UTF-8?q?=F0=9F=8C=90=20Fix=20Korean=20translati?= =?UTF-8?q?on=20for=20`docs/ko/docs/tutorial/response-status-code.md`=20(#?= =?UTF-8?q?11718)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/ko/docs/tutorial/response-status-code.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/docs/ko/docs/tutorial/response-status-code.md b/docs/ko/docs/tutorial/response-status-code.md index f92c057be..e6eed5120 100644 --- a/docs/ko/docs/tutorial/response-status-code.md +++ b/docs/ko/docs/tutorial/response-status-code.md @@ -43,16 +43,16 @@ HTTP는 세자리의 숫자 상태 코드를 응답의 일부로 전송합니다 요약하자면: -* `**1xx**` 상태 코드는 "정보"용입니다. 이들은 직접적으로는 잘 사용되지는 않습니다. 이 상태 코드를 갖는 응답들은 본문을 가질 수 없습니다. -* `**2xx**` 상태 코드는 "성공적인" 응답을 위해 사용됩니다. 가장 많이 사용되는 유형입니다. +* `1xx` 상태 코드는 "정보"용입니다. 이들은 직접적으로는 잘 사용되지는 않습니다. 이 상태 코드를 갖는 응답들은 본문을 가질 수 없습니다. +* **`2xx`** 상태 코드는 "성공적인" 응답을 위해 사용됩니다. 가장 많이 사용되는 유형입니다. * `200` 은 디폴트 상태 코드로, 모든 것이 "성공적임"을 의미합니다. * 다른 예로는 `201` "생성됨"이 있습니다. 일반적으로 데이터베이스에 새로운 레코드를 생성한 후 사용합니다. * 단, `204` "내용 없음"은 특별한 경우입니다. 이것은 클라이언트에게 반환할 내용이 없는 경우 사용합니다. 따라서 응답은 본문을 가질 수 없습니다. -* `**3xx**` 상태 코드는 "리다이렉션"용입니다. 본문을 가질 수 없는 `304` "수정되지 않음"을 제외하고, 이 상태 코드를 갖는 응답에는 본문이 있을 수도, 없을 수도 있습니다. -* `**4xx**` 상태 코드는 "클라이언트 오류" 응답을 위해 사용됩니다. 이것은 아마 가장 많이 사용하게 될 두번째 유형입니다. +* **`3xx`** 상태 코드는 "리다이렉션"용입니다. 본문을 가질 수 없는 `304` "수정되지 않음"을 제외하고, 이 상태 코드를 갖는 응답에는 본문이 있을 수도, 없을 수도 있습니다. +* **`4xx`** 상태 코드는 "클라이언트 오류" 응답을 위해 사용됩니다. 이것은 아마 가장 많이 사용하게 될 두번째 유형입니다. * 일례로 `404` 는 "찾을 수 없음" 응답을 위해 사용합니다. * 일반적인 클라이언트 오류의 경우 `400` 을 사용할 수 있습니다. -* `**5xx**` 상태 코드는 서버 오류에 사용됩니다. 이것들을 직접 사용할 일은 거의 없습니다. 응용 프로그램 코드나 서버의 일부에서 문제가 발생하면 자동으로 이들 상태 코드 중 하나를 반환합니다. +* `5xx` 상태 코드는 서버 오류에 사용됩니다. 이것들을 직접 사용할 일은 거의 없습니다. 응용 프로그램 코드나 서버의 일부에서 문제가 발생하면 자동으로 이들 상태 코드 중 하나를 반환합니다. !!! tip "팁" 각각의 상태 코드와 이들이 의미하는 내용에 대해 더 알고싶다면 MDN HTTP 상태 코드에 관한 문서 를 확인하십시오. @@ -82,7 +82,7 @@ HTTP는 세자리의 숫자 상태 코드를 응답의 일부로 전송합니다 !!! note "기술적 세부사항" `from starlette import status` 역시 사용할 수 있습니다. - **FastAPI**는 개발자인 당신의 편의를 위해 `fastapi.status` 와 동일한 `starlette.status` 도 제공합니다. 하지만 이것은 Starlette로부터 직접 제공됩니다. + **FastAPI**는 개발자인 여러분의 편의를 위해 `fastapi.status` 와 동일한 `starlette.status` 도 제공합니다. 하지만 이것은 Starlette로부터 직접 제공됩니다. ## 기본값 변경 From a0761e2b161ba6363c581a98cbc47abc7cd4dff3 Mon Sep 17 00:00:00 2001 From: Rafael de Oliveira Marques Date: Fri, 14 Jun 2024 12:07:11 -0300 Subject: [PATCH 030/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/advanced/benchmarks.md`=20(#11713)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/advanced/benchmarks.md | 34 +++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 docs/pt/docs/advanced/benchmarks.md diff --git a/docs/pt/docs/advanced/benchmarks.md b/docs/pt/docs/advanced/benchmarks.md new file mode 100644 index 000000000..72ef1e444 --- /dev/null +++ b/docs/pt/docs/advanced/benchmarks.md @@ -0,0 +1,34 @@ +# Benchmarks + +Benchmarks independentes da TechEmpower mostram que aplicações **FastAPI** rodando com o Uvicorn como um dos frameworks Python mais rápidos disponíveis, ficando atrás apenas do Starlette e Uvicorn (utilizado internamente pelo FastAPI). + +Porém, ao verificar benchmarks e comparações você deve prestar atenção ao seguinte: + +## Benchmarks e velocidade + +Quando você verifica os benchmarks, é comum ver diversas ferramentas de diferentes tipos comparados como se fossem equivalentes. + +Especificamente, para ver o Uvicorn, Starlette e FastAPI comparados entre si (entre diversas outras ferramentas). + +Quanto mais simples o problema resolvido pela ferramenta, melhor será a performance. E a maioria das análises não testa funcionalidades adicionais que são oferecidas pela ferramenta. + +A hierarquia é: + +* **Uvicorn**: um servidor ASGI + * **Starlette**: (utiliza Uvicorn) um microframework web + * **FastAPI**: (utiliza Starlette) um microframework para APIs com diversas funcionalidades adicionais para a construção de APIs, com validação de dados, etc. + +* **Uvicorn**: + * Terá a melhor performance, pois não possui muito código além do próprio servidor. + * Você não escreveria uma aplicação utilizando o Uvicorn diretamente. Isso significaria que o seu código teria que incluir pelo menos todo o código fornecido pelo Starlette (ou o **FastAPI**). E caso você fizesse isso, a sua aplicação final teria a mesma sobrecarga que teria se utilizasse um framework, minimizando o código e os bugs. + * Se você está comparando o Uvicorn, compare com os servidores de aplicação Daphne, Hypercorn, uWSGI, etc. +* **Starlette**: + * Terá o melhor desempenho, depois do Uvicorn. Na verdade, o Starlette utiliza o Uvicorn para rodar. Portanto, ele pode ficar mais "devagar" que o Uvicorn apenas por ter que executar mais código. + * Mas ele fornece as ferramentas para construir aplicações web simples, com roteamento baseado em caminhos, etc. + * Se você está comparando o Starlette, compare-o com o Sanic, Flask, Django, etc. Frameworks web (ou microframeworks). +* **FastAPI**: + * Da mesma forma que o Starlette utiliza o Uvicorn e não consegue ser mais rápido que ele, o **FastAPI** utiliza o Starlette, portanto, ele não consegue ser mais rápido que ele. + * O FastAPI provê mais funcionalidades em cima do Starlette. Funcionalidades que você quase sempre precisará quando estiver construindo APIs, como validação de dados e serialização. E ao utilizá-lo, você obtém documentação automática sem custo nenhum (a documentação automática sequer adiciona sobrecarga nas aplicações rodando, pois ela é gerada na inicialização). + * Caso você não utilize o FastAPI e faz uso do Starlette diretamente (ou outra ferramenta, como o Sanic, Flask, Responder, etc) você mesmo teria que implementar toda a validação de dados e serialização. Então, a sua aplicação final ainda teria a mesma sobrecarga caso estivesse usando o FastAPI. E em muitos casos, validação de dados e serialização é a maior parte do código escrito em aplicações. + * Então, ao utilizar o FastAPI, você está economizando tempo de programação, evitando bugs, linhas de código, e provavelmente terá a mesma performance (ou até melhor) do que teria caso você não o utilizasse (já que você teria que implementar tudo no seu código). + * Se você está comparando o FastAPI, compare-o com frameworks de aplicações web (ou conjunto de ferramentas) que oferecem validação de dados, serialização e documentação, como por exemplo o Flask-apispec, NestJS, Molten, etc. Frameworks que possuem validação integrada de dados, serialização e documentação. From df4291699f0fc73cd1a1052286f8fcb96d2b43df Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 14 Jun 2024 15:07:16 +0000 Subject: [PATCH 031/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c6ee5168a..be7c36d87 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Fix Korean translation for `docs/ko/docs/tutorial/response-status-code.md`. PR [#11718](https://github.com/tiangolo/fastapi/pull/11718) by [@nayeonkinn](https://github.com/nayeonkinn). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-data-types.md`. PR [#11711](https://github.com/tiangolo/fastapi/pull/11711) by [@nayeonkinn](https://github.com/nayeonkinn). * 🌐 Fix Korean translation for `docs/ko/docs/tutorial/body-nested-models.md`. PR [#11710](https://github.com/tiangolo/fastapi/pull/11710) by [@nayeonkinn](https://github.com/nayeonkinn). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/fastapi-cli.md`. PR [#11641](https://github.com/tiangolo/fastapi/pull/11641) by [@ayr-ton](https://github.com/ayr-ton). From d92a76f3152185ba19d3ee89f8c11be13b3205ce Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 14 Jun 2024 15:07:37 +0000 Subject: [PATCH 032/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index be7c36d87..375e179ec 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/benchmarks.md`. PR [#11713](https://github.com/tiangolo/fastapi/pull/11713) by [@ceb10n](https://github.com/ceb10n). * 🌐 Fix Korean translation for `docs/ko/docs/tutorial/response-status-code.md`. PR [#11718](https://github.com/tiangolo/fastapi/pull/11718) by [@nayeonkinn](https://github.com/nayeonkinn). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-data-types.md`. PR [#11711](https://github.com/tiangolo/fastapi/pull/11711) by [@nayeonkinn](https://github.com/nayeonkinn). * 🌐 Fix Korean translation for `docs/ko/docs/tutorial/body-nested-models.md`. PR [#11710](https://github.com/tiangolo/fastapi/pull/11710) by [@nayeonkinn](https://github.com/nayeonkinn). From 696dedf8e6bee983f15dbca16ca0f3d462d6517e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 17 Jun 2024 09:20:40 -0500 Subject: [PATCH 033/284] =?UTF-8?q?=F0=9F=94=A7=20Update=20Sponsor=20link:?= =?UTF-8?q?=20Coherence=20(#11730)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- docs/en/data/sponsors.yml | 2 +- docs/en/overrides/main.html | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 55f3e300f..5370ea092 100644 --- a/README.md +++ b/README.md @@ -53,7 +53,7 @@ The key features are: - + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 6285e8fd4..272944fb0 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -20,7 +20,7 @@ gold: - url: https://www.propelauth.com/?utm_source=fastapi&utm_campaign=1223&utm_medium=mainbadge title: Auth, user management and more for your B2B product img: https://fastapi.tiangolo.com/img/sponsors/propelauth.png - - url: https://www.withcoherence.com/?utm_medium=advertising&utm_source=fastapi&utm_campaign=banner%20january%2024 + - url: https://docs.withcoherence.com/configuration/frameworks/?utm_medium=advertising&utm_source=fastapi&utm_campaign=docs#fastapi-example title: Coherence img: https://fastapi.tiangolo.com/img/sponsors/coherence.png - url: https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 983197ff0..83fe27068 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -65,7 +65,7 @@
- + From d3388bb4ae6ce75f7c85a1fcb070d8c9659c764b Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 17 Jun 2024 14:21:03 +0000 Subject: [PATCH 034/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 375e179ec..bac06832d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -56,6 +56,7 @@ hide: ### Internal +* 🔧 Update Sponsor link: Coherence. PR [#11730](https://github.com/tiangolo/fastapi/pull/11730) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#11669](https://github.com/tiangolo/fastapi/pull/11669) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add sponsor Kong. PR [#11662](https://github.com/tiangolo/fastapi/pull/11662) by [@tiangolo](https://github.com/tiangolo). * 👷 Update Smokeshow, fix sync download artifact and smokeshow configs. PR [#11563](https://github.com/tiangolo/fastapi/pull/11563) by [@tiangolo](https://github.com/tiangolo). From 32259588e8e2e77f746ddbe5bf75dc2183995224 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 17 Jun 2024 21:25:11 -0500 Subject: [PATCH 035/284] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20add?= =?UTF-8?q?=20Zuplo=20(#11729)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/en/data/sponsors.yml | 3 +++ docs/en/data/sponsors_badge.yml | 2 ++ docs/en/docs/img/sponsors/zuplo-banner.png | Bin 0 -> 1760 bytes docs/en/docs/img/sponsors/zuplo.png | Bin 0 -> 18891 bytes docs/en/overrides/main.html | 6 ++++++ 6 files changed, 12 insertions(+) create mode 100644 docs/en/docs/img/sponsors/zuplo-banner.png create mode 100644 docs/en/docs/img/sponsors/zuplo.png diff --git a/README.md b/README.md index 5370ea092..1fb4893e6 100644 --- a/README.md +++ b/README.md @@ -56,6 +56,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 272944fb0..244d98a9a 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -29,6 +29,9 @@ gold: - url: https://konghq.com/products/kong-konnect/register?utm_medium=referral&utm_source=github&utm_campaign=platform&utm_content=fast-api title: Kong Konnect - API management platform img: https://fastapi.tiangolo.com/img/sponsors/kong.png + - url: https://zuplo.link/fastapi-gh + title: 'Zuplo: Scale, Protect, Document, and Monetize your FastAPI' + img: https://fastapi.tiangolo.com/img/sponsors/zuplo.png silver: - url: https://training.talkpython.fm/fastapi-courses title: FastAPI video courses on demand from people you trust diff --git a/docs/en/data/sponsors_badge.yml b/docs/en/data/sponsors_badge.yml index 00cbec7d2..d8a41fbcb 100644 --- a/docs/en/data/sponsors_badge.yml +++ b/docs/en/data/sponsors_badge.yml @@ -28,3 +28,5 @@ logins: - bump-sh - andrew-propelauth - svix + - zuplo-oss + - Kong diff --git a/docs/en/docs/img/sponsors/zuplo-banner.png b/docs/en/docs/img/sponsors/zuplo-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..a730f2cf2d339d34ac80dee90944b6e9b9740522 GIT binary patch literal 1760 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
+
{% endblock %} From 653315c496304be928b46c34d35097d0ce847646 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 18 Jun 2024 02:25:32 +0000 Subject: [PATCH 036/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index bac06832d..f3c84d529 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -56,6 +56,7 @@ hide: ### Internal +* 🔧 Update sponsors, add Zuplo. PR [#11729](https://github.com/tiangolo/fastapi/pull/11729) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update Sponsor link: Coherence. PR [#11730](https://github.com/tiangolo/fastapi/pull/11730) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#11669](https://github.com/tiangolo/fastapi/pull/11669) by [@tiangolo](https://github.com/tiangolo). * 🔧 Add sponsor Kong. PR [#11662](https://github.com/tiangolo/fastapi/pull/11662) by [@tiangolo](https://github.com/tiangolo). From 1b9c402643beaf22c6b1cb73159c9edae27d8086 Mon Sep 17 00:00:00 2001 From: Rafael de Oliveira Marques Date: Thu, 20 Jun 2024 16:06:58 -0300 Subject: [PATCH 037/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/advanced/additional-responses.md`?= =?UTF-8?q?=20(#11736)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/advanced/additional-responses.md | 240 ++++++++++++++++++ 1 file changed, 240 insertions(+) create mode 100644 docs/pt/docs/advanced/additional-responses.md diff --git a/docs/pt/docs/advanced/additional-responses.md b/docs/pt/docs/advanced/additional-responses.md new file mode 100644 index 000000000..7c7d22611 --- /dev/null +++ b/docs/pt/docs/advanced/additional-responses.md @@ -0,0 +1,240 @@ +# Retornos Adicionais no OpenAPI + +!!! warning "Aviso" + Este é um tema bem avançado. + + Se você está começando com o **FastAPI**, provavelmente você não precisa disso. + +Você pode declarar retornos adicionais, com códigos de status adicionais, media types, descrições, etc. + +Essas respostas adicionais serão incluídas no esquema do OpenAPI, e também aparecerão na documentação da API. + +Porém para as respostas adicionais, você deve garantir que está retornando um `Response` como por exemplo o `JSONResponse` diretamente, junto com o código de status e o conteúdo. + +## Retorno Adicional com `model` + +Você pode fornecer o parâmetro `responses` aos seus *decoradores de caminho*. + +Este parâmetro recebe um `dict`, as chaves são os códigos de status para cada retorno, como por exemplo `200`, e os valores são um outro `dict` com a informação de cada um deles. + +Cada um desses `dict` de retorno pode ter uma chave `model`, contendo um modelo do Pydantic, assim como o `response_model`. + +O **FastAPI** pegará este modelo, gerará o esquema JSON dele e incluirá no local correto do OpenAPI. + +Por exemplo, para declarar um outro retorno com o status code `404` e um modelo do Pydantic chamado `Message`, você pode escrever: + +```Python hl_lines="18 22" +{!../../../docs_src/additional_responses/tutorial001.py!} +``` + +!!! note "Nota" + Lembre-se que você deve retornar o `JSONResponse` diretamente. + +!!! info "Informação" + A chave `model` não é parte do OpenAPI. + + O **FastAPI** pegará o modelo do Pydantic, gerará o `JSON Schema`, e adicionará no local correto. + + O local correto é: + + * Na chave `content`, que tem como valor um outro objeto JSON (`dict`) que contém: + * Uma chave com o media type, como por exemplo `application/json`, que contém como valor um outro objeto JSON, contendo:: + * Uma chave `schema`, que contém como valor o JSON Schema do modelo, sendo este o local correto. + * O **FastAPI** adiciona aqui a referência dos esquemas JSON globais que estão localizados em outro lugar, ao invés de incluí-lo diretamente. Deste modo, outras aplicações e clientes podem utilizar estes esquemas JSON diretamente, fornecer melhores ferramentas de geração de código, etc. + +O retorno gerado no OpenAI para esta *operação de caminho* será: + +```JSON hl_lines="3-12" +{ + "responses": { + "404": { + "description": "Additional Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Message" + } + } + } + }, + "200": { + "description": "Successful Response", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/Item" + } + } + } + }, + "422": { + "description": "Validation Error", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/HTTPValidationError" + } + } + } + } + } +} +``` + +Os esquemas são referenciados em outro local dentro do esquema OpenAPI: + +```JSON hl_lines="4-16" +{ + "components": { + "schemas": { + "Message": { + "title": "Message", + "required": [ + "message" + ], + "type": "object", + "properties": { + "message": { + "title": "Message", + "type": "string" + } + } + }, + "Item": { + "title": "Item", + "required": [ + "id", + "value" + ], + "type": "object", + "properties": { + "id": { + "title": "Id", + "type": "string" + }, + "value": { + "title": "Value", + "type": "string" + } + } + }, + "ValidationError": { + "title": "ValidationError", + "required": [ + "loc", + "msg", + "type" + ], + "type": "object", + "properties": { + "loc": { + "title": "Location", + "type": "array", + "items": { + "type": "string" + } + }, + "msg": { + "title": "Message", + "type": "string" + }, + "type": { + "title": "Error Type", + "type": "string" + } + } + }, + "HTTPValidationError": { + "title": "HTTPValidationError", + "type": "object", + "properties": { + "detail": { + "title": "Detail", + "type": "array", + "items": { + "$ref": "#/components/schemas/ValidationError" + } + } + } + } + } + } +} +``` + +## Media types adicionais para o retorno principal + +Você pode utilizar o mesmo parâmetro `responses` para adicionar diferentes media types para o mesmo retorno principal. + +Por exemplo, você pode adicionar um media type adicional de `image/png`, declarando que a sua *operação de caminho* pode retornar um objeto JSON (com o media type `application/json`) ou uma imagem PNG: + +```Python hl_lines="19-24 28" +{!../../../docs_src/additional_responses/tutorial002.py!} +``` + +!!! note "Nota" + Note que você deve retornar a imagem utilizando um `FileResponse` diretamente. + +!!! info "Informação" + A menos que você especifique um media type diferente explicitamente em seu parâmetro `responses`, o FastAPI assumirá que o retorno possui o mesmo media type contido na classe principal de retorno (padrão `application/json`). + + Porém se você especificou uma classe de retorno com o valor `None` como media type, o FastAPI utilizará `application/json` para qualquer retorno adicional que possui um modelo associado. + +## Combinando informações + +Você também pode combinar informações de diferentes lugares, incluindo os parâmetros `response_model`, `status_code`, e `responses`. + +Você pode declarar um `response_model`, utilizando o código de status padrão `200` (ou um customizado caso você precise), e depois adicionar informações adicionais para esse mesmo retorno em `responses`, diretamente no esquema OpenAPI. + +O **FastAPI** manterá as informações adicionais do `responses`, e combinará com o esquema JSON do seu modelo. + +Por exemplo, você pode declarar um retorno com o código de status `404` que utiliza um modelo do Pydantic que possui um `description` customizado. + +E um retorno com o código de status `200` que utiliza o seu `response_model`, porém inclui um `example` customizado: + +```Python hl_lines="20-31" +{!../../../docs_src/additional_responses/tutorial003.py!} +``` + +Isso será combinado e incluído em seu OpenAPI, e disponibilizado na documentação da sua API: + + + +## Combinar retornos predefinidos e personalizados + +Você pode querer possuir alguns retornos predefinidos que são aplicados para diversas *operações de caminho*, porém você deseja combinar com retornos personalizados que são necessários para cada *operação de caminho*. + +Para estes casos, você pode utilizar a técnica do Python de "desempacotamento" de um `dict` utilizando `**dict_to_unpack`: + +```Python +old_dict = { + "old key": "old value", + "second old key": "second old value", +} +new_dict = {**old_dict, "new key": "new value"} +``` + +Aqui, o `new_dict` terá todos os pares de chave-valor do `old_dict` mais o novo par de chave-valor: + +```Python +{ + "old key": "old value", + "second old key": "second old value", + "new key": "new value", +} +``` + +Você pode utilizar essa técnica para reutilizar alguns retornos predefinidos nas suas *operações de caminho* e combiná-las com personalizações adicionais. + +Por exemplo: + +```Python hl_lines="13-17 26" +{!../../../docs_src/additional_responses/tutorial004.py!} +``` + +## Mais informações sobre retornos OpenAPI + +Para verificar exatamente o que você pode incluir nos retornos, você pode conferir estas seções na especificação do OpenAPI: + +* Objeto de Retorno OpenAPI, inclui o `Response Object`. +* Objeto de Retorno OpenAPI, você pode incluir qualquer coisa dele diretamente em cada retorno dentro do seu parâmetro `responses`. Incluindo `description`, `headers`, `content` (dentro dele que você declara diferentes media types e esquemas JSON), e `links`. From 33e2fbe20f8aa8b82cad405679bf71704c7d280f Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 20 Jun 2024 19:07:28 +0000 Subject: [PATCH 038/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f3c84d529..aa7a749fe 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/additional-responses.md`. PR [#11736](https://github.com/tiangolo/fastapi/pull/11736) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/benchmarks.md`. PR [#11713](https://github.com/tiangolo/fastapi/pull/11713) by [@ceb10n](https://github.com/ceb10n). * 🌐 Fix Korean translation for `docs/ko/docs/tutorial/response-status-code.md`. PR [#11718](https://github.com/tiangolo/fastapi/pull/11718) by [@nayeonkinn](https://github.com/nayeonkinn). * 🌐 Add Korean translation for `docs/ko/docs/tutorial/extra-data-types.md`. PR [#11711](https://github.com/tiangolo/fastapi/pull/11711) by [@nayeonkinn](https://github.com/nayeonkinn). From e62e5e88120167e2dbc1cb0ca6c60ef8e8cb2516 Mon Sep 17 00:00:00 2001 From: Victor Senna <34524951+vhsenna@users.noreply.github.com> Date: Thu, 20 Jun 2024 16:07:51 -0300 Subject: [PATCH 039/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/how-to/index.md`=20(#11731)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/how-to/index.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 docs/pt/docs/how-to/index.md diff --git a/docs/pt/docs/how-to/index.md b/docs/pt/docs/how-to/index.md new file mode 100644 index 000000000..664e89144 --- /dev/null +++ b/docs/pt/docs/how-to/index.md @@ -0,0 +1,11 @@ +# Como Fazer - Exemplos Práticos + +Aqui você encontrará diferentes exemplos práticos ou tutoriais de "como fazer" para vários tópicos. + +A maioria dessas ideias será mais ou menos **independente**, e na maioria dos casos você só precisará estudá-las se elas se aplicarem diretamente ao **seu projeto**. + +Se algo parecer interessante e útil para o seu projeto, vá em frente e dê uma olhada. Caso contrário, você pode simplesmente ignorá-lo. + +!!! tip + + Se você deseja **aprender FastAPI** de forma estruturada (recomendado), leia capítulo por capítulo [Tutorial - Guia de Usuário](../tutorial/index.md){.internal-link target=_blank} em vez disso. From b7a0fc7e12b850bf937f705a473f6c70d9b26137 Mon Sep 17 00:00:00 2001 From: Benjamin Vandamme <6206@holbertonstudents.com> Date: Thu, 20 Jun 2024 21:09:17 +0200 Subject: [PATCH 040/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20French=20translati?= =?UTF-8?q?on=20for=20`docs/fr/docs/learn/index.md`=20(#11712)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/fr/docs/learn/index.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 docs/fr/docs/learn/index.md diff --git a/docs/fr/docs/learn/index.md b/docs/fr/docs/learn/index.md new file mode 100644 index 000000000..46fc095dc --- /dev/null +++ b/docs/fr/docs/learn/index.md @@ -0,0 +1,5 @@ +# Apprendre + +Voici les sections introductives et les tutoriels pour apprendre **FastAPI**. + +Vous pouvez considérer ceci comme un **manuel**, un **cours**, la **méthode officielle** et recommandée pour appréhender FastAPI. 😎 From 26431224d1818523ecbd59a1a04ed3973457d2cb Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 20 Jun 2024 19:09:46 +0000 Subject: [PATCH 041/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index aa7a749fe..058f199dc 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/how-to/index.md`. PR [#11731](https://github.com/tiangolo/fastapi/pull/11731) by [@vhsenna](https://github.com/vhsenna). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/additional-responses.md`. PR [#11736](https://github.com/tiangolo/fastapi/pull/11736) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/benchmarks.md`. PR [#11713](https://github.com/tiangolo/fastapi/pull/11713) by [@ceb10n](https://github.com/ceb10n). * 🌐 Fix Korean translation for `docs/ko/docs/tutorial/response-status-code.md`. PR [#11718](https://github.com/tiangolo/fastapi/pull/11718) by [@nayeonkinn](https://github.com/nayeonkinn). From 85bad3303f8534f3323bddcdc5acf169a558bfeb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Pereira=20Holanda?= Date: Thu, 20 Jun 2024 16:10:31 -0300 Subject: [PATCH 042/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/advanced/settings.md`=20(#11739)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/advanced/settings.md | 485 ++++++++++++++++++++++++++++++ 1 file changed, 485 insertions(+) create mode 100644 docs/pt/docs/advanced/settings.md diff --git a/docs/pt/docs/advanced/settings.md b/docs/pt/docs/advanced/settings.md new file mode 100644 index 000000000..f6962831f --- /dev/null +++ b/docs/pt/docs/advanced/settings.md @@ -0,0 +1,485 @@ +# Configurações e Variáveis de Ambiente + +Em muitos casos a sua aplicação pode precisar de configurações externas, como chaves secretas, credenciais de banco de dados, credenciais para serviços de email, etc. + +A maioria dessas configurações é variável (podem mudar), como URLs de bancos de dados. E muitas delas podem conter dados sensíveis, como tokens secretos. + +Por isso é comum prover essas configurações como variáveis de ambiente que são utilizidas pela aplicação. + +## Variáveis de Ambiente + +!!! dica + Se você já sabe o que são variáveis de ambiente e como utilizá-las, sinta-se livre para avançar para o próximo tópico. + +Uma variável de ambiente (abreviada em inglês para "env var") é uma variável definida fora do código Python, no sistema operacional, e pode ser lida pelo seu código Python (ou por outros programas). + +Você pode criar e utilizar variáveis de ambiente no terminal, sem precisar utilizar Python: + +=== "Linux, macOS, Windows Bash" + +
+ + ```console + // Você pode criar uma env var MY_NAME usando + $ export MY_NAME="Wade Wilson" + + // E utilizá-la em outros programas, como + $ echo "Hello $MY_NAME" + + Hello Wade Wilson + ``` + +
+ +=== "Windows PowerShell" + +
+ + ```console + // Criando env var MY_NAME + $ $Env:MY_NAME = "Wade Wilson" + + // Usando em outros programas, como + $ echo "Hello $Env:MY_NAME" + + Hello Wade Wilson + ``` + +
+ +### Lendo variáveis de ambiente com Python + +Você também pode criar variáveis de ambiente fora do Python, no terminal (ou com qualquer outro método), e realizar a leitura delas no Python. + +Por exemplo, você pode definir um arquivo `main.py` com o seguinte código: + +```Python hl_lines="3" +import os + +name = os.getenv("MY_NAME", "World") +print(f"Hello {name} from Python") +``` + +!!! dica + O segundo parâmetro em `os.getenv()` é o valor padrão para o retorno. + + Se nenhum valor for informado, `None` é utilizado por padrão, aqui definimos `"World"` como o valor padrão a ser utilizado. + +E depois você pode executar esse arquivo: + +
+ +```console +// Aqui ainda não definimos a env var +$ python main.py + +// Por isso obtemos o valor padrão + +Hello World from Python + +// Mas se definirmos uma variável de ambiente primeiro +$ export MY_NAME="Wade Wilson" + +// E executarmos o programa novamente +$ python main.py + +// Agora ele pode ler a variável de ambiente + +Hello Wade Wilson from Python +``` + +
+ +Como variáveis de ambiente podem ser definidas fora do código da aplicação, mas acessadas pela aplicação, e não precisam ser armazenadas (versionadas com `git`) junto dos outros arquivos, é comum utilizá-las para guardar configurações. + +Você também pode criar uma variável de ambiente específica para uma invocação de um programa, que é acessível somente para esse programa, e somente enquanto ele estiver executando. + +Para fazer isso, crie a variável imediatamente antes de iniciar o programa, na mesma linha: + +
+ +```console +// Criando uma env var MY_NAME na mesma linha da execução do programa +$ MY_NAME="Wade Wilson" python main.py + +// Agora a aplicação consegue ler a variável de ambiente + +Hello Wade Wilson from Python + +// E a variável deixa de existir após isso +$ python main.py + +Hello World from Python +``` + +
+ +!!! dica + Você pode ler mais sobre isso em: The Twelve-Factor App: Configurações. + +### Tipagem e Validação + +Essas variáveis de ambiente suportam apenas strings, por serem externas ao Python e por que precisam ser compatíveis com outros programas e o resto do sistema (e até mesmo com outros sistemas operacionais, como Linux, Windows e macOS). + +Isso significa que qualquer valor obtido de uma variável de ambiente em Python terá o tipo `str`, e qualquer conversão para um tipo diferente ou validação deve ser realizada no código. + +## Pydantic `Settings` + +Por sorte, o Pydantic possui uma funcionalidade para lidar com essas configurações vindas de variáveis de ambiente utilizando Pydantic: Settings management. + +### Instalando `pydantic-settings` + +Primeiro, instale o pacote `pydantic-settings`: + +
+ +```console +$ pip install pydantic-settings +---> 100% +``` + +
+ +Ele também está incluído no fastapi quando você instala com a opção `all`: + +
+ +```console +$ pip install "fastapi[all]" +---> 100% +``` + +
+ +!!! info + Na v1 do Pydantic ele estava incluído no pacote principal. Agora ele está distribuido como um pacote independente para que você possa optar por instalar ou não caso você não precise dessa funcionalidade. + +### Criando o objeto `Settings` + +Importe a classe `BaseSettings` do Pydantic e crie uma nova subclasse, de forma parecida com um modelo do Pydantic. + +Os atributos da classe são declarados com anotações de tipo, e possíveis valores padrão, da mesma maneira que os modelos do Pydantic. + +Você pode utilizar todas as ferramentas e funcionalidades de validação que são utilizadas nos modelos do Pydantic, como tipos de dados diferentes e validações adicionei com `Field()`. + +=== "Pydantic v2" + + ```Python hl_lines="2 5-8 11" + {!> ../../../docs_src/settings/tutorial001.py!} + ``` + +=== "Pydantic v1" + + !!! Info + Na versão 1 do Pydantic você importaria `BaseSettings` diretamente do módulo `pydantic` em vez do módulo `pydantic_settings`. + + ```Python hl_lines="2 5-8 11" + {!> ../../../docs_src/settings/tutorial001_pv1.py!} + ``` + +!!! dica + Se você quiser algo pronto para copiar e colar na sua aplicação, não use esse exemplo, mas sim o exemplo abaixo. + +Portanto, quando você cria uma instância da classe `Settings` (nesse caso, o objeto `settings`), o Pydantic lê as variáveis de ambiente sem diferenciar maiúsculas e minúsculas, por isso, uma variável maiúscula `APP_NAME` será usada para o atributo `app_name`. + +Depois ele irá converter e validar os dados. Assim, quando você utilizar aquele objeto `settings`, os dados terão o tipo que você declarou (e.g. `items_per_user` será do tipo `int`). + +### Usando o objeto `settings` + +Depois, Você pode utilizar o novo objeto `settings` na sua aplicação: + +```Python hl_lines="18-20" +{!../../../docs_src/settings/tutorial001.py!} +``` + +### Executando o servidor + +No próximo passo, você pode inicializar o servidor passando as configurações em forma de variáveis de ambiente, por exemplo, você poderia definir `ADMIN_EMAIL` e `APP_NAME` da seguinte forma: + +
+ +```console +$ ADMIN_EMAIL="deadpool@example.com" APP_NAME="ChimichangApp" fastapi run main.py + +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +
+ +!!! dica + Para definir múltiplas variáveis de ambiente para um único comando basta separá-las utilizando espaços, e incluir todas elas antes do comando. + +Assim, o atributo `admin_email` seria definido como `"deadpool@example.com"`. + +`app_name` seria `"ChimichangApp"`. + +E `items_per_user` manteria o valor padrão de `50`. + +## Configurações em um módulo separado + +Você também pode incluir essas configurações em um arquivo de um módulo separado como visto em [Bigger Applications - Multiple Files](../tutorial/bigger-applications.md){.internal-link target=\_blank}. + +Por exemplo, você pode adicionar um arquivo `config.py` com: + +```Python +{!../../../docs_src/settings/app01/config.py!} +``` + +E utilizar essa configuração em `main.py`: + +```Python hl_lines="3 11-13" +{!../../../docs_src/settings/app01/main.py!} +``` + +!!! dica + Você também precisa incluir um arquivo `__init__.py` como visto em [Bigger Applications - Multiple Files](../tutorial/bigger-applications.md){.internal-link target=\_blank}. + +## Configurações em uma dependência + +Em certas ocasiões, pode ser útil fornecer essas configurações a partir de uma dependência, em vez de definir um objeto global `settings` que é utilizado em toda a aplicação. + +Isso é especialmente útil durante os testes, já que é bastante simples sobrescrever uma dependência com suas configurações personalizadas. + +### O arquivo de configuração + +Baseando-se no exemplo anterior, seu arquivo `config.py` seria parecido com isso: + +```Python hl_lines="10" +{!../../../docs_src/settings/app02/config.py!} +``` + +Perceba que dessa vez não criamos uma instância padrão `settings = Settings()`. + +### O arquivo principal da aplicação + +Agora criamos a dependência que retorna um novo objeto `config.Settings()`. + +=== "Python 3.9+" + + ```Python hl_lines="6 12-13" + {!> ../../../docs_src/settings/app02_an_py39/main.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="6 12-13" + {!> ../../../docs_src/settings/app02_an/main.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! dica + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="5 11-12" + {!> ../../../docs_src/settings/app02/main.py!} + ``` + +!!! dica + Vamos discutir sobre `@lru_cache` logo mais. + + Por enquanto, você pode considerar `get_settings()` como uma função normal. + +E então podemos declarar essas configurações como uma dependência na função de operação da rota e utilizar onde for necessário. + +=== "Python 3.9+" + + ```Python hl_lines="17 19-21" + {!> ../../../docs_src/settings/app02_an_py39/main.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="17 19-21" + {!> ../../../docs_src/settings/app02_an/main.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! dica + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="16 18-20" + {!> ../../../docs_src/settings/app02/main.py!} + ``` + +### Configurações e testes + +Então seria muito fácil fornecer uma configuração diferente durante a execução dos testes sobrescrevendo a dependência de `get_settings`: + +```Python hl_lines="9-10 13 21" +{!../../../docs_src/settings/app02/test_main.py!} +``` + +Na sobrescrita da dependência, definimos um novo valor para `admin_email` quando instanciamos um novo objeto `Settings`, e então retornamos esse novo objeto. + +Após isso, podemos testar se o valor está sendo utilizado. + +## Lendo um arquivo `.env` + +Se você tiver muitas configurações que variem bastante, talvez em ambientes distintos, pode ser útil colocá-las em um arquivo e depois lê-las como se fossem variáveis de ambiente. + +Essa prática é tão comum que possui um nome, essas variáveis de ambiente normalmente são colocadas em um arquivo `.env`, e esse arquivo é chamado de "dotenv". + +!!! dica + Um arquivo iniciando com um ponto final (`.`) é um arquivo oculto em sistemas baseados em Unix, como Linux e MacOS. + + Mas um arquivo dotenv não precisa ter esse nome exato. + +Pydantic suporta a leitura desses tipos de arquivos utilizando uma biblioteca externa. Você pode ler mais em Pydantic Settings: Dotenv (.env) support. + +!!! dica + Para que isso funcione você precisa executar `pip install python-dotenv`. + +### O arquivo `.env` + +Você pode definir um arquivo `.env` com o seguinte conteúdo: + +```bash +ADMIN_EMAIL="deadpool@example.com" +APP_NAME="ChimichangApp" +``` + +### Obtendo configurações do `.env` + +E então adicionar o seguinte código em `config.py`: + +=== "Pydantic v2" + + ```Python hl_lines="9" + {!> ../../../docs_src/settings/app03_an/config.py!} + ``` + + !!! dica + O atributo `model_config` é usado apenas para configuração do Pydantic. Você pode ler mais em Pydantic Model Config. + +=== "Pydantic v1" + + ```Python hl_lines="9-10" + {!> ../../../docs_src/settings/app03_an/config_pv1.py!} + ``` + + !!! dica + A classe `Config` é usada apenas para configuração do Pydantic. Você pode ler mais em Pydantic Model Config. + +!!! info + Na versão 1 do Pydantic a configuração é realizada por uma classe interna `Config`, na versão 2 do Pydantic isso é feito com o atributo `model_config`. Esse atributo recebe um `dict`, para utilizar o autocomplete e checagem de erros do seu editor de texto você pode importar e utilizar `SettingsConfigDict` para definir esse `dict`. + +Aqui definimos a configuração `env_file` dentro da classe `Settings` do Pydantic, e definimos o valor como o nome do arquivo dotenv que queremos utilizar. + +### Declarando `Settings` apenas uma vez com `lru_cache` + +Ler o conteúdo de um arquivo em disco normalmente é uma operação custosa (lenta), então você provavelmente quer fazer isso apenas um vez e reutilizar o mesmo objeto settings depois, em vez de ler os valores a cada requisição. + +Mas cada vez que fazemos: + +```Python +Settings() +``` + +um novo objeto `Settings` é instanciado, e durante a instanciação, o arquivo `.env` é lido novamente. + +Se a função da dependência fosse apenas: + +```Python +def get_settings(): + return Settings() +``` + +Iriamos criar um novo objeto a cada requisição, e estaríamos lendo o arquivo `.env` a cada requisição. ⚠️ + +Mas como estamos utilizando o decorador `@lru_cache` acima, o objeto `Settings` é criado apenas uma vez, na primeira vez que a função é chamada. ✔️ + +=== "Python 3.9+" + + ```Python hl_lines="1 11" + {!> ../../../docs_src/settings/app03_an_py39/main.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="1 11" + {!> ../../../docs_src/settings/app03_an/main.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! dica + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="1 10" + {!> ../../../docs_src/settings/app03/main.py!} + ``` + +Dessa forma, todas as chamadas da função `get_settings()` nas dependências das próximas requisições, em vez de executar o código interno de `get_settings()` e instanciar um novo objeto `Settings`, irão retornar o mesmo objeto que foi retornado na primeira chamada, de novo e de novo. + +#### Detalhes Técnicos de `lru_cache` + +`@lru_cache` modifica a função decorada para retornar o mesmo valor que foi retornado na primeira vez, em vez de calculá-lo novamente, executando o código da função toda vez. + +Assim, a função abaixo do decorador é executada uma única vez para cada combinação dos argumentos passados. E os valores retornados para cada combinação de argumentos são sempre reutilizados para cada nova chamada da função com a mesma combinação de argumentos. + +Por exemplo, se você definir uma função: + +```Python +@lru_cache +def say_hi(name: str, salutation: str = "Ms."): + return f"Hello {salutation} {name}" +``` + +Seu programa poderia executar dessa forma: + +```mermaid +sequenceDiagram + +participant code as Código +participant function as say_hi() +participant execute as Executar Função + + rect rgba(0, 255, 0, .1) + code ->> function: say_hi(name="Camila") + function ->> execute: executar código da função + execute ->> code: retornar o resultado + end + + rect rgba(0, 255, 255, .1) + code ->> function: say_hi(name="Camila") + function ->> code: retornar resultado armazenado + end + + rect rgba(0, 255, 0, .1) + code ->> function: say_hi(name="Rick") + function ->> execute: executar código da função + execute ->> code: retornar o resultado + end + + rect rgba(0, 255, 0, .1) + code ->> function: say_hi(name="Rick", salutation="Mr.") + function ->> execute: executar código da função + execute ->> code: retornar o resultado + end + + rect rgba(0, 255, 255, .1) + code ->> function: say_hi(name="Rick") + function ->> code: retornar resultado armazenado + end + + rect rgba(0, 255, 255, .1) + code ->> function: say_hi(name="Camila") + function ->> code: retornar resultado armazenado + end +``` + +No caso da nossa dependência `get_settings()`, a função não recebe nenhum argumento, então ela sempre retorna o mesmo valor. + +Dessa forma, ela se comporta praticamente como uma variável global, mas ao ser utilizada como uma função de uma dependência, pode facilmente ser sobrescrita durante os testes. + +`@lru_cache` é definido no módulo `functools` que faz parte da biblioteca padrão do Python, você pode ler mais sobre esse decorador no link Python Docs sobre `@lru_cache`. + +## Recapitulando + +Você pode usar o módulo Pydantic Settings para gerenciar as configurações de sua aplicação, utilizando todo o poder dos modelos Pydantic. + +- Utilizar dependências simplifica os testes. +- Você pode utilizar arquivos .env junto das configurações do Pydantic. +- Utilizar o decorador `@lru_cache` evita que o arquivo .env seja lido de novo e de novo para cada requisição, enquanto permite que você sobrescreva durante os testes. From 06839414faa57d03315d585bd80747e4c800203c Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 20 Jun 2024 19:10:49 +0000 Subject: [PATCH 043/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 058f199dc..8779938f0 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add French translation for `docs/fr/docs/learn/index.md`. PR [#11712](https://github.com/tiangolo/fastapi/pull/11712) by [@benjaminvandammeholberton](https://github.com/benjaminvandammeholberton). * 🌐 Add Portuguese translation for `docs/pt/docs/how-to/index.md`. PR [#11731](https://github.com/tiangolo/fastapi/pull/11731) by [@vhsenna](https://github.com/vhsenna). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/additional-responses.md`. PR [#11736](https://github.com/tiangolo/fastapi/pull/11736) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/benchmarks.md`. PR [#11713](https://github.com/tiangolo/fastapi/pull/11713) by [@ceb10n](https://github.com/ceb10n). From c26931ae1714ded8aae3fff5526183b5c0977d39 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 20 Jun 2024 19:12:54 +0000 Subject: [PATCH 044/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 8779938f0..76ddef59a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/settings.md`. PR [#11739](https://github.com/tiangolo/fastapi/pull/11739) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add French translation for `docs/fr/docs/learn/index.md`. PR [#11712](https://github.com/tiangolo/fastapi/pull/11712) by [@benjaminvandammeholberton](https://github.com/benjaminvandammeholberton). * 🌐 Add Portuguese translation for `docs/pt/docs/how-to/index.md`. PR [#11731](https://github.com/tiangolo/fastapi/pull/11731) by [@vhsenna](https://github.com/vhsenna). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/additional-responses.md`. PR [#11736](https://github.com/tiangolo/fastapi/pull/11736) by [@ceb10n](https://github.com/ceb10n). From 913659c80d25e9f4aa4404584f8a81a4fc24b481 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 25 Jun 2024 20:33:01 -0500 Subject: [PATCH 045/284] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20add?= =?UTF-8?q?=20Stainless=20(#11763)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/en/data/sponsors.yml | 3 +++ docs/en/docs/advanced/generate-clients.md | 2 +- docs/en/docs/img/sponsors/stainless.png | Bin 0 -> 29572 bytes 4 files changed, 5 insertions(+), 1 deletion(-) create mode 100644 docs/en/docs/img/sponsors/stainless.png diff --git a/README.md b/README.md index 1fb4893e6..35d0fad1f 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 244d98a9a..39c51b82b 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -51,6 +51,9 @@ silver: - url: https://www.codacy.com/?utm_source=github&utm_medium=sponsors&utm_id=pioneers title: Take code reviews from hours to minutes img: https://fastapi.tiangolo.com/img/sponsors/codacy.png + - url: https://www.stainlessapi.com/?utm_source=fastapi&utm_medium=referral + title: Stainless | Generate best-in-class SDKs + img: https://fastapi.tiangolo.com/img/sponsors/stainless.png bronze: - url: https://www.exoflare.com/open-source/?utm_source=FastAPI&utm_campaign=open_source title: Biosecurity risk assessments made easy. diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md index fd9a73618..09d00913f 100644 --- a/docs/en/docs/advanced/generate-clients.md +++ b/docs/en/docs/advanced/generate-clients.md @@ -20,7 +20,7 @@ Some of them also ✨ [**sponsor FastAPI**](../help-fastapi.md#sponsor-the-autho And it shows their true commitment to FastAPI and its **community** (you), as they not only want to provide you a **good service** but also want to make sure you have a **good and healthy framework**, FastAPI. 🙇 -For example, you might want to try Speakeasy. +For example, you might want to try Speakeasy and Stainless. There are also several other companies offering similar services that you can search and find online. 🤓 diff --git a/docs/en/docs/img/sponsors/stainless.png b/docs/en/docs/img/sponsors/stainless.png new file mode 100644 index 0000000000000000000000000000000000000000..0f99c1d32c6448dd020f4252a96529420841cbcf GIT binary patch literal 29572 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 z%0Dskw^Mq#=f2V7D#G>r4y@WNg*uTRY@LNMZ2G~|tEa42#6+s%CTYC%BA9+$opzFA5r0 z2rB;jaxcTWeqVm3Tqw;sN4YhFyda7ld}``194opYlvg?N8df+vSlWgq@Pda+SCwVP1L&WNrIC4K# zZYav+0~Fr7eCG=iEh(REArVBp(~Vj^;9Zw!vmci!zBVgxUGH*>}reCaZUb_uXNHW}( z(gc*l9K(cQp)YpkD3@c&ffM9&DJCJ|AxW}fGS_ek(L|?2A=uMDCK+nGh-vuvAG?)K z8C;`qMQg;JR$+4JzxxN<@LeA5f|JYSlS_(+u+0r4tGX$UI1S5buyhQtgC0gLKi^0x zkR~?_S^T8B5@{|i{lMmB%yW@&o`}q>nfreE6_kUO`(Di(0YJI<-+~uD8_eixAL_SY z5ne`EvM|u<$cn%4=a0hr#ykA#qk@5KgAlS{_C%EKzeQz+pd+@O$gjT^Z_1W-8oDKf zaz|}0T4R3Qj!RoKy%yAO(2xs3G0H@@D(3n?F6T@XBC|{5bg@@%=Oir~okg8aOjw*m zU!tl|P0XPXi0>A6vD14X--yJ+0v3acO{glajz^60+vVU*zYDaMACvYiF!9V*ZLD4&9EBI8 z9qOL^j-z>HZJF+6kF_<>ZfN5kP#$MadlFZO_&bn9R^9$h7~Cujbnp+{5KIR0+MvwnW(4gCZN?BMZv%uk9pv z0{36^W{+%P6`8!F5}N?(xU@MFic5YQlvw=LrOwArKL+iKsqI) zr9)D>yIV>S1f;tJBt?{v76hb)yYQC}Jis}#XV#wi-goW8_(%BSx(p#9fD->DThVTU z9J{Dp0S80Zkr>0X;oFGwq*1{KEqNmToLUTw)9O#gvn3C399yKa@#w4;SB%-NXVB87}Iv31PaHaeU>Z2K%>68tk3Q zIicvR)q!-W+mDLJhNM6`y4b_OR~n<)zP8>qTK9BSeYBJsgw(RMd69LBVjgxV-RhsS9;XXmkoK#tSa&u7=yfUOWVa z3M7*GF&xpgeGQz}d?&7AnWbE2NE_Up&2q8);?mfkUB7c(NY`wd(bUBxj0~~AE=H_D zWa*)m{H8%tmgU6Fcg$v1NQIC=9%QnHUNG-WnYZ{hN!80ePI@Aolzx&n+Ei-dZQrp- zBQnwsV`R9EG~O;+)s;-py)rloGgTyUB#OE^gVfb~eJ|AluhS+c{)yR%R{&I>n zo|~?lUm-L_d2h*{W!!0g5Q{vh1AolXO&V zI+ttD#2_+kYcsTKctJ-mYd>ZxLYN~xR#gOtQ9dHjArtyn&3D;Aa*ZA+lj>y$L3^v2k-PX`I`b5Hq z!UDqHbYg?8Cig1$v0Aniiy6)EP{MI2TX$--D(>!dZlKIb)pzzYk-@Lx{W$8m;5)r&r6Qbgzfn$!uIY&itv5E!G63hESK#yFFfM zVrIHh1foTKi3q_SU3VSnN3~cVqvWL;eQi{%&7aATWwioF)QGyEgcEwohUkc5l8>Y7 zJG0m3SA2f{zgspb2E1Uj`*4+PX&ChK2x4R{NqpgCGGgxY2G7C;b4L z9>DFh8q4_Lyw*RhDvWK8wQ>fW?gpUGhD!@LZO>EgS?mCU{*4RHIrSnTIVKAoG1z ztoefDy5eKeIl%FY0MnaM)u*6%c%^wWPJxZA=R z{F&IrI>3}!V911QIus(FwE!E)`RxV0j@BXE0>talN2t38axOT7Bmm0b%n#!xa30wO z@AjGK-l?mL5oxuvsV+_6z~+(*W3oH@N|9F9TNsPTU3x8g#mJ&AhFsV2$R&>N&i# zuyn>@0lN2-TEV$KVW}HV`n>)(*Kjx|CMJFc>l1t$P+~B84!`>x7&SW@0i1)S0xHdS zfHg2ykZtk~%FclJE zy`OG<>3Kc+3*r5j3T?K*eB6)Lo$!0CgilLiGI1zGUTrg^N>#VKk-f5+E`7Z-U;eSk z6LKN7r51>SKymZ_)_5oR0l@Gu@&KIm^c}_iR57OgxN^|6Vu40Uqoc5W6`!+>{i^3M z8Ii4aP*PwXX&y~+;D=&LOP6c12+?U%Ui!FD+>$bOPOf+6Gf~W07_@E_ASDHb)xs+K z$ull~dkwBMhjH6ET)*c4E}$ZbL-Ysfi=?;-&{CsM?jZL#`Ja7S`8qShZus#Kn6*>; z-;~`}_`!ClR!$#pQ28>I)41{*8wpm#Ktus5WVYH1x1+lugL&x@H+8_z z(6KW39WIC2-k$)*?G(_hfLs-pPtk7cBvQwI(-P4mwE8 zxjFmX>~IB+Eu?39z$tJ5&j0>&a5qEhs}h->t$x?h)%D3iBjrPhPggGSIQTB@$6v&+ z=>uk`Z}Zo{CbjYd?#7`S-T@JU~xlWjCDV0_hVfoe8B~# zj4Fs5N9#iXyGVU6esCIn8g#)LFKScpQdj?y)9%xjRGM^W{K34QE!SiU;DrnyE;p69 zpD!pX{7{uan;7=9vOg%-`tNd*U8hzFyB0M%Q=-%!spyn=OU2qIkdIA~BWxWd_~nAK zt-!EkDt>|GiSl1E1!fiI-gucvnQ%mDiUC+yJzH@QlHF;jkSUjyZCz~UTHQ3;Of$Mo z^?2~x&0^&)x42p{CXxbu*0#?R`~oZ(hJ2O6vF%U)UGNR-ZMsBda%EF2*tMprD!O0` zoUwKd_-+63@MXD1^2?ap;0XonSg!hj<>|g%oazU67^nkI!0mlNy8;Cj<6fBQ-KyyT zk;iibqDGr3iQDpq~TUR$w7oC0O4Zy;!htduOw^QObIAKyBq$-&s z!4PPpM*j}N00ewc(b@|Nr0kZ#MS+`-r1okz<|C1{Xx;*5GN1}T67H-Nh#&9xYS~2k zjtT2)=m3Dld)I7nakMcZay6UKx>bGI86!Oy^vG<5n%L}%&*)UO!Dxmv7!^--n~7bVGQ%g;#Y z5zf&GDw$&&r!33z*G(Dwm*`F2w~Dx}Cl}ccO4_qOSw;87g2AaQE7NPRRDlZxZ%PPc zRfwgR;XP^*euA+|f5UG(gYGW<8^`ZV1oz?F5B;DpO0`D}t~vP~XWrpOP#asoCdV@v zB%QF%5WL!JxZ7Yb*`~8wgV2ZaRM_i?{x>|V2q*-}V_SlWBDlKSZkIqgZ(#v}EO)#q ze(Tj4fCzDUC558T*yFi7*OEQBE{zuRnISUZD|j^m_b-a3ZQOL`W@n|i??mw?i)M$p zlrvMvU_nOy^ee*-6^o=6+EtY0%gf3YlZfW?=a_{uQFh?u;h{h^{r4-=2|6bxfg8cH!BtHP zpf1UQO3V?v2Jf;N7A@F?2h*h!a3eZwzw37dpdu9noE}ti_xV~=xJZVd{n{OtfU>14 z|AN9qt+3c+1T_jaS5Um_at6e#7V=1C@Bb29{kO5P0bk4YJyL-1AD)oOq?~rRALfL8 zojQgpc?kL+{Fzhed4N+x*U`oZ_qr#PvcZ=3EvFfgZz z-M2ZL%g{xjl)`>-otvwxqZ142HyEezJMZ?QUvM$c-WlN5aAuAfG}%b;T72-;Ww&}< z*R*jZCiQA&N!{e#+WcQb7A=MBJ!*7{5J7W<>H6Z?<~=RsEG7jn6uzQGM2w@5Q<88) zuZ?7o+Cll}TO2{fCJP~@8p{v>)_s)&)+;pSX|AA4`#w-}gBpA{%fcV>(3RdChKmOT z4)MWm^Q3-+(`PF`9BS2_CkdW{82Cg0{uiKHcX<9;1z7kK+Ji{p`!F_l^%GbiELgFd z^EG_#-m*-%8=B((hMfa!5!=C#IfDj~zrd2C4`9kZHJYOo^F0TL#Hn?gagPhE!ZHhe zQSTGjMpGh11AbFK4O72|_>^%Mn|)m{GPzo04wo-2L}orc+5rrp)e-+`t=>)g{=iUpW|(2oTB zRv3$CHPzM7QT4-S{~7XEg}#dCXO1Kq=#P(}vR;9~FTrgG%NPI`bwLMIp!E`RC)$Eg z;}DoSH=F)9n|FOprrjaW9a}a+iH$o`TtKyZY%_&&p11bIq$mwl4=-DroyAci5DPn^AZsQVlQ~rxaT3>dZtnwVxuD?n!YfCR`!%p3URhcR#*zhGzWP|*-x6qUr53CxENUR`s|s| zk>+UyapU|^b5$K%sQ-|(a$!cMQ1;z_O;8lgBf>yyWN;5baNR18BAuQlvJ2BX~1KK~Qzd+olMF;ry_AJ-RF7-TJx*iXBtT8z&so+416eS+^4GnybpL>}+0x-U%xl93z5Ac}BLHR=*C zIx@P|Ptss=b7B4jswUG+EUZg3#o)eYalNk%wHQ=~vXg9B1TDVlki`GlLn{$x!RpS+ zJ$^$K7}6rFjuqBO6CX6Yi5Bu7vnd<{sm=qb@<_ke#~|~!*HIVuhMro@xxOTP`5|pV z-wTJRNpQfKuOw!&Qo#(hCs;~1D9>v0^Hc?WI#;0H2yr@9EdtAhbHqa@{^%LXuMF9= zKlw452D|ZaqAWO;P97v#D>Npkbh$`&lMgv7p5!$eWjt0wE~-|1KXDLBsbnCu+oN$6 z)`&JqBQIg{EHYkUk}LsX&o`ePm2|#0uV^Jc#8}x_rkL!Is|iQJuB)ZE4IbU~+K5;V z>yhf&kO5&fcN0s`7wrs(#{rLi*xje2nTj)>I?>lBGfodgxPj*fCB_B)vSeM#!ryRQ z=x5UJ<8f5w8pn5`s27s(HfxFdhaf!x>pS3gBJH9m0}5XreB)bgaquh@o|b^4aN`np|3ho^rhSP*HJEgXj!LNsxyod zr9{zy#~NzO=WvUpFO0#nYt6K~n)bM`MCXo?U-ZeDv+Fn$$kkE0;tr5|o(b}zd@G!f zOxAEF$xIJT>3hh^C%Hd$FA@na4abn~5+vmG1 zH1m3kBG$PO5@T4objGz*>=j2*)=e^k1`DWaF@`63-nb&S#H8&#&HRCX@1A^rr%+%g ziY-Gd*1K3atn@G3QOOITLp126lxh}8; zD9lHbN;I#Ycx^ohm@|-{GLv59OgdggmqA#>>LpRb=TQja5#~}ff&S}z8ENKm!#c0Z zcQl&+CV%csm0ywAWP19KAwye%NJULFew$Y#^~1vq_7uiK(}hWf0R=*>i4cwEnal(( zvFs;a&GsTGY}loe-=tky%nOuJg_gym+D#_9UILyK@!ZK3j$Lbcs7&$AU*tYB0qu@N z7gF9+k`PvYqXoH7%9#r92h-OH5gichaPx(p>?@dZ6)1XH!E=N$efBUU@_X&a7rU)- z^oLE(bO~f9kIaHe)1~I0kJ4v6!NP1qeDKW^Bh;Ow8qYnE2p>gq=ayslTLSryOP8PvjXDwQ$tgSfOF99Gfo zw++TF5}c(ATBam$w6ZX${1Nl#LlhoJE&A(U9T4{!i;R#v{iOOhzR2WBDSd|Q`ucIc zYs%-$Hv$ZZTbR}edvq@-D=eCat*%6JaGkK1^|gBj6!cF$Mf9eVIbT?1k2NKy6}VpXcV+!gGHZ6>#9651TVy8dOMWXx9%0O4SToZwThbzgM`%o@jja6VK1r@$#XGYd_|7bHF%?Ao z{REZ)$95|R0#1z8tsB0o-b!P}DQ<>ib91R>aZe@q&C=`4(UweJWsrJF&4qP-qp4N- z%_eQ1;$f2_k)Zoe{QkS?`+`DNXdkhXH)5pk^@>rb)RTy`6#bi?XL(jT9C~TQ-cGtbNK8Jxm^y)w#7uN;*|dMFE9>`YZDKWnTMp(|D|=0?nG3&sVrQ@Zq0Wu) zGt4-cvusc_QY~2>kM>@~ZuDv5WqoN0`(R4!p(1baL|=x`OX=yC7Y_TIy{gBg@%DI> zwOp@92z9#a5_+AyH*izry`Geky{QdcldUHlLNECv(Qh>H9&638VP(mp^i$Tkqukiu zpYejpsj)Jf&lL+v_(!HuPbQg{|Gcg8xc+G7UgI>4i(6cwbJmkizFvYfL2^G{T6gU1 zqAan=on1Tt6NT#@EmhgWTTIWI-)Y9R5yCCDRs7-)-|;u|kgRx!Nfn*xCU09m4?#Ti zl8m-(_)$mY!grmYF+7>_;r;gCVN_m}w(sv9R`hn?4ZPg``rdIkewrw7O8$jB=rWu7bV|_w2SJ$9$`N-W#jd5gSh4KkwfEp%jQ4x1NcKymqk1LOM&)^fJsE1K{C_1j zdY82H4f~$`$}ba;sVoT?2GZTpgWg$U%DJTnQN+|dFOS6xUU1h43z=})n-O>|e)wR= zuC#^~H=m8XCf%Z4^Zrd&XpJqFwyi1pX432~i`t*7Hp%EU1bLy-j8Q2p#u&-Qh&Gfk z*%qBO{FF(Vxtn5BX}x*D;VYQ~cQNEx+aqD9$>bX+8O={(ZwOK7nXbQvVnE zRS7WzdM*Xsw;SqYRRQa{H~f~Rg^n%^+s^TF=r(?-M3y%G8LkT`%T<;MM5KyC_MJ_% ze8)py&`6hG&ks%D}(fXZz!+y;NU>2LoAmE&6Za*9)*CV zbn|!!nbS3NfK|uZQfjG+1uf-kc_F==iSQfY{10|&T^(JYxpsSHW(MNJzkAJ?#7w0d zt|Dy=6RJJWEKP4CHC({gTtHf$ESibFVm9+#DT~Ios{U}Xxyh8ztm3xiycw>;%8CA9 zx@hdiEv(N?B|F9?InC?SBC1{Bj6oW(;GAlO<_H$l$MWjsI(gW*)2U4Ck zc?XJPb+Iiz8y-_Pw5Cp0>(m@P878(rz2xoL!na?gt_Kufkm7MAiw2N;%!}cMw`skp zcl+hzb71f@NzFV1!%Le|g%^8?P;lJlP1Wq~y`c$}NT#QaBw>iQkzV_3%kSw|?;(!; zJd)O3B^+lv%e2JG3RxSj-`w0pODuD9pQ_4K|5PJ2zu0klw!1u+BdeG4hK21h9!{|J zE%7u1Q<6~4gkSCRXNjjW_{W@BQ#B)P(WZGii&B`3B_*tD&ZleZGLzphgzEYP$9CP= z#;T95uCD(5bI_q9_l=p7k2w|ZtFnHxj1%LWK;$%N%IK_J>O&x@jlh4s;%=Nq z;xQKJh=0|PKe_g1F>MyV*ZITP5H4;ZJ!)?E$^OVX{lX{2Zr(u)hRuqEdlYVr!Pvj! zlyPbCBr!-I-p=giHAa z_`DfqcXTD0K6iBJU5cs9rymPWpXBUOf4Qf8GTKcw5?ok5v)T5HBw3EQg6Pr7JEG{< z!eepl<#iM@f3Dj+^VEDw#%WUDt1vB6{XFZCIPt90 zak9$NCV5k0Soh`(hlp_Ym<9XjH=@#0$~Pfc5l>JJXCxXc6Id?B`HtDKC~7_8*uTXu zmxQWvzH#K`-0E{~gwIP;$9MHAvdX((QD2E`IA)@hmrPdo zcWX{}a|sE^?(asKJ8EI1NitYhRz(%QNzyL<#lpLHTWWbx{!JHIPpqslu}ztyQZa#V zkT+d*3?n0^O0d`@F>Dmo$JY6SWgJe@-up8)BhmJ>&0{aj%#`0eNFm!wPD+J3FMss3 z)|^%lB=e4aS3StamgCqe5_0pcIK7& zp^7qsjI+m+)nb9;$;gCin+oBCv4_9Xak1Gk_J_DIk%wxO+|p;++|;+&6_S_*5x*MI z->d~-B7tRSp>O>8y~EPh=Sk7o`(I?W+r(!yejqPdO>-J7KHB$C3iNuIAUJs86&M@D z_Nera9o6agQZL%v{@teE{{+t*nB?dVCuvJR=vX*T-aIDUc%-jWI_s5mYkQ#dJPvyO zTk5j)cko`b(;R4AWsM)(A1R<%BF(qf$ZNmFW>FM-cYJ)KmVjxb5JQ$#zanQgO1yAM z^W^6+-nAl`*WrT^uYTmAEcq5D<^Ogyo(V+fxF^ltqML9s66&_BU||dOMMcr*C1uLs zvB48e)TzmiawbX@J0l-0sn{yJdW~sWMr@o5F}%PG8KsQptl1sz<>&%q+0BY0|{<6w-vQYpH>ZVGC+Iy*Y7JtQBigf&C574f~UiufBw)J(X`&*u(y|5Q0k zp4bV#qs6APp>L7Cd0d!4%Djy5qx>`10I|CNU|PAmzD6)8^&h}dCc?&0sW3s`3= z9@Px3L5jVxP&sOQ8Ub_bU@kLLxl&){F~ms3&JQ&G1>O2uSC`edQL`VICJ@NWx_H}_ z&b?+0sZV>LEx%CuH}^trHCp2`y`A1V8$~g85wC(y29jcT#QF|O%?mGojS120jqfPz zaSdY1^U*w6jb(Hc10NfU<+lf<{XLV$bUKST_ZVWy8fDIUD=-^g8rG$B&_9&2V=5Jr)UhK)JBSm#Nze&zxxtQCdqbmBfw0XNOc6n3rK%><-;`pHrzIt143? HWfJs1?HZlw literal 0 HcmV?d00001 From a74cb194954dd206f3b83adf6a5d1562311f39ba Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Jun 2024 01:33:22 +0000 Subject: [PATCH 046/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 76ddef59a..b9b0bd780 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -60,6 +60,7 @@ hide: ### Internal +* 🔧 Update sponsors, add Stainless. PR [#11763](https://github.com/tiangolo/fastapi/pull/11763) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Zuplo. PR [#11729](https://github.com/tiangolo/fastapi/pull/11729) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update Sponsor link: Coherence. PR [#11730](https://github.com/tiangolo/fastapi/pull/11730) by [@tiangolo](https://github.com/tiangolo). * 👥 Update FastAPI People. PR [#11669](https://github.com/tiangolo/fastapi/pull/11669) by [@tiangolo](https://github.com/tiangolo). From 4711785594c7de157fc1b6556140c4d052e691a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 25 Jun 2024 20:46:25 -0500 Subject: [PATCH 047/284] =?UTF-8?q?=F0=9F=94=A7=20Tweak=20sponsors:=20Kong?= =?UTF-8?q?=20URL=20(#11764)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/sponsors.yml | 2 +- docs/en/overrides/main.html | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 39c51b82b..013c93ee4 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -26,7 +26,7 @@ gold: - url: https://www.mongodb.com/developer/languages/python/python-quickstart-fastapi/?utm_campaign=fastapi_framework&utm_source=fastapi_sponsorship&utm_medium=web_referral title: Simplify Full Stack Development with FastAPI & MongoDB img: https://fastapi.tiangolo.com/img/sponsors/mongodb.png - - url: https://konghq.com/products/kong-konnect/register?utm_medium=referral&utm_source=github&utm_campaign=platform&utm_content=fast-api + - url: https://konghq.com/products/kong-konnect?utm_medium=referral&utm_source=github&utm_campaign=platform&utm_content=fast-api title: Kong Konnect - API management platform img: https://fastapi.tiangolo.com/img/sponsors/kong.png - url: https://zuplo.link/fastapi-gh diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index 2a51240b2..64646c600 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -77,7 +77,7 @@
- + From f497efaf94625b00bd8a2aa75162f5dc92890d6c Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Jun 2024 01:46:45 +0000 Subject: [PATCH 048/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b9b0bd780..2c8daa42b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -60,6 +60,7 @@ hide: ### Internal +* 🔧 Tweak sponsors: Kong URL. PR [#11764](https://github.com/tiangolo/fastapi/pull/11764) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Stainless. PR [#11763](https://github.com/tiangolo/fastapi/pull/11763) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Zuplo. PR [#11729](https://github.com/tiangolo/fastapi/pull/11729) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update Sponsor link: Coherence. PR [#11730](https://github.com/tiangolo/fastapi/pull/11730) by [@tiangolo](https://github.com/tiangolo). From b08f15048d1b6036b9c027408feb86cbb8a9eef4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 25 Jun 2024 20:52:00 -0500 Subject: [PATCH 049/284] =?UTF-8?q?=F0=9F=94=A7=20Tweak=20sponsors:=20Kong?= =?UTF-8?q?=20URL=20(#11765)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 35d0fad1f..acd7f89ee 100644 --- a/README.md +++ b/README.md @@ -55,7 +55,7 @@ The key features are: - + From e9f4b7975c2c6055d270b5a71127fda881ebdf04 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Jun 2024 01:52:20 +0000 Subject: [PATCH 050/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 2c8daa42b..92a1474d6 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -60,6 +60,7 @@ hide: ### Internal +* 🔧 Tweak sponsors: Kong URL. PR [#11765](https://github.com/tiangolo/fastapi/pull/11765) by [@tiangolo](https://github.com/tiangolo). * 🔧 Tweak sponsors: Kong URL. PR [#11764](https://github.com/tiangolo/fastapi/pull/11764) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Stainless. PR [#11763](https://github.com/tiangolo/fastapi/pull/11763) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Zuplo. PR [#11729](https://github.com/tiangolo/fastapi/pull/11729) by [@tiangolo](https://github.com/tiangolo). From 95e667a00a93c96b0262305663ebd1599d2aec94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Pereira=20Holanda?= Date: Wed, 26 Jun 2024 10:53:12 -0300 Subject: [PATCH 051/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/tutorial/dependencies/index.md`=20?= =?UTF-8?q?(#11757)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/tutorial/dependencies/index.md | 353 ++++++++++++++++++++ 1 file changed, 353 insertions(+) create mode 100644 docs/pt/docs/tutorial/dependencies/index.md diff --git a/docs/pt/docs/tutorial/dependencies/index.md b/docs/pt/docs/tutorial/dependencies/index.md new file mode 100644 index 000000000..3c0155a6e --- /dev/null +++ b/docs/pt/docs/tutorial/dependencies/index.md @@ -0,0 +1,353 @@ +# Dependências + +O **FastAPI** possui um poderoso, mas intuitivo sistema de **Injeção de Dependência**. + +Esse sistema foi pensado para ser fácil de usar, e permitir que qualquer desenvolvedor possa integrar facilmente outros componentes ao **FastAPI**. + +## O que é "Injeção de Dependência" + +**"Injeção de Dependência"** no mundo da programação significa, que existe uma maneira de declarar no seu código (nesse caso, suas *funções de operação de rota*) para declarar as coisas que ele precisa para funcionar e que serão utilizadas: "dependências". + +Então, esse sistema (nesse caso o **FastAPI**) se encarrega de fazer o que for preciso para fornecer essas dependências para o código ("injetando" as dependências). + +Isso é bastante útil quando você precisa: + +* Definir uma lógica compartilhada (mesmo formato de código repetidamente). +* Compartilhar conexões com banco de dados. +* Aplicar regras de segurança, autenticação, papéis de usuários, etc. +* E muitas outras coisas... + +Tudo isso, enquanto minimizamos a repetição de código. + +## Primeiros passos + +Vamos ver um exemplo simples. Tão simples que não será muito útil, por enquanto. + +Mas dessa forma podemos focar em como o sistema de **Injeção de Dependência** funciona. + +### Criando uma dependência, ou "injetável" + +Primeiro vamos focar na dependência. + +Ela é apenas uma função que pode receber os mesmos parâmetros de uma *função de operação de rota*: + +=== "Python 3.10+" + + ```Python hl_lines="8-9" + {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="8-11" + {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9-12" + {!> ../../../docs_src/dependencies/tutorial001_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="6-7" + {!> ../../../docs_src/dependencies/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="8-11" + {!> ../../../docs_src/dependencies/tutorial001.py!} + ``` + +E pronto. + +**2 linhas**. + +E com a mesma forma e estrutura de todas as suas *funções de operação de rota*. + +Você pode pensar nela como uma *função de operação de rota* sem o "decorador" (sem a linha `@app.get("/some-path")`). + +E com qualquer retorno que você desejar. + +Neste caso, a dependência espera por: + +* Um parâmetro de consulta opcional `q` do tipo `str`. +* Um parâmetro de consulta opcional `skip` do tipo `int`, e igual a `0` por padrão. +* Um parâmetro de consulta opcional `limit` do tipo `int`, e igual a `100` por padrão. + +E então retorna um `dict` contendo esses valores. + +!!! info "Informação" + FastAPI passou a suportar a notação `Annotated` (e começou a recomendá-la) na versão 0.95.0. + + Se você utiliza uma versão anterior, ocorrerão erros ao tentar utilizar `Annotated`. + + Certifique-se de [Atualizar a versão do FastAPI](../../deployment/versions.md#atualizando-as-versoes-do-fastapi){.internal-link target=_blank} para pelo menos 0.95.1 antes de usar `Annotated`. + +### Importando `Depends` + +=== "Python 3.10+" + + ```Python hl_lines="3" + {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="3" + {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="3" + {!> ../../../docs_src/dependencies/tutorial001_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="1" + {!> ../../../docs_src/dependencies/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="3" + {!> ../../../docs_src/dependencies/tutorial001.py!} + ``` + +### Declarando a dependência, no "dependente" + +Da mesma forma que você utiliza `Body`, `Query`, etc. Como parâmetros de sua *função de operação de rota*, utilize `Depends` com um novo parâmetro: + +=== "Python 3.10+" + + ```Python hl_lines="13 18" + {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="15 20" + {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="16 21" + {!> ../../../docs_src/dependencies/tutorial001_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="11 16" + {!> ../../../docs_src/dependencies/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="15 20" + {!> ../../../docs_src/dependencies/tutorial001.py!} + ``` + +Ainda que `Depends` seja utilizado nos parâmetros da função da mesma forma que `Body`, `Query`, etc, `Depends` funciona de uma forma um pouco diferente. + +Você fornece um único parâmetro para `Depends`. + +Esse parâmetro deve ser algo como uma função. + +Você **não chama a função** diretamente (não adicione os parênteses no final), apenas a passe como parâmetro de `Depends()`. + +E essa função vai receber os parâmetros da mesma forma que uma *função de operação de rota*. + +!!! tip "Dica" + Você verá quais outras "coisas", além de funções, podem ser usadas como dependências no próximo capítulo. + +Sempre que uma nova requisição for realizada, o **FastAPI** se encarrega de: + +* Chamar sua dependência ("injetável") com os parâmetros corretos. +* Obter o resultado da função. +* Atribuir esse resultado para o parâmetro em sua *função de operação de rota*. + +```mermaid +graph TB + +common_parameters(["common_parameters"]) +read_items["/items/"] +read_users["/users/"] + +common_parameters --> read_items +common_parameters --> read_users +``` + +Assim, você escreve um código compartilhado apenas uma vez e o **FastAPI** se encarrega de chamá-lo em suas *operações de rota*. + +!!! check "Checando" + Perceba que você não precisa criar uma classe especial e enviar a dependência para algum outro lugar em que o **FastAPI** a "registre" ou realize qualquer operação similar. + + Você apenas envia para `Depends` e o **FastAPI** sabe como fazer o resto. + +## Compartilhando dependências `Annotated` + +Nos exemplos acima, você pode ver que existe uma pequena **duplicação de código**. + +Quando você precisa utilizar a dependência `common_parameters()`, você precisa escrever o parâmetro inteiro com uma anotação de tipo e `Depends()`: + +```Python +commons: Annotated[dict, Depends(common_parameters)] +``` + +Mas como estamos utilizando `Annotated`, podemos guardar esse valor `Annotated` em uma variável e utilizá-la em múltiplos locais: + +=== "Python 3.10+" + + ```Python hl_lines="12 16 21" + {!> ../../../docs_src/dependencies/tutorial001_02_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="14 18 23" + {!> ../../../docs_src/dependencies/tutorial001_02_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="15 19 24" + {!> ../../../docs_src/dependencies/tutorial001_02_an.py!} + ``` + +!!! tip "Dica" + Isso é apenas Python padrão, essa funcionalidade é chamada de "type alias", e na verdade não é específica ao **FastAPI**. + + Mas como o **FastAPI** se baseia em convenções do Python, incluindo `Annotated`, você pode incluir esse truque no seu código. 😎 + +As dependências continuarão funcionando como esperado, e a **melhor parte** é que a **informação sobre o tipo é preservada**, o que signfica que seu editor de texto ainda irá incluir **preenchimento automático**, **visualização de erros**, etc. O mesmo vale para ferramentas como `mypy`. + +Isso é especialmente útil para uma **base de código grande** onde **as mesmas dependências** são utilizadas repetidamente em **muitas *operações de rota***. + +## `Async` ou não, eis a questão + +Como as dependências também serão chamadas pelo **FastAPI** (da mesma forma que *funções de operação de rota*), as mesmas regras se aplicam ao definir suas funções. + +Você pode utilizar `async def` ou apenas `def`. + +E você pode declarar dependências utilizando `async def` dentro de *funções de operação de rota* definidas com `def`, ou declarar dependências com `def` e utilizar dentro de *funções de operação de rota* definidas com `async def`, etc. + +Não faz diferença. O **FastAPI** sabe o que fazer. + +!!! note "Nota" + Caso você não conheça, veja em [Async: *"Com Pressa?"*](../../async.md#com-pressa){.internal-link target=_blank} a sessão acerca de `async` e `await` na documentação. + +## Integrando com OpenAPI + +Todas as declarações de requisições, validações e requisitos para suas dependências (e sub-dependências) serão integradas em um mesmo esquema OpenAPI. + +Então, a documentação interativa também terá toda a informação sobre essas dependências: + + + +## Caso de Uso Simples + +Se você parar para ver, *funções de operação de rota* são declaradas para serem usadas sempre que uma *rota* e uma *operação* se encaixam, e então o **FastAPI** se encarrega de chamar a função correspondente com os argumentos corretos, extraindo os dados da requisição. + +Na verdade, todos (ou a maioria) dos frameworks web funcionam da mesma forma. + +Você nunca chama essas funções diretamente. Elas são chamadas pelo framework utilizado (nesse caso, **FastAPI**). + +Com o Sistema de Injeção de Dependência, você também pode informar ao **FastAPI** que sua *função de operação de rota* também "depende" em algo a mais que deve ser executado antes de sua *função de operação de rota*, e o **FastAPI** se encarrega de executar e "injetar" os resultados. + +Outros termos comuns para essa mesma ideia de "injeção de dependência" são: + +* recursos +* provedores +* serviços +* injetáveis +* componentes + +## Plug-ins em **FastAPI** + +Integrações e "plug-ins" podem ser construídos com o sistema de **Injeção de Dependência**. Mas na verdade, **não há necessidade de criar "plug-ins"**, já que utilizando dependências é possível declarar um número infinito de integrações e interações que se tornam disponíveis para as suas *funções de operação de rota*. + +E as dependências pode ser criadas de uma forma bastante simples e intuitiva que permite que você importe apenas os pacotes Python que forem necessários, e integrá-los com as funções de sua API em algumas linhas de código, *literalmente*. + +Você verá exemplos disso nos próximos capítulos, acerca de bancos de dados relacionais e NoSQL, segurança, etc. + +## Compatibilidade do **FastAPI** + +A simplicidade do sistema de injeção de dependência do **FastAPI** faz ele compatível com: + +* todos os bancos de dados relacionais +* bancos de dados NoSQL +* pacotes externos +* APIs externas +* sistemas de autenticação e autorização +* istemas de monitoramento de uso para APIs +* sistemas de injeção de dados de resposta +* etc. + +## Simples e Poderoso + +Mesmo que o sistema hierárquico de injeção de dependência seja simples de definir e utilizar, ele ainda é bastante poderoso. + +Você pode definir dependências que por sua vez definem suas próprias dependências. + +No fim, uma árvore hierárquica de dependências é criadas, e o sistema de **Injeção de Dependência** toma conta de resolver todas essas dependências (e as sub-dependências delas) para você, e provê (injeta) os resultados em cada passo. + +Por exemplo, vamos supor que você possua 4 endpoints na sua API (*operações de rota*): + +* `/items/public/` +* `/items/private/` +* `/users/{user_id}/activate` +* `/items/pro/` + +Você poderia adicionar diferentes requisitos de permissão para cada um deles utilizando apenas dependências e sub-dependências: + +```mermaid +graph TB + +current_user(["current_user"]) +active_user(["active_user"]) +admin_user(["admin_user"]) +paying_user(["paying_user"]) + +public["/items/public/"] +private["/items/private/"] +activate_user["/users/{user_id}/activate"] +pro_items["/items/pro/"] + +current_user --> active_user +active_user --> admin_user +active_user --> paying_user + +current_user --> public +active_user --> private +admin_user --> activate_user +paying_user --> pro_items +``` + +## Integração com **OpenAPI** + +Todas essas dependências, ao declarar os requisitos para suas *operações de rota*, também adicionam parâmetros, validações, etc. + +O **FastAPI** se encarrega de adicionar tudo isso ao esquema OpenAPI, para que seja mostrado nos sistemas de documentação interativa. From bd7d503314faa7ecdc443303997a24bb11d8dd03 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Jun 2024 13:53:37 +0000 Subject: [PATCH 052/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 92a1474d6..32e6a49a4 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/index.md`. PR [#11757](https://github.com/tiangolo/fastapi/pull/11757) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/settings.md`. PR [#11739](https://github.com/tiangolo/fastapi/pull/11739) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add French translation for `docs/fr/docs/learn/index.md`. PR [#11712](https://github.com/tiangolo/fastapi/pull/11712) by [@benjaminvandammeholberton](https://github.com/benjaminvandammeholberton). * 🌐 Add Portuguese translation for `docs/pt/docs/how-to/index.md`. PR [#11731](https://github.com/tiangolo/fastapi/pull/11731) by [@vhsenna](https://github.com/vhsenna). From 898994056987b2b0be591f11722fbbe5dd097827 Mon Sep 17 00:00:00 2001 From: Rafael de Oliveira Marques Date: Wed, 26 Jun 2024 10:54:00 -0300 Subject: [PATCH 053/284] =?UTF-8?q?=F0=9F=8C=90=20=20Add=20Portuguese=20tr?= =?UTF-8?q?anslation=20for=20`docs/pt/docs/advanced/additional-status-code?= =?UTF-8?q?s.md`=20(#11753)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../docs/advanced/additional-status-codes.md | 69 +++++++++++++++++++ 1 file changed, 69 insertions(+) create mode 100644 docs/pt/docs/advanced/additional-status-codes.md diff --git a/docs/pt/docs/advanced/additional-status-codes.md b/docs/pt/docs/advanced/additional-status-codes.md new file mode 100644 index 000000000..a7699b324 --- /dev/null +++ b/docs/pt/docs/advanced/additional-status-codes.md @@ -0,0 +1,69 @@ +# Códigos de status adicionais + +Por padrão, o **FastAPI** retornará as respostas utilizando o `JSONResponse`, adicionando o conteúdo do retorno da sua *operação de caminho* dentro do `JSONResponse`. + +Ele usará o código de status padrão ou o que você definir na sua *operação de caminho*. + +## Códigos de status adicionais + +Caso você queira retornar códigos de status adicionais além do código principal, você pode fazer isso retornando um `Response` diretamente, como por exemplo um `JSONResponse`, e definir os códigos de status adicionais diretamente. + +Por exemplo, vamos dizer que você deseja ter uma *operação de caminho* que permita atualizar itens, e retornar um código de status HTTP 200 "OK" quando for bem sucedido. + +Mas você também deseja aceitar novos itens. E quando os itens não existiam, ele os cria, e retorna o código de status HTTP 201 "Created. + +Para conseguir isso, importe `JSONResponse` e retorne o seu conteúdo diretamente, definindo o `status_code` que você deseja: + +=== "Python 3.10+" + + ```Python hl_lines="4 25" + {!> ../../../docs_src/additional_status_codes/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="4 25" + {!> ../../../docs_src/additional_status_codes/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="4 26" + {!> ../../../docs_src/additional_status_codes/tutorial001_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Faça uso da versão `Annotated` quando possível. + + ```Python hl_lines="2 23" + {!> ../../../docs_src/additional_status_codes/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Faça uso da versão `Annotated` quando possível. + + ```Python hl_lines="4 25" + {!> ../../../docs_src/additional_status_codes/tutorial001.py!} + ``` + +!!! warning "Aviso" + Quando você retorna um `Response` diretamente, como no exemplo acima, ele será retornado diretamente. + + Ele não será serializado com um modelo, etc. + + Garanta que ele tenha toda informação que você deseja, e que os valores sejam um JSON válido (caso você esteja usando `JSONResponse`). + +!!! note "Detalhes técnicos" + Você também pode utilizar `from starlette.responses import JSONResponse`. + + O **FastAPI** disponibiliza o `starlette.responses` como `fastapi.responses` apenas por conveniência para você, o programador. Porém a maioria dos retornos disponíveis vem diretamente do Starlette. O mesmo com `status`. + +## OpenAPI e documentação da API + +Se você retorna códigos de status adicionais e retornos diretamente, eles não serão incluídos no esquema do OpenAPI (a documentação da API), porque o FastAPI não tem como saber de antemão o que será retornado. + +Mas você pode documentar isso no seu código, utilizando: [Retornos Adicionais](additional-responses.md){.internal-link target=_blank}. From e304414c93e68f0298ddd9e23af0abfd3b8cd4da Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 26 Jun 2024 13:54:46 +0000 Subject: [PATCH 054/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 32e6a49a4..0e4677e20 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/additional-status-codes.md`. PR [#11753](https://github.com/tiangolo/fastapi/pull/11753) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/index.md`. PR [#11757](https://github.com/tiangolo/fastapi/pull/11757) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/settings.md`. PR [#11739](https://github.com/tiangolo/fastapi/pull/11739) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add French translation for `docs/fr/docs/learn/index.md`. PR [#11712](https://github.com/tiangolo/fastapi/pull/11712) by [@benjaminvandammeholberton](https://github.com/benjaminvandammeholberton). From ed22cc107d55975dfe1015fd89e59fe3ee27f852 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Pereira=20Holanda?= Date: Fri, 28 Jun 2024 11:57:49 -0300 Subject: [PATCH 055/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/tutorial/dependencies/classes-as-d?= =?UTF-8?q?ependencies.md`=20(#11768)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dependencies/classes-as-dependencies.md | 497 ++++++++++++++++++ 1 file changed, 497 insertions(+) create mode 100644 docs/pt/docs/tutorial/dependencies/classes-as-dependencies.md diff --git a/docs/pt/docs/tutorial/dependencies/classes-as-dependencies.md b/docs/pt/docs/tutorial/dependencies/classes-as-dependencies.md new file mode 100644 index 000000000..028bf3d20 --- /dev/null +++ b/docs/pt/docs/tutorial/dependencies/classes-as-dependencies.md @@ -0,0 +1,497 @@ +# Classes como Dependências + +Antes de nos aprofundarmos no sistema de **Injeção de Dependência**, vamos melhorar o exemplo anterior. + +## `dict` do exemplo anterior + +No exemplo anterior, nós retornávamos um `dict` da nossa dependência ("injetável"): + +=== "Python 3.10+" + + ```Python hl_lines="9" + {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="11" + {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="12" + {!> ../../../docs_src/dependencies/tutorial001_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="7" + {!> ../../../docs_src/dependencies/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="11" + {!> ../../../docs_src/dependencies/tutorial001.py!} + ``` + +Mas assim obtemos um `dict` como valor do parâmetro `commons` na *função de operação de rota*. + +E sabemos que editores de texto não têm como oferecer muitas funcionalidades (como sugestões automáticas) para objetos do tipo `dict`, por que não há como eles saberem o tipo das chaves e dos valores. + +Podemos fazer melhor... + +## O que caracteriza uma dependência + +Até agora você apenas viu dependências declaradas como funções. + +Mas essa não é a única forma de declarar dependências (mesmo que provavelmente seja a mais comum). + +O fator principal para uma dependência é que ela deve ser "chamável" + +Um objeto "chamável" em Python é qualquer coisa que o Python possa "chamar" como uma função + +Então se você tiver um objeto `alguma_coisa` (que pode *não* ser uma função) que você possa "chamar" (executá-lo) dessa maneira: + +```Python +something() +``` + +ou + +```Python +something(some_argument, some_keyword_argument="foo") +``` + +Então esse objeto é um "chamável". + +## Classes como dependências + +Você deve ter percebido que para criar um instância de uma classe em Python, a mesma sintaxe é utilizada. + +Por exemplo: + +```Python +class Cat: + def __init__(self, name: str): + self.name = name + + +fluffy = Cat(name="Mr Fluffy") +``` + +Nesse caso, `fluffy` é uma instância da classe `Cat`. + +E para criar `fluffy`, você está "chamando" `Cat`. + +Então, uma classe Python também é "chamável". + +Então, no **FastAPI**, você pode utilizar uma classe Python como uma dependência. + +O que o FastAPI realmente verifica, é se a dependência é algo chamável (função, classe, ou outra coisa) e os parâmetros que foram definidos. + +Se você passar algo "chamável" como uma dependência do **FastAPI**, o framework irá analisar os parâmetros desse "chamável" e processá-los da mesma forma que os parâmetros de uma *função de operação de rota*. Incluindo as sub-dependências. + +Isso também se aplica a objetos chamáveis que não recebem nenhum parâmetro. Da mesma forma que uma *função de operação de rota* sem parâmetros. + +Então, podemos mudar o "injetável" na dependência `common_parameters` acima para a classe `CommonQueryParams`: + +=== "Python 3.10+" + + ```Python hl_lines="11-15" + {!> ../../../docs_src/dependencies/tutorial002_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="11-15" + {!> ../../../docs_src/dependencies/tutorial002_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="12-16" + {!> ../../../docs_src/dependencies/tutorial002_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="9-13" + {!> ../../../docs_src/dependencies/tutorial002_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="11-15" + {!> ../../../docs_src/dependencies/tutorial002.py!} + ``` + +Observe o método `__init__` usado para criar uma instância da classe: + +=== "Python 3.10+" + + ```Python hl_lines="12" + {!> ../../../docs_src/dependencies/tutorial002_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="12" + {!> ../../../docs_src/dependencies/tutorial002_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="13" + {!> ../../../docs_src/dependencies/tutorial002_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="10" + {!> ../../../docs_src/dependencies/tutorial002_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="12" + {!> ../../../docs_src/dependencies/tutorial002.py!} + ``` + +...ele possui os mesmos parâmetros que nosso `common_parameters` anterior: + +=== "Python 3.10+" + + ```Python hl_lines="8" + {!> ../../../docs_src/dependencies/tutorial001_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="9" + {!> ../../../docs_src/dependencies/tutorial001_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="10" + {!> ../../../docs_src/dependencies/tutorial001_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="6" + {!> ../../../docs_src/dependencies/tutorial001_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="9" + {!> ../../../docs_src/dependencies/tutorial001.py!} + ``` + +Esses parâmetros são utilizados pelo **FastAPI** para "definir" a dependência. + +Em ambos os casos teremos: + +* Um parâmetro de consulta `q` opcional do tipo `str`. +* Um parâmetro de consulta `skip` do tipo `int`, com valor padrão `0`. +* Um parâmetro de consulta `limit` do tipo `int`, com valor padrão `100`. + +Os dados serão convertidos, validados, documentados no esquema da OpenAPI e etc nos dois casos. + +## Utilizando + +Agora você pode declarar sua dependência utilizando essa classe. + +=== "Python 3.10+" + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial002_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial002_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="20" + {!> ../../../docs_src/dependencies/tutorial002_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="17" + {!> ../../../docs_src/dependencies/tutorial002_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial002.py!} + ``` + +O **FastAPI** chama a classe `CommonQueryParams`. Isso cria uma "instância" dessa classe e é a instância que será passada para o parâmetro `commons` na sua função. + +## Anotações de Tipo vs `Depends` + +Perceba como escrevemos `CommonQueryParams` duas vezes no código abaixo: + +=== "Python 3.8+" + + ```Python + commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python + commons: CommonQueryParams = Depends(CommonQueryParams) + ``` + +O último `CommonQueryParams`, em: + +```Python +... Depends(CommonQueryParams) +``` + +...é o que o **FastAPI** irá realmente usar para saber qual é a dependência. + +É a partir dele que o FastAPI irá extrair os parâmetros passados e será o que o FastAPI irá realmente chamar. + +--- + +Nesse caso, o primeiro `CommonQueryParams`, em: + +=== "Python 3.8+" + + ```Python + commons: Annotated[CommonQueryParams, ... + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python + commons: CommonQueryParams ... + ``` + +...não tem nenhum signficado especial para o **FastAPI**. O FastAPI não irá utilizá-lo para conversão dos dados, validação, etc (já que ele utiliza `Depends(CommonQueryParams)` para isso). + +Na verdade você poderia escrever apenas: + +=== "Python 3.8+" + + ```Python + commons: Annotated[Any, Depends(CommonQueryParams)] + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python + commons = Depends(CommonQueryParams) + ``` + +...como em: + +=== "Python 3.10+" + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial003_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial003_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="20" + {!> ../../../docs_src/dependencies/tutorial003_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="17" + {!> ../../../docs_src/dependencies/tutorial003_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial003.py!} + ``` + +Mas declarar o tipo é encorajado por que é a forma que o seu editor de texto sabe o que será passado como valor do parâmetro `commons`. + + + +## Pegando um Atalho + +Mas você pode ver que temos uma repetição do código neste exemplo, escrevendo `CommonQueryParams` duas vezes: + +=== "Python 3.8+" + + ```Python + commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python + commons: CommonQueryParams = Depends(CommonQueryParams) + ``` + +O **FastAPI** nos fornece um atalho para esses casos, onde a dependência é *especificamente* uma classe que o **FastAPI** irá "chamar" para criar uma instância da própria classe. + +Para esses casos específicos, você pode fazer o seguinte: + +Em vez de escrever: + +=== "Python 3.8+" + + ```Python + commons: Annotated[CommonQueryParams, Depends(CommonQueryParams)] + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python + commons: CommonQueryParams = Depends(CommonQueryParams) + ``` + +...escreva: + +=== "Python 3.8+" + + ```Python + commons: Annotated[CommonQueryParams, Depends()] + ``` + +=== "Python 3.8 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python + commons: CommonQueryParams = Depends() + ``` + +Você declara a dependência como o tipo do parâmetro, e utiliza `Depends()` sem nenhum parâmetro, em vez de ter que escrever a classe *novamente* dentro de `Depends(CommonQueryParams)`. + +O mesmo exemplo ficaria então dessa forma: + +=== "Python 3.10+" + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial004_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial004_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="20" + {!> ../../../docs_src/dependencies/tutorial004_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="17" + {!> ../../../docs_src/dependencies/tutorial004_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial004.py!} + ``` + +...e o **FastAPI** saberá o que fazer. + +!!! tip "Dica" + Se isso parece mais confuso do que útil, não utilize, você não *precisa* disso. + + É apenas um atalho. Por que o **FastAPI** se preocupa em ajudar a minimizar a repetição de código. From 2afbdb3a44b6b5af0d6b07d435f4f7c7d9bea1bc Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 28 Jun 2024 14:58:12 +0000 Subject: [PATCH 056/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0e4677e20..e76cdbdcd 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#11768](https://github.com/tiangolo/fastapi/pull/11768) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/additional-status-codes.md`. PR [#11753](https://github.com/tiangolo/fastapi/pull/11753) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/index.md`. PR [#11757](https://github.com/tiangolo/fastapi/pull/11757) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/settings.md`. PR [#11739](https://github.com/tiangolo/fastapi/pull/11739) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). From 172b3dfd43eb499396ee35ba32b118d108a23da1 Mon Sep 17 00:00:00 2001 From: Rafael de Oliveira Marques Date: Mon, 1 Jul 2024 12:45:45 -0300 Subject: [PATCH 057/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/advanced/advanced-dependencies.md`?= =?UTF-8?q?=20(#11775)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../pt/docs/advanced/advanced-dependencies.md | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 docs/pt/docs/advanced/advanced-dependencies.md diff --git a/docs/pt/docs/advanced/advanced-dependencies.md b/docs/pt/docs/advanced/advanced-dependencies.md new file mode 100644 index 000000000..58887f9c8 --- /dev/null +++ b/docs/pt/docs/advanced/advanced-dependencies.md @@ -0,0 +1,138 @@ +# Dependências avançadas + +## Dependências parametrizadas + +Todas as dependências que vimos até agora são funções ou classes fixas. + +Mas podem ocorrer casos onde você deseja ser capaz de definir parâmetros na dependência, sem ter a necessidade de declarar diversas funções ou classes. + +Vamos imaginar que queremos ter uma dependência que verifica se o parâmetro de consulta `q` possui um valor fixo. + +Porém nós queremos poder parametrizar o conteúdo fixo. + +## Uma instância "chamável" + +Em Python existe uma maneira de fazer com que uma instância de uma classe seja um "chamável". + +Não propriamente a classe (que já é um chamável), mas a instância desta classe. + +Para fazer isso, nós declaramos o método `__call__`: + +=== "Python 3.9+" + + ```Python hl_lines="12" + {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="11" + {!> ../../../docs_src/dependencies/tutorial011_an.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Prefira utilizar a versão `Annotated` se possível. + + ```Python hl_lines="10" + {!> ../../../docs_src/dependencies/tutorial011.py!} + ``` + +Neste caso, o `__call__` é o que o **FastAPI** utilizará para verificar parâmetros adicionais e sub dependências, e isso é o que será chamado para passar o valor ao parâmetro na sua *função de operação de rota* posteriormente. + +## Parametrizar a instância + +E agora, nós podemos utilizar o `__init__` para declarar os parâmetros da instância que podemos utilizar para "parametrizar" a dependência: + +=== "Python 3.9+" + + ```Python hl_lines="9" + {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="8" + {!> ../../../docs_src/dependencies/tutorial011_an.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Prefira utilizar a versão `Annotated` se possível. + + ```Python hl_lines="7" + {!> ../../../docs_src/dependencies/tutorial011.py!} + ``` + +Neste caso, o **FastAPI** nunca tocará ou se importará com o `__init__`, nós vamos utilizar diretamente em nosso código. + +## Crie uma instância + +Nós poderíamos criar uma instância desta classe com: + +=== "Python 3.9+" + + ```Python hl_lines="18" + {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="17" + {!> ../../../docs_src/dependencies/tutorial011_an.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Prefira utilizar a versão `Annotated` se possível. + + ```Python hl_lines="16" + {!> ../../../docs_src/dependencies/tutorial011.py!} + ``` + +E deste modo nós podemos "parametrizar" a nossa dependência, que agora possui `"bar"` dentro dele, como o atributo `checker.fixed_content`. + +## Utilize a instância como dependência + +Então, nós podemos utilizar este `checker` em um `Depends(checker)`, no lugar de `Depends(FixedContentQueryChecker)`, porque a dependência é a instância, `checker`, e não a própria classe. + +E quando a dependência for resolvida, o **FastAPI** chamará este `checker` como: + +```Python +checker(q="somequery") +``` + +...e passar o que quer que isso retorne como valor da dependência em nossa *função de operação de rota* como o parâmetro `fixed_content_included`: + +=== "Python 3.9+" + + ```Python hl_lines="22" + {!> ../../../docs_src/dependencies/tutorial011_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="21" + {!> ../../../docs_src/dependencies/tutorial011_an.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Prefira utilizar a versão `Annotated` se possível. + + ```Python hl_lines="20" + {!> ../../../docs_src/dependencies/tutorial011.py!} + ``` + +!!! tip "Dica" + Tudo isso parece não ser natural. E pode não estar muito claro ou aparentar ser útil ainda. + + Estes exemplos são intencionalmente simples, porém mostram como tudo funciona. + + Nos capítulos sobre segurança, existem funções utilitárias que são implementadas desta maneira. + + Se você entendeu tudo isso, você já sabe como essas funções utilitárias para segurança funcionam por debaixo dos panos. From c37d71da70e01eef3b2249652fdbe4860e015f13 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 1 Jul 2024 15:46:09 +0000 Subject: [PATCH 058/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index e76cdbdcd..e17ca2f6a 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/advanced-dependencies.md`. PR [#11775](https://github.com/tiangolo/fastapi/pull/11775) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#11768](https://github.com/tiangolo/fastapi/pull/11768) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/additional-status-codes.md`. PR [#11753](https://github.com/tiangolo/fastapi/pull/11753) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/index.md`. PR [#11757](https://github.com/tiangolo/fastapi/pull/11757) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). From 0888b3ffc02933bbb52ba7c828fd71fa483cfefe Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Mon, 1 Jul 2024 18:08:40 -0500 Subject: [PATCH 059/284] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20add?= =?UTF-8?q?=20Fine=20(#11784)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + docs/en/data/sponsors.yml | 3 +++ docs/en/docs/img/sponsors/fine-banner.png | Bin 0 -> 11458 bytes docs/en/docs/img/sponsors/fine.png | Bin 0 -> 21925 bytes docs/en/overrides/main.html | 6 ++++++ 5 files changed, 10 insertions(+) create mode 100644 docs/en/docs/img/sponsors/fine-banner.png create mode 100644 docs/en/docs/img/sponsors/fine.png diff --git a/README.md b/README.md index acd7f89ee..ea722d57a 100644 --- a/README.md +++ b/README.md @@ -57,6 +57,7 @@ The key features are: + diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 013c93ee4..d6dfd5d0e 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -32,6 +32,9 @@ gold: - url: https://zuplo.link/fastapi-gh title: 'Zuplo: Scale, Protect, Document, and Monetize your FastAPI' img: https://fastapi.tiangolo.com/img/sponsors/zuplo.png + - url: https://fine.dev?ref=fastapibadge + title: "Fine's AI FastAPI Workflow: Effortlessly Deploy and Integrate FastAPI into Your Project" + img: https://fastapi.tiangolo.com/img/sponsors/fine.png silver: - url: https://training.talkpython.fm/fastapi-courses title: FastAPI video courses on demand from people you trust diff --git a/docs/en/docs/img/sponsors/fine-banner.png b/docs/en/docs/img/sponsors/fine-banner.png new file mode 100644 index 0000000000000000000000000000000000000000..57d8e52c71b067248db4f383d72051a94e8cfa47 GIT binary patch literal 11458 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 literal 0 HcmV?d00001 diff --git a/docs/en/docs/img/sponsors/fine.png b/docs/en/docs/img/sponsors/fine.png new file mode 100644 index 0000000000000000000000000000000000000000..ed770f21240df78760840a5c8d5e731f3f1418fc GIT binary patch literal 21925 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 rGUjfGRUr@=g4pT;H&Z~g_rL!G0}@
+ {% endblock %} From 42d52b834add728a62ebb53b1ada439d92a1d55c Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 1 Jul 2024 23:09:02 +0000 Subject: [PATCH 060/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index e17ca2f6a..c2fe10fe6 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -64,6 +64,7 @@ hide: ### Internal +* 🔧 Update sponsors: add Fine. PR [#11784](https://github.com/tiangolo/fastapi/pull/11784) by [@tiangolo](https://github.com/tiangolo). * 🔧 Tweak sponsors: Kong URL. PR [#11765](https://github.com/tiangolo/fastapi/pull/11765) by [@tiangolo](https://github.com/tiangolo). * 🔧 Tweak sponsors: Kong URL. PR [#11764](https://github.com/tiangolo/fastapi/pull/11764) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors, add Stainless. PR [#11763](https://github.com/tiangolo/fastapi/pull/11763) by [@tiangolo](https://github.com/tiangolo). From 6b0dddf55aee5d11557354118a0ed37f35518b1e Mon Sep 17 00:00:00 2001 From: "P-E. Brian" Date: Wed, 3 Jul 2024 04:15:55 +0200 Subject: [PATCH 061/284] =?UTF-8?q?=F0=9F=93=9D=20Fix=20image=20missing=20?= =?UTF-8?q?in=20French=20translation=20for=20`docs/fr/docs/async.md`=20=20?= =?UTF-8?q?(#11787)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/fr/docs/async.md | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/docs/fr/docs/async.md b/docs/fr/docs/async.md index 3f65032fe..eabd9686a 100644 --- a/docs/fr/docs/async.md +++ b/docs/fr/docs/async.md @@ -103,24 +103,41 @@ Pour expliquer la différence, voici une histoire de burgers : Vous amenez votre crush 😍 dans votre fast food 🍔 favori, et faites la queue pendant que le serveur 💁 prend les commandes des personnes devant vous. + + Puis vient votre tour, vous commandez alors 2 magnifiques burgers 🍔 pour votre crush 😍 et vous. -Vous payez 💸. + Le serveur 💁 dit quelque chose à son collègue dans la cuisine 👨‍🍳 pour qu'il sache qu'il doit préparer vos burgers 🍔 (bien qu'il soit déjà en train de préparer ceux des clients précédents). + + +Vous payez 💸. + Le serveur 💁 vous donne le numéro assigné à votre commande. + + Pendant que vous attendez, vous allez choisir une table avec votre crush 😍, vous discutez avec votre crush 😍 pendant un long moment (les burgers étant "magnifiques" ils sont très longs à préparer ✨🍔✨). Pendant que vous êtes assis à table, en attendant que les burgers 🍔 soient prêts, vous pouvez passer ce temps à admirer à quel point votre crush 😍 est géniale, mignonne et intelligente ✨😍✨. + + Pendant que vous discutez avec votre crush 😍, de temps en temps vous jetez un coup d'oeil au nombre affiché au-dessus du comptoir pour savoir si c'est à votre tour d'être servis. Jusqu'au moment où c'est (enfin) votre tour. Vous allez au comptoir, récupérez vos burgers 🍔 et revenez à votre table. + + Vous et votre crush 😍 mangez les burgers 🍔 et passez un bon moment ✨. + + +!!! info + Illustrations proposées par Ketrina Thompson. 🎨 + --- Imaginez que vous êtes l'ordinateur / le programme 🤖 dans cette histoire. @@ -149,26 +166,41 @@ Vous attendez pendant que plusieurs (disons 8) serveurs qui sont aussi des cuisi Chaque personne devant vous attend 🕙 que son burger 🍔 soit prêt avant de quitter le comptoir car chacun des 8 serveurs va lui-même préparer le burger directement avant de prendre la commande suivante. + + Puis c'est enfin votre tour, vous commandez 2 magnifiques burgers 🍔 pour vous et votre crush 😍. Vous payez 💸. + + Le serveur va dans la cuisine 👨‍🍳. Vous attendez devant le comptoir afin que personne ne prenne vos burgers 🍔 avant vous, vu qu'il n'y a pas de numéro de commande. + + Vous et votre crush 😍 étant occupés à vérifier que personne ne passe devant vous prendre vos burgers au moment où ils arriveront 🕙, vous ne pouvez pas vous préoccuper de votre crush 😞. C'est du travail "synchrone", vous être "synchronisés" avec le serveur/cuisinier 👨‍🍳. Vous devez attendre 🕙 et être présent au moment exact où le serveur/cuisinier 👨‍🍳 finira les burgers 🍔 et vous les donnera, sinon quelqu'un risque de vous les prendre. + + Puis le serveur/cuisinier 👨‍🍳 revient enfin avec vos burgers 🍔, après un long moment d'attente 🕙 devant le comptoir. + + Vous prenez vos burgers 🍔 et allez à une table avec votre crush 😍 Vous les mangez, et vous avez terminé 🍔 ⏹. + + Durant tout ce processus, il n'y a presque pas eu de discussions ou de flirts car la plupart de votre temps à été passé à attendre 🕙 devant le comptoir 😞. +!!! info + Illustrations proposées par Ketrina Thompson. 🎨 + --- Dans ce scénario de burgers parallèles, vous êtes un ordinateur / programme 🤖 avec deux processeurs (vous et votre crush 😍) attendant 🕙 à deux et dédiant votre attention 🕙 à "attendre devant le comptoir" pour une longue durée. From a5ce86dde58b85a6a5b2bc210db1dfa81a1257e0 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 3 Jul 2024 02:16:13 +0000 Subject: [PATCH 062/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index c2fe10fe6..4014491bb 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 📝 Fix image missing in French translation for `docs/fr/docs/async.md` . PR [#11787](https://github.com/tiangolo/fastapi/pull/11787) by [@pe-brian](https://github.com/pe-brian). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/advanced-dependencies.md`. PR [#11775](https://github.com/tiangolo/fastapi/pull/11775) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#11768](https://github.com/tiangolo/fastapi/pull/11768) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/additional-status-codes.md`. PR [#11753](https://github.com/tiangolo/fastapi/pull/11753) by [@ceb10n](https://github.com/ceb10n). From f785676b831f127b39d0c42fb92342906f0492b1 Mon Sep 17 00:00:00 2001 From: Logan <146642263+logan2d5@users.noreply.github.com> Date: Wed, 3 Jul 2024 10:17:04 +0800 Subject: [PATCH 063/284] =?UTF-8?q?=F0=9F=8C=90=20Update=20Chinese=20trans?= =?UTF-8?q?lation=20for=20`docs/tutorial/security/oauth2-jwt.md`=20(#11781?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/tutorial/security/oauth2-jwt.md | 134 ++++++++++++++++--- 1 file changed, 113 insertions(+), 21 deletions(-) diff --git a/docs/zh/docs/tutorial/security/oauth2-jwt.md b/docs/zh/docs/tutorial/security/oauth2-jwt.md index 33a4d7fc7..117f74d3e 100644 --- a/docs/zh/docs/tutorial/security/oauth2-jwt.md +++ b/docs/zh/docs/tutorial/security/oauth2-jwt.md @@ -26,29 +26,25 @@ JWT 字符串没有加密,任何人都能用它恢复原始信息。 如需深入了解 JWT 令牌,了解它的工作方式,请参阅 https://jwt.io。 -## 安装 `python-jose` +## 安装 `PyJWT` -安装 `python-jose`,在 Python 中生成和校验 JWT 令牌: +安装 `PyJWT`,在 Python 中生成和校验 JWT 令牌:
```console -$ pip install python-jose[cryptography] +$ pip install pyjwt ---> 100% ```
-Python-jose 需要安装配套的加密后端。 +!!! info "说明" -本教程推荐的后端是:pyca/cryptography。 + 如果您打算使用类似 RSA 或 ECDSA 的数字签名算法,您应该安装加密库依赖项 `pyjwt[crypto]`。 -!!! tip "提示" - - 本教程以前使用 PyJWT。 - - 但后来换成了 Python-jose,因为 Python-jose 支持 PyJWT 的所有功能,还支持与其它工具集成时可能会用到的一些其它功能。 + 您可以在 PyJWT Installation docs 获得更多信息。 ## 密码哈希 @@ -62,7 +58,7 @@ $ pip install python-jose[cryptography] 原因很简单,假如数据库被盗,窃贼无法获取用户的明文密码,得到的只是哈希值。 -这样一来,窃贼就无法在其它应用中使用窃取的密码,要知道,很多用户在所有系统中都使用相同的密码,风险超大)。 +这样一来,窃贼就无法在其它应用中使用窃取的密码(要知道,很多用户在所有系统中都使用相同的密码,风险超大)。 ## 安装 `passlib` @@ -112,9 +108,41 @@ $ pip install passlib[bcrypt] 第三个函数用于身份验证,并返回用户。 -```Python hl_lines="7 48 55-56 59-60 69-75" -{!../../../docs_src/security/tutorial004.py!} -``` +=== "Python 3.10+" + + ```Python hl_lines="8 49 56-57 60-61 70-76" + {!> ../../../docs_src/security/tutorial004_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="8 49 56-57 60-61 70-76" + {!> ../../../docs_src/security/tutorial004_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="8 50 57-58 61-62 71-77" + {!> ../../../docs_src/security/tutorial004_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="7 48 55-56 59-60 69-75" + {!> ../../../docs_src/security/tutorial004_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="8 49 56-57 60-61 70-76" + {!> ../../../docs_src/security/tutorial004.py!} + ``` !!! note "笔记" @@ -160,9 +188,41 @@ $ openssl rand -hex 32 如果令牌无效,则直接返回 HTTP 错误。 -```Python hl_lines="89-106" -{!../../../docs_src/security/tutorial004.py!} -``` +=== "Python 3.10+" + + ```Python hl_lines="4 7 13-15 29-31 79-87" + {!> ../../../docs_src/security/tutorial004_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="4 7 13-15 29-31 79-87" + {!> ../../../docs_src/security/tutorial004_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="4 7 14-16 30-32 80-88" + {!> ../../../docs_src/security/tutorial004_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="3 6 12-14 28-30 78-86" + {!> ../../../docs_src/security/tutorial004_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="4 7 13-15 29-31 79-87" + {!> ../../../docs_src/security/tutorial004.py!} + ``` ## 更新 `/token` *路径操作* @@ -170,9 +230,41 @@ $ openssl rand -hex 32 创建并返回真正的 JWT 访问令牌。 -```Python hl_lines="115-130" -{!../../../docs_src/security/tutorial004.py!} -``` +=== "Python 3.10+" + + ```Python hl_lines="118-133" + {!> ../../../docs_src/security/tutorial004_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="118-133" + {!> ../../../docs_src/security/tutorial004_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="119-134" + {!> ../../../docs_src/security/tutorial004_an.py!} + ``` + +=== "Python 3.10+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="115-130" + {!> ../../../docs_src/security/tutorial004_py310.py!} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip + Prefer to use the `Annotated` version if possible. + + ```Python hl_lines="116-131" + {!> ../../../docs_src/security/tutorial004.py!} + ``` ### JWT `sub` 的技术细节 @@ -261,7 +353,7 @@ OAuth2 支持**`scopes`**(作用域)。 开发者可以灵活选择最适合项目的安全机制。 -还可以直接使用 `passlib` 和 `python-jose` 等维护良好、使用广泛的包,这是因为 **FastAPI** 不需要任何复杂机制,就能集成外部的包。 +还可以直接使用 `passlib` 和 `PyJWT` 等维护良好、使用广泛的包,这是因为 **FastAPI** 不需要任何复杂机制,就能集成外部的包。 而且,**FastAPI** 还提供了一些工具,在不影响灵活、稳定和安全的前提下,尽可能地简化安全机制。 From eca465f4c96acc5f6a22e92fd2211675ca8a20c8 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 3 Jul 2024 02:18:33 +0000 Subject: [PATCH 064/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4014491bb..b2196498c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Update Chinese translation for `docs/tutorial/security/oauth2-jwt.md`. PR [#11781](https://github.com/tiangolo/fastapi/pull/11781) by [@logan2d5](https://github.com/logan2d5). * 📝 Fix image missing in French translation for `docs/fr/docs/async.md` . PR [#11787](https://github.com/tiangolo/fastapi/pull/11787) by [@pe-brian](https://github.com/pe-brian). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/advanced-dependencies.md`. PR [#11775](https://github.com/tiangolo/fastapi/pull/11775) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/classes-as-dependencies.md`. PR [#11768](https://github.com/tiangolo/fastapi/pull/11768) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). From dc3c320020e38fe988d9711bf5ae6cac3500246f Mon Sep 17 00:00:00 2001 From: Rafael de Oliveira Marques Date: Thu, 4 Jul 2024 17:53:25 -0300 Subject: [PATCH 065/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/advanced/openapi-webhooks.md`=20(#?= =?UTF-8?q?11791)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/advanced/openapi-webhooks.md | 51 +++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 docs/pt/docs/advanced/openapi-webhooks.md diff --git a/docs/pt/docs/advanced/openapi-webhooks.md b/docs/pt/docs/advanced/openapi-webhooks.md new file mode 100644 index 000000000..932fe0d9a --- /dev/null +++ b/docs/pt/docs/advanced/openapi-webhooks.md @@ -0,0 +1,51 @@ +# Webhooks OpenAPI + +Existem situações onde você deseja informar os **usuários** da sua API que a sua aplicação pode chamar a aplicação *deles* (enviando uma requisição) com alguns dados, normalmente para **notificar** algum tipo de **evento**. + +Isso significa que no lugar do processo normal de seus usuários enviarem requisições para a sua API, é a **sua API** (ou sua aplicação) que poderia **enviar requisições para o sistema deles** (para a API deles, a aplicação deles). + +Isso normalmente é chamado de **webhook**. + +## Etapas dos Webhooks + +Normalmente, o processo é que **você define** em seu código qual é a mensagem que você irá mandar, o **corpo da sua requisição**. + +Você também define de alguma maneira em quais **momentos** a sua aplicação mandará essas requisições ou eventos. + +E os **seus usuários** definem de alguma forma (em algum painel por exemplo) a **URL** que a sua aplicação deve enviar essas requisições. + +Toda a **lógica** sobre como cadastrar as URLs para os webhooks e o código para enviar de fato as requisições cabe a você definir. Você escreve da maneira que você desejar no **seu próprio código**. + +## Documentando webhooks com o FastAPI e OpenAPI + +Com o **FastAPI**, utilizando o OpenAPI, você pode definir os nomes destes webhooks, os tipos das operações HTTP que a sua aplicação pode enviar (e.g. `POST`, `PUT`, etc.) e os **corpos** da requisição que a sua aplicação enviaria. + +Isto pode facilitar bastante para os seus usuários **implementarem as APIs deles** para receber as requisições dos seus **webhooks**, eles podem inclusive ser capazes de gerar parte do código da API deles. + +!!! info "Informação" + Webhooks estão disponíveis a partir do OpenAPI 3.1.0, e possui suporte do FastAPI a partir da versão `0.99.0`. + +## Uma aplicação com webhooks + +Quando você cria uma aplicação com o **FastAPI**, existe um atributo chamado `webhooks`, que você utilizar para defini-los da mesma maneira que você definiria as suas **operações de rotas**, utilizando por exemplo `@app.webhooks.post()`. + +```Python hl_lines="9-13 36-53" +{!../../../docs_src/openapi_webhooks/tutorial001.py!} +``` + +Os webhooks que você define aparecerão no esquema do **OpenAPI** e na **página de documentação** gerada automaticamente. + +!!! info "Informação" + O objeto `app.webhooks` é na verdade apenas um `APIRouter`, o mesmo tipo que você utilizaria ao estruturar a sua aplicação com diversos arquivos. + +Note que utilizando webhooks você não está de fato declarando uma **rota** (como `/items/`), o texto que informa é apenas um **identificador** do webhook (o nome do evento), por exemplo em `@app.webhooks.post("new-subscription")`, o nome do webhook é `new-subscription`. + +Isto porque espera-se que os **seus usuários** definam o verdadeiro **caminho da URL** onde eles desejam receber a requisição do webhook de algum outra maneira. (e.g. um painel). + +### Confira a documentação + +Agora você pode iniciar a sua aplicação e ir até http://127.0.0.1:8000/docs. + +Você verá que a sua documentação possui as *operações de rota* normais e agora também possui alguns **webhooks**: + + From 8d39e5b74a9d3640402b4d3f1866f94ec76e153b Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 4 Jul 2024 20:53:46 +0000 Subject: [PATCH 066/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b2196498c..d41e370f8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/openapi-webhooks.md`. PR [#11791](https://github.com/tiangolo/fastapi/pull/11791) by [@ceb10n](https://github.com/ceb10n). * 🌐 Update Chinese translation for `docs/tutorial/security/oauth2-jwt.md`. PR [#11781](https://github.com/tiangolo/fastapi/pull/11781) by [@logan2d5](https://github.com/logan2d5). * 📝 Fix image missing in French translation for `docs/fr/docs/async.md` . PR [#11787](https://github.com/tiangolo/fastapi/pull/11787) by [@pe-brian](https://github.com/pe-brian). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/advanced-dependencies.md`. PR [#11775](https://github.com/tiangolo/fastapi/pull/11775) by [@ceb10n](https://github.com/ceb10n). From d60f8c59b9aa931f84aaaecc48e25178bdfc3ec7 Mon Sep 17 00:00:00 2001 From: Logan <146642263+logan2d5@users.noreply.github.com> Date: Fri, 5 Jul 2024 21:46:16 +0800 Subject: [PATCH 067/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Chinese=20translat?= =?UTF-8?q?ion=20for=20`docs/zh/docs/fastapi-cli.md`=20(#11786)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/zh/docs/fastapi-cli.md | 84 +++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 docs/zh/docs/fastapi-cli.md diff --git a/docs/zh/docs/fastapi-cli.md b/docs/zh/docs/fastapi-cli.md new file mode 100644 index 000000000..dd3914921 --- /dev/null +++ b/docs/zh/docs/fastapi-cli.md @@ -0,0 +1,84 @@ +# FastAPI CLI + +**FastAPI CLI** 是一个命令行程序,你可以用它来部署和运行你的 FastAPI 应用程序,管理你的 FastAPI 项目,等等。 + +当你安装 FastAPI 时(例如使用 `pip install FastAPI` 命令),会包含一个名为 `fastapi-cli` 的软件包,该软件包在终端中提供 `fastapi` 命令。 + +要在开发环境中运行你的 FastAPI 应用,你可以使用 `fastapi dev` 命令: + +
+ +```console +$ fastapi dev main.py +INFO Using path main.py +INFO Resolved absolute path /home/user/code/awesomeapp/main.py +INFO Searching for package file structure from directories with __init__.py files +INFO Importing from /home/user/code/awesomeapp + + ╭─ Python module file ─╮ + │ │ + │ 🐍 main.py │ + │ │ + ╰──────────────────────╯ + +INFO Importing module main +INFO Found importable FastAPI app + + ╭─ Importable FastAPI app ─╮ + │ │ + │ from main import app │ + │ │ + ╰──────────────────────────╯ + +INFO Using import string main:app + + ╭────────── FastAPI CLI - Development mode ───────────╮ + │ │ + │ Serving at: http://127.0.0.1:8000 │ + │ │ + │ API docs: http://127.0.0.1:8000/docs │ + │ │ + │ Running in development mode, for production use: │ + │ │ + fastapi run + │ │ + ╰─────────────────────────────────────────────────────╯ + +INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp'] +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [2265862] using WatchFiles +INFO: Started server process [2265873] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +该命令行程序 `fastapi` 就是 **FastAPI CLI**。 + +FastAPI CLI 接收你的 Python 程序路径,自动检测包含 FastAPI 的变量(通常命名为 `app`)及其导入方式,然后启动服务。 + +在生产环境中,你应该使用 `fastapi run` 命令。🚀 + +在内部,**FastAPI CLI** 使用了 Uvicorn,这是一个高性能、适用于生产环境的 ASGI 服务器。😎 + +## `fastapi dev` + +当你运行 `fastapi dev` 时,它将以开发模式运行。 + +默认情况下,它会启用**自动重载**,因此当你更改代码时,它会自动重新加载服务器。该功能是资源密集型的,且相较不启用时更不稳定,因此你应该仅在开发环境下使用它。 + +默认情况下,它将监听 IP 地址 `127.0.0.1`,这是你的机器与自身通信的 IP 地址(`localhost`)。 + +## `fastapi run` + +当你运行 `fastapi run` 时,它默认以生产环境模式运行。 + +默认情况下,**自动重载是禁用的**。 + +它将监听 IP 地址 `0.0.0.0`,即所有可用的 IP 地址,这样任何能够与该机器通信的人都可以公开访问它。这通常是你在生产环境中运行它的方式,例如在容器中运行。 + +在大多数情况下,你会(且应该)有一个“终止代理”在上层为你处理 HTTPS,这取决于你如何部署应用程序,你的服务提供商可能会为你处理此事,或者你可能需要自己设置。 + +!!! tip "提示" + 你可以在 [deployment documentation](deployment/index.md){.internal-link target=_blank} 获得更多信息。 From 4343170a2846bc36603fb43e5a302279fe62262b Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 5 Jul 2024 13:46:40 +0000 Subject: [PATCH 068/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index d41e370f8..419b4af2e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Chinese translation for `docs/zh/docs/fastapi-cli.md`. PR [#11786](https://github.com/tiangolo/fastapi/pull/11786) by [@logan2d5](https://github.com/logan2d5). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/openapi-webhooks.md`. PR [#11791](https://github.com/tiangolo/fastapi/pull/11791) by [@ceb10n](https://github.com/ceb10n). * 🌐 Update Chinese translation for `docs/tutorial/security/oauth2-jwt.md`. PR [#11781](https://github.com/tiangolo/fastapi/pull/11781) by [@logan2d5](https://github.com/logan2d5). * 📝 Fix image missing in French translation for `docs/fr/docs/async.md` . PR [#11787](https://github.com/tiangolo/fastapi/pull/11787) by [@pe-brian](https://github.com/pe-brian). From 4eb8db3cd3457efc11b0ac11927e3b95f871ac2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Pereira=20Holanda?= Date: Mon, 8 Jul 2024 13:09:45 -0300 Subject: [PATCH 069/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/tutorial/dependencies/dependencies?= =?UTF-8?q?-in-path-operation-operators.md`=20(#11804)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...pendencies-in-path-operation-decorators.md | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md diff --git a/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md b/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md new file mode 100644 index 000000000..4a297268c --- /dev/null +++ b/docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-decorators.md @@ -0,0 +1,138 @@ +# Dependências em decoradores de operações de rota + +Em alguns casos você não precisa necessariamente retornar o valor de uma dependência dentro de uma *função de operação de rota*. + +Ou a dependência não retorna nenhum valor. + +Mas você ainda precisa que ela seja executada/resolvida. + +Para esses casos, em vez de declarar um parâmetro em uma *função de operação de rota* com `Depends`, você pode adicionar um argumento `dependencies` do tipo `list` ao decorador da operação de rota. + +## Adicionando `dependencies` ao decorador da operação de rota + +O *decorador da operação de rota* recebe um argumento opcional `dependencies`. + +Ele deve ser uma lista de `Depends()`: + +=== "Python 3.9+" + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="18" + {!> ../../../docs_src/dependencies/tutorial006_an.py!} + ``` + +=== "Python 3.8 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível + + ```Python hl_lines="17" + {!> ../../../docs_src/dependencies/tutorial006.py!} + ``` +Essas dependências serão executadas/resolvidas da mesma forma que dependências comuns. Mas o valor delas (se existir algum) não será passado para a sua *função de operação de rota*. + +!!! tip "Dica" + Alguns editores de texto checam parâmetros de funções não utilizados, e os mostram como erros. + + Utilizando `dependencies` no *decorador da operação de rota* você pode garantir que elas serão executadas enquanto evita errors de editores/ferramentas. + + Isso também pode ser útil para evitar confundir novos desenvolvedores que ao ver um parâmetro não usado no seu código podem pensar que ele é desnecessário. + +!!! info "Informação" + Neste exemplo utilizamos cabeçalhos personalizados inventados `X-Keys` e `X-Token`. + + Mas em situações reais, como implementações de segurança, você pode obter mais vantagens em usar as [Ferramentas de segurança integradas (o próximo capítulo)](../security/index.md){.internal-link target=_blank}. + +## Erros das dependências e valores de retorno + +Você pode utilizar as mesmas *funções* de dependências que você usaria normalmente. + +### Requisitos de Dependências + +Dependências podem declarar requisitos de requisições (como cabeçalhos) ou outras subdependências: + +=== "Python 3.9+" + + ```Python hl_lines="8 13" + {!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="7 12" + {!> ../../../docs_src/dependencies/tutorial006_an.py!} + ``` + +=== "Python 3.8 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível + + ```Python hl_lines="6 11" + {!> ../../../docs_src/dependencies/tutorial006.py!} + ``` + +### Levantando exceções + +Essas dependências podem levantar exceções, da mesma forma que dependências comuns: + +=== "Python 3.9+" + + ```Python hl_lines="10 15" + {!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9 14" + {!> ../../../docs_src/dependencies/tutorial006_an.py!} + ``` + +=== "Python 3.8 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível + + ```Python hl_lines="8 13" + {!> ../../../docs_src/dependencies/tutorial006.py!} + ``` + +### Valores de retorno + +E elas também podem ou não retornar valores, eles não serão utilizados. + +Então, você pode reutilizar uma dependência comum (que retorna um valor) que já seja utilizada em outro lugar, e mesmo que o valor não seja utilizado, a dependência será executada: + +=== "Python 3.9+" + + ```Python hl_lines="11 16" + {!> ../../../docs_src/dependencies/tutorial006_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="10 15" + {!> ../../../docs_src/dependencies/tutorial006_an.py!} + ``` + +=== "Python 3.8 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível + + ```Python hl_lines="9 14" + {!> ../../../docs_src/dependencies/tutorial006.py!} + ``` + +## Dependências para um grupo de *operações de rota* + +Mais a frente, quando você ler sobre como estruturar aplicações maiores ([Bigger Applications - Multiple Files](../../tutorial/bigger-applications.md){.internal-link target=_blank}), possivelmente com múltiplos arquivos, você aprenderá a declarar um único parâmetro `dependencies` para um grupo de *operações de rota*. + +## Dependências globais + +No próximo passo veremos como adicionar dependências para uma aplicação `FastAPI` inteira, para que ela seja aplicada em toda *operação de rota*. From b45d1da7174afaa1faf116d3f33d6bb65609238c Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 8 Jul 2024 16:10:09 +0000 Subject: [PATCH 070/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 419b4af2e..9554afeb8 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-operators.md`. PR [#11804](https://github.com/tiangolo/fastapi/pull/11804) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Chinese translation for `docs/zh/docs/fastapi-cli.md`. PR [#11786](https://github.com/tiangolo/fastapi/pull/11786) by [@logan2d5](https://github.com/logan2d5). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/openapi-webhooks.md`. PR [#11791](https://github.com/tiangolo/fastapi/pull/11791) by [@ceb10n](https://github.com/ceb10n). * 🌐 Update Chinese translation for `docs/tutorial/security/oauth2-jwt.md`. PR [#11781](https://github.com/tiangolo/fastapi/pull/11781) by [@logan2d5](https://github.com/logan2d5). From 7039c5edc54e3c4f715e669696cf8d7d53aec80c Mon Sep 17 00:00:00 2001 From: Valentyn Khoroshchak <37864128+vkhoroshchak@users.noreply.github.com> Date: Tue, 9 Jul 2024 18:45:46 +0300 Subject: [PATCH 071/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Ukrainian=20transl?= =?UTF-8?q?ation=20for=20`docs/uk/docs/tutorial/first-steps.md`=20(#11809)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/uk/docs/tutorial/first-steps.md | 328 +++++++++++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 docs/uk/docs/tutorial/first-steps.md diff --git a/docs/uk/docs/tutorial/first-steps.md b/docs/uk/docs/tutorial/first-steps.md new file mode 100644 index 000000000..725677e42 --- /dev/null +++ b/docs/uk/docs/tutorial/first-steps.md @@ -0,0 +1,328 @@ +# Перші кроки + +Найпростіший файл FastAPI може виглядати так: + +```Python +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +Скопіюйте це до файлу `main.py`. + +Запустіть сервер: + +
+ +```console +$ fastapi dev main.py +INFO Using path main.py +INFO Resolved absolute path /home/user/code/awesomeapp/main.py +INFO Searching for package file structure from directories with __init__.py files +INFO Importing from /home/user/code/awesomeapp + + ╭─ Python module file ─╮ + │ │ + │ 🐍 main.py │ + │ │ + ╰──────────────────────╯ + +INFO Importing module main +INFO Found importable FastAPI app + + ╭─ Importable FastAPI app ─╮ + │ │ + │ from main import app │ + │ │ + ╰──────────────────────────╯ + +INFO Using import string main:app + + ╭────────── FastAPI CLI - Development mode ───────────╮ + │ │ + │ Serving at: http://127.0.0.1:8000 │ + │ │ + │ API docs: http://127.0.0.1:8000/docs │ + │ │ + │ Running in development mode, for production use: │ + │ │ + fastapi run + │ │ + ╰─────────────────────────────────────────────────────╯ + +INFO: Will watch for changes in these directories: ['/home/user/code/awesomeapp'] +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +INFO: Started reloader process [2265862] using WatchFiles +INFO: Started server process [2265873] +INFO: Waiting for application startup. +INFO: Application startup complete. +``` + +
+ +У консолі буде рядок приблизно такого змісту: + +```hl_lines="4" +INFO: Uvicorn running on http://127.0.0.1:8000 (Press CTRL+C to quit) +``` + +Цей рядок показує URL, за яким додаток запускається на вашій локальній машині. + +### Перевірте + +Відкрийте браузер та введіть адресу http://127.0.0.1:8000. + +Ви побачите у відповідь таке повідомлення у форматі JSON: + +```JSON +{"message": "Hello World"} +``` + +### Інтерактивна API документація + +Перейдемо сюди http://127.0.0.1:8000/docs. + +Ви побачите автоматичну інтерактивну API документацію (створену завдяки Swagger UI): + +![Swagger UI](https://fastapi.tiangolo.com/img/index/index-01-swagger-ui-simple.png) + +### Альтернативна API документація + +Тепер перейдемо сюди http://127.0.0.1:8000/redoc. + +Ви побачите альтернативну автоматичну документацію (створену завдяки ReDoc): + +![ReDoc](https://fastapi.tiangolo.com/img/index/index-02-redoc-simple.png) + +### OpenAPI + +**FastAPI** генерує "схему" з усім вашим API, використовуючи стандарт **OpenAPI** для визначення API. + +#### "Схема" + +"Схема" - це визначення або опис чогось. Це не код, який його реалізує, а просто абстрактний опис. + +#### API "схема" + +У цьому випадку, OpenAPI є специфікацією, яка визначає, як описати схему вашого API. + +Це визначення схеми включає шляхи (paths) вашого API, можливі параметри, які вони приймають тощо. + +#### "Схема" даних + +Термін "схема" також може відноситися до структури даних, наприклад, JSON. + +У цьому випадку це означає - атрибути JSON і типи даних, які вони мають тощо. + +#### OpenAPI і JSON Schema + +OpenAPI описує схему для вашого API. І ця схема включає визначення (або "схеми") даних, що надсилаються та отримуються вашим API за допомогою **JSON Schema**, стандарту для схем даних JSON. + +#### Розглянемо `openapi.json` + +Якщо вас цікавить, як виглядає вихідна схема OpenAPI, то FastAPI автоматично генерує JSON-схему з усіма описами API. + +Ознайомитися можна за посиланням: http://127.0.0.1:8000/openapi.json. + +Ви побачите приблизно такий JSON: + +```JSON +{ + "openapi": "3.1.0", + "info": { + "title": "FastAPI", + "version": "0.1.0" + }, + "paths": { + "/items/": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": { + "application/json": { + + + +... +``` + +#### Для чого потрібний OpenAPI + +Схема OpenAPI є основою для обох систем інтерактивної документації. + +Існують десятки альтернативних інструментів, заснованих на OpenAPI. Ви можете легко додати будь-який з них до **FastAPI** додатку. + +Ви також можете використовувати OpenAPI для автоматичної генерації коду для клієнтів, які взаємодіють з API. Наприклад, для фронтенд-, мобільних або IoT-додатків + +## А тепер крок за кроком + +### Крок 1: імпортуємо `FastAPI` + +```Python hl_lines="1" +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +`FastAPI` це клас у Python, який надає всю функціональність для API. + +!!! note "Технічні деталі" + `FastAPI` це клас, який успадковується безпосередньо від `Starlette`. + + Ви також можете використовувати всю функціональність Starlette у `FastAPI`. + +### Крок 2: створюємо екземпляр `FastAPI` + +```Python hl_lines="3" +{!../../../docs_src/first_steps/tutorial001.py!} +``` +Змінна `app` є екземпляром класу `FastAPI`. + +Це буде головна точка для створення і взаємодії з API. + +### Крок 3: визначте операцію шляху (path operation) + +#### Шлях (path) + +"Шлях" це частина URL, яка йде одразу після символу `/`. + +Отже, у такому URL, як: + +``` +https://example.com/items/foo +``` + +...шлях буде: + +``` +/items/foo +``` + +!!! info "Додаткова інформація" + "Шлях" (path) також зазвичай називають "ендпоінтом" (endpoint) або "маршрутом" (route). + +При створенні API, "шлях" є основним способом розділення "завдань" і "ресурсів". +#### Operation + +"Операція" (operation) тут означає один з "методів" HTTP. + +Один з: + +* `POST` +* `GET` +* `PUT` +* `DELETE` + +...та більш екзотичних: + +* `OPTIONS` +* `HEAD` +* `PATCH` +* `TRACE` + +У HTTP-протоколі можна спілкуватися з кожним шляхом, використовуючи один (або кілька) з цих "методів". + +--- + +При створенні API зазвичай використовуються конкретні методи HTTP для виконання певних дій. + +Як правило, використовують: + +* `POST`: для створення даних. +* `GET`: для читання даних. +* `PUT`: для оновлення даних. +* `DELETE`: для видалення даних. + +В OpenAPI кожен HTTP метод називається "операція". + +Ми також будемо дотримуватися цього терміна. + +#### Визначте декоратор операції шляху (path operation decorator) + +```Python hl_lines="6" +{!../../../docs_src/first_steps/tutorial001.py!} +``` +Декоратор `@app.get("/")` вказує **FastAPI**, що функція нижче, відповідає за обробку запитів, які надходять до неї: + +* шлях `/` +* використовуючи get операцію + +!!! info "`@decorator` Додаткова інформація" + Синтаксис `@something` у Python називається "декоратором". + + Ви розташовуєте його над функцією. Як гарний декоративний капелюх (мабуть, звідти походить термін). + + "Декоратор" приймає функцію нижче і виконує з нею якусь дію. + + У нашому випадку, цей декоратор повідомляє **FastAPI**, що функція нижче відповідає **шляху** `/` і **операції** `get`. + + Це і є "декоратор операції шляху (path operation decorator)". + +Можна також використовувати операції: + +* `@app.post()` +* `@app.put()` +* `@app.delete()` + +І більш екзотичні: + +* `@app.options()` +* `@app.head()` +* `@app.patch()` +* `@app.trace()` + +!!! tip "Порада" + Ви можете використовувати кожну операцію (HTTP-метод) на свій розсуд. + + **FastAPI** не нав'язує жодного певного значення для кожного методу. + + Наведена тут інформація є рекомендацією, а не обов'язковою вимогою. + + Наприклад, під час використання GraphQL зазвичай усі дії виконуються тільки за допомогою `POST` операцій. + + +### Крок 4: визначте **функцію операції шляху (path operation function)** + +Ось "**функція операції шляху**": + +* **шлях**: це `/`. +* **операція**: це `get`. +* **функція**: це функція, яка знаходиться нижче "декоратора" (нижче `@app.get("/")`). + +```Python hl_lines="7" +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +Це звичайна функція Python. + +FastAPI викликатиме її щоразу, коли отримає запит до URL із шляхом "/", використовуючи операцію `GET`. + +У даному випадку це асинхронна функція. + +--- + +Ви також можете визначити її як звичайну функцію замість `async def`: + +```Python hl_lines="7" +{!../../../docs_src/first_steps/tutorial003.py!} +``` + +!!! note "Примітка" + Якщо не знаєте в чому різниця, подивіться [Конкурентність: *"Поспішаєш?"*](../async.md#in-a-hurry){.internal-link target=_blank}. + +### Крок 5: поверніть результат + +```Python hl_lines="8" +{!../../../docs_src/first_steps/tutorial001.py!} +``` + +Ви можете повернути `dict`, `list`, а також окремі значення `str`, `int`, ітд. + +Також можна повернути моделі Pydantic (про це ви дізнаєтесь пізніше). + +Існує багато інших об'єктів і моделей, які будуть автоматично конвертовані в JSON (зокрема ORM тощо). Спробуйте використати свої улюблені, велика ймовірність, що вони вже підтримуються. + +## Підіб'ємо підсумки + +* Імпортуємо `FastAPI`. +* Створюємо екземпляр `app`. +* Пишемо **декоратор операції шляху** як `@app.get("/")`. +* Пишемо **функцію операції шляху**; наприклад, `def root(): ...`. +* Запускаємо сервер у режимі розробки `fastapi dev`. From 846e8bc8869d6c2ca20b75d8602563a14e2650eb Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 9 Jul 2024 15:46:09 +0000 Subject: [PATCH 072/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 9554afeb8..6a7410f92 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -32,6 +32,7 @@ hide: ### Translations +* 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/first-steps.md`. PR [#11809](https://github.com/tiangolo/fastapi/pull/11809) by [@vkhoroshchak](https://github.com/vkhoroshchak). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-operators.md`. PR [#11804](https://github.com/tiangolo/fastapi/pull/11804) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Chinese translation for `docs/zh/docs/fastapi-cli.md`. PR [#11786](https://github.com/tiangolo/fastapi/pull/11786) by [@logan2d5](https://github.com/logan2d5). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/openapi-webhooks.md`. PR [#11791](https://github.com/tiangolo/fastapi/pull/11791) by [@ceb10n](https://github.com/ceb10n). From 09b0a5d1534ed60148be5616b7c983315b758a54 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Pereira=20Holanda?= Date: Tue, 9 Jul 2024 14:58:59 -0300 Subject: [PATCH 073/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/tutorial/dependencies/sub-dependen?= =?UTF-8?q?cies.md`=20(#11792)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tutorial/dependencies/sub-dependencies.md | 194 ++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 docs/pt/docs/tutorial/dependencies/sub-dependencies.md diff --git a/docs/pt/docs/tutorial/dependencies/sub-dependencies.md b/docs/pt/docs/tutorial/dependencies/sub-dependencies.md new file mode 100644 index 000000000..189f196ab --- /dev/null +++ b/docs/pt/docs/tutorial/dependencies/sub-dependencies.md @@ -0,0 +1,194 @@ +# Subdependências + +Você pode criar dependências que possuem **subdependências**. + +Elas podem ter o nível de **profundidade** que você achar necessário. + +O **FastAPI** se encarrega de resolver essas dependências. + +## Primeira dependência "injetável" + +Você pode criar uma primeira dependência (injetável) dessa forma: + +=== "Python 3.10+" + + ```Python hl_lines="8-9" + {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="8-9" + {!> ../../../docs_src/dependencies/tutorial005_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="9-10" + {!> ../../../docs_src/dependencies/tutorial005_an.py!} + ``` + +=== "Python 3.10 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="6-7" + {!> ../../../docs_src/dependencies/tutorial005_py310.py!} + ``` + +=== "Python 3.8 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="8-9" + {!> ../../../docs_src/dependencies/tutorial005.py!} + ``` + +Esse código declara um parâmetro de consulta opcional, `q`, com o tipo `str`, e então retorna esse parâmetro. + +Isso é bastante simples (e não muito útil), mas irá nos ajudar a focar em como as subdependências funcionam. + +## Segunda dependência, "injetável" e "dependente" + +Então, você pode criar uma outra função para uma dependência (um "injetável") que ao mesmo tempo declara sua própria dependência (o que faz dela um "dependente" também): + +=== "Python 3.10+" + + ```Python hl_lines="13" + {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="13" + {!> ../../../docs_src/dependencies/tutorial005_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="14" + {!> ../../../docs_src/dependencies/tutorial005_an.py!} + ``` + +=== "Python 3.10 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="11" + {!> ../../../docs_src/dependencies/tutorial005_py310.py!} + ``` + +=== "Python 3.8 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="13" + {!> ../../../docs_src/dependencies/tutorial005.py!} + ``` + +Vamos focar nos parâmetros declarados: + +* Mesmo que essa função seja uma dependência ("injetável") por si mesma, ela também declara uma outra dependência (ela "depende" de outra coisa). + * Ela depende do `query_extractor`, e atribui o valor retornado pela função ao parâmetro `q`. +* Ela também declara um cookie opcional `last_query`, do tipo `str`. + * Se o usuário não passou nenhuma consulta `q`, a última consulta é utilizada, que foi salva em um cookie anteriormente. + +## Utilizando a dependência + +Então podemos utilizar a dependência com: + +=== "Python 3.10+" + + ```Python hl_lines="23" + {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="23" + {!> ../../../docs_src/dependencies/tutorial005_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="24" + {!> ../../../docs_src/dependencies/tutorial005_an.py!} + ``` + +=== "Python 3.10 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial005_py310.py!} + ``` + +=== "Python 3.8 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="22" + {!> ../../../docs_src/dependencies/tutorial005.py!} + ``` + +!!! info "Informação" + Perceba que nós estamos declarando apenas uma dependência na *função de operação de rota*, em `query_or_cookie_extractor`. + + Mas o **FastAPI** saberá que precisa solucionar `query_extractor` primeiro, para passar o resultado para `query_or_cookie_extractor` enquanto chama a função. + +```mermaid +graph TB + +query_extractor(["query_extractor"]) +query_or_cookie_extractor(["query_or_cookie_extractor"]) + +read_query["/items/"] + +query_extractor --> query_or_cookie_extractor --> read_query +``` + +## Utilizando a mesma dependência múltiplas vezes + +Se uma de suas dependências é declarada várias vezes para a mesma *operação de rota*, por exemplo, múltiplas dependências com uma mesma subdependência, o **FastAPI** irá chamar essa subdependência uma única vez para cada requisição. + +E o valor retornado é salvo em um "cache" e repassado para todos os "dependentes" que precisam dele em uma requisição específica, em vez de chamar a dependência múltiplas vezes para uma mesma requisição. + +Em um cenário avançado onde você precise que a dependência seja calculada em cada passo (possivelmente várias vezes) de uma requisição em vez de utilizar o valor em "cache", você pode definir o parâmetro `use_cache=False` em `Depends`: + +=== "Python 3.8+" + + ```Python hl_lines="1" + async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]): + return {"fresh_value": fresh_value} + ``` + +=== "Python 3.8+ non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="1" + async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)): + return {"fresh_value": fresh_value} + ``` + +## Recapitulando + +Com exceção de todas as palavras complicadas usadas aqui, o sistema de **Injeção de Dependência** é bastante simples. + +Consiste apenas de funções que parecem idênticas a *funções de operação de rota*. + +Mas ainda assim, é bastante poderoso, e permite que você declare grafos (árvores) de dependências com uma profundidade arbitrária. + +!!! tip "Dica" + Tudo isso pode não parecer muito útil com esses exemplos. + + Mas você verá o quão útil isso é nos capítulos sobre **segurança**. + + E você também verá a quantidade de código que você não precisara escrever. From 912524233b535a1d45b54863b2c4e0bd2464b193 Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 9 Jul 2024 17:59:20 +0000 Subject: [PATCH 074/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 6a7410f92..b47f44277 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/sub-dependencies.md`. PR [#11792](https://github.com/tiangolo/fastapi/pull/11792) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * ✏️ Update `docs/en/docs/fastapi-cli.md`. PR [#11715](https://github.com/tiangolo/fastapi/pull/11715) by [@alejsdev](https://github.com/alejsdev). * 📝 Update External Links . PR [#11500](https://github.com/tiangolo/fastapi/pull/11500) by [@devon2018](https://github.com/devon2018). * 📝 Add External Link: Tutorial de FastAPI, ¿el mejor framework de Python?. PR [#11618](https://github.com/tiangolo/fastapi/pull/11618) by [@EduardoZepeda](https://github.com/EduardoZepeda). From 2d916a9c951a17d0414926eacc8bf4b70a90f8c5 Mon Sep 17 00:00:00 2001 From: Rafael de Oliveira Marques Date: Thu, 11 Jul 2024 00:37:20 -0300 Subject: [PATCH 075/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/advanced/async-tests.md`=20(#11808?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/advanced/async-tests.md | 95 ++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 docs/pt/docs/advanced/async-tests.md diff --git a/docs/pt/docs/advanced/async-tests.md b/docs/pt/docs/advanced/async-tests.md new file mode 100644 index 000000000..4ccc0c452 --- /dev/null +++ b/docs/pt/docs/advanced/async-tests.md @@ -0,0 +1,95 @@ +# Testes Assíncronos + +Você já viu como testar as suas aplicações **FastAPI** utilizando o `TestClient` que é fornecido. Até agora, você viu apenas como escrever testes síncronos, sem utilizar funções `async`. + +Ser capaz de utilizar funções assíncronas em seus testes pode ser útil, por exemplo, quando você está realizando uma consulta em seu banco de dados de maneira assíncrona. Imagine que você deseja testar realizando requisições para a sua aplicação FastAPI e depois verificar que a sua aplicação inseriu corretamente as informações no banco de dados, ao utilizar uma biblioteca assíncrona para banco de dados. + +Vamos ver como nós podemos fazer isso funcionar. + +## pytest.mark.anyio + +Se quisermos chamar funções assíncronas em nossos testes, as nossas funções de teste precisam ser assíncronas. O AnyIO oferece um plugin bem legal para isso, que nos permite especificar que algumas das nossas funções de teste precisam ser chamadas de forma assíncrona. + +## HTTPX + +Mesmo que a sua aplicação **FastAPI** utilize funções normais com `def` no lugar de `async def`, ela ainda é uma aplicação `async` por baixo dos panos. + +O `TestClient` faz algumas mágicas para invocar a aplicação FastAPI assíncrona em suas funções `def` normais, utilizando o pytest padrão. Porém a mágica não acontece mais quando nós estamos utilizando dentro de funções assíncronas. Ao executar os nossos testes de forma assíncrona, nós não podemos mais utilizar o `TestClient` dentro das nossas funções de teste. + +O `TestClient` é baseado no HTTPX, e felizmente nós podemos utilizá-lo diretamente para testar a API. + +## Exemplo + +Para um exemplos simples, vamos considerar uma estrutura de arquivos semelhante ao descrito em [Bigger Applications](../tutorial/bigger-applications.md){.internal-link target=_blank} e [Testing](../tutorial/testing.md){.internal-link target=_blank}: + +``` +. +├── app +│   ├── __init__.py +│   ├── main.py +│   └── test_main.py +``` + +O arquivo `main.py` teria: + +```Python +{!../../../docs_src/async_tests/main.py!} +``` + +O arquivo `test_main.py` teria os testes para para o arquivo `main.py`, ele poderia ficar assim: + +```Python +{!../../../docs_src/async_tests/test_main.py!} +``` + +## Executá-lo + +Você pode executar os seus testes normalmente via: + +
+ +```console +$ pytest + +---> 100% +``` + +
+ +## Em Detalhes + +O marcador `@pytest.mark.anyio` informa ao pytest que esta função de teste deve ser invocada de maneira assíncrona: + +```Python hl_lines="7" +{!../../../docs_src/async_tests/test_main.py!} +``` + +!!! tip "Dica" + Note que a função de teste é `async def` agora, no lugar de apenas `def` como quando estávamos utilizando o `TestClient` anteriormente. + +Então podemos criar um `AsyncClient` com a aplicação, e enviar requisições assíncronas para ela utilizando `await`. + +```Python hl_lines="9-10" +{!../../../docs_src/async_tests/test_main.py!} +``` + +Isso é equivalente a: + +```Python +response = client.get('/') +``` + +...que nós utilizamos para fazer as nossas requisições utilizando o `TestClient`. + +!!! tip "Dica" + Note que nós estamos utilizando async/await com o novo `AsyncClient` - a requisição é assíncrona. + +!!! warning "Aviso" + Se a sua aplicação depende dos eventos de vida útil (*lifespan*), o `AsyncClient` não acionará estes eventos. Para garantir que eles são acionados, utilize o `LifespanManager` do florimondmanca/asgi-lifespan. + +## Outras Chamadas de Funções Assíncronas + +Como a função de teste agora é assíncrona, você pode chamar (e `esperar`) outras funções `async` além de enviar requisições para a sua aplicação FastAPI em seus testes, exatamente como você as chamaria em qualquer outro lugar do seu código. + +!!! tip "Dica" + Se você se deparar com um `RuntimeError: Task attached to a different loop` ao integrar funções assíncronas em seus testes (e.g. ao utilizar o MotorClient do MongoDB) Lembre-se de instanciar objetos que precisam de um loop de eventos (*event loop*) apenas em funções assíncronas, e.g. um *"callback"* `'@app.on_event("startup")`. From d3cdd3bbd14109f3b268df7ca496e24bb64593aa Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 11 Jul 2024 03:37:40 +0000 Subject: [PATCH 076/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b47f44277..7c56ad1b2 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -33,6 +33,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/async-tests.md`. PR [#11808](https://github.com/tiangolo/fastapi/pull/11808) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/first-steps.md`. PR [#11809](https://github.com/tiangolo/fastapi/pull/11809) by [@vkhoroshchak](https://github.com/vkhoroshchak). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-operators.md`. PR [#11804](https://github.com/tiangolo/fastapi/pull/11804) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Chinese translation for `docs/zh/docs/fastapi-cli.md`. PR [#11786](https://github.com/tiangolo/fastapi/pull/11786) by [@logan2d5](https://github.com/logan2d5). From c8414b986ff07b1908dc1aa85395f1da558080ea Mon Sep 17 00:00:00 2001 From: Lucas Balieiro <37416577+lucasbalieiro@users.noreply.github.com> Date: Thu, 11 Jul 2024 22:41:15 -0400 Subject: [PATCH 077/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/how-to/general.md`=20(#11825)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/how-to/general.md | 39 ++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 docs/pt/docs/how-to/general.md diff --git a/docs/pt/docs/how-to/general.md b/docs/pt/docs/how-to/general.md new file mode 100644 index 000000000..4f21463b2 --- /dev/null +++ b/docs/pt/docs/how-to/general.md @@ -0,0 +1,39 @@ +# Geral - Como Fazer - Receitas + +Aqui estão vários links para outros locais na documentação, para perguntas gerais ou frequentes + +## Filtro de dados- Segurança + +Para assegurar que você não vai retornar mais dados do que deveria, leia a seção [Tutorial - Response Model - Return Type](../tutorial/response-model.md){.internal-link target=_blank}. + +## Tags de Documentação - OpenAPI +Para adicionar tags às suas *rotas* e agrupá-las na UI da documentação, leia a seção [Tutorial - Path Operation Configurations - Tags](../tutorial/path-operation-configuration.md#tags){.internal-link target=_blank}. + +## Resumo e Descrição da documentação - OpenAPI + +Para adicionar um resumo e uma descrição às suas *rotas* e exibi-los na UI da documentação, leia a seção [Tutorial - Path Operation Configurations - Summary and Description](../tutorial/path-operation-configuration.md#summary-and-description){.internal-link target=_blank}. + +## Documentação das Descrições de Resposta - OpenAPI + +Para definir a descrição de uma resposta exibida na interface da documentação, leia a seção [Tutorial - Path Operation Configurations - Response description](../tutorial/path-operation-configuration.md#response-description){.internal-link target=_blank}. + +## Documentação para Depreciar uma *Operação de Rota* - OpenAPI + +Para depreciar uma *operação de rota* e exibi-la na interface da documentação, leia a seção [Tutorial - Path Operation Configurations - Deprecation](../tutorial/path-operation-configuration.md#deprecate-a-path-operation){.internal-link target=_blank}. + +## Converter qualquer dado para JSON + + +Para converter qualquer dado para um formato compatível com JSON, leia a seção [Tutorial - JSON Compatible Encoder](../tutorial/encoder.md){.internal-link target=_blank}. + +## OpenAPI Metadata - Docs + +Para adicionar metadados ao seu esquema OpenAPI, incluindo licensa, versão, contato, etc, leia a seção [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md){.internal-link target=_blank}. + +## OpenAPI com URL customizada + +Para customizar a URL do OpenAPI (ou removê-la), leia a seção [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#openapi-url){.internal-link target=_blank}. + +## URLs de documentação do OpenAPI + +Para alterar as URLs usadas ​​para as interfaces de usuário da documentação gerada automaticamente, leia a seção [Tutorial - Metadata and Docs URLs](../tutorial/metadata.md#docs-urls){.internal-link target=_blank}. From 18d28d4370656425fe780c8a8a46b713351584a2 Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 12 Jul 2024 02:41:39 +0000 Subject: [PATCH 078/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7c56ad1b2..0c5c9716e 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -33,6 +33,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/how-to/general.md`. PR [#11825](https://github.com/tiangolo/fastapi/pull/11825) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/async-tests.md`. PR [#11808](https://github.com/tiangolo/fastapi/pull/11808) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/first-steps.md`. PR [#11809](https://github.com/tiangolo/fastapi/pull/11809) by [@vkhoroshchak](https://github.com/vkhoroshchak). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/dependencies-in-path-operation-operators.md`. PR [#11804](https://github.com/tiangolo/fastapi/pull/11804) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). From 7782dd677b73e1f9b802ec1df9f6f7a284914451 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Pereira=20Holanda?= Date: Thu, 11 Jul 2024 23:42:04 -0300 Subject: [PATCH 079/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/tutorial/dependencies/global-depen?= =?UTF-8?q?dencies.md`=20(#11826)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dependencies/global-dependencies.md | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 docs/pt/docs/tutorial/dependencies/global-dependencies.md diff --git a/docs/pt/docs/tutorial/dependencies/global-dependencies.md b/docs/pt/docs/tutorial/dependencies/global-dependencies.md new file mode 100644 index 000000000..3eb5faa34 --- /dev/null +++ b/docs/pt/docs/tutorial/dependencies/global-dependencies.md @@ -0,0 +1,34 @@ +# Dependências Globais + +Para alguns tipos de aplicação específicos você pode querer adicionar dependências para toda a aplicação. + +De forma semelhante a [adicionar dependências (`dependencies`) em *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank}, você pode adicioná-las à aplicação `FastAPI`. + +Nesse caso, elas serão aplicadas a todas as *operações de rota* da aplicação: + +=== "Python 3.9+" + + ```Python hl_lines="16" + {!> ../../../docs_src/dependencies/tutorial012_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="16" + {!> ../../../docs_src/dependencies/tutorial012_an.py!} + ``` + +=== "Python 3.8 non-Annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="15" + {!> ../../../docs_src/dependencies/tutorial012.py!} + ``` + +E todos os conceitos apresentados na sessão sobre [adicionar dependências em *decoradores de operação de rota*](dependencies-in-path-operation-decorators.md){.internal-link target=_blank} ainda se aplicam, mas nesse caso, para todas as *operações de rota* da aplicação. + +## Dependências para conjuntos de *operações de rota* + +Mais para a frente, quando você ler sobre como estruturar aplicações maiores ([Bigger Applications - Multiple Files](../../tutorial/bigger-applications.md){.internal-link target=_blank}), possivelmente com múltiplos arquivos, você irá aprender a declarar um único parâmetro `dependencies` para um conjunto de *operações de rota*. From 2606671a0a83b1dc788ba4d2269a9d402f38e9ab Mon Sep 17 00:00:00 2001 From: github-actions Date: Fri, 12 Jul 2024 02:43:47 +0000 Subject: [PATCH 080/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0c5c9716e..0805e3233 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -33,6 +33,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/global-dependencies.md`. PR [#11826](https://github.com/tiangolo/fastapi/pull/11826) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/how-to/general.md`. PR [#11825](https://github.com/tiangolo/fastapi/pull/11825) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/async-tests.md`. PR [#11808](https://github.com/tiangolo/fastapi/pull/11808) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Ukrainian translation for `docs/uk/docs/tutorial/first-steps.md`. PR [#11809](https://github.com/tiangolo/fastapi/pull/11809) by [@vkhoroshchak](https://github.com/vkhoroshchak). From 435c11a406b54288b95980809dcec0a52f2257ed Mon Sep 17 00:00:00 2001 From: Lucas Balieiro <37416577+lucasbalieiro@users.noreply.github.com> Date: Sat, 13 Jul 2024 21:24:05 -0400 Subject: [PATCH 081/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/reference/exceptions.md`=20(#11834?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/reference/exceptions.md | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 docs/pt/docs/reference/exceptions.md diff --git a/docs/pt/docs/reference/exceptions.md b/docs/pt/docs/reference/exceptions.md new file mode 100644 index 000000000..d6b5d2613 --- /dev/null +++ b/docs/pt/docs/reference/exceptions.md @@ -0,0 +1,20 @@ +# Exceções - `HTTPException` e `WebSocketException` + +Essas são as exceções que você pode lançar para mostrar erros ao cliente. + +Quando você lança uma exceção, como aconteceria com o Python normal, o restante da execução é abortado. Dessa forma, você pode lançar essas exceções de qualquer lugar do código para abortar uma solicitação e mostrar o erro ao cliente. + +Você pode usar: + +* `HTTPException` +* `WebSocketException` + +Essas exceções podem ser importadas diretamente do `fastapi`: + +```python +from fastapi import HTTPException, WebSocketException +``` + +::: fastapi.HTTPException + +::: fastapi.WebSocketException From 13712e2720212a4a19fd90c9f775e98af51efbc9 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 01:24:27 +0000 Subject: [PATCH 082/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 0805e3233..327ca6a69 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -33,6 +33,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/reference/exceptions.md`. PR [#11834](https://github.com/tiangolo/fastapi/pull/11834) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/global-dependencies.md`. PR [#11826](https://github.com/tiangolo/fastapi/pull/11826) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/how-to/general.md`. PR [#11825](https://github.com/tiangolo/fastapi/pull/11825) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/async-tests.md`. PR [#11808](https://github.com/tiangolo/fastapi/pull/11808) by [@ceb10n](https://github.com/ceb10n). From f9ac185bf019a8e71b75d34752bb5bed9004cb02 Mon Sep 17 00:00:00 2001 From: Augustus D'Souza Date: Sun, 14 Jul 2024 07:16:19 +0530 Subject: [PATCH 083/284] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Fix=20links=20to?= =?UTF-8?q?=20alembic=20example=20repo=20in=20docs=20(#11628)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/em/docs/tutorial/sql-databases.md | 2 +- docs/en/docs/tutorial/sql-databases.md | 2 +- docs/zh/docs/tutorial/sql-databases.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/em/docs/tutorial/sql-databases.md b/docs/em/docs/tutorial/sql-databases.md index 4c8740984..5a5227352 100644 --- a/docs/em/docs/tutorial/sql-databases.md +++ b/docs/em/docs/tutorial/sql-databases.md @@ -501,7 +501,7 @@ current_user.items "🛠️" ⚒ 🔁 💪 🕐❔ 👆 🔀 📊 👆 🇸🇲 🏷, 🚮 🆕 🔢, ♒️. 🔁 👈 🔀 💽, 🚮 🆕 🏓, 🆕 🏓, ♒️. -👆 💪 🔎 🖼 ⚗ FastAPI 🏗 📄 ⚪️➡️ [🏗 ⚡ - 📄](../project-generation.md){.internal-link target=_blank}. 🎯 `alembic` 📁 ℹ 📟. +👆 💪 🔎 🖼 ⚗ FastAPI 🏗 📄 ⚪️➡️ [🏗 ⚡ - 📄](../project-generation.md){.internal-link target=_blank}. 🎯 `alembic` 📁 ℹ 📟. ### ✍ 🔗 diff --git a/docs/en/docs/tutorial/sql-databases.md b/docs/en/docs/tutorial/sql-databases.md index 0b4d06b99..1f0ebc08b 100644 --- a/docs/en/docs/tutorial/sql-databases.md +++ b/docs/en/docs/tutorial/sql-databases.md @@ -513,7 +513,7 @@ And you would also use Alembic for "migrations" (that's its main job). A "migration" is the set of steps needed whenever you change the structure of your SQLAlchemy models, add a new attribute, etc. to replicate those changes in the database, add a new column, a new table, etc. -You can find an example of Alembic in a FastAPI project in the templates from [Project Generation - Template](../project-generation.md){.internal-link target=_blank}. Specifically in the `alembic` directory in the source code. +You can find an example of Alembic in a FastAPI project in the [Full Stack FastAPI Template](../project-generation.md){.internal-link target=_blank}. Specifically in the `alembic` directory in the source code. ### Create a dependency diff --git a/docs/zh/docs/tutorial/sql-databases.md b/docs/zh/docs/tutorial/sql-databases.md index bd7c10571..8629b23fa 100644 --- a/docs/zh/docs/tutorial/sql-databases.md +++ b/docs/zh/docs/tutorial/sql-databases.md @@ -506,7 +506,7 @@ current_user.items “迁移”是每当您更改 SQLAlchemy 模型的结构、添加新属性等以在数据库中复制这些更改、添加新列、新表等时所需的一组步骤。 -您可以在[Project Generation - Template](https://fastapi.tiangolo.com/zh/project-generation/)的模板中找到一个 FastAPI 项目中的 Alembic 示例。具体在[`alembic`代码目录中](https://github.com/tiangolo/full-stack-fastapi-postgresql/tree/master/src/backend/app/alembic/)。 +您可以在[Full Stack FastAPI Template](https://fastapi.tiangolo.com/zh/project-generation/)的模板中找到一个 FastAPI 项目中的 Alembic 示例。具体在[`alembic`代码目录中](https://github.com/tiangolo/full-stack-fastapi-template/tree/master/backend/app/alembic)。 ### 创建依赖项 From 475f0d015856f1ce39ccc0a7da2dc51cc8aee368 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 01:46:44 +0000 Subject: [PATCH 084/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 327ca6a69..6b4b36580 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* ✏️ Fix links to alembic example repo in docs. PR [#11628](https://github.com/tiangolo/fastapi/pull/11628) by [@augiwan](https://github.com/augiwan). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/sub-dependencies.md`. PR [#11792](https://github.com/tiangolo/fastapi/pull/11792) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * ✏️ Update `docs/en/docs/fastapi-cli.md`. PR [#11715](https://github.com/tiangolo/fastapi/pull/11715) by [@alejsdev](https://github.com/alejsdev). * 📝 Update External Links . PR [#11500](https://github.com/tiangolo/fastapi/pull/11500) by [@devon2018](https://github.com/devon2018). From 3960b45223e4f90428d379ffbab58db2bcfb5b8f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Nicol=C3=B3=20Lino?= Date: Sun, 14 Jul 2024 03:48:42 +0200 Subject: [PATCH 085/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20fastapi=20instr?= =?UTF-8?q?umentation=20external=20link=20(#11317)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/data/external_links.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/en/data/external_links.yml b/docs/en/data/external_links.yml index e3d475d2f..15f6169ee 100644 --- a/docs/en/data/external_links.yml +++ b/docs/en/data/external_links.yml @@ -27,7 +27,7 @@ Articles: - author: Nicoló Lino author_link: https://www.nlino.com link: https://github.com/softwarebloat/python-tracing-demo - title: Instrument a FastAPI service adding tracing with OpenTelemetry and send/show traces in Grafana Tempo + title: Instrument FastAPI with OpenTelemetry tracing and visualize traces in Grafana Tempo. - author: Mikhail Rozhkov, Elena Samuylova author_link: https://www.linkedin.com/in/mnrozhkov/ link: https://www.evidentlyai.com/blog/fastapi-tutorial From 41e87c0ded0e6de9fb05e957725bc2a89eca1484 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 01:49:49 +0000 Subject: [PATCH 086/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 6b4b36580..3477950c9 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 📝 Update fastapi instrumentation external link. PR [#11317](https://github.com/tiangolo/fastapi/pull/11317) by [@softwarebloat](https://github.com/softwarebloat). * ✏️ Fix links to alembic example repo in docs. PR [#11628](https://github.com/tiangolo/fastapi/pull/11628) by [@augiwan](https://github.com/augiwan). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/sub-dependencies.md`. PR [#11792](https://github.com/tiangolo/fastapi/pull/11792) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * ✏️ Update `docs/en/docs/fastapi-cli.md`. PR [#11715](https://github.com/tiangolo/fastapi/pull/11715) by [@alejsdev](https://github.com/alejsdev). From a3a6c61164522ffa3439f3ba3e022156107b934a Mon Sep 17 00:00:00 2001 From: DamianCzajkowski <43958031+DamianCzajkowski@users.noreply.github.com> Date: Sun, 14 Jul 2024 03:57:52 +0200 Subject: [PATCH 087/284] =?UTF-8?q?=F0=9F=93=9D=20=20Update=20docs=20with?= =?UTF-8?q?=20Ariadne=20reference=20from=20Starlette=20to=20FastAPI=20(#11?= =?UTF-8?q?797)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/how-to/graphql.md | 2 +- docs/em/docs/how-to/graphql.md | 2 +- docs/en/docs/how-to/graphql.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/de/docs/how-to/graphql.md b/docs/de/docs/how-to/graphql.md index 9b03e8e05..b8e0bdddd 100644 --- a/docs/de/docs/how-to/graphql.md +++ b/docs/de/docs/how-to/graphql.md @@ -18,7 +18,7 @@ Hier sind einige der **GraphQL**-Bibliotheken, welche **ASGI** unterstützen. Di * Strawberry 🍓 * Mit Dokumentation für FastAPI * Ariadne - * Mit Dokumentation für Starlette (welche auch für FastAPI gilt) + * Mit Dokumentation für FastAPI * Tartiflette * Mit Tartiflette ASGI, für ASGI-Integration * Graphene diff --git a/docs/em/docs/how-to/graphql.md b/docs/em/docs/how-to/graphql.md index 8509643ce..686a77949 100644 --- a/docs/em/docs/how-to/graphql.md +++ b/docs/em/docs/how-to/graphql.md @@ -18,7 +18,7 @@ * 🍓 👶 * ⏮️ 🩺 FastAPI * 👸 - * ⏮️ 🩺 💃 (👈 ✔ FastAPI) + * ⏮️ 🩺 FastAPI * 🍟 * ⏮️ 🍟 🔫 🚚 🔫 🛠️ * diff --git a/docs/en/docs/how-to/graphql.md b/docs/en/docs/how-to/graphql.md index 154606406..d5a5826f1 100644 --- a/docs/en/docs/how-to/graphql.md +++ b/docs/en/docs/how-to/graphql.md @@ -18,7 +18,7 @@ Here are some of the **GraphQL** libraries that have **ASGI** support. You could * Strawberry 🍓 * With docs for FastAPI * Ariadne - * With docs for Starlette (that also apply to FastAPI) + * With docs for FastAPI * Tartiflette * With Tartiflette ASGI to provide ASGI integration * Graphene From 9f49708fd89b7cbd89f83a2066b3bd8e965b12ac Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 01:58:15 +0000 Subject: [PATCH 088/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 3477950c9..19d8d2981 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 📝 Update docs with Ariadne reference from Starlette to FastAPI. PR [#11797](https://github.com/tiangolo/fastapi/pull/11797) by [@DamianCzajkowski](https://github.com/DamianCzajkowski). * 📝 Update fastapi instrumentation external link. PR [#11317](https://github.com/tiangolo/fastapi/pull/11317) by [@softwarebloat](https://github.com/softwarebloat). * ✏️ Fix links to alembic example repo in docs. PR [#11628](https://github.com/tiangolo/fastapi/pull/11628) by [@augiwan](https://github.com/augiwan). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/sub-dependencies.md`. PR [#11792](https://github.com/tiangolo/fastapi/pull/11792) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). From 511199014f55d769b600f0f816798b05ff4c7ccf Mon Sep 17 00:00:00 2001 From: Anita Hammer <166057949+anitahammer@users.noreply.github.com> Date: Sun, 14 Jul 2024 03:04:00 +0100 Subject: [PATCH 089/284] =?UTF-8?q?=F0=9F=8C=90=20Fix=20link=20in=20German?= =?UTF-8?q?=20translation=20(#11836)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Broken link on main page --- docs/de/docs/index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/de/docs/index.md b/docs/de/docs/index.md index 9b8a73003..831d96e42 100644 --- a/docs/de/docs/index.md +++ b/docs/de/docs/index.md @@ -460,7 +460,7 @@ Wird von Starlette verwendet: * httpx - erforderlich, wenn Sie den `TestClient` verwenden möchten. * jinja2 - erforderlich, wenn Sie die Standardkonfiguration für Templates verwenden möchten. -* python-multipart - erforderlich, wenn Sie Formulare mittels `request.form()` „parsen“ möchten. +* python-multipart - erforderlich, wenn Sie Formulare mittels `request.form()` „parsen“ möchten. * itsdangerous - erforderlich für `SessionMiddleware` Unterstützung. * pyyaml - erforderlich für Starlette's `SchemaGenerator` Unterstützung (Sie brauchen das wahrscheinlich nicht mit FastAPI). * ujson - erforderlich, wenn Sie `UJSONResponse` verwenden möchten. From 36264cffb8039090050335626f3806a8fc1d9892 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 02:04:19 +0000 Subject: [PATCH 090/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 19d8d2981..e00a2d75b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -15,6 +15,7 @@ hide: ### Docs +* 🌐 Fix link in German translation. PR [#11836](https://github.com/tiangolo/fastapi/pull/11836) by [@anitahammer](https://github.com/anitahammer). * 📝 Update docs with Ariadne reference from Starlette to FastAPI. PR [#11797](https://github.com/tiangolo/fastapi/pull/11797) by [@DamianCzajkowski](https://github.com/DamianCzajkowski). * 📝 Update fastapi instrumentation external link. PR [#11317](https://github.com/tiangolo/fastapi/pull/11317) by [@softwarebloat](https://github.com/softwarebloat). * ✏️ Fix links to alembic example repo in docs. PR [#11628](https://github.com/tiangolo/fastapi/pull/11628) by [@augiwan](https://github.com/augiwan). From 9edba691e7dff9985ec63cd802dc65bce04c9daa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 13 Jul 2024 21:14:00 -0500 Subject: [PATCH 091/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index e00a2d75b..8589d35c4 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,19 +7,15 @@ hide: ## Latest Changes -* 🌐 Add Turkish translation for `docs/tr/docs/tutorial/request-forms.md`. PR [#11553](https://github.com/tiangolo/fastapi/pull/11553) by [@hasansezertasan](https://github.com/hasansezertasan). - ### Upgrades -* 📝 Restored Swagger-UI links to use the latest version possible.. PR [#11459](https://github.com/tiangolo/fastapi/pull/11459) by [@UltimateLobster](https://github.com/UltimateLobster). +* 📝 Restored Swagger-UI links to use the latest version possible. PR [#11459](https://github.com/tiangolo/fastapi/pull/11459) by [@UltimateLobster](https://github.com/UltimateLobster). ### Docs -* 🌐 Fix link in German translation. PR [#11836](https://github.com/tiangolo/fastapi/pull/11836) by [@anitahammer](https://github.com/anitahammer). * 📝 Update docs with Ariadne reference from Starlette to FastAPI. PR [#11797](https://github.com/tiangolo/fastapi/pull/11797) by [@DamianCzajkowski](https://github.com/DamianCzajkowski). * 📝 Update fastapi instrumentation external link. PR [#11317](https://github.com/tiangolo/fastapi/pull/11317) by [@softwarebloat](https://github.com/softwarebloat). * ✏️ Fix links to alembic example repo in docs. PR [#11628](https://github.com/tiangolo/fastapi/pull/11628) by [@augiwan](https://github.com/augiwan). -* 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/sub-dependencies.md`. PR [#11792](https://github.com/tiangolo/fastapi/pull/11792) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * ✏️ Update `docs/en/docs/fastapi-cli.md`. PR [#11715](https://github.com/tiangolo/fastapi/pull/11715) by [@alejsdev](https://github.com/alejsdev). * 📝 Update External Links . PR [#11500](https://github.com/tiangolo/fastapi/pull/11500) by [@devon2018](https://github.com/devon2018). * 📝 Add External Link: Tutorial de FastAPI, ¿el mejor framework de Python?. PR [#11618](https://github.com/tiangolo/fastapi/pull/11618) by [@EduardoZepeda](https://github.com/EduardoZepeda). @@ -37,6 +33,9 @@ hide: ### Translations +* 🌐 Fix link in German translation. PR [#11836](https://github.com/tiangolo/fastapi/pull/11836) by [@anitahammer](https://github.com/anitahammer). +* 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/sub-dependencies.md`. PR [#11792](https://github.com/tiangolo/fastapi/pull/11792) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). +* 🌐 Add Turkish translation for `docs/tr/docs/tutorial/request-forms.md`. PR [#11553](https://github.com/tiangolo/fastapi/pull/11553) by [@hasansezertasan](https://github.com/hasansezertasan). * 🌐 Add Portuguese translation for `docs/pt/docs/reference/exceptions.md`. PR [#11834](https://github.com/tiangolo/fastapi/pull/11834) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/global-dependencies.md`. PR [#11826](https://github.com/tiangolo/fastapi/pull/11826) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/how-to/general.md`. PR [#11825](https://github.com/tiangolo/fastapi/pull/11825) by [@lucasbalieiro](https://github.com/lucasbalieiro). From dfcc0322e4cd39bdcfd35d33a9e3dc3aef953b2d Mon Sep 17 00:00:00 2001 From: Lucas Balieiro <37416577+lucasbalieiro@users.noreply.github.com> Date: Sun, 14 Jul 2024 12:00:35 -0400 Subject: [PATCH 092/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/reference/index.md`=20(#11840)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/reference/index.md | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 docs/pt/docs/reference/index.md diff --git a/docs/pt/docs/reference/index.md b/docs/pt/docs/reference/index.md new file mode 100644 index 000000000..533a6a996 --- /dev/null +++ b/docs/pt/docs/reference/index.md @@ -0,0 +1,6 @@ +# Referência - API de Código + +Aqui está a referência ou API de código, as classes, funções, parâmetros, atributos e todas as partes do FastAPI que você pode usar em suas aplicações. + +Se você quer **aprender FastAPI**, é muito melhor ler o +[FastAPI Tutorial](https://fastapi.tiangolo.com/tutorial/). From e23916d2f9b32eab9a5d658211a9bbe69de934be Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 16:00:56 +0000 Subject: [PATCH 093/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 8589d35c4..22b5d2797 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -33,6 +33,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/reference/index.md`. PR [#11840](https://github.com/tiangolo/fastapi/pull/11840) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Fix link in German translation. PR [#11836](https://github.com/tiangolo/fastapi/pull/11836) by [@anitahammer](https://github.com/anitahammer). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/sub-dependencies.md`. PR [#11792](https://github.com/tiangolo/fastapi/pull/11792) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Turkish translation for `docs/tr/docs/tutorial/request-forms.md`. PR [#11553](https://github.com/tiangolo/fastapi/pull/11553) by [@hasansezertasan](https://github.com/hasansezertasan). From ebc6a0653ae6f9e1c023cca2fdb98c2086b4efb1 Mon Sep 17 00:00:00 2001 From: Maria Camila Gomez R Date: Sun, 14 Jul 2024 11:22:03 -0500 Subject: [PATCH 094/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Spanish=20translat?= =?UTF-8?q?ion=20for=20`docs/es/docs/how-to/graphql.md`=20(#11697)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/es/docs/how-to/graphql.md | 56 ++++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 docs/es/docs/how-to/graphql.md diff --git a/docs/es/docs/how-to/graphql.md b/docs/es/docs/how-to/graphql.md new file mode 100644 index 000000000..1138af76a --- /dev/null +++ b/docs/es/docs/how-to/graphql.md @@ -0,0 +1,56 @@ +# GraphQL + +Como **FastAPI** está basado en el estándar **ASGI**, es muy fácil integrar cualquier library **GraphQL** que sea compatible con ASGI. + +Puedes combinar *operaciones de path* regulares de la library de FastAPI con GraphQL en la misma aplicación. + +!!! tip + **GraphQL** resuelve algunos casos de uso específicos. + + Tiene **ventajas** y **desventajas** cuando lo comparas con **APIs web** comunes. + + Asegúrate de evaluar si los **beneficios** para tu caso de uso compensan las **desventajas.** 🤓 + +## Librerías GraphQL + +Aquí hay algunas de las libraries de **GraphQL** que tienen soporte con **ASGI** las cuales podrías usar con **FastAPI**: + +* Strawberry 🍓 + * Con documentación para FastAPI +* Ariadne + * Con documentación para FastAPI +* Tartiflette + * Con Tartiflette ASGI para proveer integración con ASGI +* Graphene + * Con starlette-graphene3 + +## GraphQL con Strawberry + +Si necesitas o quieres trabajar con **GraphQL**, **Strawberry** es la library **recomendada** por el diseño más cercano a **FastAPI**, el cual es completamente basado en **anotaciones de tipo**. + +Dependiendo de tus casos de uso, podrías preferir usar una library diferente, pero si me preguntas, probablemente te recomendaría **Strawberry**. + +Aquí hay una pequeña muestra de cómo podrías integrar Strawberry con FastAPI: + +```Python hl_lines="3 22 25-26" +{!../../../docs_src/graphql/tutorial001.py!} +``` + +Puedes aprender más sobre Strawberry en la documentación de Strawberry. + +Y también en la documentación sobre Strawberry con FastAPI. + +## Clase obsoleta `GraphQLApp` en Starlette + +Versiones anteriores de Starlette incluyen la clase `GraphQLApp` para integrarlo con Graphene. + +Esto fue marcado como obsoleto en Starlette, pero si aún tienes código que lo usa, puedes fácilmente **migrar** a starlette-graphene3, la cual cubre el mismo caso de uso y tiene una **interfaz casi idéntica.** + +!!! tip + Si necesitas GraphQL, te recomendaría revisar Strawberry, que es basada en anotaciones de tipo en vez de clases y tipos personalizados. + +## Aprende más + +Puedes aprender más acerca de **GraphQL** en la documentación oficial de GraphQL. + +También puedes leer más acerca de cada library descrita anteriormente en sus enlaces. From ce5ecaa2a2f5e4717f4dbc93d976a13b59d7d157 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 16:22:25 +0000 Subject: [PATCH 095/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 22b5d2797..4bc454190 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -33,6 +33,7 @@ hide: ### Translations +* 🌐 Add Spanish translation for `docs/es/docs/how-to/graphql.md`. PR [#11697](https://github.com/tiangolo/fastapi/pull/11697) by [@camigomezdev](https://github.com/camigomezdev). * 🌐 Add Portuguese translation for `docs/pt/docs/reference/index.md`. PR [#11840](https://github.com/tiangolo/fastapi/pull/11840) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Fix link in German translation. PR [#11836](https://github.com/tiangolo/fastapi/pull/11836) by [@anitahammer](https://github.com/anitahammer). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/sub-dependencies.md`. PR [#11792](https://github.com/tiangolo/fastapi/pull/11792) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). From 60f7fe400618bdbd7660212d86ffe04504bf2096 Mon Sep 17 00:00:00 2001 From: kittydoor Date: Sun, 14 Jul 2024 19:06:59 +0200 Subject: [PATCH 096/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20Hypercorn=20lin?= =?UTF-8?q?ks=20in=20all=20the=20docs=20(#11744)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/bn/docs/index.md | 2 +- docs/de/docs/deployment/manually.md | 4 ++-- docs/de/docs/index.md | 2 +- docs/em/docs/deployment/manually.md | 4 ++-- docs/en/docs/deployment/manually.md | 4 ++-- docs/es/docs/index.md | 2 +- docs/fa/docs/index.md | 2 +- docs/fr/docs/deployment/manually.md | 4 ++-- docs/he/docs/index.md | 2 +- docs/it/docs/index.md | 2 +- docs/ja/docs/deployment/manually.md | 2 +- docs/ja/docs/index.md | 2 +- docs/ko/docs/index.md | 2 +- docs/pl/docs/index.md | 2 +- docs/pt/docs/deployment.md | 2 +- docs/pt/docs/index.md | 2 +- docs/ru/docs/deployment/manually.md | 4 ++-- docs/ru/docs/index.md | 2 +- docs/tr/docs/index.md | 2 +- docs/uk/docs/index.md | 2 +- docs/zh/docs/deployment/manually.md | 4 ++-- docs/zh/docs/index.md | 2 +- 22 files changed, 28 insertions(+), 28 deletions(-) diff --git a/docs/bn/docs/index.md b/docs/bn/docs/index.md index bbc3e9a3a..3105e69c8 100644 --- a/docs/bn/docs/index.md +++ b/docs/bn/docs/index.md @@ -126,7 +126,7 @@ $ pip install fastapi -আপনার একটি ASGI সার্ভারেরও প্রয়োজন হবে, প্রোডাকশনের জন্য Uvicorn অথবা Hypercorn. +আপনার একটি ASGI সার্ভারেরও প্রয়োজন হবে, প্রোডাকশনের জন্য Uvicorn অথবা Hypercorn.
diff --git a/docs/de/docs/deployment/manually.md b/docs/de/docs/deployment/manually.md index c8e348aa1..ddc31dc5b 100644 --- a/docs/de/docs/deployment/manually.md +++ b/docs/de/docs/deployment/manually.md @@ -5,7 +5,7 @@ Das Wichtigste, was Sie zum Ausführen einer **FastAPI**-Anwendung auf einer ent Es gibt 3 Hauptalternativen: * Uvicorn: ein hochperformanter ASGI-Server. -* Hypercorn: ein ASGI-Server, der unter anderem mit HTTP/2 und Trio kompatibel ist. +* Hypercorn: ein ASGI-Server, der unter anderem mit HTTP/2 und Trio kompatibel ist. * Daphne: Der für Django Channels entwickelte ASGI-Server. ## Servermaschine und Serverprogramm @@ -43,7 +43,7 @@ Sie können einen ASGI-kompatiblen Server installieren mit: === "Hypercorn" - * Hypercorn, ein ASGI-Server, der auch mit HTTP/2 kompatibel ist. + * Hypercorn, ein ASGI-Server, der auch mit HTTP/2 kompatibel ist.
diff --git a/docs/de/docs/index.md b/docs/de/docs/index.md index 831d96e42..ccc50fd62 100644 --- a/docs/de/docs/index.md +++ b/docs/de/docs/index.md @@ -142,7 +142,7 @@ $ pip install fastapi
-Sie benötigen außerdem einen ASGI-Server. Für die Produktumgebung beispielsweise Uvicorn oder Hypercorn. +Sie benötigen außerdem einen ASGI-Server. Für die Produktumgebung beispielsweise Uvicorn oder Hypercorn.
diff --git a/docs/em/docs/deployment/manually.md b/docs/em/docs/deployment/manually.md index f27b423e2..43cbc9409 100644 --- a/docs/em/docs/deployment/manually.md +++ b/docs/em/docs/deployment/manually.md @@ -5,7 +5,7 @@ 📤 3️⃣ 👑 🎛: * Uvicorn: ↕ 🎭 🔫 💽. -* Hypercorn: 🔫 💽 🔗 ⏮️ 🇺🇸🔍/2️⃣ & 🎻 👪 🎏 ⚒. +* Hypercorn: 🔫 💽 🔗 ⏮️ 🇺🇸🔍/2️⃣ & 🎻 👪 🎏 ⚒. * 👸: 🔫 💽 🏗 ✳ 📻. ## 💽 🎰 & 💽 📋 @@ -43,7 +43,7 @@ === "Hypercorn" - * Hypercorn, 🔫 💽 🔗 ⏮️ 🇺🇸🔍/2️⃣. + * Hypercorn, 🔫 💽 🔗 ⏮️ 🇺🇸🔍/2️⃣.
diff --git a/docs/en/docs/deployment/manually.md b/docs/en/docs/deployment/manually.md index 3baaa8253..51989d819 100644 --- a/docs/en/docs/deployment/manually.md +++ b/docs/en/docs/deployment/manually.md @@ -65,7 +65,7 @@ The main thing you need to run a **FastAPI** application (or any other ASGI appl There are several alternatives, including: * Uvicorn: a high performance ASGI server. -* Hypercorn: an ASGI server compatible with HTTP/2 and Trio among other features. +* Hypercorn: an ASGI server compatible with HTTP/2 and Trio among other features. * Daphne: the ASGI server built for Django Channels. ## Server Machine and Server Program @@ -107,7 +107,7 @@ But you can also install an ASGI server manually: === "Hypercorn" - * Hypercorn, an ASGI server also compatible with HTTP/2. + * Hypercorn, an ASGI server also compatible with HTTP/2.
diff --git a/docs/es/docs/index.md b/docs/es/docs/index.md index 631be7463..5153367dd 100644 --- a/docs/es/docs/index.md +++ b/docs/es/docs/index.md @@ -132,7 +132,7 @@ $ pip install fastapi
-También vas a necesitar un servidor ASGI para producción cómo Uvicorn o Hypercorn. +También vas a necesitar un servidor ASGI para producción cómo Uvicorn o Hypercorn.
diff --git a/docs/fa/docs/index.md b/docs/fa/docs/index.md index 623bc0f75..dfbb8e647 100644 --- a/docs/fa/docs/index.md +++ b/docs/fa/docs/index.md @@ -134,7 +134,7 @@ $ pip install fastapi
-نصب یک سرور پروداکشن نظیر Uvicorn یا Hypercorn نیز جزء نیازمندی‌هاست. +نصب یک سرور پروداکشن نظیر Uvicorn یا Hypercorn نیز جزء نیازمندی‌هاست.
diff --git a/docs/fr/docs/deployment/manually.md b/docs/fr/docs/deployment/manually.md index c53e2db67..eb1253cf8 100644 --- a/docs/fr/docs/deployment/manually.md +++ b/docs/fr/docs/deployment/manually.md @@ -5,7 +5,7 @@ La principale chose dont vous avez besoin pour exécuter une application **FastA Il existe 3 principales alternatives : * Uvicorn : un serveur ASGI haute performance. -* Hypercorn : un serveur +* Hypercorn : un serveur ASGI compatible avec HTTP/2 et Trio entre autres fonctionnalités. * Daphne : le serveur ASGI conçu pour Django Channels. @@ -46,7 +46,7 @@ Vous pouvez installer un serveur compatible ASGI avec : === "Hypercorn" - * Hypercorn, un serveur ASGI également compatible avec HTTP/2. + * Hypercorn, un serveur ASGI également compatible avec HTTP/2.
diff --git a/docs/he/docs/index.md b/docs/he/docs/index.md index 621126128..626578e40 100644 --- a/docs/he/docs/index.md +++ b/docs/he/docs/index.md @@ -138,7 +138,7 @@ $ pip install fastapi
-תצטרכו גם שרת ASGI כגון Uvicorn או Hypercorn. +תצטרכו גם שרת ASGI כגון Uvicorn או Hypercorn.
diff --git a/docs/it/docs/index.md b/docs/it/docs/index.md index c06d3a174..016316a64 100644 --- a/docs/it/docs/index.md +++ b/docs/it/docs/index.md @@ -129,7 +129,7 @@ $ pip install fastapi
-Per il rilascio in produzione, sarà necessario un server ASGI come Uvicorn oppure Hypercorn. +Per il rilascio in produzione, sarà necessario un server ASGI come Uvicorn oppure Hypercorn.
diff --git a/docs/ja/docs/deployment/manually.md b/docs/ja/docs/deployment/manually.md index 67010a66f..449aea31e 100644 --- a/docs/ja/docs/deployment/manually.md +++ b/docs/ja/docs/deployment/manually.md @@ -25,7 +25,7 @@ === "Hypercorn" - * Hypercorn, HTTP/2にも対応しているASGIサーバ。 + * Hypercorn, HTTP/2にも対応しているASGIサーバ。
diff --git a/docs/ja/docs/index.md b/docs/ja/docs/index.md index f95ac060f..2d4daac75 100644 --- a/docs/ja/docs/index.md +++ b/docs/ja/docs/index.md @@ -133,7 +133,7 @@ $ pip install fastapi
-本番環境では、Uvicorn または、 Hypercornのような、 ASGI サーバーが必要になります。 +本番環境では、Uvicorn または、 Hypercornのような、 ASGI サーバーが必要になります。
diff --git a/docs/ko/docs/index.md b/docs/ko/docs/index.md index 4bc92c36c..21dd16f59 100644 --- a/docs/ko/docs/index.md +++ b/docs/ko/docs/index.md @@ -133,7 +133,7 @@ $ pip install fastapi
-프로덕션을 위해 Uvicorn 또는 Hypercorn과 같은 ASGI 서버도 필요할 겁니다. +프로덕션을 위해 Uvicorn 또는 Hypercorn과 같은 ASGI 서버도 필요할 겁니다.
diff --git a/docs/pl/docs/index.md b/docs/pl/docs/index.md index 4bd100f13..83bbe19cf 100644 --- a/docs/pl/docs/index.md +++ b/docs/pl/docs/index.md @@ -132,7 +132,7 @@ $ pip install fastapi
-Na serwerze produkcyjnym będziesz także potrzebował serwera ASGI, np. Uvicorn lub Hypercorn. +Na serwerze produkcyjnym będziesz także potrzebował serwera ASGI, np. Uvicorn lub Hypercorn.
diff --git a/docs/pt/docs/deployment.md b/docs/pt/docs/deployment.md index 2272467fd..d25ea79fd 100644 --- a/docs/pt/docs/deployment.md +++ b/docs/pt/docs/deployment.md @@ -345,7 +345,7 @@ Você apenas precisa instalar um servidor ASGI compatível como: === "Hypercorn" - * Hypercorn, um servidor ASGI também compatível com HTTP/2. + * Hypercorn, um servidor ASGI também compatível com HTTP/2.
diff --git a/docs/pt/docs/index.md b/docs/pt/docs/index.md index 223aeee46..6e7aa21f7 100644 --- a/docs/pt/docs/index.md +++ b/docs/pt/docs/index.md @@ -126,7 +126,7 @@ $ pip install fastapi
-Você também precisará de um servidor ASGI para produção, tal como Uvicorn ou Hypercorn. +Você também precisará de um servidor ASGI para produção, tal como Uvicorn ou Hypercorn.
diff --git a/docs/ru/docs/deployment/manually.md b/docs/ru/docs/deployment/manually.md index a24580489..0b24c0695 100644 --- a/docs/ru/docs/deployment/manually.md +++ b/docs/ru/docs/deployment/manually.md @@ -5,7 +5,7 @@ Существует три наиболее распространённые альтернативы: * Uvicorn: высокопроизводительный ASGI сервер. -* Hypercorn: ASGI сервер, помимо прочего поддерживающий HTTP/2 и Trio. +* Hypercorn: ASGI сервер, помимо прочего поддерживающий HTTP/2 и Trio. * Daphne: ASGI сервер, созданный для Django Channels. ## Сервер как машина и сервер как программа @@ -46,7 +46,7 @@ === "Hypercorn" - * Hypercorn, ASGI сервер, поддерживающий протокол HTTP/2. + * Hypercorn, ASGI сервер, поддерживающий протокол HTTP/2.
diff --git a/docs/ru/docs/index.md b/docs/ru/docs/index.md index 03087448c..d59f45031 100644 --- a/docs/ru/docs/index.md +++ b/docs/ru/docs/index.md @@ -135,7 +135,7 @@ $ pip install fastapi
-Вам также понадобится сервер ASGI для производства, такой как Uvicorn или Hypercorn. +Вам также понадобится сервер ASGI для производства, такой как Uvicorn или Hypercorn.
diff --git a/docs/tr/docs/index.md b/docs/tr/docs/index.md index 4b9c0705d..f7a8cf2a5 100644 --- a/docs/tr/docs/index.md +++ b/docs/tr/docs/index.md @@ -141,7 +141,7 @@ $ pip install fastapi
-Uygulamamızı kullanılabilir hale getirmek için Uvicorn ya da Hypercorn gibi bir ASGI sunucusuna ihtiyacımız olacak. +Uygulamamızı kullanılabilir hale getirmek için Uvicorn ya da Hypercorn gibi bir ASGI sunucusuna ihtiyacımız olacak.
diff --git a/docs/uk/docs/index.md b/docs/uk/docs/index.md index e32389772..29e19025a 100644 --- a/docs/uk/docs/index.md +++ b/docs/uk/docs/index.md @@ -127,7 +127,7 @@ $ pip install fastapi
-Вам також знадобиться сервер ASGI для продакшину, наприклад Uvicorn або Hypercorn. +Вам також знадобиться сервер ASGI для продакшину, наприклад Uvicorn або Hypercorn.
diff --git a/docs/zh/docs/deployment/manually.md b/docs/zh/docs/deployment/manually.md index 15588043f..ca7142613 100644 --- a/docs/zh/docs/deployment/manually.md +++ b/docs/zh/docs/deployment/manually.md @@ -5,7 +5,7 @@ 有 3 个主要可选方案: * Uvicorn:高性能 ASGI 服务器。 -* Hypercorn:与 HTTP/2 和 Trio 等兼容的 ASGI 服务器。 +* Hypercorn:与 HTTP/2 和 Trio 等兼容的 ASGI 服务器。 * Daphne:为 Django Channels 构建的 ASGI 服务器。 ## 服务器主机和服务器程序 @@ -44,7 +44,7 @@ === "Hypercorn" - * Hypercorn,一个也与 HTTP/2 兼容的 ASGI 服务器。 + * Hypercorn,一个也与 HTTP/2 兼容的 ASGI 服务器。
diff --git a/docs/zh/docs/index.md b/docs/zh/docs/index.md index aef3b3a50..f03a0dd13 100644 --- a/docs/zh/docs/index.md +++ b/docs/zh/docs/index.md @@ -138,7 +138,7 @@ $ pip install fastapi
-你还会需要一个 ASGI 服务器,生产环境可以使用 Uvicorn 或者 Hypercorn。 +你还会需要一个 ASGI 服务器,生产环境可以使用 Uvicorn 或者 Hypercorn
From 3a8f6cd1a2fc5a30c853c10b6bb411b62c84e3ee Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 17:07:22 +0000 Subject: [PATCH 097/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 4bc454190..b445e11d6 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -13,6 +13,7 @@ hide: ### Docs +* 📝 Update Hypercorn links in all the docs. PR [#11744](https://github.com/tiangolo/fastapi/pull/11744) by [@kittydoor](https://github.com/kittydoor). * 📝 Update docs with Ariadne reference from Starlette to FastAPI. PR [#11797](https://github.com/tiangolo/fastapi/pull/11797) by [@DamianCzajkowski](https://github.com/DamianCzajkowski). * 📝 Update fastapi instrumentation external link. PR [#11317](https://github.com/tiangolo/fastapi/pull/11317) by [@softwarebloat](https://github.com/softwarebloat). * ✏️ Fix links to alembic example repo in docs. PR [#11628](https://github.com/tiangolo/fastapi/pull/11628) by [@augiwan](https://github.com/augiwan). From 9d74b23670ae7b7fa4ccb5d6cbfea7373ff12dd7 Mon Sep 17 00:00:00 2001 From: gitworkflows <118260833+gitworkflows@users.noreply.github.com> Date: Sun, 14 Jul 2024 23:10:43 +0600 Subject: [PATCH 098/284] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20Simplify=20interna?= =?UTF-8?q?l=20docs=20script=20(#11777)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- scripts/mkdocs_hooks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/mkdocs_hooks.py b/scripts/mkdocs_hooks.py index 8335a13f6..24ffecf46 100644 --- a/scripts/mkdocs_hooks.py +++ b/scripts/mkdocs_hooks.py @@ -39,7 +39,7 @@ def on_config(config: MkDocsConfig, **kwargs: Any) -> MkDocsConfig: lang = dir_path.parent.name if lang in available_langs: config.theme["language"] = lang - if not (config.site_url or "").endswith(f"{lang}/") and not lang == "en": + if not (config.site_url or "").endswith(f"{lang}/") and lang != "en": config.site_url = f"{config.site_url}{lang}/" return config From fb15c48556a44b8bb8cf9dd55000b95813f20bc7 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 17:11:03 +0000 Subject: [PATCH 099/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index b445e11d6..3dac89d7b 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -81,6 +81,7 @@ hide: ### Internal +* ♻️ Simplify internal docs script. PR [#11777](https://github.com/tiangolo/fastapi/pull/11777) by [@gitworkflows](https://github.com/gitworkflows). * 🔧 Update sponsors: add Fine. PR [#11784](https://github.com/tiangolo/fastapi/pull/11784) by [@tiangolo](https://github.com/tiangolo). * 🔧 Tweak sponsors: Kong URL. PR [#11765](https://github.com/tiangolo/fastapi/pull/11765) by [@tiangolo](https://github.com/tiangolo). * 🔧 Tweak sponsors: Kong URL. PR [#11764](https://github.com/tiangolo/fastapi/pull/11764) by [@tiangolo](https://github.com/tiangolo). From 0b1e2ec2a6109fc6db8f8fd216d4843930d4d62a Mon Sep 17 00:00:00 2001 From: Alejandra <90076947+alejsdev@users.noreply.github.com> Date: Sun, 14 Jul 2024 12:27:40 -0500 Subject: [PATCH 100/284] =?UTF-8?q?=E2=9C=8F=EF=B8=8F=20Rewording=20in=20`?= =?UTF-8?q?docs/en/docs/fastapi-cli.md`=20(#11716)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Andres Pineda <1900897+ajpinedam@users.noreply.github.com> Co-authored-by: Sebastián Ramírez --- docs/en/docs/fastapi-cli.md | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/docs/en/docs/fastapi-cli.md b/docs/en/docs/fastapi-cli.md index f5b0a6448..a6facde3a 100644 --- a/docs/en/docs/fastapi-cli.md +++ b/docs/en/docs/fastapi-cli.md @@ -54,9 +54,9 @@ $ fastapi dev Date: Sun, 14 Jul 2024 17:28:03 +0000 Subject: [PATCH 101/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 3dac89d7b..192596210 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -13,6 +13,7 @@ hide: ### Docs +* ✏️ Rewording in `docs/en/docs/fastapi-cli.md`. PR [#11716](https://github.com/tiangolo/fastapi/pull/11716) by [@alejsdev](https://github.com/alejsdev). * 📝 Update Hypercorn links in all the docs. PR [#11744](https://github.com/tiangolo/fastapi/pull/11744) by [@kittydoor](https://github.com/kittydoor). * 📝 Update docs with Ariadne reference from Starlette to FastAPI. PR [#11797](https://github.com/tiangolo/fastapi/pull/11797) by [@DamianCzajkowski](https://github.com/DamianCzajkowski). * 📝 Update fastapi instrumentation external link. PR [#11317](https://github.com/tiangolo/fastapi/pull/11317) by [@softwarebloat](https://github.com/softwarebloat). From 4d3ef06029fec473b2b185da55f6d355d052e1ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 14 Jul 2024 12:46:40 -0500 Subject: [PATCH 102/284] =?UTF-8?q?=E2=9E=96=20Remove=20orjson=20and=20ujs?= =?UTF-8?q?on=20from=20default=20dependencies=20(#11842)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 7 +++++-- docs/en/docs/advanced/custom-response.md | 8 +++++++- docs/en/docs/index.md | 7 +++++-- pyproject.toml | 4 ---- 4 files changed, 17 insertions(+), 9 deletions(-) diff --git a/README.md b/README.md index ea722d57a..e344f97ad 100644 --- a/README.md +++ b/README.md @@ -468,12 +468,15 @@ Used by Starlette: Used by FastAPI / Starlette: * uvicorn - for the server that loads and serves your application. -* orjson - Required if you want to use `ORJSONResponse`. -* ujson - Required if you want to use `UJSONResponse`. * `fastapi-cli` - to provide the `fastapi` command. When you install `fastapi` it comes these standard dependencies. +Additional optional dependencies: + +* orjson - Required if you want to use `ORJSONResponse`. +* ujson - Required if you want to use `UJSONResponse`. + ## `fastapi-slim` If you don't want the extra standard optional dependencies, install `fastapi-slim` instead. diff --git a/docs/en/docs/advanced/custom-response.md b/docs/en/docs/advanced/custom-response.md index 45c7c7bd5..1d12173a1 100644 --- a/docs/en/docs/advanced/custom-response.md +++ b/docs/en/docs/advanced/custom-response.md @@ -39,7 +39,7 @@ But if you are certain that the content that you are returning is **serializable And it will be documented as such in OpenAPI. !!! tip - The `ORJSONResponse` is currently only available in FastAPI, not in Starlette. + The `ORJSONResponse` is only available in FastAPI, not in Starlette. ## HTML Response @@ -149,10 +149,16 @@ This is the default response used in **FastAPI**, as you read above. A fast alternative JSON response using `orjson`, as you read above. +!!! info + This requires installing `orjson` for example with `pip install orjson`. + ### `UJSONResponse` An alternative JSON response using `ujson`. +!!! info + This requires installing `ujson` for example with `pip install ujson`. + !!! warning `ujson` is less careful than Python's built-in implementation in how it handles some edge-cases. diff --git a/docs/en/docs/index.md b/docs/en/docs/index.md index 434c70893..8b54f175f 100644 --- a/docs/en/docs/index.md +++ b/docs/en/docs/index.md @@ -466,12 +466,15 @@ Used by Starlette: Used by FastAPI / Starlette: * uvicorn - for the server that loads and serves your application. -* orjson - Required if you want to use `ORJSONResponse`. -* ujson - Required if you want to use `UJSONResponse`. * `fastapi-cli` - to provide the `fastapi` command. When you install `fastapi` it comes these standard dependencies. +Additional optional dependencies: + +* orjson - Required if you want to use `ORJSONResponse`. +* ujson - Required if you want to use `UJSONResponse`. + ## `fastapi-slim` If you don't want the extra standard optional dependencies, install `fastapi-slim` instead. diff --git a/pyproject.toml b/pyproject.toml index a79845646..dbaa42149 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -61,10 +61,6 @@ standard = [ "jinja2 >=2.11.2", # For forms and file uploads "python-multipart >=0.0.7", - # For UJSONResponse - "ujson >=4.0.1,!=4.0.2,!=4.1.0,!=4.2.0,!=4.3.0,!=5.0.0,!=5.1.0", - # For ORJSONResponse - "orjson >=3.2.1", # To validate email fields "email_validator >=2.0.0", # Uvicorn with uvloop From 0f22c76d7d27790803c036ef66124c68e1b44dd3 Mon Sep 17 00:00:00 2001 From: github-actions Date: Sun, 14 Jul 2024 17:47:04 +0000 Subject: [PATCH 103/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 192596210..6a08a1e5d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Upgrades +* ➖ Remove orjson and ujson from default dependencies. PR [#11842](https://github.com/tiangolo/fastapi/pull/11842) by [@tiangolo](https://github.com/tiangolo). * 📝 Restored Swagger-UI links to use the latest version possible. PR [#11459](https://github.com/tiangolo/fastapi/pull/11459) by [@UltimateLobster](https://github.com/UltimateLobster). ### Docs From 38db0a585870e14b7561c8ac420f2ede3564e995 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 14 Jul 2024 12:53:37 -0500 Subject: [PATCH 104/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 6a08a1e5d..f9dc1d71d 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,7 +9,8 @@ hide: ### Upgrades -* ➖ Remove orjson and ujson from default dependencies. PR [#11842](https://github.com/tiangolo/fastapi/pull/11842) by [@tiangolo](https://github.com/tiangolo). +* ➖ Remove `orjson` and `ujson` from default dependencies. PR [#11842](https://github.com/tiangolo/fastapi/pull/11842) by [@tiangolo](https://github.com/tiangolo). + * These dependencies are still installed when you install with `pip install "fastapi[all]"`. But they not included in `pip install fastapi`. * 📝 Restored Swagger-UI links to use the latest version possible. PR [#11459](https://github.com/tiangolo/fastapi/pull/11459) by [@UltimateLobster](https://github.com/UltimateLobster). ### Docs From b1993642461031bac9d21dd87e7faf59f19049f6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sun, 14 Jul 2024 12:54:20 -0500 Subject: [PATCH 105/284] =?UTF-8?q?=F0=9F=94=96=20Release=20version=200.11?= =?UTF-8?q?1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 2 ++ fastapi/__init__.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f9dc1d71d..3734f3482 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,8 @@ hide: ## Latest Changes +## 0.111.1 + ### Upgrades * ➖ Remove `orjson` and `ujson` from default dependencies. PR [#11842](https://github.com/tiangolo/fastapi/pull/11842) by [@tiangolo](https://github.com/tiangolo). diff --git a/fastapi/__init__.py b/fastapi/__init__.py index 04305ad8b..4d60bc7de 100644 --- a/fastapi/__init__.py +++ b/fastapi/__init__.py @@ -1,6 +1,6 @@ """FastAPI framework, high performance, easy to learn, fast to code, ready for production""" -__version__ = "0.111.0" +__version__ = "0.111.1" from starlette import status as status From 4c0c05c9446d23b67fc22cc715bc62908173bd43 Mon Sep 17 00:00:00 2001 From: Lucas Balieiro <37416577+lucasbalieiro@users.noreply.github.com> Date: Mon, 15 Jul 2024 14:46:51 -0400 Subject: [PATCH 106/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/reference/apirouter.md`=20(#11843)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/reference/apirouter.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 docs/pt/docs/reference/apirouter.md diff --git a/docs/pt/docs/reference/apirouter.md b/docs/pt/docs/reference/apirouter.md new file mode 100644 index 000000000..7568601c9 --- /dev/null +++ b/docs/pt/docs/reference/apirouter.md @@ -0,0 +1,24 @@ +# Classe `APIRouter` + +Aqui está a informação de referência para a classe `APIRouter`, com todos os seus parâmetros, atributos e métodos. + +Você pode importar a classe `APIRouter` diretamente do `fastapi`: + +```python +from fastapi import APIRouter +``` + +::: fastapi.APIRouter + options: + members: + - websocket + - include_router + - get + - put + - post + - delete + - options + - head + - patch + - trace + - on_event From 67ed86cb7f788516c2dc1e0b7d800e4ae8a531d6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 15 Jul 2024 18:47:15 +0000 Subject: [PATCH 107/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 3734f3482..83c7ad188 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Translations + +* 🌐 Add Portuguese translation for `docs/pt/docs/reference/apirouter.md`. PR [#11843](https://github.com/tiangolo/fastapi/pull/11843) by [@lucasbalieiro](https://github.com/lucasbalieiro). + ## 0.111.1 ### Upgrades From 7bbddf012c2f5dc3781d9331ee9fec9f718efa94 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 16 Jul 2024 21:12:29 -0500 Subject: [PATCH 108/284] =?UTF-8?q?=F0=9F=94=A8=20Update=20docs=20Termynal?= =?UTF-8?q?=20scripts=20to=20not=20include=20line=20nums=20for=20local=20d?= =?UTF-8?q?ev=20(#11854)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/css/custom.css | 4 ++++ docs/en/docs/js/custom.js | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/en/docs/css/custom.css b/docs/en/docs/css/custom.css index 386aa9d7e..b192f6123 100644 --- a/docs/en/docs/css/custom.css +++ b/docs/en/docs/css/custom.css @@ -13,6 +13,10 @@ white-space: pre-wrap; } +.termy .linenos { + display: none; +} + a.external-link { /* For right to left languages */ direction: ltr; diff --git a/docs/en/docs/js/custom.js b/docs/en/docs/js/custom.js index 8e3be4c13..0008db49e 100644 --- a/docs/en/docs/js/custom.js +++ b/docs/en/docs/js/custom.js @@ -35,7 +35,7 @@ function setupTermynal() { function createTermynals() { document - .querySelectorAll(`.${termynalActivateClass} .highlight`) + .querySelectorAll(`.${termynalActivateClass} .highlight code`) .forEach(node => { const text = node.textContent; const lines = text.split("\n"); From 84f04cc8a048bd7cead9c1acff53d4479889c9c1 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 17 Jul 2024 02:13:04 +0000 Subject: [PATCH 109/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 83c7ad188..405a7922c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -11,6 +11,10 @@ hide: * 🌐 Add Portuguese translation for `docs/pt/docs/reference/apirouter.md`. PR [#11843](https://github.com/tiangolo/fastapi/pull/11843) by [@lucasbalieiro](https://github.com/lucasbalieiro). +### Internal + +* 🔨 Update docs Termynal scripts to not include line nums for local dev. PR [#11854](https://github.com/tiangolo/fastapi/pull/11854) by [@tiangolo](https://github.com/tiangolo). + ## 0.111.1 ### Upgrades From 9230978aae7513a31b9e6e772bf4397f519c81b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Wed, 17 Jul 2024 17:36:02 -0500 Subject: [PATCH 110/284] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors:=20rem?= =?UTF-8?q?ove=20TalkPython=20(#11861)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - docs/en/data/sponsors.yml | 3 --- 2 files changed, 4 deletions(-) diff --git a/README.md b/README.md index e344f97ad..48ab9d1a5 100644 --- a/README.md +++ b/README.md @@ -58,7 +58,6 @@ The key features are: - diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index d6dfd5d0e..9b6539adf 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -36,9 +36,6 @@ gold: title: "Fine's AI FastAPI Workflow: Effortlessly Deploy and Integrate FastAPI into Your Project" img: https://fastapi.tiangolo.com/img/sponsors/fine.png silver: - - url: https://training.talkpython.fm/fastapi-courses - title: FastAPI video courses on demand from people you trust - img: https://fastapi.tiangolo.com/img/sponsors/talkpython-v2.jpg - url: https://github.com/deepset-ai/haystack/ title: Build powerful search from composable, open source building blocks img: https://fastapi.tiangolo.com/img/sponsors/haystack-fastapi.svg From 15130a3eb5080d8d457752a502167ddd44d79156 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 17 Jul 2024 22:37:18 +0000 Subject: [PATCH 111/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 405a7922c..9ec295be5 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -13,6 +13,7 @@ hide: ### Internal +* 🔧 Update sponsors: remove TalkPython. PR [#11861](https://github.com/tiangolo/fastapi/pull/11861) by [@tiangolo](https://github.com/tiangolo). * 🔨 Update docs Termynal scripts to not include line nums for local dev. PR [#11854](https://github.com/tiangolo/fastapi/pull/11854) by [@tiangolo](https://github.com/tiangolo). ## 0.111.1 From a5fbbeeb61d8b197a7a52f4d3536d2ef508d231c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jo=C3=A3o=20Pedro=20Pereira=20Holanda?= Date: Thu, 18 Jul 2024 17:13:18 -0300 Subject: [PATCH 112/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/tutorial/dependencies/dependencies?= =?UTF-8?q?-with-yield.md`=20(#11848)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../dependencies/dependencies-with-yield.md | 349 ++++++++++++++++++ 1 file changed, 349 insertions(+) create mode 100644 docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md diff --git a/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md b/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md new file mode 100644 index 000000000..8b4175fc5 --- /dev/null +++ b/docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md @@ -0,0 +1,349 @@ +# Dependências com yield + +O FastAPI possui suporte para dependências que realizam alguns passos extras ao finalizar. + +Para fazer isso, utilize `yield` em vez de `return`, e escreva os passos extras (código) depois. + +!!! tip "Dica" + Garanta que `yield` é utilizado apenas uma vez. + +!!! note "Detalhes Técnicos" + Qualquer função que possa ser utilizada com: + + * `@contextlib.contextmanager` ou + * `@contextlib.asynccontextmanager` + + pode ser utilizada como uma dependência do **FastAPI**. + + Na realidade, o FastAPI utiliza esses dois decoradores internamente. + +## Uma dependência de banco de dados com `yield` + +Por exemplo, você poderia utilizar isso para criar uma sessão do banco de dados, e fechá-la após terminar sua operação. + +Apenas o código anterior a declaração com `yield` e o código contendo essa declaração são executados antes de criar uma resposta. + +```Python hl_lines="2-4" +{!../../../docs_src/dependencies/tutorial007.py!} +``` + +O valor gerado (yielded) é o que é injetado nas *operações de rota* e outras dependências. + +```Python hl_lines="4" +{!../../../docs_src/dependencies/tutorial007.py!} +``` + +O código após o `yield` é executado após a resposta ser entregue: + +```Python hl_lines="5-6" +{!../../../docs_src/dependencies/tutorial007.py!} +``` + +!!! tip "Dica" + Você pode usar funções assíncronas (`async`) ou funções comuns. + + O **FastAPI** saberá o que fazer com cada uma, da mesma forma que as dependências comuns. + +## Uma dependência com `yield` e `try` + +Se você utilizar um bloco `try` em uma dependência com `yield`, você irá capturar qualquer exceção que for lançada enquanto a dependência é utilizada. + +Por exemplo, se algum código em um certo momento no meio da operação, em outra dependência ou em uma *operação de rota*, fizer um "rollback" de uma transação de banco de dados ou causar qualquer outro erro, você irá capturar a exceção em sua dependência. + +Então, você pode procurar por essa exceção específica dentro da dependência com `except AlgumaExcecao`. + +Da mesma forma, você pode utilizar `finally` para garantir que os passos de saída são executados, com ou sem exceções. + +```python hl_lines="3 5" +{!../../../docs_src/dependencies/tutorial007.py!} +``` + +## Subdependências com `yield` + +Você pode ter subdependências e "árvores" de subdependências de qualquer tamanho e forma, e qualquer uma ou todas elas podem utilizar `yield`. + +O **FastAPI** garantirá que o "código de saída" em cada dependência com `yield` é executado na ordem correta. + +Por exemplo, `dependency_c` pode depender de `dependency_b`, e `dependency_b` depender de `dependency_a`: + +=== "python 3.9+" + + ```python hl_lines="6 14 22" + {!> ../../../docs_src/dependencies/tutorial008_an_py39.py!} + ``` + +=== "python 3.8+" + + ```python hl_lines="5 13 21" + {!> ../../../docs_src/dependencies/tutorial008_an.py!} + ``` + +=== "python 3.8+ non-annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```python hl_lines="4 12 20" + {!> ../../../docs_src/dependencies/tutorial008.py!} + ``` + +E todas elas podem utilizar `yield`. + +Neste caso, `dependency_c` precisa que o valor de `dependency_b` (nomeada de `dep_b` aqui) continue disponível para executar seu código de saída. + +E, por outro lado, `dependency_b` precisa que o valor de `dependency_a` (nomeada de `dep_a`) continue disponível para executar seu código de saída. + +=== "python 3.9+" + + ```python hl_lines="18-19 26-27" + {!> ../../../docs_src/dependencies/tutorial008_an_py39.py!} + ``` + +=== "python 3.8+" + + ```python hl_lines="17-18 25-26" + {!> ../../../docs_src/dependencies/tutorial008_an.py!} + ``` + +=== "python 3.8+ non-annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```python hl_lines="16-17 24-25" + {!> ../../../docs_src/dependencies/tutorial008.py!} + ``` + +Da mesma forma, você pode ter algumas dependências com `yield` e outras com `return` e ter uma relação de dependência entre algumas dos dois tipos. + +E você poderia ter uma única dependência que precisa de diversas outras dependências com `yield`, etc. + +Você pode ter qualquer combinação de dependências que você quiser. + +O **FastAPI** se encarrega de executá-las na ordem certa. + +!!! note "Detalhes Técnicos" + Tudo isso funciona graças aos gerenciadores de contexto do Python. + + O **FastAPI** utiliza eles internamente para alcançar isso. + +## Dependências com `yield` e `httpexception` + +Você viu que dependências podem ser utilizadas com `yield` e podem incluir blocos `try` para capturar exceções. + +Da mesma forma, você pode lançar uma `httpexception` ou algo parecido no código de saída, após o `yield` + +!!! tip "Dica" + + Essa é uma técnica relativamente avançada, e na maioria dos casos você não precisa dela totalmente, já que você pode lançar exceções (incluindo `httpexception`) dentro do resto do código da sua aplicação, por exemplo, em uma *função de operação de rota*. + + Mas ela existe para ser utilizada caso você precise. 🤓 + +=== "python 3.9+" + + ```python hl_lines="18-22 31" + {!> ../../../docs_src/dependencies/tutorial008b_an_py39.py!} + ``` + +=== "python 3.8+" + + ```python hl_lines="17-21 30" + {!> ../../../docs_src/dependencies/tutorial008b_an.py!} + ``` + +=== "python 3.8+ non-annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```python hl_lines="16-20 29" + {!> ../../../docs_src/dependencies/tutorial008b.py!} + ``` + +Uma alternativa que você pode utilizar para capturar exceções (e possivelmente lançar outra HTTPException) é criar um [Manipulador de Exceções Customizado](../handling-errors.md#instalando-manipuladores-de-excecoes-customizados){.internal-link target=_blank}. + +## Dependências com `yield` e `except` + +Se você capturar uma exceção com `except` em uma dependência que utilize `yield` e ela não for levantada novamente (ou uma nova exceção for levantada), o FastAPI não será capaz de identifcar que houve uma exceção, da mesma forma que aconteceria com Python puro: + +=== "Python 3.9+" + + ```Python hl_lines="15-16" + {!> ../../../docs_src/dependencies/tutorial008c_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="14-15" + {!> ../../../docs_src/dependencies/tutorial008c_an.py!} + ``` + +=== "Python 3.8+ non-annotated" + + !!! tip "dica" + utilize a versão com `Annotated` se possível. + + ```Python hl_lines="13-14" + {!> ../../../docs_src/dependencies/tutorial008c.py!} + ``` + +Neste caso, o cliente irá ver uma resposta *HTTP 500 Internal Server Error* como deveria acontecer, já que não estamos levantando nenhuma `HTTPException` ou coisa parecida, mas o servidor **não terá nenhum log** ou qualquer outra indicação de qual foi o erro. 😱 + +### Sempre levante (`raise`) exceções em Dependências com `yield` e `except` + +Se você capturar uma exceção em uma dependência com `yield`, a menos que você esteja levantando outra `HTTPException` ou coisa parecida, você deveria relançar a exceção original. + +Você pode relançar a mesma exceção utilizando `raise`: + +=== "Python 3.9+" + + ```Python hl_lines="17" + {!> ../../../docs_src/dependencies/tutorial008d_an_py39.py!} + ``` + +=== "Python 3.8+" + + ```Python hl_lines="16" + {!> ../../../docs_src/dependencies/tutorial008d_an.py!} + ``` + +=== "python 3.8+ non-annotated" + + !!! tip "Dica" + Utilize a versão com `Annotated` se possível. + + ```Python hl_lines="15" + {!> ../../../docs_src/dependencies/tutorial008d.py!} + ``` + +Agora o cliente irá receber a mesma resposta *HTTP 500 Internal Server Error*, mas o servidor terá nosso `InternalError` personalizado nos logs. 😎 + +## Execução de dependências com `yield` + +A sequência de execução é mais ou menos como esse diagrama. O tempo passa do topo para baixo. E cada coluna é uma das partes interagindo ou executando código. + +```mermaid +sequenceDiagram + +participant client as Cliente +participant handler as Manipulador de exceções +participant dep as Dep com yield +participant operation as Operação de Rota +participant tasks as Tarefas de Background + + Note over client,operation: pode lançar exceções, incluindo HTTPException + client ->> dep: Iniciar requisição + Note over dep: Executar código até o yield + opt lançar Exceção + dep -->> handler: lançar Exceção + handler -->> client: resposta de erro HTTP + end + dep ->> operation: Executar dependência, e.g. sessão de BD + opt raise + operation -->> dep: Lançar exceção (e.g. HTTPException) + opt handle + dep -->> dep: Pode capturar exceções, lançar uma nova HTTPException, lançar outras exceções + end + handler -->> client: resposta de erro HTTP + end + + operation ->> client: Retornar resposta ao cliente + Note over client,operation: Resposta já foi enviada, e não pode ser modificada + opt Tarefas + operation -->> tasks: Enviar tarefas de background + end + opt Lançar outra exceção + tasks -->> tasks: Manipula exceções no código da tarefa de background + end +``` + +!!! info "Informação" + Apenas **uma resposta** será enviada para o cliente. Ela pode ser uma das respostas de erro, ou então a resposta da *operação de rota*. + + Após uma dessas respostas ser enviada, nenhuma outra resposta pode ser enviada + +!!! tip "Dica" + Esse diagrama mostra `HttpException`, mas você pode levantar qualquer outra exceção que você capture em uma dependência com `yield` ou um [Manipulador de exceções personalizado](../handling-errors.md#instalando-manipuladores-de-excecoes-customizados){.internal-link target=_blank}. + + Se você lançar qualquer exceção, ela será passada para as dependências com yield, inlcuindo a `HTTPException`. Na maioria dos casos você vai querer relançar essa mesma exceção ou uma nova a partir da dependência com `yield` para garantir que ela seja tratada adequadamente. + +## Dependências com `yield`, `HTTPException`, `except` e Tarefas de Background + +!!! warning "Aviso" + Você provavelmente não precisa desses detalhes técnicos, você pode pular essa seção e continuar na próxima seção abaixo. + + Esses detalhes são úteis principalmente se você estiver usando uma versão do FastAPI anterior à 0.106.0 e utilizando recursos de dependências com `yield` em tarefas de background. + +### Dependências com `yield` e `except`, Detalhes Técnicos + +Antes do FastAPI 0.110.0, se você utilizasse uma dependência com `yield`, e então capturasse uma dependência com `except` nessa dependência, caso a exceção não fosse relançada, ela era automaticamente lançada para qualquer manipulador de exceções ou o manipulador de erros interno do servidor. + +Isso foi modificado na versão 0.110.0 para consertar o consumo de memória não controlado das exceções relançadas automaticamente sem um manipulador (erros internos do servidor), e para manter o comportamento consistente com o código Python tradicional. + +### Tarefas de Background e Dependências com `yield`, Detalhes Técnicos + +Antes do FastAPI 0.106.0, levantar exceções após um `yield` não era possível, o código de saída nas dependências com `yield` era executado *após* a resposta ser enviada, então os [Manipuladores de Exceções](../handling-errors.md#instalando-manipuladores-de-excecoes-customizados){.internal-link target=_blank} já teriam executado. + +Isso foi implementado dessa forma principalmente para permitir que os mesmos objetos fornecidos ("yielded") pelas dependências dentro de tarefas de background fossem reutilizados, por que o código de saída era executado antes das tarefas de background serem finalizadas. + +Ainda assim, como isso exigiria esperar que a resposta navegasse pela rede enquanto mantia ativo um recurso desnecessário na dependência com yield (por exemplo, uma conexão com banco de dados), isso mudou na versão 0.106.0 do FastAPI. + +!!! tip "Dica" + + Adicionalmente, uma tarefa de background é, normalmente, um conjunto de lógicas independentes que devem ser manipuladas separadamente, com seus próprios recursos (e.g. sua própria conexão com banco de dados). + + Então, dessa forma você provavelmente terá um código mais limpo. + +Se você costumava depender desse comportamento, agora você precisa criar os recursos para uma tarefa de background dentro dela mesma, e usar internamente apenas dados que não dependam de recursos de dependências com `yield`. + +Por exemplo, em vez de utilizar a mesma sessão do banco de dados, você criaria uma nova sessão dentro da tarefa de background, e você obteria os objetos do banco de dados utilizando essa nova sessão. E então, em vez de passar o objeto obtido do banco de dados como um parâmetro para a função da tarefa de background, você passaria o ID desse objeto e buscaria ele novamente dentro da função da tarefa de background. + +## Gerenciadores de contexto + +### O que são gerenciadores de contexto + +"Gerenciadores de Contexto" são qualquer um dos objetos Python que podem ser utilizados com a declaração `with`. + +Por exemplo, você pode utilizar `with` para ler um arquivo: + +```Python +with open("./somefile.txt") as f: + contents = f.read() + print(contents) +``` + +Por baixo dos panos, o código `open("./somefile.txt")` cria um objeto que é chamado de "Gerenciador de Contexto". + +Quando o bloco `with` finaliza, ele se certifica de fechar o arquivo, mesmo que tenha ocorrido alguma exceção. + +Quando você cria uma dependência com `yield`, o **FastAPI** irá criar um gerenciador de contexto internamente para ela, e combiná-lo com algumas outras ferramentas relacionadas. + +### Utilizando gerenciadores de contexto em dependências com `yield` + +!!! warning "Aviso" + Isso é uma ideia mais ou menos "avançada". + + Se você está apenas iniciando com o **FastAPI** você pode querer pular isso por enquanto. + +Em python, você pode criar Gerenciadores de Contexto ao criar uma classe com dois métodos: `__enter__()` e `__exit__()`. + +Você também pode usá-los dentro de dependências com `yield` do **FastAPI** ao utilizar `with` ou `async with` dentro da função da dependência: + +```Python hl_lines="1-9 13" +{!../../../docs_src/dependencies/tutorial010.py!} +``` + +!!! tip "Dica" + Outra forma de criar um gerenciador de contexto é utilizando: + + * `@contextlib.contextmanager` ou + + * `@contextlib.asynccontextmanager` + + Para decorar uma função com um único `yield`. + + Isso é o que o **FastAPI** usa internamente para dependências com `yield`. + + Mas você não precisa usar esses decoradores para as dependências do FastAPI (e você não deveria). + + O FastAPI irá fazer isso para você internamente. From 4592223c869f0d092b7270593ff3d32113539b14 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 18 Jul 2024 20:13:42 +0000 Subject: [PATCH 113/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 9ec295be5..31654d0ba 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#11848](https://github.com/tiangolo/fastapi/pull/11848) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/reference/apirouter.md`. PR [#11843](https://github.com/tiangolo/fastapi/pull/11843) by [@lucasbalieiro](https://github.com/lucasbalieiro). ### Internal From 3898fa88f29a52a57889cf6134fb3d955ee6c1b2 Mon Sep 17 00:00:00 2001 From: Lucas Balieiro <37416577+lucasbalieiro@users.noreply.github.com> Date: Thu, 18 Jul 2024 16:15:21 -0400 Subject: [PATCH 114/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/reference/background.md`=20(#11849?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/pt/docs/reference/background.md | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 docs/pt/docs/reference/background.md diff --git a/docs/pt/docs/reference/background.md b/docs/pt/docs/reference/background.md new file mode 100644 index 000000000..bfc15aa76 --- /dev/null +++ b/docs/pt/docs/reference/background.md @@ -0,0 +1,11 @@ +# Tarefas em Segundo Plano - `BackgroundTasks` + +Você pode declarar um parâmetro em uma *função de operação de rota* ou em uma função de dependência com o tipo `BackgroundTasks`, e então utilizá-lo para agendar a execução de tarefas em segundo plano após o envio da resposta. + +Você pode importá-lo diretamente do `fastapi`: + +```python +from fastapi import BackgroundTasks +``` + +::: fastapi.BackgroundTasks From cd6e9db0653eabbf0fb14908c73939a11a131058 Mon Sep 17 00:00:00 2001 From: github-actions Date: Thu, 18 Jul 2024 20:18:17 +0000 Subject: [PATCH 115/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 31654d0ba..f32bff241 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -9,6 +9,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/reference/background.md`. PR [#11849](https://github.com/tiangolo/fastapi/pull/11849) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#11848](https://github.com/tiangolo/fastapi/pull/11848) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/reference/apirouter.md`. PR [#11843](https://github.com/tiangolo/fastapi/pull/11843) by [@lucasbalieiro](https://github.com/lucasbalieiro). From b80a2590f807a9261a1863bf194e3d94a4e583ce Mon Sep 17 00:00:00 2001 From: Nolan Di Mare Sullivan Date: Mon, 22 Jul 2024 21:37:30 +0100 Subject: [PATCH 116/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20Speakeasy=20URL?= =?UTF-8?q?=20(#11871)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Sebastián Ramírez --- README.md | 2 +- docs/de/docs/advanced/generate-clients.md | 2 +- docs/en/data/sponsors.yml | 2 +- docs/en/docs/advanced/generate-clients.md | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 48ab9d1a5..2bcccbe3b 100644 --- a/README.md +++ b/README.md @@ -60,7 +60,7 @@ The key features are: - + diff --git a/docs/de/docs/advanced/generate-clients.md b/docs/de/docs/advanced/generate-clients.md index 7d1d69353..d69437954 100644 --- a/docs/de/docs/advanced/generate-clients.md +++ b/docs/de/docs/advanced/generate-clients.md @@ -20,7 +20,7 @@ Einige von diesen ✨ [**sponsern FastAPI**](../help-fastapi.md#den-autor-sponse 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. 🙇 -Beispielsweise könnten Sie Speakeasy ausprobieren. +Beispielsweise könnten Sie Speakeasy ausprobieren. Es gibt auch mehrere andere Unternehmen, welche ähnliche Dienste anbieten und die Sie online suchen und finden können. 🤓 diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 9b6539adf..7fad270da 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -42,7 +42,7 @@ silver: - url: https://databento.com/ title: Pay as you go for market data img: https://fastapi.tiangolo.com/img/sponsors/databento.svg - - url: https://speakeasyapi.dev?utm_source=fastapi+repo&utm_medium=github+sponsorship + - url: https://speakeasy.com?utm_source=fastapi+repo&utm_medium=github+sponsorship title: SDKs for your API | Speakeasy img: https://fastapi.tiangolo.com/img/sponsors/speakeasy.png - url: https://www.svix.com/ diff --git a/docs/en/docs/advanced/generate-clients.md b/docs/en/docs/advanced/generate-clients.md index 09d00913f..136ddb064 100644 --- a/docs/en/docs/advanced/generate-clients.md +++ b/docs/en/docs/advanced/generate-clients.md @@ -20,7 +20,7 @@ Some of them also ✨ [**sponsor FastAPI**](../help-fastapi.md#sponsor-the-autho And it shows their true commitment to FastAPI and its **community** (you), as they not only want to provide you a **good service** but also want to make sure you have a **good and healthy framework**, FastAPI. 🙇 -For example, you might want to try Speakeasy and Stainless. +For example, you might want to try Speakeasy and Stainless. There are also several other companies offering similar services that you can search and find online. 🤓 From 360f4966a6ca96c95f2e504f5841e0b895f2a9d6 Mon Sep 17 00:00:00 2001 From: github-actions Date: Mon, 22 Jul 2024 20:37:50 +0000 Subject: [PATCH 117/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index f32bff241..7872e2fbe 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -7,6 +7,10 @@ hide: ## Latest Changes +### Docs + +* 📝 Update Speakeasy URL. PR [#11871](https://github.com/tiangolo/fastapi/pull/11871) by [@ndimares](https://github.com/ndimares). + ### Translations * 🌐 Add Portuguese translation for `docs/pt/docs/reference/background.md`. PR [#11849](https://github.com/tiangolo/fastapi/pull/11849) by [@lucasbalieiro](https://github.com/lucasbalieiro). From 480f9285997bca3e65793a4a8af178393420c3d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Tue, 23 Jul 2024 14:36:22 -0500 Subject: [PATCH 118/284] =?UTF-8?q?=F0=9F=94=A7=20Update=20sponsors,=20rem?= =?UTF-8?q?ove=20Reflex=20(#11875)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 - docs/en/data/sponsors.yml | 3 --- docs/en/overrides/main.html | 6 ------ 3 files changed, 10 deletions(-) diff --git a/README.md b/README.md index 2bcccbe3b..c0422ead8 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,6 @@ The key features are: - diff --git a/docs/en/data/sponsors.yml b/docs/en/data/sponsors.yml index 7fad270da..39654a361 100644 --- a/docs/en/data/sponsors.yml +++ b/docs/en/data/sponsors.yml @@ -11,9 +11,6 @@ gold: - url: https://bump.sh/fastapi?utm_source=fastapi&utm_medium=referral&utm_campaign=sponsor title: Automate FastAPI documentation generation with Bump.sh img: https://fastapi.tiangolo.com/img/sponsors/bump-sh.svg - - url: https://reflex.dev - title: Reflex - img: https://fastapi.tiangolo.com/img/sponsors/reflex.png - url: https://github.com/scalar/scalar/?utm_source=fastapi&utm_medium=website&utm_campaign=main-badge title: "Scalar: Beautiful Open-Source API References from Swagger/OpenAPI files" img: https://fastapi.tiangolo.com/img/sponsors/scalar.svg diff --git a/docs/en/overrides/main.html b/docs/en/overrides/main.html index ae8ea5667..d647a8df4 100644 --- a/docs/en/overrides/main.html +++ b/docs/en/overrides/main.html @@ -46,12 +46,6 @@
-
From cd86c72ed6087943e362040c4fcbf056e57cb89d Mon Sep 17 00:00:00 2001 From: github-actions Date: Tue, 23 Jul 2024 19:36:46 +0000 Subject: [PATCH 119/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 7872e2fbe..962db1395 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -19,6 +19,7 @@ hide: ### Internal +* 🔧 Update sponsors, remove Reflex. PR [#11875](https://github.com/tiangolo/fastapi/pull/11875) by [@tiangolo](https://github.com/tiangolo). * 🔧 Update sponsors: remove TalkPython. PR [#11861](https://github.com/tiangolo/fastapi/pull/11861) by [@tiangolo](https://github.com/tiangolo). * 🔨 Update docs Termynal scripts to not include line nums for local dev. PR [#11854](https://github.com/tiangolo/fastapi/pull/11854) by [@tiangolo](https://github.com/tiangolo). From 4b4c48ecff0eb8feff2f3086d1615c84882ad463 Mon Sep 17 00:00:00 2001 From: Rafael de Oliveira Marques Date: Wed, 24 Jul 2024 17:39:07 -0300 Subject: [PATCH 120/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Portuguese=20trans?= =?UTF-8?q?lation=20for=20`docs/pt/docs/advanced/response-change-status-co?= =?UTF-8?q?de.md`=20(#11863)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../advanced/response-change-status-code.md | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 docs/pt/docs/advanced/response-change-status-code.md diff --git a/docs/pt/docs/advanced/response-change-status-code.md b/docs/pt/docs/advanced/response-change-status-code.md new file mode 100644 index 000000000..99695c831 --- /dev/null +++ b/docs/pt/docs/advanced/response-change-status-code.md @@ -0,0 +1,33 @@ +# Retorno - Altere o Código de Status + +Você provavelmente leu anteriormente que você pode definir um [Código de Status do Retorno](../tutorial/response-status-code.md){.internal-link target=_blank} padrão. + +Porém em alguns casos você precisa retornar um código de status diferente do padrão. + +## Caso de uso + +Por exemplo, imagine que você deseja retornar um código de status HTTP de "OK" `200` por padrão. + +Mas se o dado não existir, você quer criá-lo e retornar um código de status HTTP de "CREATED" `201`. + +Mas você ainda quer ser capaz de filtrar e converter o dado que você retornará com um `response_model`. + +Para estes casos, você pode utilizar um parâmetro `Response`. + +## Use um parâmetro `Response` + +Você pode declarar um parâmetro do tipo `Response` em sua *função de operação de rota* (assim como você pode fazer para cookies e headers). + +E então você pode definir o `status_code` neste objeto de retorno temporal. + +```Python hl_lines="1 9 12" +{!../../../docs_src/response_change_status_code/tutorial001.py!} +``` + +E então você pode retornar qualquer objeto que você precise, como você faria normalmente (um `dict`, um modelo de banco de dados, etc.). + +E se você declarar um `response_model`, ele ainda será utilizado para filtrar e converter o objeto que você retornou. + +O **FastAPI** utilizará este retorno *temporal* para extrair o código de status (e também cookies e headers), e irá colocá-los no retorno final que contém o valor que você retornou, filtrado por qualquer `response_model`. + +Você também pode declarar o parâmetro `Response` nas dependências, e definir o código de status nelas. Mas lembre-se que o último que for definido é o que prevalecerá. From 386a6796abb445d04e65c729dbb7fcc4a4775b96 Mon Sep 17 00:00:00 2001 From: github-actions Date: Wed, 24 Jul 2024 20:39:30 +0000 Subject: [PATCH 121/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 962db1395..5a9b1c06c 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -13,6 +13,7 @@ hide: ### Translations +* 🌐 Add Portuguese translation for `docs/pt/docs/advanced/response-change-status-code.md`. PR [#11863](https://github.com/tiangolo/fastapi/pull/11863) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/reference/background.md`. PR [#11849](https://github.com/tiangolo/fastapi/pull/11849) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#11848](https://github.com/tiangolo/fastapi/pull/11848) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). * 🌐 Add Portuguese translation for `docs/pt/docs/reference/apirouter.md`. PR [#11843](https://github.com/tiangolo/fastapi/pull/11843) by [@lucasbalieiro](https://github.com/lucasbalieiro). From c96afadbd74cc25f8cb73f0a456b217f17bf5368 Mon Sep 17 00:00:00 2001 From: Aleksandr Andrukhov Date: Sun, 28 Jul 2024 02:59:11 +0300 Subject: [PATCH 122/284] =?UTF-8?q?=F0=9F=8C=90=20Add=20Russian=20translat?= =?UTF-8?q?ion=20for=20`docs/ru/docs/tutorial/dependencies/sub-dependencie?= =?UTF-8?q?s.md`=20(#10515)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tutorial/dependencies/sub-dependencies.md | 194 ++++++++++++++++++ 1 file changed, 194 insertions(+) create mode 100644 docs/ru/docs/tutorial/dependencies/sub-dependencies.md diff --git a/docs/ru/docs/tutorial/dependencies/sub-dependencies.md b/docs/ru/docs/tutorial/dependencies/sub-dependencies.md new file mode 100644 index 000000000..31f9f43c6 --- /dev/null +++ b/docs/ru/docs/tutorial/dependencies/sub-dependencies.md @@ -0,0 +1,194 @@ +# Подзависимости + +Вы можете создавать зависимости, которые имеют **подзависимости**. + +Их **вложенность** может быть любой глубины. + +**FastAPI** сам займётся их управлением. + +## Провайдер зависимости + +Можно создать первую зависимость следующим образом: + +=== "Python 3.10+" + + ```Python hl_lines="8-9" + {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="8-9" + {!> ../../../docs_src/dependencies/tutorial005_an_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="9-10" + {!> ../../../docs_src/dependencies/tutorial005_an.py!} + ``` + +=== "Python 3.10 без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="6-7" + {!> ../../../docs_src/dependencies/tutorial005_py310.py!} + ``` + +=== "Python 3.6 без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="8-9" + {!> ../../../docs_src/dependencies/tutorial005.py!} + ``` + +Она объявляет необязательный параметр запроса `q` как строку, а затем возвращает его. + +Это довольно просто (хотя и не очень полезно), но поможет нам сосредоточиться на том, как работают подзависимости. + +## Вторая зависимость + +Затем можно создать еще одну функцию зависимости, которая в то же время содержит внутри себя первую зависимость (таким образом, она тоже является "зависимой"): + +=== "Python 3.10+" + + ```Python hl_lines="13" + {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="13" + {!> ../../../docs_src/dependencies/tutorial005_an_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="14" + {!> ../../../docs_src/dependencies/tutorial005_an.py!} + ``` + +=== "Python 3.10 без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="11" + {!> ../../../docs_src/dependencies/tutorial005_py310.py!} + ``` + +=== "Python 3.6 без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="13" + {!> ../../../docs_src/dependencies/tutorial005.py!} + ``` + +Остановимся на объявленных параметрах: + +* Несмотря на то, что эта функция сама является зависимостью, она также является зависимой от чего-то другого. + * Она зависит от `query_extractor` и присваивает возвращаемое ей значение параметру `q`. +* Она также объявляет необязательный куки-параметр `last_query` в виде строки. + * Если пользователь не указал параметр `q` в запросе, то мы используем последний использованный запрос, который мы ранее сохранили в куки-параметре `last_query`. + +## Использование зависимости + +Затем мы можем использовать зависимость вместе с: + +=== "Python 3.10+" + + ```Python hl_lines="23" + {!> ../../../docs_src/dependencies/tutorial005_an_py310.py!} + ``` + +=== "Python 3.9+" + + ```Python hl_lines="23" + {!> ../../../docs_src/dependencies/tutorial005_an_py39.py!} + ``` + +=== "Python 3.6+" + + ```Python hl_lines="24" + {!> ../../../docs_src/dependencies/tutorial005_an.py!} + ``` + +=== "Python 3.10 без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="19" + {!> ../../../docs_src/dependencies/tutorial005_py310.py!} + ``` + +=== "Python 3.6 без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="22" + {!> ../../../docs_src/dependencies/tutorial005.py!} + ``` + +!!! info "Дополнительная информация" + Обратите внимание, что мы объявляем только одну зависимость в *функции операции пути* - `query_or_cookie_extractor`. + + Но **FastAPI** будет знать, что сначала он должен выполнить `query_extractor`, чтобы передать результаты этого в `query_or_cookie_extractor` при его вызове. + +```mermaid +graph TB + +query_extractor(["query_extractor"]) +query_or_cookie_extractor(["query_or_cookie_extractor"]) + +read_query["/items/"] + +query_extractor --> query_or_cookie_extractor --> read_query +``` + +## Использование одной и той же зависимости несколько раз + +Если одна из ваших зависимостей объявлена несколько раз для одной и той же *функции операции пути*, например, несколько зависимостей имеют общую подзависимость, **FastAPI** будет знать, что вызывать эту подзависимость нужно только один раз за запрос. + +При этом возвращаемое значение будет сохранено в "кэш" и будет передано всем "зависимым" функциям, которые нуждаются в нем внутри этого конкретного запроса, вместо того, чтобы вызывать зависимость несколько раз для одного и того же запроса. + +В расширенном сценарии, когда вы знаете, что вам нужно, чтобы зависимость вызывалась на каждом шаге (возможно, несколько раз) в одном и том же запросе, вместо использования "кэшированного" значения, вы можете установить параметр `use_cache=False` при использовании `Depends`: + +=== "Python 3.6+" + + ```Python hl_lines="1" + async def needy_dependency(fresh_value: Annotated[str, Depends(get_value, use_cache=False)]): + return {"fresh_value": fresh_value} + ``` + +=== "Python 3.6+ без Annotated" + + !!! tip "Подсказка" + Предпочтительнее использовать версию с аннотацией, если это возможно. + + ```Python hl_lines="1" + async def needy_dependency(fresh_value: str = Depends(get_value, use_cache=False)): + return {"fresh_value": fresh_value} + ``` + +## Резюме + +Помимо всех этих умных слов, используемых здесь, система внедрения зависимостей довольно проста. + +Это просто функции, которые выглядят так же, как *функции операций путей*. + +Но, тем не менее, эта система очень мощная и позволяет вам объявлять вложенные графы (деревья) зависимостей сколь угодно глубоко. + +!!! tip "Подсказка" + Все это может показаться не столь полезным на этих простых примерах. + + Но вы увидите как это пригодится в главах посвященных безопасности. + + И вы также увидите, сколько кода это вам сэкономит. From a4fd3fd4835a3905e5c7823f142b06bdcf9ebd2c Mon Sep 17 00:00:00 2001 From: github-actions Date: Sat, 27 Jul 2024 23:59:30 +0000 Subject: [PATCH 123/284] =?UTF-8?q?=F0=9F=93=9D=20Update=20release=20notes?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/en/docs/release-notes.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/en/docs/release-notes.md b/docs/en/docs/release-notes.md index 5a9b1c06c..b61857fb5 100644 --- a/docs/en/docs/release-notes.md +++ b/docs/en/docs/release-notes.md @@ -13,6 +13,7 @@ hide: ### Translations +* 🌐 Add Russian translation for `docs/ru/docs/tutorial/dependencies/sub-dependencies.md`. PR [#10515](https://github.com/tiangolo/fastapi/pull/10515) by [@AlertRED](https://github.com/AlertRED). * 🌐 Add Portuguese translation for `docs/pt/docs/advanced/response-change-status-code.md`. PR [#11863](https://github.com/tiangolo/fastapi/pull/11863) by [@ceb10n](https://github.com/ceb10n). * 🌐 Add Portuguese translation for `docs/pt/docs/reference/background.md`. PR [#11849](https://github.com/tiangolo/fastapi/pull/11849) by [@lucasbalieiro](https://github.com/lucasbalieiro). * 🌐 Add Portuguese translation for `docs/pt/docs/tutorial/dependencies/dependencies-with-yield.md`. PR [#11848](https://github.com/tiangolo/fastapi/pull/11848) by [@Joao-Pedro-P-Holanda](https://github.com/Joao-Pedro-P-Holanda). From 81234084cd4691a844ae75489f9c58705588a828 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 27 Jul 2024 19:03:57 -0500 Subject: [PATCH 124/284] =?UTF-8?q?=F0=9F=93=9D=20Re-structure=20docs=20ma?= =?UTF-8?q?in=20menu=20(#11904)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/de/docs/features.md | 5 ----- docs/de/docs/help/index.md | 3 --- docs/de/docs/index.md | 5 +---- docs/em/docs/features.md | 5 ----- docs/em/docs/index.md | 5 +---- docs/en/docs/features.md | 5 ----- docs/en/docs/help/index.md | 3 --- docs/en/docs/index.md | 5 +---- docs/en/docs/reference/index.md | 2 +- docs/en/mkdocs.yml | 12 ++++++------ docs/es/docs/features.md | 5 ----- docs/es/docs/help/index.md | 3 --- docs/es/docs/index.md | 5 +---- docs/fa/docs/index.md | 5 +---- docs/fr/docs/features.md | 5 ----- docs/fr/docs/index.md | 5 +---- docs/he/docs/index.md | 5 +---- docs/ja/docs/features.md | 5 ----- docs/ja/docs/index.md | 5 +---- docs/ko/docs/features.md | 5 ----- docs/ko/docs/help/index.md | 3 --- docs/ko/docs/index.md | 5 +---- docs/pl/docs/features.md | 5 ----- docs/pl/docs/index.md | 5 +---- docs/pt/docs/features.md | 5 ----- docs/pt/docs/help/index.md | 3 --- docs/pt/docs/index.md | 5 +---- docs/ru/docs/features.md | 5 ----- docs/ru/docs/index.md | 5 +---- docs/tr/docs/features.md | 5 ----- docs/tr/docs/help/index.md | 3 --- docs/tr/docs/index.md | 5 +---- docs/vi/docs/features.md | 5 ----- docs/vi/docs/index.md | 5 +---- docs/yo/docs/index.md | 5 +---- docs/zh/docs/features.md | 5 ----- docs/zh/docs/index.md | 5 +---- 37 files changed, 23 insertions(+), 154 deletions(-) delete mode 100644 docs/de/docs/help/index.md delete mode 100644 docs/en/docs/help/index.md delete mode 100644 docs/es/docs/help/index.md delete mode 100644 docs/ko/docs/help/index.md delete mode 100644 docs/pt/docs/help/index.md delete mode 100644 docs/tr/docs/help/index.md diff --git a/docs/de/docs/features.md b/docs/de/docs/features.md index 76aad9f16..1e68aff88 100644 --- a/docs/de/docs/features.md +++ b/docs/de/docs/features.md @@ -1,8 +1,3 @@ ---- -hide: - - navigation ---- - # Merkmale ## FastAPI Merkmale diff --git a/docs/de/docs/help/index.md b/docs/de/docs/help/index.md deleted file mode 100644 index 8fdc4a049..000000000 --- a/docs/de/docs/help/index.md +++ /dev/null @@ -1,3 +0,0 @@ -# Hilfe - -Helfen und Hilfe erhalten, beitragen, mitmachen. 🤝 diff --git a/docs/de/docs/index.md b/docs/de/docs/index.md index ccc50fd62..e3c5be321 100644 --- a/docs/de/docs/index.md +++ b/docs/de/docs/index.md @@ -1,7 +1,4 @@ ---- -hide: - - navigation ---- +# FastAPI