From dd6ab23b62187c8b60563bbf2f5324c8b8a901d6 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Sebasti=C3=A1n=20Ram=C3=ADrez?= Date: Sat, 30 Mar 2019 19:53:44 +0400 Subject: [PATCH] :sparkles: Add docs/tests extending OpenAPI (#126) --- .../tutorial/extending-openapi/image01.png | Bin 0 -> 64786 bytes docs/src/extending_openapi/tutorial001.py | 28 ++++++ docs/tutorial/extending-openapi.md | 90 ++++++++++++++++++ mkdocs.yml | 1 + .../test_extending_openapi/__init__.py | 0 .../test_tutorial001.py | 44 +++++++++ 6 files changed, 163 insertions(+) create mode 100644 docs/img/tutorial/extending-openapi/image01.png create mode 100644 docs/src/extending_openapi/tutorial001.py create mode 100644 docs/tutorial/extending-openapi.md create mode 100644 tests/test_tutorial/test_extending_openapi/__init__.py create mode 100644 tests/test_tutorial/test_extending_openapi/test_tutorial001.py diff --git a/docs/img/tutorial/extending-openapi/image01.png b/docs/img/tutorial/extending-openapi/image01.png new file mode 100644 index 0000000000000000000000000000000000000000..26d13293d9c6d557274dabddd858aad2dbfb44b1 GIT binary patch literal 64786 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ª>GCy!(B7ti{-sZ4%Xd&CfiPa_>)BpvRv*RfAFc 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�LD*d}At zcM4``V9>Z=+vnm@os&nz@2~9ug^OMHm0qUW;}rKuu~G+(=)M9oWkV3)4BMw2dnkef zWjili`)vvvopHI;f96}o6ja_0ZB3dT-Qm1zZJlPWs$bHcQo!`_{ zL2AS2u3x!!?d}PN@-)rx|$l= zZN3jkU5dF1?4$z&cu+BJ+Vkf}r}|cYrf(1FUeuM}c%LGYy|>fTopSzu+G^0bC&NXW_SoJPF7i3jrtw$hqN=-Tkk1 zupT(CtgNJ;*_#N6I9 z1Rr~Q=guG8;aRBwcCd(!j*W^+Z*FeRWUvD`-cXf8Bme_?x%nZ!HI(`g+JjwYXDkvcs6IR`YJy%! zVW&AklVkN=Jh6pG*tB9HcIaYE6OyvS=s5nPt~Xu|p~J9t9iWxH%jwFog|^w#!X|tn zU(+{8L(UzwN47V1Sb*}7rEy^Du^ww2w71$#uGQ?Cl|Pvj1D?8g-f=3|s<+0<3Tsl{ z%*LVoJov)Ji@cDbD*rM%y5AUIffZF%UI_B?8lPIxhKV!d1O>IYQ7AFy)6Rn#FE?Ng z7$oxB&W9E4Waox91TXk~g}Dfju{jDy`umMN3k#b^a0IzIRsbBa>tt_`hO;-bv<>f? zplfSE5~tiUzI?e&YHrRg4gZPeQw5y0s4Kn2A`z$ywjPZ#-DD-_YT`eyz@poXG4%zj)zGLqnTWl4l?XU)a@ByCVnxnby^%FKkvl zf_EiVtZTlGG@g$a#tFz<==Y*pThE@g!$IScljr3VSTpjI`rwunjt)wXkb)&oF$7=( z>OB%Xve5DIaRFiB&Im*z03~pNoZ?yw39;!-a3{iXPf8coLs_Lo`S|?+p zb*oMC0uf_cJmXvA4p>JmoIO3QRtY#ir=G?$ny!6!qR+FkW+*ryP`8e43xcIpLPJ}< zH_%Z4;)`#X(8I(F_f}iTEtMwm^5kmGAY&8+%=Glq`>@a)GwM~$&70aI>R$t~SPq zRp!a&bz;!YOnamw40efyc1F}3Nn&9+L6$eLRZGQw8elfXGNIOIu|2V|v~D%kRC7Y~ z9W`Fpzf~~PP7;qQC@7$1WJfcQhK+~e1;zTX!cDYxvLqnbBwXS&14CE&%v&QMC)EvlA&((_;Aeaqmy!$1A~cJvlMcqULBo(Ycf!2*Eh-9k{MR%CJ5H!RwlOTUoic z#si9j{bCY|ZJ6lH;MVfqcs)K;8h{5haO{q6ZEmFm^jvdk=U8%dP^)L4zjRZBP10Q- z0tppj3bWte4Fljm7{c|6{$3bUYh1OTwjuo;9%0KOl^sU*cVL9nG`ob`kO7;Nn|}YK z2vsgQdKKNMLC+?Jtlv8U1oX#`cf;a^;)Y3m73=oe>_N}2a&h67_|%LdPgq$c0~{p6 z#L{4GrxD)HAs-uuGYgA1Algqz znaN4NeZF&N&ZIL5C(UC#s`X4w%TLn=x5+z{BuVM^0E`8*o(XY0=Qg^UY*dir*B-D_ zB;hy)5;iN$=sRP3m`a;hdj?s7gayRb+e>nlgi^Qf`Ne)41~DBSxwQ+P{>pE_06WQv zxRk3l0bd-+iRB<(06^38=eGf0a-3>56@rY>BdbLmn6NLEtKgY++7zXJHx#Z;Jy3Q(MJMmw3G(*Xzz(~)B9t*OzzjrvldEJC2~L0y_#=9XGb6gcy5_T%Yg<)SK&9JSTkqZR z_C_2TAi?{sx@Frim6XTM{rOk``RVm73c(hKP>96DXk=DlA&_y5?|9$A{mOtiqDv|1 zoGfziMu7VP0Xn%f!wZl>7J9?+%8ZQXktYsnkj}*oO}wj7@@ZOSoSt>?=d{{drMTEw z07w(`X3>3%E54K7GE)G#%ARl3O1#7nLO!Fo(X2@tEmm(mo5WumRHLb>>3vyo{{`uu zscB;AZYi#BBQHLfq>5y1Y$!t9?wTYzqPX`6VT@hBz<1c@vRRBA5p`N6#Xz z0la3BcM-*6(a=GH?#&2$UQ)Ho~5aqZCO&Z$cKWp!EeZx7$zq_2- znKt+^a6?3Ev1>{+$5_Wb;)jhb&K{_OgcEB^*&`$7So3uZyG{tXhy>KQ;8;YA#Y|}= zDk~(__{^Dc;QYIPptQIR<(o0OOP1SqLk5e#ZK&5cL|%7==O&mC7s2`y+it9T-lYybDBq^FX;Wpy-L!UvXvoPxUK& z5;`4YI~@%o-HDGb??095NPNp9p{22$|GmOckTj4u8<3ipM-)rEV_2-1TDud3d5*bd zgux9da&mHd46LlL_x`BUD!D(wv#x+K#)U=!B>S;CGak&{H09+4VDga@>NQ+kSHY0N z>(}3ehDLREe6;Gk0belC&yE0`g8I7%yri3R0CspHzSaI7fM(ySWy+R#h+@O10;6wL%$3weSG(nCp^hlG7gn%G020so&BscMa`%*@7XQ z8)no2!ChSLoYFDn<*&Zxv(RDyi1t~P08mO#?0HpHHI6~XGBcoTj}i)EqGcbqbM4~( zNbY5JgJSCooyuGxjAW5vAWItMZBrD80OQK_fO2XlU9+TRiA_$(PMvAPFb(~fNEX03 zyvbtynGA9uOYen!?wjVT5AT}np~r#lc43& zhrMTGbA#JwHqWreNWQIM*4uHdF$y4{tG+j(pBxKQbh3eHEb$|;QtKE%*JFVb^YZe# z@cY>JGzF|>74+CPxu0exRWzHBgEcGb<%qul=Sz30Y?GT|FPC>Gjg;TxMsd?gOJ}Y% z85kHK0axrZ&5@7mDa-`td_tPkv>;{zPWR18xJ=H>U!JP0It4)R>_f& z4Z7w_ZT5MO_8N4*`d|!zXSK}2zEhYyBg}}q50;|vWS?3zW&&-`oW0bK-YN6$I}Op_ z{_LP4rLy{2JqCqD`Xxx{-l5+AfIz$vgsEJgZ zp49Q{g{?w2x~IH)^NMsU1SSbq1mr=uGYV84`)1p z-r*75<9QqA1B%r9!0Vlz&=NaHCIbr!#hsg1@=!@P>KEMs^%z4E+L}7czPF=s0RR=q z{ubDRsCgRvm=0kqO}YM?_&;@Pn=;-K3j#%?I@DWbOy3`OKKnbGFdAUU^0-{Rm*I~V z&{=oH#xwA2cJh)!7Mwaq+8khKA&Gul60E}#s=9CScRjSLq3ya!d3O~7ruwnf_@PIQ z?h&J8@_PH*8Wr0L@5~2>>PX{0jc}~HcS6a5TRHhD+pjc9ae$1MUk>#fTf5=XEh}R# z0_mC#@ITLXR#WefoBVD5oR9wdOI~>#@9eUgBhnun* zKh}^95?!~DIm4q9KRngtGjBBCN~7364A|l6Il?vP9=^zKl3xABX-L=hBNsFs2%@i_ zdL+Ceh-L@=@ExGl9`fDKPk`H_itRO`|8`rGYV)?!|4=h9ZKw1Py7RgJH}(J2)YjS8sHraJ zQ)0VZDp7>VYOntw;_SRt7kyR)sY5grp6`4spvt;DdvcMjhAQjnB$vs5UQ8+C$cVUh z3HAygt?}kluB)ZPK3c%@JKWW)KVX!K{qcp}F9N^^b`Iyycs_na%r|mzp}t2HrPNJ) zrTpZ(Y9q^{ZrYXyBs3-XiX7rCmyOSnJ%fH+`+Y!*ci~fBReDoc's OpenAPI extension to include a custom logo. + +### Normal **FastAPI** + +First, write all your **FastAPI** application as normally: + +```Python hl_lines="1 4 7 8 9" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Generate the OpenAPI schema + +Then, use the same utility function to generate the OpenAPI schema, inside a `custom_openapi()` function: + +```Python hl_lines="2 15 16 17 18 19 20" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Modify the OpenAPI schema + +Now you can add the ReDoc extension, adding a custom `x-logo` to the `info` "object" in the OpenAPI schema: + +```Python hl_lines="21 22 23" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Cache the OpenAPI schema + +You can use the property `.openapi_schema` as a "cache", to store your generated schema. + +That way, your application won't have to generate the schema every time a user opens your API docs. + +It will be generated only once, and then the same cached schema will be used for the next requests. + +```Python hl_lines="13 14 24 25" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Override the method + +Now you can replace the `.openapi()` method with your new function. + +```Python hl_lines="28" +{!./src/extending_openapi/tutorial001.py!} +``` + +### Check it + +Once you go to http://127.0.0.1:8000/redoc you will see that you are using your custom logo (in this example, **FastAPI**'s logo): + + diff --git a/mkdocs.yml b/mkdocs.yml index f550d48678..4edc575f24 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -67,6 +67,7 @@ nav: - WebSockets: 'tutorial/websockets.md' - 'Events: startup - shutdown': 'tutorial/events.md' - Debugging: 'tutorial/debugging.md' + - Extending OpenAPI: 'tutorial/extending-openapi.md' - Concurrency and async / await: 'async.md' - Deployment: 'deployment.md' - Project Generation - Template: 'project-generation.md' diff --git a/tests/test_tutorial/test_extending_openapi/__init__.py b/tests/test_tutorial/test_extending_openapi/__init__.py new file mode 100644 index 0000000000..e69de29bb2 diff --git a/tests/test_tutorial/test_extending_openapi/test_tutorial001.py b/tests/test_tutorial/test_extending_openapi/test_tutorial001.py new file mode 100644 index 0000000000..8600096144 --- /dev/null +++ b/tests/test_tutorial/test_extending_openapi/test_tutorial001.py @@ -0,0 +1,44 @@ +from starlette.testclient import TestClient + +from extending_openapi.tutorial001 import app + +client = TestClient(app) + +openapi_schema = { + "openapi": "3.0.2", + "info": { + "title": "Custom title", + "version": "2.5.0", + "description": "This is a very custom OpenAPI schema", + "x-logo": {"url": "https://fastapi.tiangolo.com/img/logo-margin/logo-teal.png"}, + }, + "paths": { + "/items/": { + "get": { + "responses": { + "200": { + "description": "Successful Response", + "content": {"application/json": {"schema": {}}}, + } + }, + "summary": "Read Items Get", + "operationId": "read_items_items__get", + } + } + }, +} + + +def test_openapi_schema(): + response = client.get("/openapi.json") + assert response.status_code == 200 + assert response.json() == openapi_schema + response = client.get("/openapi.json") + assert response.status_code == 200 + assert response.json() == openapi_schema + + +def test(): + response = client.get("/items/") + assert response.status_code == 200 + assert response.json() == [{"name": "Foo"}] -- 2.47.3