{"id":47055,"date":"2022-11-29T13:13:37","date_gmt":"2022-11-29T12:13:37","guid":{"rendered":"https:\/\/kinsta.com\/dk\/?p=47055&#038;preview=true&#038;preview_id=47055"},"modified":"2023-08-23T10:13:12","modified_gmt":"2023-08-23T09:13:12","slug":"fastapi","status":"publish","type":"post","link":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/","title":{"rendered":"Byg en app med FastAPI til Python"},"content":{"rendered":"<p>FastAPI er en hurtig og letv\u00e6gts webframework til opbygning af moderne programmeringsgr\u00e6nseflader til applikationer ved hj\u00e6lp af <a href=\"https:\/\/kinsta.com\/blog\/python-object-oriented-programming\/\">Python<\/a> 3.6 og derover. I denne vejledning gennemg\u00e5r vi det grundl\u00e6ggende i at bygge en app med FastAPI, og du f\u00e5r en fornemmelse af, hvorfor det blev nomineret som en af de <a href=\"https:\/\/www.infoworld.com\/article\/3637038\/the-best-open-source-software-of-2021.html#slide5\" target=\"_blank\" rel=\"noopener noreferrer\">bedste open source-frameworks i 2021<\/a>.<\/p>\n<p>N\u00e5r du er klar til at udvikle dine egne FastAPI-apps, skal du ikke lede l\u00e6nge for at finde et sted at hoste dem. Kinsta&#8217;s <a href=\"https:\/\/sevalla.com\/application-hosting\/\">Applikation Hosting<\/a>&#8211; og <a href=\"https:\/\/sevalla.com\/database-hosting\/\">Database Hosting<\/a>-tjenester giver en Platform as a Service, der er st\u00e6rk p\u00e5 Python.<\/p>\n<p>Lad os f\u00f8rst l\u00e6re det grundl\u00e6ggende.<\/p>\n<div><\/div><kinsta-auto-toc heading=\"Table of Contents\" exclude=\"last\" list-style=\"arrow\" selector=\"h2\" count-number=\"-1\"><\/kinsta-auto-toc>\n<h2>Fordele ved FastAPI<\/h2>\n<p>Nedenfor er nogle af de fordele, som <a href=\"https:\/\/fastapi.tiangolo.com\/\">FastAPI-framework<\/a> bringer til et projekt.<\/p>\n<ul>\n<li><strong>Hastighed:<\/strong> Som navnet antyder, er FastAPI en meget hurtig ramme. Dens hastighed kan sammenlignes med <a href=\"https:\/\/docs.sevalla.com\/templates\/overview\">Go<\/a> og <a href=\"https:\/\/docs.sevalla.com\/templates\/overview\">Node.js<\/a>, som generelt anses for at v\u00e6re blandt de hurtigste muligheder for at bygge API&#8217;er.<\/li>\n<li><strong>Let at l\u00e6re og kode:<\/strong> FastAPI har allerede regnet n\u00e6sten alt det ud, du skal bruge for at lave en produktionsklar API. Som udvikler, der bruger FastAPI, beh\u00f8ver du ikke at kode alting fra bunden. Med kun f\u00e5 linjer kode kan du have et RESTful API klar til implementering.<\/li>\n<li><strong>Omfattende dokumentation:<\/strong> FastAPI bruger OpenAPI-dokumentationsstandarderne, s\u00e5 dokumentation kan genereres dynamisk. Denne dokumentation indeholder detaljerede oplysninger om FastAPI&#8217;s endpoints, svar, parametre og returkoder.<\/li>\n<li><strong>API&#8217;er med f\u00e6rre fejl:<\/strong> FastAPI underst\u00f8tter <a href=\"https:\/\/fastapi.tiangolo.com\/tutorial\/query-params-str-validations\/#add-more-validations\" target=\"_blank\" rel=\"noopener noreferrer\">brugerdefineret datavalidering<\/a>, hvilket g\u00f8r det muligt for udviklere at opbygge API&#8217;er med f\u00e6rre fejl. FastAPI&#8217;s udviklere praler af, at denne framework resulterer i f\u00e6rre menneskeskabte fejl &#8211; helt op til 40% f\u00e6rre.<\/li>\n<li><strong>Typehints:<\/strong> Types-modulet blev indf\u00f8rt i Python 3.5. Det giver dig mulighed for at deklarere <code>type<\/code> for en variabel. N\u00e5r typen af en variabel er deklareret, kan IDE&#8217;er give bedre support og forudsige fejl mere pr\u00e6cist.<\/li>\n<\/ul>\n\n<h2>S\u00e5dan kommer du i gang med FastAPI<\/h2>\n<p>For at f\u00f8lge denne vejledning og komme i gang med FastAPI skal du f\u00f8rst g\u00f8re et par ting.<\/p>\n<p>S\u00f8rg for, at du har en teksteditor\/IDE til programm\u00f8rer, f.eks. <a href=\"https:\/\/code.visualstudio.com\/download\" target=\"_blank\" rel=\"noopener noreferrer\">Visual Studio Code<\/a>. Andre muligheder omfatter <a href=\"https:\/\/kinsta.com\/blog\/how-to-use-sublime-text\/\" rel=\"noopener\">Sublime Text<\/a> og <a href=\"https:\/\/www.espressoapp.com\/\" target=\"_blank\" rel=\"noopener noreferrer\">Espresso<\/a>.<\/p>\n<p>Det er en almindelig praksis at have dine Python-apps og deres instanser k\u00f8rende i virtuelle milj\u00f8er. Virtuelle milj\u00f8er g\u00f8r det muligt at k\u00f8re forskellige pakkes\u00e6t og konfigurationer samtidig og undg\u00e5 konflikter p\u00e5 grund af inkompatible pakkeversioner.<\/p>\n<p>For at oprette et virtuelt milj\u00f8 skal du \u00e5bne <a href=\"https:\/\/kinsta.com\/dk\/blog\/python-commandoer\/#introduction-to-the-cli\">din terminal<\/a> og k\u00f8re denne kommando:<\/p>\n<pre><code class=\"language-bash\">$ python3 -m venv env<\/code><\/pre>\n<p>Du skal ogs\u00e5 aktivere det virtuelle milj\u00f8. Kommandoen til at g\u00f8re det vil variere afh\u00e6ngigt af det operativsystem og den shell, du bruger. Her er nogle eksempler p\u00e5 CLI-aktivering for en r\u00e6kke milj\u00f8er:<\/p>\n<pre><code class=\"language-bash\"># On Unix or MacOS (bash shell): \n\/path\/to\/venv\/bin\/activate\n\n# On Unix or MacOS (csh shell):\n\/path\/to\/venv\/bin\/activate.csh\n\n# On Unix or MacOS (fish shell):\n\/path\/to\/venv\/bin\/activate.fish\n\n# On Windows (command prompt):\npathtovenvScriptsactivate.bat\n\n# On Windows (PowerShell):\npathtovenvScriptsActivate.ps1\n<\/code><\/pre>\n<p>(Nogle Python-aware IDE&#8217;er kan ogs\u00e5 konfigureres til at aktivere det aktuelle virtuelle milj\u00f8.)<\/p>\n<p>Nu skal du installere FastAPI:<\/p>\n<pre><code class=\"language-bash\">$ pip3 install fastapi<\/code><\/pre>\n<p>FastAPI er en ramme til opbygning af API&#8217;er, men for at teste dine API&#8217;er har du brug for en lokal webserver. <a href=\"https:\/\/www.uvicorn.org\/\" target=\"_blank\" rel=\"noopener noreferrer\">Uvicorn<\/a> er en lynhurtig Asynchronous Server Gateway Interface (ASGI) webserver til Python, som er fantastisk til udvikling. For at installere Uvicorn skal du k\u00f8re denne kommando:<\/p>\n<pre><code class=\"language-bash\">$ pip3 install \"uvicorn[standard]\"<\/code><\/pre>\n<p>N\u00e5r installationen er lykkedes, skal du oprette en fil med navnet <strong>main.py<\/strong> i dit projekts arbejdskatalog. Denne fil vil v\u00e6re dit indgangspunkt for applikationen.<\/p>\n<figure style=\"width: 1151px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/11\/fastapi-project-layout.png\" alt=\"Visning af et grundl\u00e6ggende FastAPI-projekt i et IDE.\" width=\"1151\" height=\"475\"><figcaption class=\"wp-caption-text\">Visning af et grundl\u00e6ggende FastAPI-projekt i et IDE.<\/figcaption><\/figure>\n<h3>Et hurtigt FastAPI-eksempel<\/h3>\n<p>Du skal teste din FastAPI-installation ved hurtigt at ops\u00e6tte et eksempel endpoint. Inds\u00e6t f\u00f8lgende kode i din <strong>main.py<\/strong>-fil, og gem derefter filen:<\/p>\n<pre><code class=\"language-python\"># main.py\nfrom fastapi import FastAPI\napp = FastAPI()\n@app.get(\"\/\")\nasync def root():\n return {\"greeting\":\"Hello world\"}\n<\/code><\/pre>\n<p>Ovenst\u00e5ende uddrag skaber et grundl\u00e6ggende FastAPI-endpoint. Nedenfor er en oversigt over, hvad hver linje g\u00f8r:<\/p>\n<ul>\n<li><code>from fastapi import FastAPI<\/code>: Funktionaliteten for din API leveres af FastAPI Python-klassen.<\/li>\n<li><code>app = FastAPI()<\/code>: Dette opretter en FastAPI-instans.<\/li>\n<li><code>@app.get(\"\/\")<\/code>: Dette er en python-dekorator, der angiver over for FastAPI, at funktionen under den er ansvarlig for h\u00e5ndteringen af anmodninger.<\/li>\n<li><code>@app.get(\"\/\")<\/code>: Dette er en dekorator, der angiver ruten. Dette opretter en <code>GET<\/code> -metode p\u00e5 webstedets rute. Resultatet returneres derefter af den indpakkede funktion.<\/li>\n<li>Andre mulige operationer, der bruges til at kommunikere, omfatter <code>@app.post()<\/code>, <code>@app.put()<\/code>, <code>@app.delete()<\/code>, <code>@app.options()<\/code>, <code>@app.head()<\/code>, <code>@app.patch()<\/code> og <code>@app.trace()<\/code>.<\/li>\n<\/ul>\n<p>I filmappen skal du k\u00f8re f\u00f8lgende kommando i din terminal for at starte API-serveren:<\/p>\n<pre><code class=\"language-bash\">$ uvicorn main:app --reload<\/code><\/pre>\n<p>I denne kommando er <code>main<\/code> navnet p\u00e5 dit modul. Objektet <code>app<\/code> er en instans af dit program og importeres til ASGI-serveren. Flaget <code>--reload<\/code> fort\u00e6ller serveren, at den skal genindl\u00e6ses automatisk, n\u00e5r du foretager \u00e6ndringer.<\/p>\n<p>Du b\u00f8r se noget, der ligner dette i din terminal:<\/p>\n<pre><code> $ uvicorn main:app --reload\nINFO: Will watch for changes in these directories: ['D:\\WEB DEV\\Eunit\\Tests\\fast-api']\nINFO: Uvicorn running on http:\/\/127.0.0.1:8000 (Press CTRL+C to quit)\nINFO: Started reloader process [26888] using WatchFiles\nINFO: Started server process [14956]\nINFO: Waiting for application startup.\nINFO: Application startup complete.\n<\/code><\/pre>\n<p>Naviger til <code>http:\/\/localhost:8000<\/code> i din browser for at bekr\u00e6fte, at din API fungerer. Du b\u00f8r se &#8220;Hello&#8221;: &#8220;World&#8221; som et JSON-objekt p\u00e5 siden. Dette illustrerer, hvor nemt det er at oprette en API med FastAPI. Det eneste, du skulle g\u00f8re, var at definere en rute og returnere din Python-ordbog, som det ses p\u00e5 linje seks i ovenst\u00e5ende uddrag.<\/p>\n<figure style=\"width: 900px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/11\/fastapi-hello-world-in-browser.png\" alt=\"En FastAPI Hello World-applikation, der k\u00f8rer i en webbrowser.\" width=\"900\" height=\"340\"><figcaption class=\"wp-caption-text\">FastAPI Hello World-applikation i en webbrowser.<\/figcaption><\/figure>\n<h3>Brug af typehints<\/h3>\n<p>Hvis du bruger Python, er du vant til at anm\u00e6rke variabler med grundl\u00e6ggende datatyper som <code>int<\/code>, <code>str<\/code>, <code>float<\/code> og <code>bool<\/code>. Fra Python version 3.9 blev der imidlertid indf\u00f8rt avancerede datastrukturer. Dette giver dig mulighed for at arbejde med datastrukturer som <code>dictionaries<\/code>, <code>tuples<\/code> og <code>lists<\/code>. Med FastAPI&#8217;s typehints kan du strukturere skemaet for dine data ved hj\u00e6lp af <a href=\"https:\/\/pydantic-docs.helpmanual.io\/usage\/models\/\" target=\"_blank\" rel=\"noopener noreferrer\">pydantiske<\/a> modeller og derefter bruge de pydantiske modeller til at give typehints og drage fordel af den datavalidering, der er til r\u00e5dighed.<\/p>\n<p>I eksemplet nedenfor demonstreres brugen af typehints i Python med en simpel prisberegner til m\u00e5ltider, <code>calculate_meal_fee<\/code>:<\/p>\n<pre><code class=\"language-python\">def calculate_meal_fee(beef_price: int, meal_price: int) -&gt; int:\n total_price: int = beef_price + meal_price\n return total_price\nprint(\"Calculated meal fee\", calculate_meal_fee(75, 19))\n<\/code><\/pre>\n<p>Bem\u00e6rk, at typehints ikke \u00e6ndrer den m\u00e5de, som din kode k\u00f8rer p\u00e5.<\/p>\n<h3>FastAPI interaktiv API-dokumentation<\/h3>\n<p>FastAPI bruger <a href=\"https:\/\/github.com\/swagger-api\/swagger-ui\" target=\"_blank\" rel=\"noopener noreferrer\">Swagger UI<\/a> til at levere automatisk interaktiv API-dokumentation. For at f\u00e5 adgang til den skal du navigere til <code>http:\/\/localhost:8000\/docs<\/code>, og du vil se en sk\u00e6rm med alle dine endpoints, metoder og skemaer.<\/p>\n<figure style=\"width: 900px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/11\/swagger-ui-fastapi-documentation-interface.png\" alt=\"Sk\u00e6rmbillede af Swagger UI-gr\u00e6nsefladen til dokumentation.\" width=\"900\" height=\"1013\"><figcaption class=\"wp-caption-text\">Swagger UI&#8217;s dokumentation for FastAPI.<\/figcaption><\/figure>\n<p>Denne automatiske, browserbaserede API-dokumentation leveres af FastAPI, og du beh\u00f8ver ikke at g\u00f8re noget andet for at udnytte den.<\/p>\n<p>En alternativ browserbaseret API-dokumentation, som ogs\u00e5 leveres af FastAPI, er <a href=\"https:\/\/github.com\/Redocly\/redoc\" target=\"_blank\" rel=\"noopener noreferrer\">Redoc<\/a>. For at f\u00e5 adgang til Redoc skal du navigere til <code>http:\/\/localhost:8000\/redoc<\/code>, hvor du vil blive pr\u00e6senteret for en liste over dine endpoints, metoderne og deres respektive svar.<\/p>\n<figure style=\"width: 900px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/11\/redoc-fastapi-documentation-interface.png\" alt=\"Sk\u00e6rmbillede af Redoc-gr\u00e6nsefladen til dokumentation.\" width=\"900\" height=\"1112\"><figcaption class=\"wp-caption-text\">Redoc&#8217;s dokumentation for FastAPI.<\/figcaption><\/figure>\n<h3>Ops\u00e6tning af ruter i FastAPI<\/h3>\n<p>Med dekoratoren <code>@app<\/code> kan du angive rutens <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Methods\" target=\"_blank\" rel=\"noopener noreferrer\">metode<\/a>, f.eks. <code>@app.get<\/code> eller <code>@app.post<\/code>, og den underst\u00f8tter <code>GET<\/code>, <code>POST<\/code>, <code>PUT<\/code> og <code>DELETE<\/code>, samt de mindre almindelige muligheder <code>HEAD<\/code>, <code>PATCH<\/code> og <code>TRACE<\/code>.<\/p>\n<h2>Opbygning af din app med FastAPI<\/h2>\n<p>I denne vejledning vil du blive gennemg\u00e5 opbygningen af en <a href=\"https:\/\/www.codecademy.com\/article\/what-is-crud\" target=\"_blank\" rel=\"noopener noreferrer\">CRUD<\/a>-applikation med FastAPI. Applikationen vil v\u00e6re i stand til at:<\/p>\n<ul>\n<li>Oprettelse af en bruger<\/li>\n<li>L\u00e6s en brugers databasepost<\/li>\n<li>Opdatering af en eksisterende bruger<\/li>\n<li>Sletning af en bestemt bruger<\/li>\n<\/ul>\n<p>For at udf\u00f8re disse CRUD-operationer vil du oprette metoder, der eksponerer API-slutpunkterne. Resultatet vil v\u00e6re en in-memory-database, der kan gemme en liste over brugere.<\/p>\n<figure style=\"width: 864px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/11\/database-table-fastapi-crud-example.png\" alt=\"Diagram over databasetabelstruktur for CRUD-eksempler.\" width=\"864\" height=\"551\"><figcaption class=\"wp-caption-text\">Database tabelstruktur for CRUD-eksempler.<\/figcaption><\/figure>\n<p>Du skal bruge <a href=\"https:\/\/pydantic-docs.helpmanual.io\/\" target=\"_blank\" rel=\"noopener noreferrer\">pydantic<\/a>-biblioteket til at udf\u00f8re datavalidering og indstillinger ved hj\u00e6lp af Python-typeannotationer. Med henblik p\u00e5 denne vejledning vil du erkl\u00e6re formen af dine data som klasser med attributter.<\/p>\n<p>Denne tutorial vil bruge in-memory-databasen. Dette er for hurtigt at f\u00e5 dig i gang med at bruge FastAPI til at opbygge dine API&#8217;er. Til produktion kan du dog g\u00f8re brug af en hvilken som helst database efter eget valg, f.eks. <a href=\"https:\/\/kinsta.com\/blog\/what-is-postgresql\/\">PostgreSQL<\/a>, <a href=\"https:\/\/kinsta.com\/dk\/blog\/hvad-er-mysql\/\">MySQL<\/a>, <a href=\"https:\/\/kinsta.com\/dk\/blog\/sqlite-vs-mysql\/#what-is-sqlite\">SQLite<\/a> eller endda Oracle.<\/p>\n<h3>Opbygning af appen<\/h3>\n<p>Du begynder med at oprette din brugermodel. Brugermodellen vil have f\u00f8lgende attributter:<\/p>\n<ul>\n<li><code>id<\/code>: En universel unik identifikator (UUID)<\/li>\n<li><code>first_name<\/code>: Brugerens fornavn<\/li>\n<li><code>last_name<\/code>: Brugerens efternavn<\/li>\n<li><code>gender<\/code>: Brugerens k\u00f8n<\/li>\n<li><code>roles<\/code>, som er en liste med <code>admin<\/code> og <code>user<\/code> roller<\/li>\n<\/ul>\n<p>Start med at oprette en ny fil ved navn <strong>models.py<\/strong> i din arbejdskatalog, og inds\u00e6t derefter f\u00f8lgende kode i <strong>models.py<\/strong> for at oprette din model:<\/p>\n<pre><code class=\"language-python\">\n# models.py\nfrom typing import List, Optional\nfrom uuid import UUID, uuid4\nfrom pydantic import BaseModel\nfrom enum import Enum\nfrom pydantic import BaseModel\nclass Gender(str, Enum):\n male = \"male\"\n female = \"female\"\nclass Role(str, Enum):\n admin = \"admin\"\n user = \"user\"\nclass User(BaseModel):\n id: Optional[UUID] = uuid4()\n first_name: str\n last_name: str\n gender: Gender\n roles: List[Role]\n<\/code><\/pre>\n<p>I ovenst\u00e5ende kode:<\/p>\n<ul>\n<li>Din <code>User<\/code> -klasse udvider <code>BaseModel<\/code>, som derefter importeres fra <code>pydantic<\/code>.<\/li>\n<li>Du har defineret brugerens attributter som beskrevet ovenfor.<\/li>\n<\/ul>\n<p>Det n\u00e6ste skridt er at oprette din database. Udskift indholdet af din <strong>main.py<\/strong>-fil med f\u00f8lgende kode:<\/p>\n<pre><code class=\"language-python\">\n# main.py\nfrom typing import List\nfrom uuid import uuid4\nfrom fastapi import FastAPI\nfrom models import Gender, Role, User\napp = FastAPI()\ndb: List[User] = [\n User(\n id=uuid4(),\n first_name=\"John\",\n last_name=\"Doe\",\n gender=Gender.male,\n roles=[Role.user],\n ),\n User(\n id=uuid4(),\n first_name=\"Jane\",\n last_name=\"Doe\",\n gender=Gender.female,\n roles=[Role.user],\n ),\n User(\n id=uuid4(),\n first_name=\"James\",\n last_name=\"Gabriel\",\n gender=Gender.male,\n roles=[Role.user],\n ),\n User(\n id=uuid4(),\n first_name=\"Eunit\",\n last_name=\"Eunit\",\n gender=Gender.male,\n roles=[Role.admin, Role.user],\n ),\n]\n<\/code><\/pre>\n<p>I <strong>main.py<\/strong>:<\/p>\n<ul>\n<li>Du initialiserede <code>db<\/code> med en type <code>List<\/code>, og du indgav <code>User<\/code> -modellen<\/li>\n<li>Du oprettede en in-memory-database med fire brugere, hver med de n\u00f8dvendige attributter s\u00e5som <code>first_name<\/code>, <code>last_name<\/code>, <code>gender<\/code> og <code>roles<\/code>. Brugeren <code>Eunit<\/code> er tildelt rollerne <code>admin<\/code> og <code>user<\/code>, mens de tre andre brugere kun er tildelt rollen <code>user<\/code>.<\/li>\n<\/ul>\n<h3>Read Database Records<\/h3>\n<p>Du har oprettet din in-memory-database og udfyldt den med brugere, s\u00e5 det n\u00e6ste skridt er at oprette et slutpunkt, der returnerer en liste over alle brugere. Det er her, FastAPI kommer ind i billedet.<\/p>\n<p>I din <strong>main.py<\/strong>-fil inds\u00e6tter du f\u00f8lgende kode lige under dit <code>Hello World<\/code> endpoint:<\/p>\n<pre><code class=\"language-python\">\n# main.py\n @app.get(\"\/api\/v1\/users\")\n async def get_users():\n return db\n<\/code><\/pre>\n<p>Denne kode definerer endpointet <code>\/api\/v1\/users<\/code> og opretter en asynkron funktion, <code>get_users<\/code>, som returnerer alt indhold i databasen, <code>db<\/code>.<\/p>\n<p>Gem din fil, og du kan teste dit brugerendpunkt. K\u00f8r f\u00f8lgende kommando i din terminal for at starte API-serveren:<\/p>\n<pre><code class=\"language-bash\">$ uvicorn main:app --reload<\/code><\/pre>\n<p>Naviger til <code>http:\/\/localhost:8000\/api\/v1\/users<\/code> i din browser. Dette skulle give en liste over alle dine brugere, som vist nedenfor:<\/p>\n<figure style=\"width: 685px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/11\/fastapi-results-read-request.png\" alt=\"Sk\u00e6rmbillede af brugerdata returneret af FastAPI GET-anmodning.\" width=\"685\" height=\"1029\"><figcaption class=\"wp-caption-text\">Brugerdata hentet af FastAPI database read request.<\/figcaption><\/figure>\n<p>P\u00e5 dette tidspunkt vil din <strong>main.py<\/strong>-fil se s\u00e5ledes ud:<\/p>\n<pre><code class=\"language-python\">\n# main.py\nfrom typing import List\nfrom uuid import uuid4\nfrom fastapi import FastAPI\nfrom models import Gender, Role, User\napp = FastAPI()\ndb: List[User] = [\n User(\n id=uuid4(),\n first_name=\"John\",\n last_name=\"Doe\",\n gender=Gender.male,\n roles=[Role.user],\n ),\n User(\n id=uuid4(),\n first_name=\"Jane\",\n last_name=\"Doe\",\n gender=Gender.female,\n roles=[Role.user],\n ),\n User(\n id=uuid4(),\n first_name=\"James\",\n last_name=\"Gabriel\",\n gender=Gender.male,\n roles=[Role.user],\n ),\n User(\n id=uuid4(),\n first_name=\"Eunit\",\n last_name=\"Eunit\",\n gender=Gender.male,\n roles=[Role.admin, Role.user],\n ),\n]\n@app.get(\"\/\")\nasync def root():\n return {\"Hello\": \"World\",}\n@app.get(\"\/api\/v1\/users\")\nasync def get_users():\n return db\n<\/code><\/pre>\n<h3>Opret Database Records<\/h3>\n<p>Det n\u00e6ste trin er at oprette et endpoint til at oprette en ny bruger i din database. Inds\u00e6t f\u00f8lgende uddrag i din <strong>main.py<\/strong>-fil:<\/p>\n<pre><code class=\"language-python\">\n# main.py\n@app.post(\"\/api\/v1\/users\")\nasync def create_user(user: User):\n db.append(user)\n return {\"id\": user.id}\n<\/code><\/pre>\n<p>I dette uddrag har du defineret slutpunktet til at indsende en ny bruger og gjort brug af <code>@app.post<\/code> decorator til at oprette en <code>POST<\/code> -metode.<\/p>\n<p>Du oprettede ogs\u00e5 funktionen <code>create_user<\/code>, som accepterer <code>user<\/code> i modellen <code>User<\/code>, og du tilf\u00f8jede (tilf\u00f8jede) den nyligt oprettede <code>user<\/code> til databasen, <code>db<\/code>. Endelig returnerer endpoint et JSON-objekt med den nyoprettede brugers <code>id<\/code>.<\/p>\n<p>Du skal bruge den automatiske API-dokumentation fra FastAPI til at teste dit endpoint, som det fremg\u00e5r ovenfor. Dette skyldes, at du ikke kan foretage en postanmodning ved hj\u00e6lp af webbrowseren. Naviger til <code>http:\/\/localhost:8000\/docs<\/code> for at teste ved hj\u00e6lp af den dokumentation, der leveres af <a href=\"https:\/\/github.com\/swagger-api\/swagger-ui\">SwaggerUI<\/a>.<\/p>\n<figure style=\"width: 685px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/11\/fastapi-parameters-post-request.png\" alt=\"Sk\u00e6rmbillede, der viser parametre for FastAPI POST-anmodning.\" width=\"685\" height=\"1029\"><figcaption class=\"wp-caption-text\">Parametre til en FastAPI POST-anmodning<\/figcaption><\/figure>\n<h3>Sletning af databa records<\/h3>\n<p>Da du bygger en CRUD-app, skal din applikation have mulighed for at <a href=\"https:\/\/developer.mozilla.org\/en-US\/docs\/Web\/HTTP\/Methods\/DELETE\">slette<\/a> en bestemt ressource. I denne tutorial vil du oprette et endpoint til at slette en bruger.<\/p>\n<p>Inds\u00e6t f\u00f8lgende kode i din <strong>main.py<\/strong>-fil:<\/p>\n<pre><code class=\"language-python\">\n# main.py\nfrom uuid import UUID\nfrom fastapi HTTPException\n@app.delete(\"\/api\/v1\/users\/{id}\")\nasync def delete_user(id: UUID):\nfor user in db:\n if user.id == id:\n db.remove(user)\n return\nraise HTTPException(\n status_code=404, detail=f\"Delete user failed, id {id} not found.\"\n )\n<\/code><\/pre>\n<p>Her er en linje-for-linje opdeling af, hvordan denne kode fungerer:<\/p>\n<ul>\n<li><code>@app.delete(\"\/api\/v1\/users\/{id}\")<\/code>: Du har oprettet slette-endpoint ved hj\u00e6lp af <code>@app.delete()<\/code> -dekoratoren. Stien er stadig <code>\/api\/v1\/users\/{id}<\/code>, men derefter hentes <code>id<\/code>, som er en stivariabel, der svarer til brugerens id.<\/li>\n<li><code>async def delete_user(id: UUID):<\/code>: Opretter funktionen <code>delete_user<\/code>, som henter <code>id<\/code> fra URL&#8217;en.<\/li>\n<li><code>for user in db:<\/code>: Dette fort\u00e6ller appen, at den skal genneml\u00f8be brugerne i databasen og kontrollere, om den overf\u00f8rte <code>id<\/code> passer til en bruger i databasen.<\/li>\n<li><code>db.remove(user)<\/code>: Hvis <code>id<\/code> passer til en bruger, slettes brugeren, ellers sendes en <code>HTTPException<\/code> med <a href=\"https:\/\/kinsta.com\/dk\/blog\/http-status-codes\/\">statuskode<\/a> 404.<\/li>\n<\/ul>\n<figure style=\"width: 594px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/11\/fastapi-parameters-delete-request.png\" alt=\"Sk\u00e6rmbillede, der viser parametre for FastAPI DELETE-anmodning.\" width=\"594\" height=\"1030\"><figcaption class=\"wp-caption-text\">Parametre for en FastAPI DELETE-anmodning.<\/figcaption><\/figure>\n<h3>Opdatering af database records<\/h3>\n<p>Du skal oprette et endpoint til at opdatere en brugers oplysninger. De detaljer, der kan opdateres, omfatter f\u00f8lgende parametre: <code>first_name<\/code>, , <code>last_name<\/code>, og <code>roles<\/code>.<\/p>\n<p>I din <strong>models.py<\/strong>-fil inds\u00e6tter du f\u00f8lgende kode under din <code>User<\/code> -model, dvs. efter <code>User(BaseModel):<\/code> -klassen:<\/p>\n<pre><code class=\"language-python\"> # models.py\n class UpdateUser(BaseModel):\n first_name: Optional[str]\n last_name: Optional[str]\n roles: Optional[List[Role]]\n<\/code><\/pre>\n<p>I dette uddrag udvider klassen <code>UpdateUser<\/code> <code>BaseModel<\/code> . Derefter indstiller du de opdaterbare brugerparametre, f.eks. <code>first_name<\/code>, <code>last_name<\/code> og <code>roles<\/code>, til at v\u00e6re valgfrie.<\/p>\n<p>Nu opretter du et slutpunkt for at opdatere en bestemt brugers oplysninger. I din fil <strong>main.py<\/strong> inds\u00e6tter du f\u00f8lgende kode efter <code>@app.delete<\/code> decorator:<\/p>\n<pre><code class=\"language-python\"># main.py\n@app.put(\"\/api\/v1\/users\/{id}\")\nasync def update_user(user_update: UpdateUser, id: UUID):\n for user in db:\n if user.id == id:\n if user_update.first_name is not None:\n user.first_name = user_update.first_name\n if user_update.last_name is not None:\n user.last_name = user_update.last_name\n if user_update.roles is not None:\n user.roles = user_update.roles\n return user.id\n raise HTTPException(status_code=404, detail=f\"Could not find user with id: {id}\")\n<\/code><\/pre>\n<p>I ovenst\u00e5ende kode har du gjort f\u00f8lgende:<\/p>\n<ul>\n<li>Oprettede <code>@app.put(\"\/api\/v1\/users\/{id}\")<\/code>, opdateringsslutpunktet. Det har en variabel parameter <code>id<\/code>, der svarer til brugerens id.<\/li>\n<li>Der blev oprettet en metode kaldet <code>update_user<\/code>, som indeholder klassen <code>UpdateUser<\/code> og <code>id<\/code>.<\/li>\n<li>Brugte et <code>for<\/code> loop til at kontrollere, om den bruger, der er knyttet til den overgivne <code>id<\/code>, findes i databasen.<\/li>\n<li>Kontrolleret, om nogen af brugerens parametre er <code>is not None<\/code> (ikke nul). Hvis en parameter, f.eks. <code>first_name<\/code>, <code>last_name<\/code> eller <code>roles<\/code>, ikke er nul, opdateres den.<\/li>\n<li>Hvis operationen er vellykket, returneres bruger-id&#8217;et.<\/li>\n<li>Hvis brugeren ikke kunne findes, opst\u00e5r der en <code>HTTPException<\/code> undtagelse med statuskode 404 og en meddelelse <code>Could not find user with id: {id}<\/code>.<\/li>\n<\/ul>\n<p>For at teste dette endpoint skal du sikre dig, at din Uvicorn-server k\u00f8rer. Hvis den ikke k\u00f8rer, skal du indtaste denne kommando:<\/p>\n<pre><code class=\"language-bash\">uvicorn main:app --reload<\/code><\/pre>\n<p>Nedenfor er et sk\u00e6rmbillede af testen.<\/p>\n<figure style=\"width: 593px\" class=\"wp-caption alignnone\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/kinsta.com\/wp-content\/uploads\/2022\/11\/fastapi-parameters-update-request.png\" alt=\"Sk\u00e6rmbillede, der viser parametre for en UPDATE-anmodning.\" width=\"593\" height=\"954\"><figcaption class=\"wp-caption-text\">Parametre for en FastAPI UPDATE-anmodning.<\/figcaption><\/figure>\n\n<h2>Opsummering<\/h2>\n<p>I denne tutorial har du l\u00e6rt om FastAPI-rammen til Python og har selv set, hvor hurtigt du kan f\u00e5 en FastAPI-drevet applikation op at k\u00f8re. Du har l\u00e6rt at opbygge CRUD API endpoints ved hj\u00e6lp af dette framework &#8211; oprettelse, l\u00e6sning, opdatering og sletning af database records.<\/p>\n<p>Hvis du nu \u00f8nsker at tage din webapp-udvikling til det n\u00e6ste niveau, skal du huske at tjekke Kinstas platform til <a href=\"https:\/\/kinsta.com\/dk\/changelog\/applikation-database-hosting\/\">applikationshosting og databasehosting<\/a>. Ligesom FastAPI er den kraftfuldt enkel.<\/p>\n<kinsta-video src=\"https:\/\/www.youtube.com\/watch?v=vmNem6wxfSQ\"><\/kinsta-video>\n","protected":false},"excerpt":{"rendered":"<p>FastAPI er en hurtig og letv\u00e6gts webframework til opbygning af moderne programmeringsgr\u00e6nseflader til applikationer ved hj\u00e6lp af Python 3.6 og derover. I denne vejledning gennemg\u00e5r vi &#8230;<\/p>\n","protected":false},"author":270,"featured_media":47056,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_kinsta_gated_content":false,"_kinsta_gated_content_redirect":"","footnotes":""},"tags":[518,494,570,197],"topic":[679,729],"class_list":["post-47055","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","tag-api","tag-python","tag-web-applications","tag-web-development","topic-api","topic-python"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v24.6 (Yoast SEO v24.6) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Byg en app med FastAPI til Python - Kinsta\u00ae<\/title>\n<meta name=\"description\" content=\"Her er hvad du beh\u00f8ver at vide om FastAPI for hurtigt at bygge applikationsprogrammeringsgr\u00e6nseflader ved hj\u00e6lp af Python.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Byg en app med FastAPI til Python\" \/>\n<meta property=\"og:description\" content=\"Her er hvad du beh\u00f8ver at vide om FastAPI for hurtigt at bygge applikationsprogrammeringsgr\u00e6nseflader ved hj\u00e6lp af Python.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kinsta\u00ae\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\" \/>\n<meta property=\"article:published_time\" content=\"2022-11-29T12:13:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2023-08-23T09:13:12+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"1460\" \/>\n\t<meta property=\"og:image:height\" content=\"730\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"author\" content=\"Emmanuel Uchenna\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:description\" content=\"Her er hvad du beh\u00f8ver at vide om FastAPI for hurtigt at bygge applikationsprogrammeringsgr\u00e6nseflader ved hj\u00e6lp af Python.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg\" \/>\n<meta name=\"twitter:creator\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:site\" content=\"@kinsta_dk\" \/>\n<meta name=\"twitter:label1\" content=\"Skrevet af\" \/>\n\t<meta name=\"twitter:data1\" content=\"Emmanuel Uchenna\" \/>\n\t<meta name=\"twitter:label2\" content=\"Estimeret l\u00e6setid\" \/>\n\t<meta name=\"twitter:data2\" content=\"13 minutter\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/\"},\"author\":{\"name\":\"Emmanuel Uchenna\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/8deb20857e9f90e6cc3c2426da8f343f\"},\"headline\":\"Byg en app med FastAPI til Python\",\"datePublished\":\"2022-11-29T12:13:37+00:00\",\"dateModified\":\"2023-08-23T09:13:12+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/\"},\"wordCount\":2151,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg\",\"keywords\":[\"API\",\"Python\",\"web applications\",\"web development\"],\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/\",\"name\":\"Byg en app med FastAPI til Python - Kinsta\u00ae\",\"isPartOf\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg\",\"datePublished\":\"2022-11-29T12:13:37+00:00\",\"dateModified\":\"2023-08-23T09:13:12+00:00\",\"description\":\"Her er hvad du beh\u00f8ver at vide om FastAPI for hurtigt at bygge applikationsprogrammeringsgr\u00e6nseflader ved hj\u00e6lp af Python.\",\"breadcrumb\":{\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#breadcrumb\"},\"inLanguage\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#primaryimage\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg\",\"width\":1460,\"height\":730},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/kinsta.com\/dk\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"API\",\"item\":\"https:\/\/kinsta.com\/dk\/emner\/api\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Byg en app med FastAPI til Python\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/kinsta.com\/dk\/#website\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"name\":\"Kinsta\u00ae\",\"description\":\"Hurtig, sikker, premium hostingl\u00f8sninger\",\"publisher\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/kinsta.com\/dk\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/kinsta.com\/dk\/#organization\",\"name\":\"Kinsta\",\"url\":\"https:\/\/kinsta.com\/dk\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"contentUrl\":\"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg\",\"width\":500,\"height\":500,\"caption\":\"Kinsta\"},\"image\":{\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/\"},\"sameAs\":[\"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/\",\"https:\/\/x.com\/kinsta_dk\",\"https:\/\/www.instagram.com\/kinstahosting\/\",\"https:\/\/www.linkedin.com\/company\/kinsta\/\",\"https:\/\/www.pinterest.com\/kinstahosting\/\",\"https:\/\/www.youtube.com\/c\/Kinsta\"]},{\"@type\":\"Person\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/8deb20857e9f90e6cc3c2426da8f343f\",\"name\":\"Emmanuel Uchenna\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@id\":\"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/ad8b6a83415f2708e437768feb16d3da?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/ad8b6a83415f2708e437768feb16d3da?s=96&d=mm&r=g\",\"caption\":\"Emmanuel Uchenna\"},\"description\":\"Emmanuel is an experienced, passionate, and enthusiastic software developer and technical writer with proven years of professional experience. He focuses on full-stack web development. He's fluent in ReactJS, JavaScript, VueJS, and NodeJS and familiar with industry-standard technologies such as Git, GitHub, and TDD. He helps individuals, businesses, and brands build responsive, accessible, beautiful, and intuitive websites to improve their online presence. He is also a technical writer for various websites and his own projects.\",\"url\":\"https:\/\/kinsta.com\/dk\/blog\/author\/emmanueluchenna\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Byg en app med FastAPI til Python - Kinsta\u00ae","description":"Her er hvad du beh\u00f8ver at vide om FastAPI for hurtigt at bygge applikationsprogrammeringsgr\u00e6nseflader ved hj\u00e6lp af Python.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/","og_locale":"da_DK","og_type":"article","og_title":"Byg en app med FastAPI til Python","og_description":"Her er hvad du beh\u00f8ver at vide om FastAPI for hurtigt at bygge applikationsprogrammeringsgr\u00e6nseflader ved hj\u00e6lp af Python.","og_url":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/","og_site_name":"Kinsta\u00ae","article_publisher":"https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","article_published_time":"2022-11-29T12:13:37+00:00","article_modified_time":"2023-08-23T09:13:12+00:00","og_image":[{"width":1460,"height":730,"url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg","type":"image\/jpeg"}],"author":"Emmanuel Uchenna","twitter_card":"summary_large_image","twitter_description":"Her er hvad du beh\u00f8ver at vide om FastAPI for hurtigt at bygge applikationsprogrammeringsgr\u00e6nseflader ved hj\u00e6lp af Python.","twitter_image":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg","twitter_creator":"@kinsta_dk","twitter_site":"@kinsta_dk","twitter_misc":{"Skrevet af":"Emmanuel Uchenna","Estimeret l\u00e6setid":"13 minutter"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#article","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/"},"author":{"name":"Emmanuel Uchenna","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/8deb20857e9f90e6cc3c2426da8f343f"},"headline":"Byg en app med FastAPI til Python","datePublished":"2022-11-29T12:13:37+00:00","dateModified":"2023-08-23T09:13:12+00:00","mainEntityOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/"},"wordCount":2151,"commentCount":0,"publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg","keywords":["API","Python","web applications","web development"],"inLanguage":"da-DK","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/kinsta.com\/dk\/blog\/fastapi\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/","url":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/","name":"Byg en app med FastAPI til Python - Kinsta\u00ae","isPartOf":{"@id":"https:\/\/kinsta.com\/dk\/#website"},"primaryImageOfPage":{"@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#primaryimage"},"image":{"@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#primaryimage"},"thumbnailUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg","datePublished":"2022-11-29T12:13:37+00:00","dateModified":"2023-08-23T09:13:12+00:00","description":"Her er hvad du beh\u00f8ver at vide om FastAPI for hurtigt at bygge applikationsprogrammeringsgr\u00e6nseflader ved hj\u00e6lp af Python.","breadcrumb":{"@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/kinsta.com\/dk\/blog\/fastapi\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#primaryimage","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2022\/11\/fastapi.jpg","width":1460,"height":730},{"@type":"BreadcrumbList","@id":"https:\/\/kinsta.com\/dk\/blog\/fastapi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/kinsta.com\/dk\/"},{"@type":"ListItem","position":2,"name":"API","item":"https:\/\/kinsta.com\/dk\/emner\/api\/"},{"@type":"ListItem","position":3,"name":"Byg en app med FastAPI til Python"}]},{"@type":"WebSite","@id":"https:\/\/kinsta.com\/dk\/#website","url":"https:\/\/kinsta.com\/dk\/","name":"Kinsta\u00ae","description":"Hurtig, sikker, premium hostingl\u00f8sninger","publisher":{"@id":"https:\/\/kinsta.com\/dk\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/kinsta.com\/dk\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"da-DK"},{"@type":"Organization","@id":"https:\/\/kinsta.com\/dk\/#organization","name":"Kinsta","url":"https:\/\/kinsta.com\/dk\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/","url":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","contentUrl":"https:\/\/kinsta.com\/dk\/wp-content\/uploads\/sites\/12\/2023\/12\/kinsta-logo.jpeg","width":500,"height":500,"caption":"Kinsta"},"image":{"@id":"https:\/\/kinsta.com\/dk\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Kinsta-Danmark-122855885298660\/","https:\/\/x.com\/kinsta_dk","https:\/\/www.instagram.com\/kinstahosting\/","https:\/\/www.linkedin.com\/company\/kinsta\/","https:\/\/www.pinterest.com\/kinstahosting\/","https:\/\/www.youtube.com\/c\/Kinsta"]},{"@type":"Person","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/8deb20857e9f90e6cc3c2426da8f343f","name":"Emmanuel Uchenna","image":{"@type":"ImageObject","inLanguage":"da-DK","@id":"https:\/\/kinsta.com\/dk\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/ad8b6a83415f2708e437768feb16d3da?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/ad8b6a83415f2708e437768feb16d3da?s=96&d=mm&r=g","caption":"Emmanuel Uchenna"},"description":"Emmanuel is an experienced, passionate, and enthusiastic software developer and technical writer with proven years of professional experience. He focuses on full-stack web development. He's fluent in ReactJS, JavaScript, VueJS, and NodeJS and familiar with industry-standard technologies such as Git, GitHub, and TDD. He helps individuals, businesses, and brands build responsive, accessible, beautiful, and intuitive websites to improve their online presence. He is also a technical writer for various websites and his own projects.","url":"https:\/\/kinsta.com\/dk\/blog\/author\/emmanueluchenna\/"}]}},"acf":[],"_links":{"self":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/47055","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/users\/270"}],"replies":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/comments?post=47055"}],"version-history":[{"count":11,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/47055\/revisions"}],"predecessor-version":[{"id":50942,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/posts\/47055\/revisions\/50942"}],"alternate":[{"embeddable":true,"hreflang":"en","title":"English","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/en"},{"embeddable":true,"hreflang":"it","title":"Italian","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/it"},{"embeddable":true,"hreflang":"pt","title":"Portuguese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/pt"},{"embeddable":true,"hreflang":"fr","title":"French","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/fr"},{"embeddable":true,"hreflang":"de","title":"German","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/de"},{"embeddable":true,"hreflang":"ja","title":"Japanese","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/jp"},{"embeddable":true,"hreflang":"nl","title":"Dutch","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/nl"},{"embeddable":true,"hreflang":"es","title":"Spanish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/es"},{"embeddable":true,"hreflang":"sv","title":"Swedish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/se"},{"embeddable":true,"hreflang":"da","title":"Danish","href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/translations\/dk"},{"href":"https:\/\/kinsta.com\/dk\/wp-json\/kinsta\/v1\/posts\/47055\/tree"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media\/47056"}],"wp:attachment":[{"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/media?parent=47055"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/tags?post=47055"},{"taxonomy":"topic","embeddable":true,"href":"https:\/\/kinsta.com\/dk\/wp-json\/wp\/v2\/topic?post=47055"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}