{"id":41301,"date":"2026-03-28T09:00:37","date_gmt":"2026-03-28T06:00:37","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/"},"modified":"2026-03-28T09:00:37","modified_gmt":"2026-03-28T06:00:37","slug":"100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/","title":{"rendered":"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi"},"content":{"rendered":"<h2>#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi<\/h2>\n<p>#100DaysOfCode ser\u00fcveninizde 54. g\u00fcne ula\u015ft\u0131\u011f\u0131n\u0131zda, art\u0131k \u00f6\u011frendiklerinizi somut bir projeye d\u00f6n\u00fc\u015ft\u00fcrmenin heyecan\u0131n\u0131 ya\u015f\u0131yor olmal\u0131s\u0131n\u0131z. Bu g\u00fcn\u00fcn konusu, bir\u00e7ok geli\u015ftiricinin yolculu\u011funda \u00f6nemli bir kilometre ta\u015f\u0131 olan bir blog uygulamas\u0131 olu\u015fturmak. Bu makale, temel bir blog uygulamas\u0131n\u0131 ad\u0131m ad\u0131m nas\u0131l geli\u015ftirebilece\u011finizi, hangi teknolojileri kullanabilece\u011finizi ve bu s\u00fcre\u00e7te kar\u015f\u0131la\u015fabilece\u011finiz zorluklar\u0131 ele alarak size kapsaml\u0131 bir rehber sunacak. Haz\u0131rsan\u0131z, kod yazmaya ba\u015flayal\u0131m!<\/p>\n<h2>1. Blog Uygulamas\u0131 Neden Geli\u015ftirilmeli?<\/h2>\n<p>Bir blog uygulamas\u0131 geli\u015ftirmek, sadece bir proje tamamlamakla kalmaz, ayn\u0131 zamanda bir\u00e7ok a\u00e7\u0131dan ki\u015fisel ve profesyonel geli\u015fiminize katk\u0131da bulunur. Bu b\u00f6l\u00fcm, neden b\u00f6yle bir projeye giri\u015fmeniz gerekti\u011fine dair motivasyon kaynaklar\u0131n\u0131 inceleyecektir.<\/p>\n<h3>1.1. \u00d6\u011frenme ve Uygulama F\u0131rsatlar\u0131<\/h3>\n<p>Blog uygulamalar\u0131, genellikle tam y\u0131\u011f\u0131n (full-stack) geli\u015ftirme becerilerini test etmek ve peki\u015ftirmek i\u00e7in m\u00fckemmel bir platform sunar. Veritaban\u0131 etkile\u015fiminden kullan\u0131c\u0131 aray\u00fcz\u00fcne, kimlik do\u011frulamas\u0131ndan API geli\u015ftirmeye kadar bir\u00e7ok farkl\u0131 alanda pratik yapma imkan\u0131 bulursunuz. Bu s\u00fcre\u00e7te, yeni teknolojileri \u00f6\u011frenme ve mevcut bilgilerinizi derinle\u015ftirme \u015fans\u0131na sahip olursunuz.<\/p>\n<h3>1.2. Portfolyo De\u011feri<\/h3>\n<p>\u0130\u015f aray\u0131\u015f\u0131nda olan bir geli\u015ftirici i\u00e7in sa\u011flam bir portfolyo olmazsa olmazd\u0131r. Kendi geli\u015ftirdi\u011finiz, \u00e7al\u0131\u015fan bir blog uygulamas\u0131, potansiyel i\u015fverenlere yeteneklerinizi ve problem \u00e7\u00f6zme becerilerinizi g\u00f6stermenin harika bir yoludur. Kullan\u0131c\u0131 y\u00f6netimi, CRUD i\u015flemleri (Olu\u015fturma, Okuma, G\u00fcncelleme, Silme) ve veritaban\u0131 entegrasyonu gibi temel \u00f6zellikleri bar\u0131nd\u0131ran bir proje, teknik yeterlili\u011finizin kan\u0131t\u0131 niteli\u011findedir.<\/p>\n<h3>1.3. \u0130\u00e7erik Y\u00f6netimi ve Ki\u015fisel Marka<\/h3>\n<p>Kendi blog uygulaman\u0131z, ki\u015fisel markan\u0131z\u0131 olu\u015fturmak ve bilginizi payla\u015fmak i\u00e7in size ba\u011f\u0131ms\u0131z bir platform sa\u011flar. \u00d6\u011frendiklerinizi, deneyimlerinizi veya ilgi alanlar\u0131n\u0131z\u0131 d\u00fcnyaya duyurabilir, b\u00f6ylece hem kendinizi geli\u015ftirir hem de ba\u015fkalar\u0131na ilham verebilirsiniz. Bu, ayn\u0131 zamanda i\u00e7erik y\u00f6netim sistemlerinin (CMS) nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamak i\u00e7in de harika bir f\u0131rsatt\u0131r.<\/p>\n<h2>2. Proje Planlamas\u0131 ve Teknoloji Se\u00e7imi<\/h2>\n<p>Her ba\u015far\u0131l\u0131 projenin arkas\u0131nda iyi bir planlama yatar. Blog uygulaman\u0131z i\u00e7in do\u011fru teknolojileri se\u00e7mek ve temel \u00f6zellikleri belirlemek, geli\u015ftirme s\u00fcrecinizi \u00e7ok daha verimli hale getirecektir.<\/p>\n<h3>2.1. Temel \u00d6zellikler<\/h3>\n<p>Bir blog uygulamas\u0131n\u0131n olmazsa olmaz baz\u0131 \u00f6zellikleri vard\u0131r. \u0130\u015fte ba\u015flang\u0131\u00e7 i\u00e7in d\u00fc\u015f\u00fcnebilece\u011finiz temel \u00f6zellikler:<\/p>\n<ul>\n<li><b>Kullan\u0131c\u0131 Y\u00f6netimi:<\/b> Kay\u0131t olma, giri\u015f yapma, profil g\u00fcncelleme.<\/li>\n<li><b>Makale Y\u00f6netimi:<\/b> Makale olu\u015fturma, okuma, d\u00fczenleme, silme (CRUD i\u015flemleri).<\/li>\n<li><b>Yorum Sistemi:<\/b> Makalelere yorum yapma, yorumlar\u0131 g\u00f6r\u00fcnt\u00fcleme.<\/li>\n<li><b>Kategoriler\/Etiketler:<\/b> Makaleleri s\u0131n\u0131fland\u0131rma ve filtreleme.<\/li>\n<li><b>Ana Sayfa:<\/b> Son makaleleri veya pop\u00fcler makaleleri listeleme.<\/li>\n<li><b>Tek Makale Sayfas\u0131:<\/b> Se\u00e7ilen makalenin detaylar\u0131n\u0131 ve yorumlar\u0131n\u0131 g\u00f6sterme.<\/li>\n<\/ul>\n<h3>2.2. Frontend Teknolojileri<\/h3>\n<p>Kullan\u0131c\u0131lar\u0131n etkile\u015fimde bulunaca\u011f\u0131 aray\u00fcz\u00fc olu\u015fturmak i\u00e7in \u00e7e\u015fitli frontend teknolojileri kullanabilirsiniz:<\/p>\n<ul>\n<li><b>HTML5 &#038; CSS3:<\/b> Uygulaman\u0131z\u0131n temel yap\u0131s\u0131n\u0131 ve stilini olu\u015fturmak i\u00e7in vazge\u00e7ilmezdir.<\/li>\n<li><b>JavaScript (Vanilla JS):<\/b> Dinamik i\u00e7erik ve etkile\u015fim sa\u011flamak i\u00e7in.<\/li>\n<li><b>JavaScript Frameworkleri (Opsiyonel):<\/b> React, Vue.js veya Angular gibi modern frameworkler, daha karma\u015f\u0131k ve \u00f6l\u00e7eklenebilir uygulamalar i\u00e7in tercih edilebilir. Ancak #100DaysOfCode kapsam\u0131nda, vanilla JS ile ba\u015flamak temel prensipleri anlaman\u0131za yard\u0131mc\u0131 olabilir.<\/li>\n<\/ul>\n<h3>2.3. Backend Teknolojileri<\/h3>\n<p>Uygulaman\u0131z\u0131n sunucu taraf\u0131, veritaban\u0131 ile ileti\u015fim kuracak, API&#8217;leri y\u00f6netecek ve i\u015f mant\u0131\u011f\u0131n\u0131 i\u015fleyecektir. Pop\u00fcler se\u00e7enekler \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Python (Flask\/Django):<\/b> Python&#8217;\u0131n basitli\u011fi ve geni\u015f k\u00fct\u00fcphane deste\u011fi sayesinde web geli\u015ftirmede olduk\u00e7a pop\u00fclerdir. Flask hafif bir mikro-framework iken, Django daha kapsaml\u0131 ve &#8220;pil dahil&#8221; bir frameworkt\u00fcr.<\/li>\n<li><b>Node.js (Express):<\/b> JavaScript bilginizi hem frontend hem de backend&#8217;de kullanmak isterseniz idealdir. Express.js, Node.js i\u00e7in minimalist ve esnek bir web uygulama framework\u00fcd\u00fcr.<\/li>\n<li><b>Ruby (Ruby on Rails):<\/b> H\u0131zl\u0131 geli\u015ftirme ve &#8220;convention over configuration&#8221; prensibiyle bilinir.<\/li>\n<\/ul>\n<p>Bu makalede, Python ve Flask kombinasyonuna odaklanaca\u011f\u0131z, zira #100DaysOfCode kat\u0131l\u0131mc\u0131lar\u0131 aras\u0131nda olduk\u00e7a yayg\u0131nd\u0131r ve h\u0131zl\u0131 prototipleme i\u00e7in uygundur.<\/p>\n<h3>2.4. Veritaban\u0131 Se\u00e7imi<\/h3>\n<p>Verilerinizi depolamak i\u00e7in bir veritaban\u0131na ihtiyac\u0131n\u0131z olacak. Se\u00e7enekler \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>SQL Veritabanlar\u0131:<\/b> PostgreSQL, MySQL, SQLite. \u0130li\u015fkisel veritabanlar\u0131d\u0131r ve yap\u0131land\u0131r\u0131lm\u0131\u015f veriler i\u00e7in uygundur. Ba\u015flang\u0131\u00e7 seviyesi projeler i\u00e7in SQLite, kurulumu kolay oldu\u011fu i\u00e7in harika bir se\u00e7enektir.<\/li>\n<li><b>NoSQL Veritabanlar\u0131:<\/b> MongoDB, Cassandra. Yap\u0131land\u0131r\u0131lmam\u0131\u015f veya yar\u0131 yap\u0131land\u0131r\u0131lm\u0131\u015f veriler i\u00e7in esneklik sunar.<\/li>\n<\/ul>\n<p>SQLite, geli\u015ftirme ortam\u0131nda h\u0131zl\u0131ca ba\u015flamak i\u00e7in m\u00fckemmeldir. SQLAlchemy gibi ORM (Object-Relational Mapper) k\u00fct\u00fcphaneleri, veritaban\u0131 i\u015flemlerini daha kolay hale getirir.<\/p>\n<h2>3. Backend Geli\u015ftirme: API ve Veritaban\u0131 \u0130li\u015fkisi<\/h2>\n<p>Uygulaman\u0131z\u0131n beyni olan backend, verileri y\u00f6netir, i\u015f mant\u0131\u011f\u0131n\u0131 y\u00fcr\u00fct\u00fcr ve frontend ile ileti\u015fim kurar. Bu b\u00f6l\u00fcmde, backend&#8217;in temel bile\u015fenlerini ve Flask ile nas\u0131l uygulanabilece\u011fini inceleyece\u011fiz.<\/p>\n<h3>3.1. Model Tasar\u0131m\u0131<\/h3>\n<p>Veritaban\u0131n\u0131zdaki tablolar\u0131 ve aralar\u0131ndaki ili\u015fkileri tan\u0131mlamak, model tasar\u0131m\u0131 ile ba\u015flar. Bir blog uygulamas\u0131 i\u00e7in temel modeller \u015funlar olabilir:<\/p>\n<ul>\n<li><b>User (Kullan\u0131c\u0131):<\/b> Kullan\u0131c\u0131 ad\u0131, e-posta, parola (hashlenmi\u015f).<\/li>\n<li><b>Post (Makale):<\/b> Ba\u015fl\u0131k, i\u00e7erik, yazar (User ile ili\u015fki), olu\u015fturulma tarihi.<\/li>\n<li><b>Comment (Yorum):<\/b> \u0130\u00e7erik, yazar (User ile ili\u015fki), makale (Post ile ili\u015fki), olu\u015fturulma tarihi.<\/li>\n<\/ul>\n<p>\u00d6rnek bir <code>Post<\/code> tablosu yap\u0131s\u0131 (SQLAlchemy ile):<\/p>\n<pre><code class=\"language-python\">\nfrom datetime import datetime\nfrom flask_sqlalchemy import SQLAlchemy\n\ndb = SQLAlchemy()\n\nclass User(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    username = db.Column(db.String(80), unique=True, nullable=False)\n    email = db.Column(db.String(120), unique=True, nullable=False)\n    password_hash = db.Column(db.String(128))\n    posts = db.relationship('Post', backref='author', lazy=True)\n    comments = db.relationship('Comment', backref='comment_author', lazy=True)\n\nclass Post(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    title = db.Column(db.String(100), nullable=False)\n    content = db.Column(db.Text, nullable=False)\n    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\n    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)\n    comments = db.relationship('Comment', backref='post', lazy=True)\n\nclass Comment(db.Model):\n    id = db.Column(db.Integer, primary_key=True)\n    content = db.Column(db.Text, nullable=False)\n    date_posted = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)\n    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False)\n    post_id = db.Column(db.Integer, db.ForeignKey('post.id'), nullable=False)\n<\/pre>\n<p><\/code><\/p>\n<h3>3.2. API U\u00e7 Noktalar\u0131 (Endpoints)<\/h3>\n<p>Frontend'in backend ile ileti\u015fim kurabilmesi i\u00e7in API u\u00e7 noktalar\u0131 (route'lar) tan\u0131mlaman\u0131z gerekir. \u0130\u015fte baz\u0131 \u00f6rnekler:<\/p>\n<ul>\n<li><code>GET \/api\/posts<\/code>: T\u00fcm makaleleri listeler.<\/li>\n<li><code>GET \/api\/posts\/<id><\/code>: Belirli bir makalenin detaylar\u0131n\u0131 getirir.<\/li>\n<li><code>POST \/api\/posts<\/code>: Yeni bir makale olu\u015fturur.<\/li>\n<li><code>PUT \/api\/posts\/<id><\/code>: Mevcut bir makaleyi g\u00fcnceller.<\/li>\n<li><code>DELETE \/api\/posts\/<id><\/code>: Bir makaleyi siler.<\/li>\n<li><code>POST \/api\/register<\/code>: Yeni kullan\u0131c\u0131 kayd\u0131.<\/li>\n<li><code>POST \/api\/login<\/code>: Kullan\u0131c\u0131 giri\u015fi.<\/li>\n<\/ul>\n<p>Flask ile basit bir makale listeleme ve olu\u015fturma rotas\u0131 \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-python\">\nfrom flask import Flask, request, jsonify\nfrom flask_sqlalchemy import SQLAlchemy\nfrom datetime import datetime\n\napp = Flask(__name__)\napp.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:\/\/\/blog.db'\napp.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False\ndb = SQLAlchemy(app)\n\n# Model tan\u0131mlar\u0131 (yukar\u0131daki gibi)\n\n@app.route('\/api\/posts', methods=['GET'])\ndef get_posts():\n    posts = Post.query.all()\n    output = []\n    for post in posts:\n        post_data = {\n            'id': post.id,\n            'title': post.title,\n            'content': post.content,\n            'author': post.author.username,\n            'date_posted': post.date_posted.isoformat()\n        }\n        output.append(post_data)\n    return jsonify({'posts': output})\n\n@app.route('\/api\/posts', methods=['POST'])\ndef create_post():\n    data = request.get_json()\n    new_post = Post(title=data['title'], content=data['content'], user_id=data['user_id'])\n    db.session.add(new_post)\n    db.session.commit()\n    return jsonify({'message': 'Makale ba\u015far\u0131yla olu\u015fturuldu!'}), 201\n\nif __name__ == '__main__':\n    with app.app_context():\n        db.create_all() # Veritaban\u0131 tablolar\u0131n\u0131 olu\u015ftur\n    app.run(debug=True)\n<\/pre>\n<p><\/code><\/p>\n<h3>3.3. Kimlik Do\u011frulama ve Yetkilendirme<\/h3>\n<p>Kullan\u0131c\u0131lar\u0131n kay\u0131t olmas\u0131n\u0131, giri\u015f yapmas\u0131n\u0131 ve belirli i\u015flemleri (\u00f6rne\u011fin, kendi makalelerini d\u00fczenleme) yapabilmesini sa\u011flamak i\u00e7in kimlik do\u011frulama ve yetkilendirme mekanizmalar\u0131 gereklidir. JWT (JSON Web Tokens) veya oturum (session) tabanl\u0131 kimlik do\u011frulama y\u00f6ntemleri kullan\u0131labilir. Parolalar\u0131 asla d\u00fcz metin olarak saklamay\u0131n; bunun yerine Bcrypt gibi k\u00fct\u00fcphanelerle hashleyin.<\/p>\n<h2>4. Frontend Geli\u015ftirme: Kullan\u0131c\u0131 Aray\u00fcz\u00fc<\/h2>\n<p>Kullan\u0131c\u0131 aray\u00fcz\u00fc (UI), uygulaman\u0131z\u0131n g\u00f6r\u00fcnen y\u00fcz\u00fcd\u00fcr. Frontend, backend'den ald\u0131\u011f\u0131 verileri kullan\u0131c\u0131ya sunar ve kullan\u0131c\u0131n\u0131n etkile\u015fimlerini backend'e iletir.<\/p>\n<h3>4.1. Sayfa Yap\u0131lar\u0131<\/h3>\n<p>Blog uygulaman\u0131z i\u00e7in temel sayfa yap\u0131lar\u0131 \u015funlar\u0131 i\u00e7erebilir:<\/p>\n<ul>\n<li><b>index.html (Ana Sayfa):<\/b> T\u00fcm makalelerin \u00f6zetini listeleyen sayfa.<\/li>\n<li><b>post-detail.html:<\/b> Tek bir makalenin ba\u015fl\u0131\u011f\u0131n\u0131, i\u00e7eri\u011fini ve yorumlar\u0131n\u0131 g\u00f6steren sayfa.<\/li>\n<li><b>create-post.html:<\/b> Yeni bir makale olu\u015fturmak i\u00e7in form i\u00e7eren sayfa.<\/li>\n<li><b>login.html \/ register.html:<\/b> Kullan\u0131c\u0131 giri\u015fi ve kay\u0131t formlar\u0131.<\/li>\n<\/ul>\n<h3>4.2. Veri \u00c7ekme ve G\u00f6sterme<\/h3>\n<p>Frontend, JavaScript'in Fetch API'si veya Axios gibi k\u00fct\u00fcphaneler arac\u0131l\u0131\u011f\u0131yla backend API'lerinden veri \u00e7eker. \u00c7ekilen veriler, HTML DOM'u manip\u00fcle edilerek dinamik olarak sayfada g\u00f6sterilir.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ T\u00fcm makaleleri \u00e7ekme ve g\u00f6sterme (Vanilla JS)\ndocument.addEventListener('DOMContentLoaded', () => {\n    fetch('\/api\/posts')\n        .then(response => response.json())\n        .then(data => {\n            const postsContainer = document.getElementById('posts-container');\n            data.posts.forEach(post => {\n                const postElement = document.createElement('div');\n                postElement.classList.add('post-card');\n                postElement.innerHTML = <code><h3><a href=\"\/post\/${post.id}\">${post.title}<\/a><\/h3>\n                    <p>Yazar: ${post.author} - Tarih: ${new Date(post.date_posted).toLocaleDateString()}<\/p>\n                    <p>${post.content.substring(0, 150)}...<\/p><\/code>;\n                postsContainer.appendChild(postElement);\n            });\n        })\n        .catch(error => console.error('Makaleler \u00e7ekilirken hata olu\u015ftu:', error));\n});\n<\/pre>\n<p><\/code><\/p>\n<h3>4.3. Form Y\u00f6netimi<\/h3>\n<p>Yeni makale olu\u015fturma, yorum ekleme veya kullan\u0131c\u0131 giri\u015fi gibi i\u015flemler i\u00e7in HTML formlar\u0131 kullan\u0131l\u0131r. JavaScript, bu formlardan gelen verileri al\u0131r, do\u011frular ve backend API'lerine HTTP POST istekleri ile g\u00f6nderir.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Yeni makale olu\u015fturma formu g\u00f6nderimi (Vanilla JS)\nconst createPostForm = document.getElementById('create-post-form');\nif (createPostForm) {\n    createPostForm.addEventListener('submit', (e) => {\n        e.preventDefault();\n        const title = document.getElementById('post-title').value;\n        const content = document.getElementById('post-content').value;\n        const userId = 1; \/\/ Ge\u00e7ici olarak sabit bir kullan\u0131c\u0131 ID'si\n\n        fetch('\/api\/posts', {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application\/json',\n            },\n            body: JSON.stringify({ title, content, user_id: userId }),\n        })\n        .then(response => response.json())\n        .then(data => {\n            alert(data.message);\n            window.location.href = '\/'; \/\/ Ana sayfaya y\u00f6nlendir\n        })\n        .catch(error => console.error('Makale olu\u015fturulurken hata olu\u015ftu:', error));\n    });\n}\n<\/pre>\n<p><\/code><\/p>\n<h2>5. Temel Blog Uygulamas\u0131 Kod \u00d6rnekleri ve Yap\u0131land\u0131rma<\/h2>\n<p>Uygulaman\u0131z\u0131 geli\u015ftirirken kullanabilece\u011finiz baz\u0131 temel kod yap\u0131lar\u0131 ve yap\u0131land\u0131rma ipu\u00e7lar\u0131 a\u015fa\u011f\u0131dad\u0131r.<\/p>\n<h3>5.1. Proje Yap\u0131s\u0131<\/h3>\n<p>Tipik bir Flask projesi i\u00e7in \u00f6nerilen dizin yap\u0131s\u0131:<\/p>\n<pre><code class=\"language-bash\">\nblog_app\/\n\u251c\u2500\u2500 app.py              # Ana Flask uygulamas\u0131\n\u251c\u2500\u2500 config.py           # Yap\u0131land\u0131rma ayarlar\u0131\n\u251c\u2500\u2500 models.py           # Veritaban\u0131 modelleri\n\u251c\u2500\u2500 routes.py           # API u\u00e7 noktalar\u0131\n\u251c\u2500\u2500 static\/             # CSS, JS, resimler\n\u2502   \u251c\u2500\u2500 css\/\n\u2502   \u2502   \u2514\u2500\u2500 style.css\n\u2502   \u251c\u2500\u2500 js\/\n\u2502   \u2502   \u2514\u2500\u2500 main.js\n\u251c\u2500\u2500 templates\/          # HTML \u015fablonlar\u0131\n\u2502   \u251c\u2500\u2500 index.html\n\u2502   \u251c\u2500\u2500 post_detail.html\n\u2502   \u2514\u2500\u2500 base.html\n\u2514\u2500\u2500 venv\/               # Sanal ortam\n<\/pre>\n<p><\/code><\/p>\n<h3>5.2. Flask Uygulamas\u0131 Ba\u015flang\u0131c\u0131<\/h3>\n<p><code>app.py<\/code> dosyan\u0131z\u0131n temel yap\u0131s\u0131:<\/p>\n<pre><code class=\"language-python\">\nfrom flask import Flask\nfrom flask_sqlalchemy import SQLAlchemy\nfrom config import Config # config.py dosyas\u0131ndan yap\u0131land\u0131rmay\u0131 \u00e7ek\n\napp = Flask(__name__)\napp.config.from_object(Config) # Config s\u0131n\u0131f\u0131n\u0131 uygula\ndb = SQLAlchemy(app)\n\n# Modelleri ve rotalar\u0131 burada import edin\n# from models import User, Post, Comment\n# from routes import *\n\nif __name__ == '__main__':\n    with app.app_context():\n        db.create_all() # T\u00fcm tablolar\u0131 olu\u015ftur\n    app.run(debug=True)\n<\/pre>\n<p><\/code><\/p>\n<h3>5.3. Sanal Ortam ve Ba\u011f\u0131ml\u0131l\u0131klar<\/h3>\n<p>Projenizi izole etmek i\u00e7in bir sanal ortam kullanmak \u00f6nemlidir. Gerekli k\u00fct\u00fcphaneleri <code>requirements.txt<\/code> dosyas\u0131na ekleyin.<\/p>\n<pre><code class=\"language-bash\">\n# Sanal ortam olu\u015fturma\npython3 -m venv venv\n\n# Sanal ortam\u0131 etkinle\u015ftirme\nsource venv\/bin\/activate  # Linux\/macOS\n.\\venv\\Scripts\\activate   # Windows\n\n# Gerekli k\u00fct\u00fcphaneleri y\u00fckleme\npip install Flask Flask-SQLAlchemy Flask-WTF Flask-Login python-dotenv\n\n# Y\u00fckl\u00fc k\u00fct\u00fcphaneleri requirements.txt dosyas\u0131na kaydetme\npip freeze > requirements.txt\n<\/pre>\n<p><\/code><\/p>\n<p><code>requirements.txt<\/code> dosya i\u00e7eri\u011fi \u00f6rne\u011fi:<\/p>\n<pre><code class=\"language-text\">\nFlask==2.3.3\nFlask-SQLAlchemy==3.1.1\nFlask-WTF==1.2.1\nWerkzeug==2.3.8\n# Di\u011fer ba\u011f\u0131ml\u0131l\u0131klar...\n<\/pre>\n<p><\/code><\/p>\n<h2>Sonu\u00e7<\/h2>\n<p>#100DaysOfCode ser\u00fcveninizin 54. g\u00fcn\u00fcnde bir blog uygulamas\u0131 geli\u015ftirmek, \u00f6\u011frendi\u011finiz teorik bilgileri prati\u011fe d\u00f6kmenin ve tam y\u0131\u011f\u0131n geli\u015ftirme becerilerinizi peki\u015ftirmenin harika bir yoludur. Bu s\u00fcre\u00e7te, veritaban\u0131 tasar\u0131m\u0131, API geli\u015ftirme, kullan\u0131c\u0131 aray\u00fcz\u00fc olu\u015fturma ve kimlik do\u011frulama gibi bir\u00e7ok temel kavram\u0131 deneyimleyeceksiniz. Unutmay\u0131n, bu sadece bir ba\u015flang\u0131\u00e7. Uygulaman\u0131z\u0131 s\u00fcrekli geli\u015ftirerek, yeni \u00f6zellikler ekleyerek ve kodunuzu optimize ederek kendinizi daha da ileriye ta\u015f\u0131yabilirsiniz. Bu yolculukta ba\u015far\u0131lar dileriz!<\/p>\n<h2>SSS (S\u0131k Sorulan Sorular)<\/h2>\n<h3>S1: Hangi veritaban\u0131n\u0131 kullanmal\u0131y\u0131m?<\/h3>\n<p>Ba\u015flang\u0131\u00e7 seviyesi bir proje i\u00e7in SQLite idealdir, \u00e7\u00fcnk\u00fc kurulumu kolayd\u0131r ve ek bir veritaban\u0131 sunucusu gerektirmez. Ancak \u00fcretim ortam\u0131 i\u00e7in PostgreSQL veya MySQL gibi daha g\u00fc\u00e7l\u00fc ili\u015fkisel veritabanlar\u0131 tercih edilebilir.<\/p>\n<h3>S2: Frontend ve Backend'i nas\u0131l birle\u015ftirece\u011fim?<\/h3>\n<p>Frontend (HTML, CSS, JavaScript) ve Backend (Flask\/Node.js) aras\u0131ndaki ileti\u015fim HTTP istekleri (GET, POST, PUT, DELETE) arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015fir. Frontend, backend'in sundu\u011fu API u\u00e7 noktalar\u0131na istek g\u00f6nderir ve ald\u0131\u011f\u0131 JSON verilerini kullanarak kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc g\u00fcnceller. Flask gibi frameworkler, hem API u\u00e7 noktalar\u0131n\u0131 sunabilir hem de HTML \u015fablonlar\u0131n\u0131 do\u011frudan render edebilir.<\/p>\n<h3>S3: Bu proje ne kadar s\u00fcrer?<\/h3>\n<p>Projenin s\u00fcresi, eklemek istedi\u011finiz \u00f6zelliklerin karma\u015f\u0131kl\u0131\u011f\u0131na ve kendi \u00f6\u011frenme h\u0131z\u0131n\u0131za ba\u011fl\u0131d\u0131r. Temel bir CRUD i\u015flevselli\u011fine sahip blog uygulamas\u0131n\u0131 birka\u00e7 g\u00fcn i\u00e7inde tamamlayabilirsiniz. Ancak kullan\u0131c\u0131 profilleri, yorumlar, etiketler, arama gibi ek \u00f6zellikler ekledik\u00e7e s\u00fcre uzayacakt\u0131r. #100DaysOfCode kapsam\u0131nda her g\u00fcn k\u00fc\u00e7\u00fck ad\u0131mlar atmak \u00f6nemlidir.<\/p>\n<h3>S4: Hangi Flask k\u00fct\u00fcphanelerini kullanmal\u0131y\u0131m?<\/h3>\n<p>Bir blog uygulamas\u0131 i\u00e7in temel Flask k\u00fct\u00fcphaneleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><b>Flask-SQLAlchemy:<\/b> ORM ile veritaban\u0131 etkile\u015fimi i\u00e7in.<\/li>\n<li><b>Flask-WTF:<\/b> Form olu\u015fturma ve do\u011frulama i\u00e7in.<\/li>\n<li><b>Flask-Login:<\/b> Kullan\u0131c\u0131 oturumlar\u0131n\u0131 y\u00f6netmek i\u00e7in.<\/li>\n<li><b>Werkzeug (Flask ile gelir):<\/b> Parola hashleme i\u00e7in (<code>generate_password_hash<\/code> ve <code>check_password_hash<\/code>).<\/li>\n<\/ul>\n<h3>S5: SEO uyumlu bir blog uygulamas\u0131 nas\u0131l yap\u0131l\u0131r?<\/h3>\n<p>SEO (Arama Motoru Optimizasyonu) i\u00e7in \u015funlara dikkat edebilirsiniz:<\/p>\n<ul>\n<li><b>Anlaml\u0131 URL'ler:<\/b> Makale ba\u015fl\u0131klar\u0131n\u0131 i\u00e7eren URL'ler (\u00f6rn. <code>\/posts\/makale-basligi<\/code>).<\/li>\n<li><b>Meta Etiketleri:<\/b> Her sayfa i\u00e7in uygun <code><title><\/code> ve <code><meta description><\/code> etiketleri.<\/li>\n<li><b>Semantik HTML:<\/b> Do\u011fru HTML5 etiketlerini (<code><br \/>\n<header><\/code>, <code><\/p>\n<nav><\/code>, <code><\/p>\n<article><\/code>, <code><\/p>\n<footer><\/code> vb.) kullanmak.<\/li>\n<li><b>H\u0131zl\u0131 Y\u00fckleme S\u00fcresi:<\/b> Resimleri optimize etmek, CSS ve JS dosyalar\u0131n\u0131 s\u0131k\u0131\u015ft\u0131rmak.<\/li>\n<li><b>Mobil Uyumluluk:<\/b> Duyarl\u0131 (responsive) tasar\u0131m kullanmak.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"#100DaysOfCode ser\u00fcveninizde 54. g\u00fcne ula\u015ft\u0131\u011f\u0131n\u0131zda, art\u0131k \u00f6\u011frendiklerinizi somut bir projeye d\u00f6n\u00fc\u015ft\u00fcrmenin heyecan\u0131n\u0131 ya\u015f\u0131yor olmal\u0131s\u0131n\u0131z.","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-41301","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>#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\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\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi\" \/>\n<meta property=\"og:description\" content=\"#100DaysOfCode ser\u00fcveninizde 54. g\u00fcne ula\u015ft\u0131\u011f\u0131n\u0131zda, art\u0131k \u00f6\u011frendiklerinizi somut bir projeye d\u00f6n\u00fc\u015ft\u00fcrmenin heyecan\u0131n\u0131 ya\u015f\u0131yor olmal\u0131s\u0131n\u0131z.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-03-28T06:00:37+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=\"12 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi\",\"datePublished\":\"2026-03-28T06:00:37+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/\"},\"wordCount\":1782,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/\",\"name\":\"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-03-28T06:00:37+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi\"}]},{\"@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":"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi","og_description":"#100DaysOfCode ser\u00fcveninizde 54. g\u00fcne ula\u015ft\u0131\u011f\u0131n\u0131zda, art\u0131k \u00f6\u011frendiklerinizi somut bir projeye d\u00f6n\u00fc\u015ft\u00fcrmenin heyecan\u0131n\u0131 ya\u015f\u0131yor olmal\u0131s\u0131n\u0131z.","og_url":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-03-28T06:00:37+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"12 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi","datePublished":"2026-03-28T06:00:37+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/"},"wordCount":1782,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/","name":"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-03-28T06:00:37+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/100daysofcode-gun-54-kapsamli-bir-blog-uygulamasi-gelistirme-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"#100DaysOfCode G\u00fcn 54: Kapsaml\u0131 Bir Blog Uygulamas\u0131 Geli\u015ftirme Rehberi"}]},{"@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\/41301","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=41301"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41301\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=41301"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=41301"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=41301"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}