{"id":32226,"date":"2025-10-19T07:01:15","date_gmt":"2025-10-19T04:01:15","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/"},"modified":"2025-10-19T07:01:15","modified_gmt":"2025-10-19T04:01:15","slug":"fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/","title":{"rendered":"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 &#8211; Minimal Bir Forum"},"content":{"rendered":"<p><body><\/p>\n<p>Kendi online toplulu\u011funuzu kurma hayali mi kuruyorsunuz? Belki de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n etkile\u015fimde bulunabilece\u011fi, d\u00fc\u015f\u00fcncelerini payla\u015fabilece\u011fi bir platforma ihtiyac\u0131n\u0131z var. FastAPI ile s\u0131f\u0131rdan, modern ve h\u0131zl\u0131 bir forum backend&#8217;i olu\u015fturmak, d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fczden \u00e7ok daha kolay ve keyifli bir s\u00fcre\u00e7 olabilir. Bu makalede, Python&#8217;\u0131n g\u00fcc\u00fcn\u00fc FastAPI&#8217;nin performans\u0131yla birle\u015ftirerek nas\u0131l minimal bir forum \u00e7at\u0131s\u0131 kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki bir geli\u015ftiricinin bile kolayca anlayabilece\u011fi, ancak deneyimli kullan\u0131c\u0131lar i\u00e7in de de\u011ferli ipu\u00e7lar\u0131 bar\u0131nd\u0131ran bu rehberle, kendi forum maceran\u0131za ilk ad\u0131m\u0131 at\u0131n.<\/p>\n<p>Modern web uygulamalar\u0131 geli\u015ftirmek, \u00f6zellikle API tabanl\u0131 mimarilerin y\u00fckseli\u015fiyle birlikte, daha verimli ve performansl\u0131 ara\u00e7lar gerektiriyor. \u0130\u015fte tam bu noktada Python&#8217;\u0131n en gen\u00e7 ve en dinamik web framework&#8217;lerinden biri olan FastAPI sahneye \u00e7\u0131k\u0131yor. FastAPI, y\u00fcksek performansl\u0131, \u00f6\u011frenmesi kolay ve geli\u015ftirici deneyimini oda\u011f\u0131na alan bir yap\u0131 sunar. Bu framework, asenkron programlama yetenekleri sayesinde ayn\u0131 anda binlerce iste\u011fi i\u015fleyebilir, bu da forum gibi yo\u011fun etkile\u015fimli uygulamalar i\u00e7in kritik bir avantaj sa\u011flar. Django ve Flask gibi k\u00f6kl\u00fc rakiplerine k\u0131yasla daha yeni olmas\u0131na ra\u011fmen, \u00f6zellikle modern mikroservis mimarileri ve API geli\u015ftirme s\u00f6z konusu oldu\u011funda h\u0131zla tercih edilen bir se\u00e7enek haline gelmi\u015ftir.<\/p>\n<p>FastAPI&#8217;nin pop\u00fclaritesinin arkas\u0131nda yatan temel nedenlerden biri, Python&#8217;\u0131n tip ipu\u00e7lar\u0131ndan (type hints) tam anlam\u0131yla faydalanmas\u0131d\u0131r. Bu \u00f6zellik sayesinde Pydantic ad\u0131 verilen bir k\u00fct\u00fcphane ile veri do\u011frulama ve serile\u015ftirme i\u015flemleri inan\u0131lmaz derecede kolayla\u015f\u0131r. \u00d6rne\u011fin, bir kullan\u0131c\u0131dan forum konusu olu\u015fturmas\u0131n\u0131 istedi\u011finizde, konunun ba\u015fl\u0131\u011f\u0131n\u0131n string, i\u00e7eri\u011finin yine string ve belki de bir yazar ID&#8217;sinin integer olmas\u0131n\u0131 beklersiniz. Pydantic, bu veri tiplerini otomatik olarak do\u011frular ve d\u00f6n\u00fc\u015ft\u00fcr\u00fcr, b\u00f6ylece siz manuel do\u011frulama kodlar\u0131 yazmak zorunda kalmazs\u0131n\u0131z. Bu da hem geli\u015ftirme s\u00fcresini k\u0131salt\u0131r hem de olas\u0131 hatalar\u0131 \u00f6nemli \u00f6l\u00e7\u00fcde azalt\u0131r. Ayr\u0131ca, FastAPI&#8217;nin sundu\u011fu otomatik etkile\u015fimli API belgeleri (Swagger UI ve ReDoc), geli\u015ftirme s\u00fcrecini \u00e7ok daha \u015feffaf ve i\u015fbirlik\u00e7i hale getirir. Bir API endpoint&#8217;i tan\u0131mlad\u0131\u011f\u0131n\u0131zda, bu dok\u00fcmanlar otomatik olarak g\u00fcncellenir ve di\u011fer geli\u015ftiricilerin veya hatta kendi frontend ekibinizin API&#8217;nizi kolayca anlamas\u0131na ve kullanmas\u0131na olanak tan\u0131r. Bu \u00f6zellik, \u00f6zellikle birden fazla geli\u015ftiricinin \u00e7al\u0131\u015ft\u0131\u011f\u0131 projelerde veya API&#8217;yi d\u0131\u015f d\u00fcnyaya a\u00e7t\u0131\u011f\u0131n\u0131z senaryolarda paha bi\u00e7ilmezdir. T\u00fcm bu avantajlar g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, FastAPI&#8217;nin h\u0131zl\u0131, g\u00fcvenilir ve bak\u0131m\u0131 kolay bir forum backend&#8217;i in\u015fa etmek i\u00e7in neden m\u00fckemmel bir se\u00e7im oldu\u011funu anlamak zor de\u011fil. Ayr\u0131ca, Python&#8217;\u0131n zengin ekosistemi sayesinde veritaban\u0131 entegrasyonu, yetkilendirme (authentication) ve di\u011fer ileri d\u00fczey \u00f6zellikler i\u00e7in bir\u00e7ok haz\u0131r k\u00fct\u00fcphane ve ara\u00e7 mevcuttur.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: FastAPI&#8217;nin asenkron yap\u0131s\u0131n\u0131 tam olarak kullanabilmek i\u00e7in veritaban\u0131 i\u015flemlerinizde ve d\u0131\u015f API \u00e7a\u011fr\u0131lar\u0131n\u0131zda asenkron s\u00fcr\u00fcc\u00fcler (\u00f6rne\u011fin <code>asyncpg<\/code>, <code>aiosqlite<\/code> veya <code>asyncio-redis<\/code>) kullanmaya \u00f6zen g\u00f6sterin. Aksi takdirde, senkron i\u015flemler ana olay\u0131 (event loop) bloke ederek performans avantaj\u0131n\u0131 azaltabilir.\n<\/div>\n<h2>Minimal Bir Forum \u0130\u00e7in Temel Gereksinimler Nelerdir?<\/h2>\n<p>Her b\u00fcy\u00fck projenin temelinde sa\u011flam bir minimalist yakla\u015f\u0131m yatar. &#8220;Minimal bir forum&#8221; derken, kullan\u0131c\u0131lar\u0131n etkile\u015fimde bulunabilece\u011fi en temel i\u015flevleri kastediyoruz: konular\u0131 (threads) listeleyebilmek, yeni konular a\u00e7abilmek, bir konunun detaylar\u0131n\u0131 g\u00f6rebilmek ve o konuya mesajlar (replies) ekleyebilmek. Bu a\u015famada kullan\u0131c\u0131 kayd\u0131, profil y\u00f6netimi, \u00f6zel mesajla\u015fma veya geli\u015fmi\u015f arama gibi karma\u015f\u0131k \u00f6zellikleri bir kenara b\u0131rak\u0131yoruz. Amac\u0131m\u0131z, uygulaman\u0131n \u00e7ekirde\u011fini olu\u015fturan veri modellerini ve API endpoint&#8217;lerini basit ve anla\u015f\u0131l\u0131r bir \u015fekilde olu\u015fturmakt\u0131r. Bu temel i\u015flevler, forumunuzun belkemi\u011fini olu\u015fturacak ve ilerleyen ad\u0131mlarda \u00fczerine daha fazla \u00f6zellik in\u015fa etmenizi sa\u011flayacakt\u0131r.<\/p>\n<p>Veritaban\u0131 se\u00e7imi, projenin b\u00fcy\u00fckl\u00fc\u011f\u00fcne ve karma\u015f\u0131kl\u0131\u011f\u0131na g\u00f6re de\u011fi\u015fse de, minimal bir forum i\u00e7in ba\u015flang\u0131\u00e7ta bellek i\u00e7i (in-memory) depolama veya SQLite gibi hafif bir se\u00e7enek olduk\u00e7a idealdir. Bu, h\u0131zl\u0131 prototipleme yapmam\u0131z\u0131 ve veritaban\u0131 kurulumunun getirece\u011fi karma\u015f\u0131kl\u0131ktan ka\u00e7\u0131nmam\u0131z\u0131 sa\u011flar. Bellek i\u00e7i depolama, sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda verilerin kaybolaca\u011f\u0131 anlam\u0131na gelse de, ilk ad\u0131mda API&#8217;nin mant\u0131\u011f\u0131n\u0131 test etmek i\u00e7in m\u00fckemmeldir. \u0130lerleyen a\u015famalarda kolayca bir PostgreSQL, MySQL veya MongoDB gibi daha kal\u0131c\u0131 bir veritaban\u0131na ge\u00e7i\u015f yapabiliriz. Proje yap\u0131s\u0131 da \u00f6nem ta\u015f\u0131r; d\u00fczenli bir dosya ve klas\u00f6r yap\u0131s\u0131, projeniz b\u00fcy\u00fcd\u00fck\u00e7e y\u00f6netilebilirli\u011fini art\u0131r\u0131r. \u00d6rne\u011fin, veri modellerini ayr\u0131 bir dosyada, API rotalar\u0131n\u0131 ba\u015fka bir dosyada tutmak iyi bir uygulamad\u0131r. Bu mod\u00fcler yap\u0131, kodun okunabilirli\u011fini ve bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131r\u0131r.<\/p>\n<p>Geli\u015ftirme ortam\u0131m\u0131z\u0131n haz\u0131rlanmas\u0131 da bu s\u00fcrecin ayr\u0131lmaz bir par\u00e7as\u0131d\u0131r. Python tabanl\u0131 projelerde sanal ortam (virtual environment) kullanmak, projenizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole etmek i\u00e7in olmazsa olmazd\u0131r. Bu sayede farkl\u0131 projelerdeki farkl\u0131 k\u00fct\u00fcphane versiyonlar\u0131 birbiriyle \u00e7ak\u0131\u015fmaz. Bir sanal ortam olu\u015fturup FastAPI ve Uvicorn gibi gerekli k\u00fct\u00fcphaneleri kurduktan sonra, ilk FastAPI uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in haz\u0131rs\u0131n\u0131z demektir. Bu temel gereksinimler, hem teknik altyap\u0131y\u0131 sa\u011flamla\u015ft\u0131r\u0131r hem de geli\u015ftirme s\u00fcrecini daha d\u00fczenli ve hatas\u0131z hale getirir. T\u00fcm bu haz\u0131rl\u0131klar, forumunuzun temelini atmak i\u00e7in sa\u011flam bir zemin olu\u015fturur ve sonraki ad\u0131mlarda daha karma\u015f\u0131k \u00f6zellikler eklerken size esneklik sa\u011flar. Bu minimalist yakla\u015f\u0131m, karma\u015f\u0131kl\u0131\u011f\u0131 y\u00f6netilebilir par\u00e7alara ay\u0131rarak \u00f6\u011frenme s\u00fcrecini de h\u0131zland\u0131r\u0131r, b\u00f6ylece motivasyonunuzu y\u00fcksek tutarak projenizi ba\u015far\u0131yla tamamlayabilirsiniz.<\/p>\n<h3>Ad\u0131m Ad\u0131m Kurulum: FastAPI Ortam\u0131n\u0131z\u0131 Haz\u0131rlama<\/h3>\n<p>Her yaz\u0131l\u0131m projesi, sa\u011flam bir temel \u00fczerine in\u015fa edilir. FastAPI ile forumumuzu olu\u015fturmaya ba\u015flamadan \u00f6nce, gerekli geli\u015ftirme ortam\u0131n\u0131 d\u00fczg\u00fcn bir \u015fekilde kurmam\u0131z gerekiyor. Bu s\u00fcre\u00e7, Python projeleri i\u00e7in en iyi uygulama olan sanal ortam (virtual environment) olu\u015fturma, FastAPI ve bir ASGI sunucusu olan Uvicorn&#8217;u kurma ad\u0131mlar\u0131n\u0131 i\u00e7erir. Bu ad\u0131mlar, projenizin ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 izole etmenizi ve farkl\u0131 projeler aras\u0131nda versiyon \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nlemenizi sa\u011flar. \u0130lk olarak, projeniz i\u00e7in yeni bir dizin olu\u015fturun ve i\u00e7ine girin:<\/p>\n<pre><code class=\"language-bash\">\nmkdir fastforum\ncd fastforum\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, bu dizin i\u00e7inde bir sanal ortam olu\u015ftural\u0131m. Windows kullan\u0131c\u0131lar\u0131 i\u00e7in \"Scripts\" dizinindeki \"activate\" dosyas\u0131n\u0131, Linux\/macOS kullan\u0131c\u0131lar\u0131 i\u00e7in ise \"bin\" dizinindeki \"activate\" beti\u011fini \u00e7al\u0131\u015ft\u0131rman\u0131z gerekecek. Sanal ortam\u0131 aktive ettikten sonra, komut istemcisi veya terminal penceresi, aktif sanal ortam\u0131 g\u00f6steren bir \u00f6n ekle de\u011fi\u015fmelidir, bu genellikle \"(venv)\" veya \"(fastforum-env)\" \u015feklinde g\u00f6r\u00fcn\u00fcr.<\/p>\n<pre><code class=\"language-bash\">\npython -m venv venv\n# Linux\/macOS\nsource venv\/bin\/activate\n# Windows\n.\\venv\\Scripts\\activate\n<\/pre>\n<p><\/code><\/p>\n<p>Sanal ortam\u0131n\u0131z ba\u015far\u0131yla aktifle\u015ftirildi\u011fine g\u00f6re, \u015fimdi FastAPI ve Uvicorn'u y\u00fckleyebiliriz. Uvicorn, FastAPI uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan hafif ve h\u0131zl\u0131 bir ASGI sunucusudur. Ayr\u0131ca, <code>python-multipart<\/code> k\u00fct\u00fcphanesini de ekleyelim; bu, form verileri gibi karma\u015f\u0131k veri tiplerini i\u015flemede bize yard\u0131mc\u0131 olacakt\u0131r, ilerleyen a\u015famalarda dosya y\u00fckleme gibi \u00f6zellikler i\u00e7in de \u00f6nemlidir.<\/p>\n<pre><code class=\"language-bash\">\npip install fastapi uvicorn python-multipart\n<\/pre>\n<p><\/code><\/p>\n<p>Kurulum tamamland\u0131ktan sonra, projemizin k\u00f6k dizininde <code>main.py<\/code> ad\u0131nda bir dosya olu\u015ftural\u0131m ve i\u00e7ine basit bir FastAPI uygulamas\u0131 yazarak her \u015feyin d\u00fczg\u00fcn \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 kontrol edelim. Bu minimal kod par\u00e7as\u0131, FastAPI uygulaman\u0131z\u0131n temelini olu\u015fturur ve ilk API endpoint'inizi tan\u0131mlar. Bir GET iste\u011fiyle \"Hello World\" mesaj\u0131n\u0131 d\u00f6nd\u00fcrecek basit bir rota olu\u015fturaca\u011f\u0131z.<\/p>\n<pre><code class=\"language-python\">\n# main.py\nfrom fastapi import FastAPI\n\napp = FastAPI()\n\n@app.get(\"\/\")\nasync def read_root():\n    return {\"message\": \"Merhaba, Minimal Forum!\"}\n<\/pre>\n<p><\/code><\/p>\n<p>Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalde \u015fu komutu kullan\u0131n:<\/p>\n<pre><code class=\"language-bash\">\nuvicorn main:app --reload\n<\/pre>\n<p><\/code><\/p>\n<p><code>--reload<\/code> bayra\u011f\u0131, kodunuzda yapt\u0131\u011f\u0131n\u0131z de\u011fi\u015fiklikleri otomatik olarak alg\u0131lay\u0131p sunucuyu yeniden ba\u015flat\u0131r, bu da geli\u015ftirme s\u00fcrecini \u00e7ok daha verimli hale getirir. Taray\u0131c\u0131n\u0131zda <a href=\"http:\/\/127.0.0.1:8000\">http:\/\/127.0.0.1:8000<\/a> adresine gitti\u011finizde <code>{\"message\": \"Merhaba, Minimal Forum!\"}<\/code> \u00e7\u0131kt\u0131s\u0131n\u0131 g\u00f6rmelisiniz. Ayr\u0131ca, <a href=\"http:\/\/127.0.0.1:8000\/docs\">http:\/\/127.0.0.1:8000\/docs<\/a> adresinde Swagger UI ile otomatik olarak olu\u015fturulmu\u015f API belgelendirmesini g\u00f6rebilirsiniz. Bu, FastAPI'nin sundu\u011fu harika bir \u00f6zelliktir. Bu ilk ad\u0131m\u0131 tamamlad\u0131\u011f\u0131m\u0131zda, forumumuzun backend'i i\u00e7in sa\u011flam ve i\u015flevsel bir temel olu\u015fturmu\u015f oluruz. Art\u0131k forum mant\u0131\u011f\u0131m\u0131z\u0131 ve API endpoint'lerimizi geli\u015ftirmeye haz\u0131r\u0131z. Her ad\u0131m\u0131 dikkatle takip ederek, kendi h\u0131zl\u0131 ve modern forumunuzu in\u015fa etmeye ba\u015flayabilirsiniz.<\/p>\n<h2>Forumumuzun Omurgas\u0131n\u0131 Olu\u015fturmak: Konular ve Mesajlar Nas\u0131l Y\u00f6netilir?<\/h2>\n<p>Minimal forumumuzun kalbi, konular\u0131n ve bu konulara yaz\u0131lan mesajlar\u0131n y\u00f6netildi\u011fi API endpoint'lerinde atacak. Bu b\u00f6l\u00fcmde, Pydantic modelleri kullanarak veri yap\u0131m\u0131z\u0131 tan\u0131mlayacak ve bu verileri i\u015fleyecek FastAPI endpoint'lerini olu\u015fturaca\u011f\u0131z. Karma\u015f\u0131k veritaban\u0131 entegrasyonundan ka\u00e7\u0131nmak i\u00e7in, ba\u015flang\u0131\u00e7ta verileri bellekte (in-memory) tutaca\u011f\u0131z. Bu yakla\u015f\u0131m, i\u015f mant\u0131\u011f\u0131m\u0131z\u0131 h\u0131zl\u0131ca test etmemize ve API aray\u00fcz\u00fcm\u00fcz\u00fc geli\u015ftirmemize olanak tan\u0131r. Ger\u00e7ek d\u00fcnyada, bu verileri kal\u0131c\u0131 bir depolama \u00e7\u00f6z\u00fcm\u00fcne (\u00f6rne\u011fin SQLite, PostgreSQL) ta\u015f\u0131man\u0131z gerekecektir, ancak \u00f6\u011frenme a\u015famas\u0131nda bu basitlik b\u00fcy\u00fck avantaj sa\u011flar.<\/p>\n<p>\u00d6ncelikle, forumumuz i\u00e7in iki temel Pydantic modeli tan\u0131mlayal\u0131m: <code>Message<\/code> (mesajlar i\u00e7in) ve <code>Topic<\/code> (konular i\u00e7in). Bu modeller, gelen verilerin yap\u0131s\u0131n\u0131 ve tiplerini belirlememize yard\u0131mc\u0131 olur. <code>Message<\/code> modeli, bir mesaj\u0131n i\u00e7eri\u011fini (<code>content<\/code>) ve yazar\u0131n\u0131 (<code>author<\/code>) i\u00e7erecekken, <code>Topic<\/code> modeli bir konunun ba\u015fl\u0131\u011f\u0131n\u0131 (<code>title<\/code>), yazar\u0131n\u0131 (<code>author<\/code>) ve bu konuya ait mesajlar\u0131 (<code>messages<\/code>) i\u00e7erecektir. Her konuya ve mesaja benzersiz bir kimlik (ID) atayarak, bu \u00f6\u011felere kolayca eri\u015fim sa\u011flayaca\u011f\u0131z. UUID (Universally Unique Identifier) kullanmak, ID \u00e7ak\u0131\u015fmalar\u0131n\u0131 \u00f6nlemek i\u00e7in iyi bir pratiktir ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda s\u0131kl\u0131kla tercih edilir.<\/p>\n<pre><code class=\"language-python\">\n# main.py i\u00e7inde veya models.py ad\u0131nda ayr\u0131 bir dosyada\nfrom typing import List, Optional\nfrom pydantic import BaseModel\nimport uuid\n\n# Mesaj modeli\nclass Message(BaseModel):\n    id: str = str(uuid.uuid4())\n    author: str\n    content: str\n\n# Konu modeli\nclass Topic(BaseModel):\n    id: str = str(uuid.uuid4())\n    title: str\n    author: str\n    messages: List[Message] = [] # Ba\u015flang\u0131\u00e7ta bo\u015f mesaj listesi\n<\/pre>\n<p><\/code><\/p>\n<p>Verileri depolamak i\u00e7in basit Python listeleri kullanaca\u011f\u0131z. Bu listeler, her yeni konu veya mesaj eklendi\u011finde g\u00fcncellenecek ve t\u00fcm forum verilerini bellek i\u00e7inde tutacakt\u0131r. <code>topics<\/code> listesi, olu\u015fturulan t\u00fcm <code>Topic<\/code> nesnelerini i\u00e7erecektir. Bu basit yap\u0131, API endpoint'lerimizi olu\u015ftururken odaklanmam\u0131z\u0131 kolayla\u015ft\u0131racakt\u0131r. A\u015fa\u011f\u0131daki endpoint'leri uygulayarak forumumuzun omurgas\u0131n\u0131 in\u015fa edece\u011fiz:<\/p>\n<ol>\n<li><code>GET \/topics<\/code>: T\u00fcm forum konular\u0131n\u0131 listeler.<\/li>\n<li><code>POST \/topics<\/code>: Yeni bir forum konusu olu\u015fturur.<\/li>\n<li><code>GET \/topics\/{topic_id}<\/code>: Belirli bir konunun detaylar\u0131n\u0131 (ba\u015fl\u0131\u011f\u0131, yazar\u0131 ve t\u00fcm mesajlar\u0131) g\u00f6r\u00fcnt\u00fcler.<\/li>\n<li><code>POST \/topics\/{topic_id}\/messages<\/code>: Belirli bir konuya yeni bir mesaj ekler.<\/li>\n<\/ol>\n<p>Bu endpoint'ler, forumun temel etkile\u015fim ak\u0131\u015f\u0131n\u0131 sa\u011flar. \u00d6rne\u011fin, bir kullan\u0131c\u0131 anasayfada t\u00fcm konular\u0131 g\u00f6rebilir (<code>GET \/topics<\/code>), ilgilendi\u011fi bir konuya t\u0131klayarak detaylar\u0131n\u0131 okuyabilir (<code>GET \/topics\/{topic_id}<\/code>) ve bir yan\u0131t yazabilir (<code>POST \/topics\/{topic_id}\/messages<\/code>). Ayr\u0131ca, yeni bir tart\u0131\u015fma ba\u015flatmak istedi\u011finde yeni bir konu a\u00e7abilir (<code>POST \/topics<\/code>). Her endpoint, FastAPI'nin g\u00fc\u00e7l\u00fc rota tan\u0131mlay\u0131c\u0131lar\u0131 (<code>@app.get<\/code>, <code>@app.post<\/code>) kullan\u0131larak olu\u015fturulacak ve Pydantic modelleri sayesinde gelen istek g\u00f6vdeleri (request bodies) otomatik olarak do\u011frulanacakt\u0131r. E\u011fer bir konu bulunamazsa veya ge\u00e7ersiz bir istek yap\u0131l\u0131rsa, uygun HTTP hata kodlar\u0131yla (\u00f6rne\u011fin 404 Not Found, 400 Bad Request) yan\u0131t verece\u011fiz. Bu yakla\u015f\u0131m, API'mizin hem sa\u011flam hem de kullan\u0131c\u0131 dostu olmas\u0131n\u0131 sa\u011flayacakt\u0131r. T\u00fcm bu ad\u0131mlar, forum backend'inizin temelini atarken, mod\u00fcler ve anla\u015f\u0131l\u0131r bir yap\u0131 kurman\u0131za yard\u0131mc\u0131 olacakt\u0131r.<\/p>\n<h3>Forum API End-Pointlerini FastAPI ile Yazmak<\/h3>\n<p>FastAPI'nin en g\u00fc\u00e7l\u00fc y\u00f6nlerinden biri, API endpoint'lerini tan\u0131mlaman\u0131n ne kadar kolay olmas\u0131d\u0131r. \u00d6nceki b\u00f6l\u00fcmde tan\u0131mlad\u0131\u011f\u0131m\u0131z Pydantic modellerini ve bellek i\u00e7i depolama listelerini kullanarak, forumumuzun temel API rotalar\u0131n\u0131 ad\u0131m ad\u0131m olu\u015ftural\u0131m. <code>main.py<\/code> dosyan\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki kodlar\u0131 ekleyin veya mevcut kodunuzu bu yap\u0131y\u0131 yans\u0131tacak \u015fekilde g\u00fcncelleyin.<\/p>\n<pre><code class=\"language-python\">\n# main.py\nfrom fastapi import FastAPI, HTTPException, status\nfrom typing import List, Optional\nfrom pydantic import BaseModel\nimport uuid\n\napp = FastAPI()\n\n# Veri modelleri\nclass Message(BaseModel):\n    id: str = str(uuid.uuid4())\n    author: str\n    content: str\n\nclass Topic(BaseModel):\n    id: str = str(uuid.uuid4())\n    title: str\n    author: str\n    messages: List[Message] = []\n\n# Bellek i\u00e7i depolama\ntopics_db: List[Topic] = []\n\n# 1. T\u00fcm forum konular\u0131n\u0131 listeleme\n@app.get(\"\/topics\", response_model=List[Topic], summary=\"T\u00fcm forum konular\u0131n\u0131 listeler\")\nasync def get_all_topics():\n    \"\"\"\n    Sistemdeki t\u00fcm forum konular\u0131n\u0131 getirir.\n    Her konu ba\u015fl\u0131\u011f\u0131, yazar\u0131 ve konuya ait mesajlar\u0131 i\u00e7erir.\n    \"\"\"\n    return topics_db\n\n# 2. Yeni bir forum konusu olu\u015fturma\n@app.post(\"\/topics\", response_model=Topic, status_code=status.HTTP_201_CREATED, summary=\"Yeni bir forum konusu olu\u015fturur\")\nasync def create_topic(topic: Topic):\n    \"\"\"\n    Yeni bir forum konusu olu\u015fturur.\n    - <strong>title<\/strong>: Konunun ba\u015fl\u0131\u011f\u0131 (string)\n    - <strong>author<\/strong>: Konuyu a\u00e7an yazar (string)\n    - <strong>messages<\/strong>: Konuya ilk mesajlar (iste\u011fe ba\u011fl\u0131 liste)\n    \"\"\"\n    topics_db.append(topic)\n    return topic\n\n# 3. Belirli bir konunun detaylar\u0131n\u0131 g\u00f6r\u00fcnt\u00fcleme\n@app.get(\"\/topics\/{topic_id}\", response_model=Topic, summary=\"Belirli bir konunun detaylar\u0131n\u0131 getirir\")\nasync def get_topic(topic_id: str):\n    \"\"\"\n    Belirli bir 'topic_id' ile konuyu ve ona ait t\u00fcm mesajlar\u0131 getirir.\n    E\u011fer konu bulunamazsa 404 hatas\u0131 d\u00f6nd\u00fcr\u00fcr.\n    \"\"\"\n    for topic in topics_db:\n        if topic.id == topic_id:\n            return topic\n    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=\"Konu bulunamad\u0131\")\n\n# 4. Belirli bir konuya yeni bir mesaj ekleme\n@app.post(\"\/topics\/{topic_id}\/messages\", response_model=Message, status_code=status.HTTP_201_CREATED, summary=\"Bir konuya yeni bir mesaj ekler\")\nasync def add_message_to_topic(topic_id: str, message: Message):\n    \"\"\"\n    Belirli bir 'topic_id' ile konuya yeni bir mesaj ekler.\n    - <strong>author<\/strong>: Mesaj\u0131 g\u00f6nderen yazar (string)\n    - <strong>content<\/strong>: Mesaj\u0131n i\u00e7eri\u011fi (string)\n    \"\"\"\n    for topic in topics_db:\n        if topic.id == topic_id:\n            topic.messages.append(message)\n            return message\n    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=\"Konu bulunamad\u0131\")\n\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki kod blo\u011funu inceledi\u011fimizde, FastAPI'nin rotalar\u0131 tan\u0131mlamak i\u00e7in nas\u0131l Python dekorat\u00f6rlerini (<code>@app.get<\/code>, <code>@app.post<\/code>) kulland\u0131\u011f\u0131n\u0131 g\u00f6r\u00fcyoruz. <code>response_model<\/code> parametresi, API'den d\u00f6necek yan\u0131t\u0131n Pydantic modelini belirler, bu da otomatik dok\u00fcmantasyonu zenginle\u015ftirir ve veri tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar. <code>status_code<\/code> parametresi ise ba\u015far\u0131l\u0131 yan\u0131tlar i\u00e7in d\u00f6nd\u00fcr\u00fclecek HTTP durum kodunu belirtir (\u00f6rne\u011fin 201 Created). <code>summary<\/code> ve dokstringler (\u00fc\u00e7 t\u0131rnakl\u0131 metinler), otomatik olarak olu\u015fturulan Swagger UI ve ReDoc belgelerinde g\u00f6r\u00fcnerek API'nizin kullan\u0131m\u0131n\u0131 a\u00e7\u0131klay\u0131c\u0131 hale getirir.<\/p>\n<p>Yol parametreleri (Path Parameters) \u00f6rne\u011fin <code>\/topics\/{topic_id}<\/code> gibi, URL'deki dinamik segmentleri yakalamak i\u00e7in kullan\u0131l\u0131rken, istek g\u00f6vdesi (Request Body) Pydantic modelleri arac\u0131l\u0131\u011f\u0131yla al\u0131n\u0131r. \u00d6rne\u011fin, <code>create_topic<\/code> fonksiyonundaki <code>topic: Topic<\/code> ifadesi, gelen JSON iste\u011finin otomatik olarak bir <code>Topic<\/code> nesnesine d\u00f6n\u00fc\u015ft\u00fcr\u00fclmesini ve do\u011frulanmas\u0131n\u0131 sa\u011flar. E\u011fer gelen veri modeliyle e\u015fle\u015fmezse, FastAPI otomatik olarak 422 Unprocessable Entity hatas\u0131 d\u00f6nd\u00fcr\u00fcr. Hata y\u00f6netimi i\u00e7in ise <code>HTTPException<\/code> kullan\u0131l\u0131r. E\u011fer bir konu bulunamazsa, <code>raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=\"Konu bulunamad\u0131\")<\/code> ifadesiyle anlaml\u0131 bir 404 hatas\u0131 d\u00f6nd\u00fcr\u00fcr\u00fcz. Bu yakla\u015f\u0131m, API'mizin sadece i\u015flevsel de\u011fil, ayn\u0131 zamanda sa\u011flam ve hata durumlar\u0131nda bilgi verici olmas\u0131n\u0131 sa\u011flar. FastAPI'nin bu entegre \u00f6zellikleri sayesinde, sadece birka\u00e7 sat\u0131r kodla g\u00fc\u00e7l\u00fc ve g\u00fcvenilir bir API backend'i olu\u015fturabiliyoruz. \u015eimdi <code>uvicorn main:app --reload<\/code> komutuyla uygulaman\u0131z\u0131 \u00e7al\u0131\u015ft\u0131r\u0131n ve <a href=\"http:\/\/127.0.0.1:8000\/docs\">http:\/\/127.0.0.1:8000\/docs<\/a> adresinden Swagger UI arac\u0131l\u0131\u011f\u0131yla API'nizi test etmeye ba\u015flayabilirsiniz. Yeni konular olu\u015fturun, onlara mesajlar ekleyin ve listeleme endpoint'lerini kullanarak sonu\u00e7lar\u0131 kontrol edin. Bu sayede, forumunuzun backend'inin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 somut bir \u015fekilde g\u00f6rebilirsiniz.<\/p>\n<h2>Forumun \u00d6n Y\u00fcz\u00fc: Minimal Bir Aray\u00fcz Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Bir forum backend'i, kullan\u0131c\u0131lar i\u00e7in anlaml\u0131 olabilmesi i\u00e7in bir \u00f6n y\u00fcze ihtiya\u00e7 duyar. FastAPI a\u011f\u0131rl\u0131kl\u0131 olarak bir API framework'\u00fc olsa da, Jinja2 \u015fablon motorunu kullanarak \u00e7ok basit ve minimal bir \u00f6n y\u00fcz olu\u015fturabiliriz. Bu, forum API'mizin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 g\u00f6rselle\u015ftirmemize ve kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan ilk ad\u0131m\u0131 atmam\u0131za olanak tan\u0131r. Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda genellikle React, Vue.js veya Angular gibi modern JavaScript framework'leri kullan\u0131l\u0131rken, Jinja2 entegrasyonu h\u0131zl\u0131 prototipleme ve sunucu tarafl\u0131 render etme (SSR) i\u00e7in olduk\u00e7a elveri\u015flidir. Bu k\u0131s\u0131mda, ana sayfam\u0131z\u0131 konular\u0131 listeleyecek \u015fekilde ve her konunun detay sayfas\u0131n\u0131 mesajlar\u0131 g\u00f6sterecek ve yeni mesaj g\u00f6ndermeye izin verecek \u015fekilde tasarlayaca\u011f\u0131z. Ayr\u0131ca, bu minimal \u00f6n y\u00fczde mobil uyumlulu\u011fu da g\u00f6z \u00f6n\u00fcnde bulundurarak baz\u0131 temel CSS ipu\u00e7lar\u0131na de\u011finece\u011fiz.<\/p>\n<p>\u00d6ncelikle, Jinja2 \u015fablonlar\u0131n\u0131 kullanabilmek i\u00e7in <code>fastapi.templating.Jinja2Templates<\/code> s\u0131n\u0131f\u0131n\u0131 import etmemiz ve \u015fablonlar\u0131m\u0131z\u0131n bulundu\u011fu dizini belirtmemiz gerekir. Proje dizininizde bir <code>templates<\/code> klas\u00f6r\u00fc olu\u015fturun ve i\u00e7ine HTML dosyalar\u0131n\u0131z\u0131 yerle\u015ftirin. Ayr\u0131ca, statik dosyalar (CSS, JS) i\u00e7in de bir <code>static<\/code> klas\u00f6r\u00fc olu\u015fturup FastAPI'ye tan\u0131tmam\u0131z gerekecektir. Bu, sayfan\u0131z\u0131n stilini belirleyen CSS dosyalar\u0131n\u0131 veya frontend etkile\u015fimi sa\u011flayan JavaScript dosyalar\u0131n\u0131 sunabilmeniz i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<pre><code class=\"language-python\">\n# main.py dosyan\u0131za ekleyin\nfrom fastapi.staticfiles import StaticFiles\nfrom fastapi.templating import Jinja2Templates\nfrom starlette.requests import Request # FastAPI request objesi i\u00e7in\n\n# ... di\u011fer importlar ve topic_db ...\n\n# Statik dosyalar\u0131 (CSS, JS vb.) tan\u0131mla\napp.mount(\"\/static\", StaticFiles(directory=\"static\"), name=\"static\")\n\n# Jinja2 \u015fablon motorunu tan\u0131mla\ntemplates = Jinja2Templates(directory=\"templates\")\n\n# Ana sayfa: Konular\u0131 listele\n@app.get(\"\/\", response_model=List[Topic], summary=\"Ana sayfa: T\u00fcm forum konular\u0131n\u0131 g\u00f6sterir\")\nasync def home(request: Request):\n    return templates.TemplateResponse(\"index.html\", {\"request\": request, \"topics\": topics_db})\n\n# Konu detay sayfas\u0131\n@app.get(\"\/topics_web\/{topic_id}\", response_model=Topic, summary=\"Konu detay sayfas\u0131\")\nasync def topic_detail_web(request: Request, topic_id: str):\n    for topic in topics_db:\n        if topic.id == topic_id:\n            return templates.TemplateResponse(\"topic.html\", {\"request\": request, \"topic\": topic})\n    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=\"Konu bulunamad\u0131\")\n<\/pre>\n<p><\/code><\/p>\n<p>\u015eimdi, <code>templates\/index.html<\/code> ve <code>templates\/topic.html<\/code> dosyalar\u0131n\u0131 olu\u015ftural\u0131m. <code>index.html<\/code>, mevcut t\u00fcm konular\u0131 listeleyecek ve her konuya t\u0131klanabilir bir ba\u011flant\u0131 sunacak. <code>topic.html<\/code> ise se\u00e7ilen konunun ba\u015fl\u0131\u011f\u0131n\u0131, yazar\u0131n\u0131 ve alt\u0131ndaki t\u00fcm mesajlar\u0131 g\u00f6sterecek, ayr\u0131ca yeni bir mesaj g\u00f6ndermek i\u00e7in basit bir HTML formu i\u00e7erecektir. Bu form, JavaScript kullanmadan do\u011frudan API endpoint'imize POST iste\u011fi g\u00f6nderecek \u015fekilde yap\u0131land\u0131r\u0131labilir.<\/p>\n<pre><code class=\"language-html\">\n<!-- templates\/index.html -->\n<!DOCTYPE html>\n<html lang=\"tr\">\n<head>\n    <meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n    <title>Minimal Forum - Anasayfa<\/title>\n    <link rel=\"stylesheet\" href=\"{{ url_for('static', path='\/css\/style.css') }}\">\n<\/head>\n<body>\n    <div class=\"container\">\n        <h1>Forum Konular\u0131<\/h1>\n        <ul class=\"topic-list\">\n            {% for topic in topics %}\n                <li>\n                    <a href=\"\/topics_web\/{{ topic.id }}\">{{ topic.title }}<\/a>\n                    <p>Yazar: {{ topic.author }}<\/p>\n                <\/li>\n            {% endfor %}\n        <\/ul>\n        <h2>Yeni Konu Olu\u015ftur<\/h2>\n        <form action=\"\/topics\" method=\"post\" class=\"create-topic-form\">\n            <input type=\"text\" name=\"title\" placeholder=\"Konu Ba\u015fl\u0131\u011f\u0131\" required><br>\n            <input type=\"text\" name=\"author\" placeholder=\"Yazar Ad\u0131\" required><br>\n            <button type=\"submit\">Konu A\u00e7<\/button>\n        <\/form>\n    <\/div>\n<\/body>\n<\/html>\n<\/pre>\n<p><\/code><\/p>\n<pre><code class=\"language-html\"><\/pre>\n<p><\/code><br \/>\n<!-- templates\/topic.html --><br \/>\n<!DOCTYPE html><br \/>\n<html lang=\"tr\"><br \/>\n<head><br \/>\n    <meta charset=\"UTF-8\"><br \/>\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\"><br \/>\n    <title>{{ topic.title }} - Minimal Forum<\/title>\n    <link rel=\"stylesheet\" href=\"{{ url_for('static', path='\/css\/style.css') }}\">\n<\/head><br \/>\n<body><\/p>\n<div class=\"container\">\n<h1>{{ topic.title }}<\/h1>\n<p><em>Yazar: {{ topic.author }}<\/em><\/p>\n<h2>Mesajlar<\/h2>\n<div class=\"messages-container\">\n            {% for message in topic.messages %}<\/p>\n<div class=\"message-card\">\n<p><strong>{{ message.author }}:<\/strong><\/p>\n<p>{{ message.content }}<\/p>\n<\/p><\/div>\n<p>            {% else %}<\/p>\n<p>Bu konuda hen\u00fcz mesaj yok.<\/p>\n<p>            {% endfor %}\n        <\/p><\/div>\n<h2>Mesaj G\u00f6nder<\/h2>\n<form action=\"\/topics\/{{ topic.id }}\/messages\" method=\"post\" class=\"post-message-form\">\n            <input type=\"text\" name=\"author\" placeholder=\"Ad\u0131n\u0131z\" required><br \/>\n            <textarea name=\"content\" placeholder=\"Mesaj\u0131n\u0131z...\" rows=\"4\" required><\/textarea><br \/>\n            <button type=\"submit\">G\u00f6nder<\/button><br \/>\n        <\/form>\n<p><a href=\"\/\">&larr; T\u00fcm Konulara Geri D\u00f6n<\/a><\/p>\n<\/p><\/div>\n<p><\/body><br \/>\n<\/html><br \/>\n<\/code><\/p>\n<p>Formlar\u0131 do\u011frudan FastAPI endpoint'lerine POST etmek i\u00e7in, FastAPI'nin <code>request<\/code> objesinden <code>request.form()<\/code> kullanarak form verilerini almam\u0131z gerekir. Bu durumda, Pydantic model yerine <code>Form<\/code> s\u0131n\u0131f\u0131n\u0131 kullan\u0131r\u0131z. <code>main.py<\/code> dosyan\u0131zdaki <code>create_topic<\/code> ve <code>add_message_to_topic<\/code> fonksiyonlar\u0131n\u0131 HTML formlar\u0131ndan gelen verileri i\u015fleyecek \u015fekilde g\u00fcncellememiz gerekecek:<\/p>\n<pre><code class=\"language-python\">\n# main.py dosyas\u0131ndaki create_topic ve add_message_to_topic fonksiyonlar\u0131n\u0131 g\u00fcncelleyin\nfrom fastapi import FastAPI, HTTPException, status, Form # Form'u ekleyin\nfrom starlette.responses import RedirectResponse # Y\u00f6nlendirme i\u00e7in\nfrom starlette.status import HTTP_303_SEE_OTHER # Y\u00f6nlendirme i\u00e7in\n# ... di\u011fer importlar ...\n\n# ... veri modelleri ve topics_db ...\n\n# Yeni bir forum konusu olu\u015fturma (HTML Form i\u00e7in g\u00fcncellendi)\n@app.post(\"\/topics\", status_code=status.HTTP_303_SEE_OTHER, summary=\"Yeni bir forum konusu olu\u015fturur (HTML Form)\")\nasync def create_topic_from_form(title: str = Form(...), author: str = Form(...)):\n    new_topic = Topic(title=title, author=author, messages=[])\n    topics_db.append(new_topic)\n    # Konu olu\u015fturulduktan sonra ana sayfaya y\u00f6nlendir\n    return RedirectResponse(url=\"\/\", status_code=HTTP_303_SEE_OTHER)\n\n# Belirli bir konuya yeni bir mesaj ekleme (HTML Form i\u00e7in g\u00fcncellendi)\n@app.post(\"\/topics\/{topic_id}\/messages\", status_code=status.HTTP_303_SEE_OTHER, summary=\"Bir konuya yeni bir mesaj ekler (HTML Form)\")\nasync def add_message_to_topic_from_form(topic_id: str, author: str = Form(...), content: str = Form(...)):\n    for topic in topics_db:\n        if topic.id == topic_id:\n            new_message = Message(author=author, content=content)\n            topic.messages.append(new_message)\n            # Mesaj eklendikten sonra konunun detay sayfas\u0131na y\u00f6nlendir\n            return RedirectResponse(url=f\"\/topics_web\/{topic_id}\", status_code=HTTP_303_SEE_OTHER)\n    raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail=\"Konu bulunamad\u0131\")\n<\/pre>\n<p><\/code><\/p>\n<p>Bu g\u00fcncellemelerle birlikte, HTML formlar\u0131ndan gelen verileri i\u015fleyebilir ve ba\u015far\u0131l\u0131 i\u015flemlerden sonra kullan\u0131c\u0131y\u0131 ilgili sayfaya y\u00f6nlendirebiliriz. Bu, JavaScript'e ihtiya\u00e7 duymadan basit bir kullan\u0131c\u0131 ak\u0131\u015f\u0131 sa\u011flar. Frontend geli\u015ftirmede kullan\u0131lan <code>response_model<\/code> burada kullan\u0131lmaz, \u00e7\u00fcnk\u00fc do\u011frudan bir HTML sayfas\u0131 veya y\u00f6nlendirme d\u00f6nd\u00fcr\u00fcyoruz.<\/p>\n<h3>Mobil Uyumlu Tasar\u0131m \u0130\u00e7in \u0130pu\u00e7lar\u0131 ve En \u0130yi Uygulamalar<\/h3>\n<p>Modern web uygulamalar\u0131, farkl\u0131 ekran boyutlar\u0131na sahip cihazlarda sorunsuz bir kullan\u0131c\u0131 deneyimi sunmal\u0131d\u0131r. Minimal forumumuz i\u00e7in \u00e7ok detayl\u0131 bir CSS \u00e7er\u00e7evesi kullanmasak da, temel mobil uyumluluk prensiplerini uygulamak \u00f6nemlidir. \u00d6ncelikle, her HTML dosyas\u0131n\u0131n <code><head><\/code> etiketine a\u015fa\u011f\u0131daki meta etiketini eklemek, taray\u0131c\u0131lara sayfan\u0131n cihaz geni\u015fli\u011fine uygun olarak \u00f6l\u00e7eklenmesi gerekti\u011fini bildirir:<\/p>\n<pre><code class=\"language-html\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan, <code>static\/css\/style.css<\/code> dosyas\u0131n\u0131 olu\u015fturarak basit stil kurallar\u0131 ekleyebiliriz. \u00d6rne\u011fin, sayfa i\u00e7eri\u011finin ekran geni\u015fli\u011fini a\u015fmas\u0131n\u0131 engellemek ve okunabilirli\u011fi art\u0131rmak i\u00e7in bir <code>max-width<\/code> de\u011feri belirleyebiliriz. Flexbox veya Grid gibi modern CSS d\u00fczenleme teknikleri, i\u00e7eri\u011fin farkl\u0131 ekran boyutlar\u0131nda nas\u0131l hizalanaca\u011f\u0131n\u0131 ve s\u0131ralanaca\u011f\u0131n\u0131 belirlemede \u00e7ok g\u00fc\u00e7l\u00fcd\u00fcr. \u0130\u015fte basit bir <code>style.css<\/code> \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-css\">\n\/* static\/css\/style.css *\/\nbody {\n    font-family: Arial, sans-serif;\n    line-height: 1.6;\n    margin: 0;\n    padding: 0;\n    background-color: #f4f4f4;\n    color: #333;\n}\n\n.container {\n    max-width: 800px;\n    margin: 20px auto;\n    padding: 20px;\n    background-color: #fff;\n    border-radius: 8px;\n    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);\n}\n\nh1, h2 {\n    color: #333;\n    border-bottom: 1px solid #eee;\n    padding-bottom: 10px;\n    margin-bottom: 20px;\n}\n\n.topic-list ul {\n    list-style: none;\n    padding: 0;\n}\n\n.topic-list li {\n    background-color: #f9f9f9;\n    margin-bottom: 10px;\n    padding: 15px;\n    border-radius: 5px;\n    border: 1px solid #ddd;\n}\n\n.topic-list li a {\n    text-decoration: none;\n    color: #007bff;\n    font-weight: bold;\n    font-size: 1.2em;\n}\n\n.topic-list li p {\n    font-size: 0.9em;\n    color: #666;\n    margin-top: 5px;\n}\n\n.messages-container {\n    margin-top: 20px;\n}\n\n.message-card {\n    background-color: #e9e9e9;\n    padding: 10px 15px;\n    margin-bottom: 10px;\n    border-radius: 5px;\n}\n\n.message-card p strong {\n    color: #007bff;\n}\n\nform {\n    background-color: #f9f9f9;\n    padding: 20px;\n    border-radius: 8px;\n    margin-top: 20px;\n    border: 1px solid #eee;\n}\n\nform input[type=\"text\"],\nform textarea {\n    width: calc(100% - 22px); \/* Padding ve border i\u00e7in ayarlama *\/\n    padding: 10px;\n    margin-bottom: 10px;\n    border: 1px solid #ddd;\n    border-radius: 4px;\n    box-sizing: border-box; \/* Padding ve border'\u0131 geni\u015fli\u011fe dahil et *\/\n}\n\nform button {\n    background-color: #28a745;\n    color: white;\n    padding: 10px 20px;\n    border: none;\n    border-radius: 4px;\n    cursor: pointer;\n    font-size: 1em;\n}\n\nform button:hover {\n    background-color: #218838;\n}\n\n\/* Mobil uyumluluk i\u00e7in medya sorgular\u0131 *\/\n@media (max-width: 600px) {\n    .container {\n        margin: 10px;\n        padding: 15px;\n    }\n\n    h1 {\n        font-size: 1.8em;\n    }\n\n    h2 {\n        font-size: 1.4em;\n    }\n\n    form input[type=\"text\"],\n    form textarea {\n        width: 100%;\n    }\n}\n<\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki CSS, temel renkleri, fontlar\u0131 ve d\u00fczeni tan\u0131mlarken, <code>@media (max-width: 600px)<\/code> medya sorgusu sayesinde k\u00fc\u00e7\u00fck ekranlar i\u00e7in \u00f6zel stil ayarlar\u0131 yapar. \u00d6rne\u011fin, konteynerin kenar bo\u015fluklar\u0131n\u0131 azalt\u0131r ve ba\u015fl\u0131klar\u0131n yaz\u0131 tipi boyutunu k\u00fc\u00e7\u00fclt\u00fcr. Bu, i\u00e7eri\u011fin mobil cihazlarda daha iyi g\u00f6r\u00fcnmesini ve okunmas\u0131n\u0131 sa\u011flar. Daha karma\u015f\u0131k bir forum i\u00e7in Tailwind CSS veya Bootstrap gibi bir CSS framework'\u00fc kullanmak veya \u00f6zel bir frontend framework'\u00fc (Vue, React) ile API'yi t\u00fcketmek \u00e7ok daha esnek ve g\u00fc\u00e7l\u00fc \u00e7\u00f6z\u00fcmler sunar.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Daha ileri d\u00fczey mobil uyumluluk i\u00e7in, \u00f6zellikle form elemanlar\u0131nda ve interaktif bile\u015fenlerde dokunmatik dostu boyutlar ve hedefler kullanmaya \u00f6zen g\u00f6sterin. B\u00fcy\u00fck d\u00fc\u011fmeler ve yeterli bo\u015fluk, mobil kullan\u0131c\u0131 deneyimini \u00f6nemli \u00f6l\u00e7\u00fcde iyile\u015ftirir.\n<\/div>\n<h2>Bir Ad\u0131m \u0130leri: Minimal Forumu Geli\u015ftirmek \u0130\u00e7in \u0130pu\u00e7lar\u0131 ve P\u00fcf Noktalar\u0131<\/h2>\n<p>Minimal forumumuzu ba\u015far\u0131yla kurduk ve temel i\u015flevselli\u011fini test ettik. Ancak ger\u00e7ek bir d\u00fcnya uygulamas\u0131 i\u00e7in bu, sadece ba\u015flang\u0131\u00e7. \u0130\u015fte forumunuzu daha robust, \u00f6l\u00e7eklenebilir ve \u00f6zellik dolu hale getirmek i\u00e7in d\u00fc\u015f\u00fcnebilece\u011finiz baz\u0131 ileri d\u00fczey ad\u0131mlar ve p\u00fcf noktalar\u0131:<\/p>\n<h3>Veri Kal\u0131c\u0131l\u0131\u011f\u0131 ve Veritaban\u0131 Entegrasyonu<\/h3>\n<p>\u015eu anda verilerimiz sunucu yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda kaybolan bellekte tutuluyor. Bu, bir forum i\u00e7in kabul edilemez. Kal\u0131c\u0131 depolama i\u00e7in birka\u00e7 se\u00e7ene\u011finiz var:<\/p>\n<ol>\n<li><strong>SQLite:<\/strong> K\u00fc\u00e7\u00fck ve orta \u00f6l\u00e7ekli uygulamalar i\u00e7in idealdir. Kurulumu kolayd\u0131r ve ayr\u0131 bir veritaban\u0131 sunucusu gerektirmez. FastAPI ile SQLAlchemy veya Tortoise ORM gibi ORM'leri kullanarak entegrasyonu olduk\u00e7a basittir. <code>databases<\/code> k\u00fct\u00fcphanesi, asenkron veritaban\u0131 i\u015flemleri i\u00e7in uygun bir se\u00e7imdir.<\/li>\n<li><strong>PostgreSQL\/MySQL:<\/strong> Daha b\u00fcy\u00fck ve karma\u015f\u0131k uygulamalar i\u00e7in tercih edilir. Y\u00fcksek performans, \u00f6l\u00e7eklenebilirlik ve g\u00fc\u00e7l\u00fc \u00f6zellikler sunar. Docker ile yerel geli\u015ftirme ortam\u0131n\u0131zda kolayca bir veritaban\u0131 sunucusu \u00e7al\u0131\u015ft\u0131rabilirsiniz.<\/li>\n<li><strong>MongoDB:<\/strong> NoSQL veritaban\u0131 tercih ediyorsan\u0131z, esnek \u015fema yap\u0131s\u0131yla forumdaki i\u00e7erik gibi yar\u0131 yap\u0131land\u0131r\u0131lm\u0131\u015f veriler i\u00e7in iyi bir se\u00e7enek olabilir. <code>Motor<\/code> k\u00fct\u00fcphanesi ile FastAPI'de asenkron MongoDB eri\u015fimi sa\u011flayabilirsiniz.<\/li>\n<\/ol>\n<pre><code class=\"language-python\">\n# \u00d6rnek: SQLAlchemy ile veritaban\u0131 ba\u011flant\u0131s\u0131\n# from sqlalchemy import create_engine, Column, Integer, String, DateTime\n# from sqlalchemy.ext.declarative import declarative_base\n# from sqlalchemy.orm import sessionmaker\n# import datetime\n#\n# SQLALCHEMY_DATABASE_URL = \"sqlite:\/\/\/.\/sql_app.db\"\n# engine = create_engine(SQLALCHEMY_DATABASE_URL, connect_args={\"check_same_thread\": False})\n# SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)\n# Base = declarative_base()\n#\n# class DBTopic(Base):\n#     __tablename__ = \"topics\"\n#     id = Column(String, primary_key=True, index=True)\n#     title = Column(String, index=True)\n#     author = Column(String)\n#     created_at = Column(DateTime, default=datetime.datetime.now)\n#     # \u0130li\u015fkili mesajlar i\u00e7in bir ili\u015fki eklenebilir\n#\n# # Base.metadata.create_all(bind=engine)\n<\/pre>\n<p><\/code><\/p>\n<h3>Kullan\u0131c\u0131 Yetkilendirme ve Kimlik Do\u011frulama (Authentication & Authorization)<\/h3>\n<p>Ger\u00e7ek bir forumda kullan\u0131c\u0131lar\u0131n oturum a\u00e7mas\u0131, kendi konular\u0131n\u0131 olu\u015fturmas\u0131 ve kendi mesajlar\u0131n\u0131 d\u00fczenlemesi\/silmesi gerekir. FastAPI, OAuth2 ve JWT (JSON Web Tokens) kullanarak g\u00fc\u00e7l\u00fc kimlik do\u011frulama mekanizmalar\u0131 olu\u015fturmak i\u00e7in yerle\u015fik destek sunar. <code>fastapi.security<\/code> mod\u00fcl\u00fc, bu s\u00fcreci kolayla\u015ft\u0131ran ara\u00e7lar sa\u011flar. Kullan\u0131c\u0131 ad\u0131\/\u015fifre tabanl\u0131 bir giri\u015f sistemi kurarak ve JWT'ler arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131 oturumlar\u0131n\u0131 y\u00f6neterek forumunuzu \u00e7ok daha g\u00fcvenli hale getirebilirsiniz.<\/p>\n<h3>Containerization (Docker)<\/h3>\n<p>Uygulaman\u0131z\u0131 Docker konteynerlerine almak, geli\u015ftirme ortam\u0131n\u0131z\u0131 standartla\u015ft\u0131rman\u0131za ve uygulaman\u0131z\u0131 herhangi bir platformda kolayca da\u011f\u0131tman\u0131za olanak tan\u0131r. Dockerfile ve docker-compose.yml dosyalar\u0131 olu\u015fturarak FastAPI uygulaman\u0131z\u0131, veritaban\u0131n\u0131z\u0131 ve di\u011fer servislerinizi tek bir komutla aya\u011fa kald\u0131rabilirsiniz. Bu, \u00f6zellikle ekip i\u00e7inde \u00e7al\u0131\u015f\u0131rken veya farkl\u0131 da\u011f\u0131t\u0131m ortamlar\u0131na ge\u00e7i\u015f yaparken b\u00fcy\u00fck kolayl\u0131k sa\u011flar.<\/p>\n<h3>Test Yazma (Pytest)<\/h3>\n<p>Uygulaman\u0131z b\u00fcy\u00fcd\u00fck\u00e7e, her yeni \u00f6zellik ekledi\u011finizde t\u00fcm sistemin hala do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan emin olmak zorla\u015f\u0131r. Pytest gibi bir test framework'\u00fc kullanarak API endpoint'leriniz, veri modelleriniz ve i\u015f mant\u0131\u011f\u0131n\u0131z i\u00e7in birim testleri ve entegrasyon testleri yazmak, hatalar\u0131 erken a\u015famada yakalaman\u0131za ve kod kalitenizi art\u0131rman\u0131za yard\u0131mc\u0131 olur. FastAPI'nin <code>TestClient<\/code>'\u0131, API'nizi test etmek i\u00e7in \u00f6zel olarak tasarlanm\u0131\u015ft\u0131r ve HTTP istekleri g\u00f6ndermeyi kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Asenkron \u0130\u015flemler ve Arka Plan G\u00f6revleri<\/h3>\n<p>FastAPI'nin asenkron do\u011fas\u0131ndan tam olarak yararlanmak i\u00e7in, veritaban\u0131 sorgular\u0131, d\u0131\u015f API \u00e7a\u011fr\u0131lar\u0131 veya dosya i\u015flemleri gibi G\/\u00c7 (Input\/Output) yo\u011fun g\u00f6revlerde asenkron k\u00fct\u00fcphaneler kullan\u0131n. Ayr\u0131ca, e-posta g\u00f6nderme veya veri analizi gibi uzun s\u00fcren i\u015flemleri do\u011frudan istek-yan\u0131t d\u00f6ng\u00fcs\u00fcnde \u00e7al\u0131\u015ft\u0131rmak yerine arka plan g\u00f6revleri olarak (Celery, RQ gibi k\u00fct\u00fcphanelerle) i\u015fleyebilirsiniz. FastAPI'nin <code>BackgroundTasks<\/code> \u00f6zelli\u011fi, basit arka plan g\u00f6revlerini y\u00f6netmek i\u00e7in h\u0131zl\u0131 bir yol sunar.<\/p>\n<h3>Da\u011f\u0131t\u0131m (Deployment)<\/h3>\n<p>Uygulaman\u0131z\u0131 canl\u0131ya almak i\u00e7in \u00e7e\u015fitli bulut platformlar\u0131n\u0131 (Heroku, Vercel, AWS ECS\/Lambda, Google Cloud Run) veya kendi sunucular\u0131n\u0131z\u0131 kullanabilirsiniz. Konteynerle\u015ftirme (Docker) bu s\u00fcre\u00e7te size b\u00fcy\u00fck avantaj sa\u011flayacakt\u0131r. Nginx veya Traefik gibi bir reverse proxy kullanarak uygulaman\u0131z\u0131n g\u00fcvenli\u011fini ve performans\u0131n\u0131 art\u0131rabilir, SSL sertifikalar\u0131 ile HTTPS eri\u015fimi sa\u011flayabilirsiniz.<\/p>\n<p>Bu ileri d\u00fczey konular, minimal forumunuzu ger\u00e7ek bir \u00fcretim uygulamas\u0131na d\u00f6n\u00fc\u015ft\u00fcrmek i\u00e7in size yol g\u00f6sterecektir. Her bir ad\u0131m\u0131 ara\u015ft\u0131r\u0131rken ve uygularken, FastAPI'nin sundu\u011fu esneklik ve Python'\u0131n zengin ekosisteminden faydalanacaks\u0131n\u0131z. Unutmay\u0131n, geli\u015ftirme bir yolculuktur ve her yeni \u00f6zellik, bilginizi ve becerilerinizi daha da geli\u015ftirecektir.<\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>Bu makalede, FastAPI'nin g\u00fcc\u00fcn\u00fc kullanarak s\u0131f\u0131rdan, minimal ama i\u015flevsel bir forum backend'i nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m g\u00f6rd\u00fck. Python'\u0131n modern web geli\u015ftirme framework'\u00fc olan FastAPI'nin asenkron yetenekleri, Pydantic ile veri do\u011frulamas\u0131 ve otomatik API dok\u00fcmantasyonu gibi \u00f6zelliklerinin, h\u0131zl\u0131 ve verimli bir API geli\u015ftirme s\u00fcrecini nas\u0131l m\u00fcmk\u00fcn k\u0131ld\u0131\u011f\u0131n\u0131 ke\u015ffettik. Sanal ortam kurulumundan temel veri modellerinin olu\u015fturulmas\u0131na, API endpoint'lerinin yaz\u0131lmas\u0131ndan basit bir \u00f6n y\u00fcz entegrasyonuna kadar her ad\u0131m\u0131 ele ald\u0131k. Hatta mobil uyumlu tasar\u0131m i\u00e7in temel ipu\u00e7lar\u0131na ve forumunuzu daha ileri ta\u015f\u0131mak i\u00e7in veri kal\u0131c\u0131l\u0131\u011f\u0131, yetkilendirme, Docker ve test gibi \u00f6nemli konulara da de\u011findik.<\/p>\n<p>Art\u0131k elinizde, kullan\u0131c\u0131lar\u0131n konu a\u00e7\u0131p mesajla\u015fabilece\u011fi bir forumun temel iskeleti var. Bu ba\u015flang\u0131\u00e7 noktas\u0131, kendi ihtiya\u00e7lar\u0131n\u0131za g\u00f6re daha karma\u015f\u0131k \u00f6zellikler ekleyebilece\u011finiz sa\u011flam bir temel sunuyor. Unutmay\u0131n ki yaz\u0131l\u0131m geli\u015ftirme s\u00fcrekli bir \u00f6\u011frenme ve iterasyon s\u00fcrecidir. Bu minimal forumu bir ba\u015flang\u0131\u00e7 olarak al\u0131p, \u00fczerine kendi yarat\u0131c\u0131l\u0131\u011f\u0131n\u0131z\u0131 ve teknik bilginizi ekleyerek \u00e7ok daha kapsaml\u0131 ve g\u00fc\u00e7l\u00fc bir topluluk platformu in\u015fa edebilirsiniz. FastAPI, bu yolculukta size h\u0131zl\u0131, g\u00fcvenilir ve keyifli bir geli\u015ftirme deneyimi sunmaya devam edecektir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ul>\n<li>\n        <strong>FastAPI, b\u00fcy\u00fck \u00f6l\u00e7ekli uygulamalar i\u00e7in uygun mu?<\/strong><\/p>\n<p>Evet, kesinlikle. FastAPI, asenkron yap\u0131s\u0131 ve y\u00fcksek performans\u0131 sayesinde milyonlarca iste\u011fi i\u015fleyebilecek kadar \u00f6l\u00e7eklenebilir. Uvicorn gibi h\u0131zl\u0131 ASGI sunucular\u0131yla birle\u015fti\u011finde, mikroservislerden b\u00fcy\u00fck monolitik API'lere kadar geni\u015f bir yelpazede kullan\u0131labilir. Ayr\u0131ca, Pydantic ile veri do\u011frulama ve otomatik dok\u00fcmantasyon, b\u00fcy\u00fck ekiplerde geli\u015ftirme s\u00fcrecini kolayla\u015ft\u0131r\u0131r.<\/p>\n<\/li>\n<li>\n        <strong>Bellek i\u00e7i depolama yerine ger\u00e7ek bir veritaban\u0131 nas\u0131l entegre edebilirim?<\/strong><\/p>\n<p>Ger\u00e7ek bir veritaban\u0131 entegre etmek i\u00e7in SQLAlchemy (ili\u015fkisel veritabanlar\u0131 i\u00e7in) veya Motor (MongoDB gibi NoSQL i\u00e7in) gibi bir ORM (Object-Relational Mapper) veya k\u00fct\u00fcphane kullanman\u0131z gerekir. <code>databases<\/code> k\u00fct\u00fcphanesi, FastAPI ile asenkron veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 y\u00f6netmek i\u00e7in harika bir se\u00e7enektir. Uygulaman\u0131za ba\u011f\u0131ml\u0131l\u0131k ekleyerek ve veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 y\u00f6neterek mevcut kodunuzu kolayca g\u00fcncelleyebilirsiniz.<\/p>\n<\/li>\n<li>\n        <strong>FastAPI ile frontend geli\u015ftirme yapmak ne kadar m\u00fcmk\u00fcn?<\/strong><\/p>\n<p>FastAPI esasen bir backend (API) framework'\u00fcd\u00fcr. Ancak Jinja2Templates gibi \u015fablon motorlar\u0131n\u0131 kullanarak basit HTML sayfalar\u0131 render edebilir veya StaticFiles ile statik HTML\/CSS\/JS dosyalar\u0131n\u0131 sunabilirsiniz. Genellikle FastAPI backend olarak API sunarken, React, Vue.js, Angular gibi ayr\u0131 bir JavaScript frontend framework'\u00fc bu API'leri t\u00fcketerek kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc olu\u015fturur. Bu makaledeki \u00f6rnek, h\u0131zl\u0131 bir prototipleme i\u00e7in temel bir entegrasyonu g\u00f6stermektedir.<\/p>\n<\/li>\n<li>\n        <strong>Kullan\u0131c\u0131 kimlik do\u011frulamas\u0131n\u0131 (authentication) nas\u0131l eklerim?<\/strong><\/p>\n<p>FastAPI, OAuth2 ve JWT (JSON Web Tokens) i\u00e7in yerle\u015fik destek sa\u011flar. <code>fastapi.security.OAuth2PasswordBearer<\/code> ve <code>jose<\/code> k\u00fct\u00fcphanesi gibi ara\u00e7lar\u0131 kullanarak kullan\u0131c\u0131 ad\u0131\/\u015fifre tabanl\u0131 bir giri\u015f sistemi kurabilir, JWT'ler ile oturumlar\u0131 y\u00f6netebilir ve API endpoint'lerinize eri\u015fimi kontrol edebilirsiniz. Bu, forumunuzda kullan\u0131c\u0131lar\u0131n g\u00fcvenli bir \u015fekilde oturum a\u00e7mas\u0131n\u0131 ve yetkilendirilmi\u015f i\u015flemler yapmas\u0131n\u0131 sa\u011flar.<\/p>\n<\/li>\n<li>\n        <strong>Uygulamam\u0131 Docker konteynerine nas\u0131l al\u0131r\u0131m?<\/strong><\/p>\n<p>Uygulaman\u0131z\u0131 Docker konteynerine almak i\u00e7in proje k\u00f6k dizininizde bir <code>Dockerfile<\/code> olu\u015fturman\u0131z gerekir. Bu dosya, uygulaman\u0131z\u0131n ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 kurma, kodu kopyalama ve Uvicorn sunucusunu \u00e7al\u0131\u015ft\u0131rma ad\u0131mlar\u0131n\u0131 i\u00e7erir. Daha karma\u015f\u0131k senaryolar i\u00e7in, veritaban\u0131 gibi ek servisleri de ayn\u0131 anda y\u00f6netmek i\u00e7in <code>docker-compose.yml<\/code> kullanabilirsiniz. Bu, geli\u015ftirme, test ve da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini standartla\u015ft\u0131r\u0131r.<\/p>\n<\/li>\n<\/ul>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Kendi online toplulu\u011funuzu kurma hayali mi kuruyorsunuz? Belki de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n etkile\u015fimde bulunabilece\u011fi, d\u00fc\u015f\u00fcncelerini payla\u015fabilece\u011fi bir platforma ihtiyac\u0131n\u0131z var.&hellip;","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32226","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 - Minimal Bir Forum<\/title>\n<meta name=\"description\" content=\"Kendi online toplulu\u011funuzu kurma hayali mi kuruyorsunuz? Belki de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n etkile\u015fimde bulunabilece\u011fi, d\u00fc\u015f\u00fcncelerini payla\u015fabilece\u011fi bir platforma ihtiyac\u0131n\u0131z var. FastAPI ile s\u0131f\u0131rdan, modern ve h\u0131zl\u0131 bir forum backend&#039;i olu\u015fturmak, d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fczden \u00e7ok daha kolay ve keyifli bir s\u00fcre\u00e7 olabilir. Bu makalede, Python&#039;\u0131n g\u00fcc\u00fcn\u00fc FastAPI&#039;nin performans\u0131yla birle\u015ftirerek nas\u0131l minimal bir forum \u00e7at\u0131s\u0131 kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki bir geli\u015ftiricinin bile kolayca anlayabilece\u011fi, ancak deneyimli kullan\u0131c\u0131lar i\u00e7in de de\u011ferli ipu\u00e7lar\u0131 bar\u0131nd\u0131ran bu rehberle, kendi forum maceran\u0131za ilk ad\u0131m\u0131 at\u0131n.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 - Minimal Bir Forum\" \/>\n<meta property=\"og:description\" content=\"Kendi online toplulu\u011funuzu kurma hayali mi kuruyorsunuz? Belki de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n etkile\u015fimde bulunabilece\u011fi, d\u00fc\u015f\u00fcncelerini payla\u015fabilece\u011fi bir platforma ihtiyac\u0131n\u0131z var. FastAPI ile s\u0131f\u0131rdan, modern ve h\u0131zl\u0131 bir forum backend&#039;i olu\u015fturmak, d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fczden \u00e7ok daha kolay ve keyifli bir s\u00fcre\u00e7 olabilir. Bu makalede, Python&#039;\u0131n g\u00fcc\u00fcn\u00fc FastAPI&#039;nin performans\u0131yla birle\u015ftirerek nas\u0131l minimal bir forum \u00e7at\u0131s\u0131 kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki bir geli\u015ftiricinin bile kolayca anlayabilece\u011fi, ancak deneyimli kullan\u0131c\u0131lar i\u00e7in de de\u011ferli ipu\u00e7lar\u0131 bar\u0131nd\u0131ran bu rehberle, kendi forum maceran\u0131za ilk ad\u0131m\u0131 at\u0131n.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-19T04:01:15+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 &#8211; Minimal Bir Forum\",\"datePublished\":\"2025-10-19T04:01:15+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/\"},\"wordCount\":4504,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/\",\"name\":\"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 - Minimal Bir Forum\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-19T04:01:15+00:00\",\"description\":\"Kendi online toplulu\u011funuzu kurma hayali mi kuruyorsunuz? Belki de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n etkile\u015fimde bulunabilece\u011fi, d\u00fc\u015f\u00fcncelerini payla\u015fabilece\u011fi bir platforma ihtiyac\u0131n\u0131z var. FastAPI ile s\u0131f\u0131rdan, modern ve h\u0131zl\u0131 bir forum backend'i olu\u015fturmak, d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fczden \u00e7ok daha kolay ve keyifli bir s\u00fcre\u00e7 olabilir. Bu makalede, Python'\u0131n g\u00fcc\u00fcn\u00fc FastAPI'nin performans\u0131yla birle\u015ftirerek nas\u0131l minimal bir forum \u00e7at\u0131s\u0131 kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki bir geli\u015ftiricinin bile kolayca anlayabilece\u011fi, ancak deneyimli kullan\u0131c\u0131lar i\u00e7in de de\u011ferli ipu\u00e7lar\u0131 bar\u0131nd\u0131ran bu rehberle, kendi forum maceran\u0131za ilk ad\u0131m\u0131 at\u0131n.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 &#8211; Minimal Bir Forum\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 - Minimal Bir Forum","description":"Kendi online toplulu\u011funuzu kurma hayali mi kuruyorsunuz? Belki de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n etkile\u015fimde bulunabilece\u011fi, d\u00fc\u015f\u00fcncelerini payla\u015fabilece\u011fi bir platforma ihtiyac\u0131n\u0131z var. FastAPI ile s\u0131f\u0131rdan, modern ve h\u0131zl\u0131 bir forum backend'i olu\u015fturmak, d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fczden \u00e7ok daha kolay ve keyifli bir s\u00fcre\u00e7 olabilir. Bu makalede, Python'\u0131n g\u00fcc\u00fcn\u00fc FastAPI'nin performans\u0131yla birle\u015ftirerek nas\u0131l minimal bir forum \u00e7at\u0131s\u0131 kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki bir geli\u015ftiricinin bile kolayca anlayabilece\u011fi, ancak deneyimli kullan\u0131c\u0131lar i\u00e7in de de\u011ferli ipu\u00e7lar\u0131 bar\u0131nd\u0131ran bu rehberle, kendi forum maceran\u0131za ilk ad\u0131m\u0131 at\u0131n.","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:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/","og_locale":"tr_TR","og_type":"article","og_title":"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 - Minimal Bir Forum","og_description":"Kendi online toplulu\u011funuzu kurma hayali mi kuruyorsunuz? Belki de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n etkile\u015fimde bulunabilece\u011fi, d\u00fc\u015f\u00fcncelerini payla\u015fabilece\u011fi bir platforma ihtiyac\u0131n\u0131z var. FastAPI ile s\u0131f\u0131rdan, modern ve h\u0131zl\u0131 bir forum backend'i olu\u015fturmak, d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fczden \u00e7ok daha kolay ve keyifli bir s\u00fcre\u00e7 olabilir. Bu makalede, Python'\u0131n g\u00fcc\u00fcn\u00fc FastAPI'nin performans\u0131yla birle\u015ftirerek nas\u0131l minimal bir forum \u00e7at\u0131s\u0131 kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki bir geli\u015ftiricinin bile kolayca anlayabilece\u011fi, ancak deneyimli kullan\u0131c\u0131lar i\u00e7in de de\u011ferli ipu\u00e7lar\u0131 bar\u0131nd\u0131ran bu rehberle, kendi forum maceran\u0131za ilk ad\u0131m\u0131 at\u0131n.","og_url":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-19T04:01:15+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 &#8211; Minimal Bir Forum","datePublished":"2025-10-19T04:01:15+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/"},"wordCount":4504,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/","url":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/","name":"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 - Minimal Bir Forum","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-19T04:01:15+00:00","description":"Kendi online toplulu\u011funuzu kurma hayali mi kuruyorsunuz? Belki de kullan\u0131c\u0131lar\u0131n\u0131z\u0131n etkile\u015fimde bulunabilece\u011fi, d\u00fc\u015f\u00fcncelerini payla\u015fabilece\u011fi bir platforma ihtiyac\u0131n\u0131z var. FastAPI ile s\u0131f\u0131rdan, modern ve h\u0131zl\u0131 bir forum backend'i olu\u015fturmak, d\u00fc\u015f\u00fcnd\u00fc\u011f\u00fcn\u00fczden \u00e7ok daha kolay ve keyifli bir s\u00fcre\u00e7 olabilir. Bu makalede, Python'\u0131n g\u00fcc\u00fcn\u00fc FastAPI'nin performans\u0131yla birle\u015ftirerek nas\u0131l minimal bir forum \u00e7at\u0131s\u0131 kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ke\u015ffedece\u011fiz. Ba\u015flang\u0131\u00e7 seviyesindeki bir geli\u015ftiricinin bile kolayca anlayabilece\u011fi, ancak deneyimli kullan\u0131c\u0131lar i\u00e7in de de\u011ferli ipu\u00e7lar\u0131 bar\u0131nd\u0131ran bu rehberle, kendi forum maceran\u0131za ilk ad\u0131m\u0131 at\u0131n.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-ile-kendi-forumunuzu-olusturun-adim-1-minimal-bir-forum\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"FastAPI ile Kendi Forumunuzu Olu\u015fturun: Ad\u0131m 1 &#8211; Minimal Bir Forum"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32226","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32226"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32226\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32226"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32226"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32226"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}