{"id":33223,"date":"2025-10-31T07:41:03","date_gmt":"2025-10-31T04:41:03","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=33223"},"modified":"2025-10-31T07:41:03","modified_gmt":"2025-10-31T04:41:03","slug":"flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/","title":{"rendered":"Flask&#8217;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Flask&#8217;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Modern web uygulamalar\u0131n\u0131n kalbinde, kullan\u0131c\u0131lar\u0131n veya di\u011fer sistemlerin sunucuya g\u00f6nderdi\u011fi verilerin do\u011fru, g\u00fcvenli ve verimli bir \u015fekilde i\u015flenmesi yatar. Flask, hafif yap\u0131s\u0131yla Python tabanl\u0131 web uygulamalar\u0131 geli\u015ftirmek i\u00e7in pop\u00fcler bir mikro \u00e7er\u00e7evedir ve gelen istek verilerini i\u015flemek i\u00e7in g\u00fc\u00e7l\u00fc ve esnek mekanizmalar sunar. Bu makalede, Flask uygulamalar\u0131nda gelen istek verilerinin nas\u0131l al\u0131naca\u011f\u0131n\u0131, i\u015flenece\u011fini, do\u011frulanaca\u011f\u0131n\u0131 ve g\u00fcvenli hale getirilece\u011fini ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceleyece\u011fiz. Sorgu parametrelerinden form verilerine, JSON y\u00fcklerinden dosya y\u00fcklemelerine kadar her t\u00fcrl\u00fc veri t\u00fcr\u00fcn\u00fc ele alacak ve en iyi uygulamalar\u0131 vurgulayaca\u011f\u0131z.<\/p>\n<h3>Giri\u015f: \u0130stek Verileri Neden \u00d6nemlidir?<\/h3>\n<p>Bir web uygulamas\u0131, kullan\u0131c\u0131dan veya ba\u015fka bir API&#8217;den gelen verilerle etkile\u015fime girerek dinamik i\u00e7erik \u00fcretir, veritaban\u0131 i\u015flemlerini ger\u00e7ekle\u015ftirir veya belirli bir i\u015f mant\u0131\u011f\u0131n\u0131 y\u00fcr\u00fct\u00fcr. Bu veriler, bir arama sorgusundan bir kullan\u0131c\u0131 kay\u0131t formuna, bir API \u00e7a\u011fr\u0131s\u0131n\u0131n JSON y\u00fck\u00fcnden bir dosya y\u00fcklemesine kadar \u00e7e\u015fitli \u015fekillerde olabilir. Gelen istek verilerini do\u011fru bir \u015fekilde anlamak ve i\u015flemek, uygulaman\u0131n do\u011fru \u00e7al\u0131\u015fmas\u0131, kullan\u0131c\u0131 deneyiminin iyile\u015ftirilmesi ve en \u00f6nemlisi g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131n \u00f6nlenmesi i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<p>Flask, bu i\u015flemi kolayla\u015ft\u0131rmak i\u00e7in <code>request<\/code> ad\u0131nda \u00f6zel bir global nesne sa\u011flar. Bu nesne, mevcut gelen istekle ilgili t\u00fcm bilgilere eri\u015fim sa\u011flar ve geli\u015ftiricilerin farkl\u0131 veri t\u00fcrlerini kolayca ayr\u0131\u015ft\u0131rmas\u0131na olanak tan\u0131r.<\/p>\n<h3>Flask&#8217;\u0131n <code>request<\/code> Nesnesi<\/h3>\n<p>Flask&#8217;ta gelen istek verilerine eri\u015fimin anahtar\u0131, <code>flask<\/code> mod\u00fcl\u00fcnden i\u00e7e aktard\u0131\u011f\u0131m\u0131z <code>request<\/code> nesnesidir. Bu nesne, her gelen HTTP iste\u011fi i\u00e7in \u00f6zel olarak olu\u015fturulur ve o iste\u011fe \u00f6zg\u00fc t\u00fcm verileri i\u00e7erir. <code>request<\/code> nesnesi, bir proxy g\u00f6revi g\u00f6r\u00fcr, yani asl\u0131nda mevcut uygulama ba\u011flam\u0131ndaki ger\u00e7ek istek nesnesine i\u015faret eder. Bu sayede, uygulaman\u0131z\u0131n herhangi bir yerinden <code>request<\/code> nesnesine eri\u015febilirsiniz.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request, jsonify\n\napp = Flask(__name__)\n\n@app.route('\/')\ndef index():\n    # request nesnesine burada eri\u015filebilir\n    return 'Merhaba Flask!'\n\nif __name__ == '__main__':\n    app.run(debug=True)\n<\/code><\/pre>\n<p><code>request<\/code> nesnesi, gelen istekle ilgili bir\u00e7ok faydal\u0131 \u00f6zelli\u011fe sahiptir. Bunlar aras\u0131nda:<\/p>\n<ul>\n<li><code>request.method<\/code>: \u0130ste\u011fin HTTP metodunu (GET, POST, PUT, DELETE vb.) d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>request.url<\/code>: \u0130ste\u011fin tam URL&#8217;sini d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>request.base_url<\/code>: URL&#8217;nin sorgu dizisi ve fragment k\u0131sm\u0131 hari\u00e7 temelini d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>request.host<\/code>: \u0130ste\u011fin yap\u0131ld\u0131\u011f\u0131 ana bilgisayar ad\u0131n\u0131 d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>request.path<\/code>: URL&#8217;nin ana bilgisayar ve sorgu dizisi hari\u00e7 yolunu d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>request.remote_addr<\/code>: \u0130ste\u011fi yapan istemcinin IP adresini d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>request.user_agent<\/code>: \u0130stemcinin User-Agent dizesini d\u00f6nd\u00fcr\u00fcr.<\/li>\n<li><code>request.referrer<\/code>: \u0130stemcinin geldi\u011fi referans URL&#8217;yi d\u00f6nd\u00fcr\u00fcr.<\/li>\n<\/ul>\n<p>Bu \u00f6zellikler, iste\u011fin ba\u011flam\u0131n\u0131 anlamak ve uygulaman\u0131n davran\u0131\u015f\u0131n\u0131 buna g\u00f6re ayarlamak i\u00e7in \u00e7ok \u00f6nemlidir.<\/p>\n<h3>Farkl\u0131 \u0130stek Veri T\u00fcrlerine Eri\u015fim<\/h3>\n<p>Gelen istekler farkl\u0131 formatlarda veri ta\u015f\u0131yabilir. Flask&#8217;\u0131n <code>request<\/code> nesnesi, bu farkl\u0131 formatlara kolayca eri\u015fmek i\u00e7in \u00f6zel nitelikler sa\u011flar.<\/p>\n<h4>Sorgu Parametreleri (URL Parametreleri)<\/h4>\n<p>Sorgu parametreleri, URL&#8217;nin soru i\u015faretinden (?) sonra gelen ve anahtar-de\u011fer \u00e7iftlerinden olu\u015fan verilerdir (\u00f6rn: <code>\/arama?q=flask&sayfa=1<\/code>). Genellikle <code>GET<\/code> istekleriyle birlikte kullan\u0131l\u0131rlar ve bir kayna\u011f\u0131 filtrelemek, s\u0131ralamak veya belirli bir g\u00f6r\u00fcn\u00fcm\u00fcn\u00fc istemek i\u00e7in idealdirler.<\/p>\n<p>Flask&#8217;ta sorgu parametrelerine <code>request.args<\/code> ile eri\u015filir. <code>request.args<\/code> bir <code>ImmutableMultiDict<\/code> nesnesidir, yani de\u011fi\u015ftirilemez bir s\u00f6zl\u00fck benzeri yap\u0131d\u0131r ve ayn\u0131 anahtar i\u00e7in birden fazla de\u011fer tutabilir.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request\n\napp = Flask(__name__)\n\n@app.route('\/arama')\ndef arama():\n    sorgu = request.args.get('q', 'Flask') # 'q' parametresini al, yoksa 'Flask' varsay\u0131lan de\u011ferini kullan\n    sayfa = request.args.get('sayfa', 1, type=int) # 'sayfa' parametresini al, int'e \u00e7evir, yoksa 1 kullan\n    \n    return f\"Arama sorgusu: '{sorgu}', Sayfa: {sayfa}\"\n\n<h2>\u00d6rnek kullan\u0131m: \/arama?q=python&sayfa=2<\/h2>\n<\/code><\/pre>\n<p><code>get()<\/code> metodu, parametre yoksa <code>None<\/code> d\u00f6nmek yerine bir varsay\u0131lan de\u011fer belirtmenize olanak tan\u0131r. Ayr\u0131ca, <code>type<\/code> parametresi ile otomatik tip d\u00f6n\u00fc\u015f\u00fcm\u00fc yapabilirsiniz. Ayn\u0131 anahtar i\u00e7in birden fazla de\u011fer almak isterseniz (<code>\/urunler?etiket=yeni&etiket=indirimli<\/code> gibi), <code>getlist()<\/code> metodunu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-python\">@app.route('\/urunler')\ndef urunler():\n    etiketler = request.args.getlist('etiket')\n    if etiketler:\n        return f\"Se\u00e7ilen etiketler: {', '.join(etiketler)}\"\n    return \"Hi\u00e7 etiket se\u00e7ilmedi.\"\n<\/code><\/pre>\n<h4>Form Verileri (HTML Formlar\u0131)<\/h4>\n<p>Form verileri, genellikle HTML formlar\u0131 arac\u0131l\u0131\u011f\u0131yla <code>POST<\/code> istekleriyle g\u00f6nderilir. Bu veriler, <code>application\/x-www-form-urlencoded<\/code> veya <code>multipart\/form-data<\/code> (dosya y\u00fcklemeleri i\u00e7in) MIME tipleriyle kodlan\u0131r.<\/p>\n<p>Flask&#8217;ta form verilerine <code>request.form<\/code> ile eri\u015filir. Bu da bir <code>ImmutableMultiDict<\/code> nesnesidir.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request, render_template_string\n\napp = Flask(__name__)\n\nHTML_FORM = \"\"\"\n<form method=\"POST\" action=\"\/kayit\">\n    <label for=\"kullanici_adi\">Kullan\u0131c\u0131 Ad\u0131:<\/label><br>\n    <input type=\"text\" id=\"kullanici_adi\" name=\"kullanici_adi\"><br>\n    <label for=\"email\">Email:<\/label><br>\n    <input type=\"email\" id=\"email\" name=\"email\"><br><br>\n    <input type=\"submit\" value=\"Kaydol\">\n<\/form>\n\"\"\"\n\n@app.route('\/kayit', methods=['GET', 'POST'])\ndef kayit():\n    if request.method == 'POST':\n        kullanici_adi = request.form.get('kullanici_adi')\n        email = request.form.get('email')\n        \n        if kullanici_adi and email:\n            return f\"Kay\u0131t ba\u015far\u0131l\u0131! Kullan\u0131c\u0131 Ad\u0131: {kullanici_adi}, Email: {email}\"\n        return \"L\u00fctfen t\u00fcm alanlar\u0131 doldurun.\"\n    return render_template_string(HTML_FORM)\n<\/code><\/pre>\n<p>Yine <code>get()<\/code> ve <code>getlist()<\/code> metodlar\u0131 burada da ge\u00e7erlidir. <code>request.form<\/code> do\u011frudan eri\u015fim denemeleri (<code>request.form['kullanici_adi']<\/code>) e\u011fer anahtar yoksa <code>KeyError<\/code> hatas\u0131 f\u0131rlat\u0131rken, <code>get()<\/code> metodu <code>None<\/code> d\u00f6nd\u00fcrerek daha g\u00fcvenli bir kullan\u0131m sa\u011flar.<\/p>\n<h4>JSON Verileri (API \u0130stekleri)<\/h4>\n<p>Modern web uygulamalar\u0131 ve API&#8217;ler genellikle veri al\u0131\u015fveri\u015fi i\u00e7in JSON format\u0131n\u0131 kullan\u0131r. \u0130stemci, <code>Content-Type: application\/json<\/code> ba\u015fl\u0131\u011f\u0131yla bir <code>POST<\/code>, <code>PUT<\/code> veya <code>PATCH<\/code> iste\u011fi g\u00f6nderdi\u011finde, istek g\u00f6vdesinde JSON format\u0131nda veri bulunur.<\/p>\n<p>Flask, bu t\u00fcr verileri <code>request.json<\/code> veya <code>request.get_json()<\/code> ile otomatik olarak ayr\u0131\u015ft\u0131r\u0131r.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request, jsonify\n\napp = Flask(__name__)\n\n@app.route('\/api\/veri', methods=['POST'])\ndef api_veri_al():\n    if request.is_json:\n        data = request.get_json() # veya request.json\n        \n        isim = data.get('isim')\n        yas = data.get('yas')\n        \n        if isim and yas:\n            return jsonify({\"mesaj\": f\"Veri al\u0131nd\u0131: \u0130sim={isim}, Ya\u015f={yas}\"}), 200\n        return jsonify({\"hata\": \"Eksik veri\"}), 400\n    return jsonify({\"hata\": \"\u0130stek JSON format\u0131nda de\u011fil\"}), 400\n\n<h2>\u00d6rnek cURL iste\u011fi:<\/h2>\n<h2>curl -X POST -H \"Content-Type: application\/json\" -d '{\"isim\": \"Ahmet\", \"yas\": 30}' http:\/\/127.0.0.1:5000\/api\/veri<\/h2>\n<\/code><\/pre>\n<p><code>request.get_json()<\/code> metodunun baz\u0131 \u00f6nemli parametreleri vard\u0131r:<\/p>\n<ul>\n<li><code>force=True<\/code>: <code>Content-Type<\/code> ba\u015fl\u0131\u011f\u0131 <code>application\/json<\/code> olmasa bile Flask&#8217;\u0131 JSON&#8217;u ayr\u0131\u015ft\u0131rmaya zorlar. G\u00fcvenlik a\u00e7\u0131klar\u0131 do\u011furabilece\u011fi i\u00e7in dikkatli kullan\u0131lmal\u0131d\u0131r.<\/li>\n<li><code>silent=True<\/code>: JSON ayr\u0131\u015ft\u0131rma hatas\u0131 durumunda <code>BadRequest<\/code> hatas\u0131 f\u0131rlatmak yerine <code>None<\/code> d\u00f6nd\u00fcr\u00fcr. Bu, hatalar\u0131 manuel olarak ele alman\u0131za olanak tan\u0131r.<\/li>\n<\/ul>\n<p>JSON verilerini i\u015flerken, gelen verilerin yap\u0131s\u0131n\u0131 ve tiplerini do\u011frulamak (validation) kritik \u00f6neme sahiptir. Bu konuya daha sonra de\u011finece\u011fiz.<\/p>\n<h4>Dosya Y\u00fcklemeleri<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n resim, belge veya di\u011fer dosyalar\u0131 sunucuya y\u00fcklemesi gerekti\u011finde, HTML formu <code>enctype=\"multipart\/form-data\"<\/code> olarak ayarlan\u0131r. Flask, bu t\u00fcr dosya y\u00fcklemelerini <code>request.files<\/code> nesnesi arac\u0131l\u0131\u011f\u0131yla y\u00f6netir.<\/p>\n<p><code>request.files<\/code> da bir <code>ImmutableMultiDict<\/code> nesnesidir ve her bir dosya alan\u0131 ad\u0131 i\u00e7in bir <code>FileStorage<\/code> nesnesi i\u00e7erir. <code>FileStorage<\/code> nesnesi, y\u00fcklenen dosya hakk\u0131nda bilgi (ad\u0131, MIME tipi) sa\u011flar ve dosyay\u0131 kaydetmek i\u00e7in metotlar sunar.<\/p>\n<pre><code class=\"language-python\">import os\nfrom flask import Flask, request, redirect, url_for, render_template_string\nfrom werkzeug.utils import secure_filename\n\napp = Flask(__name__)\nUPLOAD_FOLDER = 'uploads'\nALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}\napp.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER\n\n<h2>Y\u00fckleme klas\u00f6r\u00fcn\u00fc olu\u015ftur<\/h2>\nif not os.path.exists(UPLOAD_FOLDER):\n    os.makedirs(UPLOAD_FOLDER)\n\ndef allowed_file(filename):\n    return '.' in filename and \\\n           filename.rsplit('.', 1)[1].lower() in ALLOWED_EXTENSIONS\n\nHTML_UPLOAD_FORM = \"\"\"\n<form method=\"POST\" action=\"\/yukle\" enctype=\"multipart\/form-data\">\n    <label for=\"dosya\">Dosya Se\u00e7:<\/label><br>\n    <input type=\"file\" id=\"dosya\" name=\"dosya\"><br><br>\n    <input type=\"submit\" value=\"Y\u00fckle\">\n<\/form>\n\"\"\"\n\n@app.route('\/yukle', methods=['GET', 'POST'])\ndef yukle_dosya():\n    if request.method == 'POST':\n        if 'dosya' not in request.files:\n            return \"Dosya alan\u0131 bulunamad\u0131\", 400\n        \n        dosya = request.files['dosya']\n        \n        if dosya.filename == '':\n            return \"Dosya se\u00e7ilmedi\", 400\n        \n        if dosya and allowed_file(dosya.filename):\n            filename = secure_filename(dosya.filename) # G\u00fcvenli dosya ad\u0131 olu\u015fturma\n            dosya.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))\n            return f\"Dosya '{filename}' ba\u015far\u0131yla y\u00fcklendi!\"\n        else:\n            return \"Desteklenmeyen dosya t\u00fcr\u00fc\", 400\n    \n    return render_template_string(HTML_UPLOAD_FORM)\n<\/code><\/pre>\n<p>Dosya y\u00fcklemelerinde g\u00fcvenlik \u00e7ok \u00f6nemlidir:<\/p>\n<ul>\n<li><code>secure_filename()<\/code>: <code>werkzeug.utils<\/code> mod\u00fcl\u00fcnden bu fonksiyonu kullanarak dosya adlar\u0131n\u0131 temizleyin. Bu, yol ge\u00e7i\u015fi (path traversal) gibi sald\u0131r\u0131lar\u0131 \u00f6nler.<\/li>\n<li>\u0130zin verilen uzant\u0131lar: Yaln\u0131zca uygulaman\u0131z\u0131n i\u015flemesi gereken dosya t\u00fcrlerine izin verin.<\/li>\n<li>Dosya boyutu limitleri: B\u00fcy\u00fck dosyalar\u0131n sunucunuzu yava\u015flatmas\u0131n\u0131 veya kaynaklar\u0131n\u0131 t\u00fcketmesini \u00f6nlemek i\u00e7in maksimum dosya boyutu belirleyin. Flask bunu <code>app.config['MAX_CONTENT_LENGTH']<\/code> ile yapman\u0131za olanak tan\u0131r.<\/li>\n<\/ul>\n<h4>Ba\u015fl\u0131klar (Headers)<\/h4>\n<p>HTTP ba\u015fl\u0131klar\u0131, istemci ve sunucu aras\u0131nda ek bilgiler ta\u015f\u0131r (\u00f6rn: <code>User-Agent<\/code>, <code>Content-Type<\/code>, <code>Authorization<\/code>). Flask&#8217;ta bu ba\u015fl\u0131klara <code>request.headers<\/code> ile eri\u015filir. <code>request.headers<\/code> bir <code>EnvironHeaders<\/code> nesnesidir ve s\u00f6zl\u00fck benzeri bir aray\u00fcze sahiptir.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request, jsonify\n\napp = Flask(__name__)\n\n@app.route('\/bilgi')\ndef bilgi_goster():\n    user_agent = request.headers.get('User-Agent')\n    content_type = request.headers.get('Content-Type')\n    \n    return jsonify({\n        \"User-Agent\": user_agent,\n        \"Content-Type\": content_type,\n        \"Method\": request.method,\n        \"Remote-Addr\": request.remote_addr\n    })\n<\/code><\/pre>\n<p>Ba\u015fl\u0131klar, kimlik do\u011frulama, i\u00e7erik t\u00fcr\u00fc kontrol\u00fc veya istemci bilgilerini almak gibi \u00e7e\u015fitli ama\u00e7lar i\u00e7in kullan\u0131labilir.<\/p>\n<h4>\u00c7erezler (Cookies)<\/h4>\n<p>\u00c7erezler, istemcinin taray\u0131c\u0131s\u0131nda depolanan k\u00fc\u00e7\u00fck veri par\u00e7ac\u0131klar\u0131d\u0131r ve genellikle oturum y\u00f6netimi veya kullan\u0131c\u0131 tercihlerini hat\u0131rlamak i\u00e7in kullan\u0131l\u0131r. Gelen istekteki \u00e7erezlere <code>request.cookies<\/code> ile eri\u015filir. Bu da bir <code>ImmutableMultiDict<\/code> nesnesidir.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request, make_response\n\napp = Flask(__name__)\n\n@app.route('\/get_cookie')\ndef get_cookie():\n    son_ziyaret = request.cookies.get('son_ziyaret')\n    if son_ziyaret:\n        return f\"Son ziyaretiniz: {son_ziyaret}\"\n    return \"Hen\u00fcz bir ziyaret \u00e7erezi bulunmuyor.\"\n\n@app.route('\/set_cookie')\ndef set_cookie():\n    resp = make_response(\"\u00c7erez ayarland\u0131!\")\n    resp.set_cookie('son_ziyaret', 'bugun', max_age=3600) # 1 saat ge\u00e7erli\n    return resp\n<\/code><\/pre>\n<p>\u00c7erezleri okumak i\u00e7in <code>request.cookies.get('anahtar')<\/code> kullan\u0131rken, \u00e7erezleri ayarlamak veya silmek i\u00e7in bir <code>Response<\/code> nesnesi olu\u015fturman\u0131z ve <code>set_cookie()<\/code> metodunu kullanman\u0131z gerekir.<\/p>\n<h4>Ham Veri<\/h4>\n<p>Yukar\u0131daki \u00f6zel niteliklerin hi\u00e7biri gelen iste\u011fin i\u00e7eri\u011fini do\u011fru bir \u015fekilde ayr\u0131\u015ft\u0131ramazsa (\u00f6rn: <code>Content-Type<\/code> bilinmeyen bir t\u00fcrse), iste\u011fin ham g\u00f6vdesine <code>request.data<\/code> ile eri\u015febilirsiniz. Bu, bayt dizisi (bytes) olarak d\u00f6ner.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request\n\napp = Flask(__name__)\n\n@app.route('\/ham_veri', methods=['POST'])\ndef ham_veri_al():\n    if request.data:\n        # Gelen ham veriyi UTF-8 olarak \u00e7\u00f6z\n        ham_icerik = request.data.decode('utf-8')\n        return f\"Gelen ham veri: {ham_icerik}\"\n    return \"Ham veri bulunamad\u0131.\"\n\n<h2>\u00d6rnek cURL iste\u011fi:<\/h2>\n<h2>curl -X POST -H \"Content-Type: text\/plain\" -d 'Merhaba, bu bir ham veri \u00f6rne\u011fidir.' http:\/\/127.0.0.1:5000\/ham_veri<\/h2>\n<\/code><\/pre>\n<p>Bu, \u00f6zellikle \u00f6zel protokoller veya belirli ikili veri t\u00fcrleriyle \u00e7al\u0131\u015f\u0131rken faydal\u0131 olabilir.<\/p>\n<h3>\u0130stek Metotlar\u0131 ve URL Kurallar\u0131<\/h3>\n<p>Flask, gelen istekleri HTTP metotlar\u0131na ve URL yollar\u0131na g\u00f6re y\u00f6nlendirmenize olanak tan\u0131r.<\/p>\n<h4>\u0130stek Metotlar\u0131<\/h4>\n<p>Bir rota i\u00e7in hangi HTTP metotlar\u0131n\u0131n kabul edilece\u011fini <code>@app.route()<\/code> dekorat\u00f6r\u00fcndeki <code>methods<\/code> parametresiyle belirleyebilirsiniz. <code>request.method<\/code> ile de mevcut iste\u011fin metodunu kontrol edebilirsiniz.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request\n\napp = Flask(__name__)\n\n@app.route('\/islem', methods=['GET', 'POST'])\ndef islem():\n    if request.method == 'POST':\n        return \"POST iste\u011fi al\u0131nd\u0131!\"\n    else: # GET\n        return \"GET iste\u011fi al\u0131nd\u0131!\"\n<\/code><\/pre>\n<h4>URL De\u011fi\u015fkenleri (Path Parameters)<\/h4>\n<p>URL&#8217;nin bir par\u00e7as\u0131 olarak de\u011fi\u015fkenler tan\u0131mlayabilir ve bunlar\u0131 do\u011frudan rota fonksiyonunuza parametre olarak ge\u00e7irebilirsiniz. Bu, RESTful API&#8217;ler olu\u015fturmak i\u00e7in \u00e7ok yayg\u0131n bir y\u00f6ntemdir.<\/p>\n<pre><code class=\"language-python\">from flask import Flask\n\napp = Flask(__name__)\n\n@app.route('\/kullanici\/<string:kullanici_adi>')\ndef kullanici_profili(kullanici_adi):\n    return f\"Kullan\u0131c\u0131 Profili: {kullanici_adi}\"\n\n@app.route('\/urun\/<int:urun_id>')\ndef urun_detay(urun_id):\n    return f\"\u00dcr\u00fcn Detay\u0131: ID={urun_id}\"\n\n@app.route('\/dosya\/<path:dosya_yolu>')\ndef dosya_goster(dosya_yolu):\n    return f\"Dosya Yolu: {dosya_yolu}\"\n\n<h2>\u00d6rnek kullan\u0131mlar:<\/h2>\n<h2>\/kullanici\/ahmet<\/h2>\n<h2>\/urun\/123<\/h2>\n<h2>\/dosya\/static\/resimler\/logo.png<\/h2>\n<\/code><\/pre>\n<p>Flask, URL de\u011fi\u015fkenleri i\u00e7in tip d\u00f6n\u00fc\u015ft\u00fcr\u00fcc\u00fcler sa\u011flar:<\/p>\n<ul>\n<li><code>string<\/code>: Varsay\u0131lan. Herhangi bir metni kabul eder.<\/li>\n<li><code>int<\/code>: Pozitif tamsay\u0131lar\u0131 kabul eder.<\/li>\n<li><code>float<\/code>: Pozitif kayan noktal\u0131 say\u0131lar\u0131 kabul eder.<\/li>\n<li><code>path<\/code>: E\u011fik \u00e7izgiler (\/) dahil olmak \u00fczere herhangi bir metni kabul eder.<\/li>\n<li><code>uuid<\/code>: UUID dizelerini kabul eder.<\/li>\n<\/ul>\n<h3>Veri Do\u011frulama ve Temizleme (Validation and Sanitization)<\/h3>\n<p>Gelen istek verilerini i\u015flerken en kritik ad\u0131mlardan biri, bu verileri do\u011frulamak ve temizlemektir. Bu, uygulaman\u0131z\u0131n g\u00fcvenli\u011fini sa\u011flaman\u0131n, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc koruman\u0131n ve beklenmeyen hatalar\u0131 \u00f6nlemenin temelidir.<\/p>\n<h4>Neden Gereklidir?<\/h4>\n<ul>\n<li><strong>G\u00fcvenlik:<\/strong> K\u00f6t\u00fc niyetli kullan\u0131c\u0131lar, SQL enjeksiyonu, XSS (Cross-Site Scripting), komut enjeksiyonu gibi sald\u0131r\u0131lar ger\u00e7ekle\u015ftirmek i\u00e7in ge\u00e7ersiz veya zararl\u0131 veri g\u00f6ndermeye \u00e7al\u0131\u015fabilirler.<\/li>\n<li><strong>Veri B\u00fct\u00fcnl\u00fc\u011f\u00fc:<\/strong> Veritaban\u0131na veya ba\u015fka bir depolama alan\u0131na kaydedilen verilerin do\u011fru formatta ve beklenen aral\u0131kta olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Uygulama Kararl\u0131l\u0131\u011f\u0131:<\/strong> Ge\u00e7ersiz veri tipleri veya eksik veriler, uygulaman\u0131zda \u00e7al\u0131\u015fma zaman\u0131 hatalar\u0131na neden olabilir.<\/li>\n<li><strong>Kullan\u0131c\u0131 Deneyimi:<\/strong> Kullan\u0131c\u0131lara giri\u015f hatalar\u0131 hakk\u0131nda a\u00e7\u0131k ve anla\u015f\u0131l\u0131r geri bildirimler sunar.<\/li>\n<\/ul>\n<h4>Temel Do\u011frulama Y\u00f6ntemleri<\/h4>\n<p>En basit do\u011frulama, verinin varl\u0131\u011f\u0131n\u0131, tipini ve temel format\u0131n\u0131 kontrol etmektir:<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request, jsonify\n\napp = Flask(__name__)\n\n@app.route('\/kayit_ol', methods=['POST'])\ndef kayit_ol():\n    data = request.get_json()\n    \n    if not data:\n        return jsonify({\"hata\": \"JSON veri bulunamad\u0131\"}), 400\n\n    kullanici_adi = data.get('kullanici_adi')\n    email = data.get('email')\n    sifre = data.get('sifre')\n\n    # Varl\u0131k kontrol\u00fc\n    if not kullanici_adi or not email or not sifre:\n        return jsonify({\"hata\": \"Kullan\u0131c\u0131 ad\u0131, email ve \u015fifre zorunludur\"}), 400\n\n    # Tip kontrol\u00fc (basit)\n    if not isinstance(kullanici_adi, str) or \\\n       not isinstance(email, str) or \\\n       not isinstance(sifre, str):\n        return jsonify({\"hata\": \"Alanlar metin olmal\u0131d\u0131r\"}), 400\n\n    # Uzunluk kontrol\u00fc\n    if len(kullanici_adi) < 3 or len(sifre) < 8:\n        return jsonify({\"hata\": \"Kullan\u0131c\u0131 ad\u0131 en az 3, \u015fifre en az 8 karakter olmal\u0131\"}), 400\n    \n    # Email format\u0131 kontrol\u00fc (basit regex veya k\u00fct\u00fcphane ile daha iyi)\n    if \"@\" not in email or \".\" not in email:\n        return jsonify({\"hata\": \"Ge\u00e7ersiz email format\u0131\"}), 400\n\n    # Di\u011fer i\u015f mant\u0131\u011f\u0131 (veritaban\u0131na kaydetme vb.)\n    return jsonify({\"mesaj\": \"Kay\u0131t ba\u015far\u0131l\u0131!\"}), 201\n<\/code><\/pre>\n<h4>K\u00fct\u00fcphanelerle Do\u011frulama<\/h4>\n<p>Karma\u015f\u0131k uygulamalarda, manuel do\u011frulama zahmetli ve hataya a\u00e7\u0131k olabilir. Flask ekosisteminde veri do\u011frulama i\u00e7in pop\u00fcler k\u00fct\u00fcphaneler bulunmaktad\u0131r:<\/p>\n<ul>\n<li><strong>WTForms:<\/strong> \u00d6zellikle HTML formlar\u0131 i\u00e7in tasarlanm\u0131\u015ft\u0131r. Form alanlar\u0131n\u0131 tan\u0131mlaman\u0131za, do\u011frulay\u0131c\u0131lar\u0131 eklemenize ve formlar\u0131 kolayca i\u015flemenize olanak tan\u0131r. Flask-WTF uzant\u0131s\u0131 ile Flask ile entegrasyonu daha da kolayla\u015f\u0131r.<\/li>\n<li><strong>Marshmallow:<\/strong> API'ler i\u00e7in veri serile\u015ftirme\/denizle\u015ftirme ve do\u011frulama konusunda g\u00fc\u00e7l\u00fc bir k\u00fct\u00fcphanedir. Gelen JSON verilerini Python nesnelerine d\u00f6n\u00fc\u015ft\u00fcr\u00fcrken veya tersini yaparken \u015femalar tan\u0131mlaman\u0131za olanak tan\u0131r.<\/li>\n<li><strong>Pydantic:<\/strong> Python'\u0131n tip ipu\u00e7lar\u0131n\u0131 kullanarak veri do\u011frulama ve ayarlar y\u00f6netimi i\u00e7in modern ve h\u0131zl\u0131 bir k\u00fct\u00fcphanedir. \u00d6zellikle API geli\u015ftirme i\u00e7in pop\u00fclerdir ve veri modellerini a\u00e7\u0131k\u00e7a tan\u0131mlaman\u0131za yard\u0131mc\u0131 olur.<\/li>\n<\/ul>\n<p><strong>Marshmallow ile JSON Veri Do\u011frulama \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-python\">from flask import Flask, request, jsonify\nfrom marshmallow import Schema, fields, validate\n\napp = Flask(__name__)\n\nclass KullaniciSchema(Schema):\n    kullanici_adi = fields.Str(required=True, validate=validate.Length(min=3, max=50))\n    email = fields.Email(required=True)\n    sifre = fields.Str(required=True, validate=validate.Length(min=8))\n    yas = fields.Int(validate=validate.Range(min=18, max=120), required=False)\n\n@app.route('\/api\/kullanici', methods=['POST'])\ndef api_kullanici_olustur():\n    json_data = request.get_json()\n    if not json_data:\n        return jsonify({\"hata\": \"JSON veri bulunamad\u0131\"}), 400\n\n    schema = KullaniciSchema()\n    try:\n        # Gelen veriyi \u015femaya g\u00f6re do\u011frula ve y\u00fckle\n        data = schema.load(json_data)\n    except Exception as err:\n        return jsonify({\"hata\": err.messages}), 400\n\n    # Do\u011frulanm\u0131\u015f ve temizlenmi\u015f 'data' ile i\u015flemler yap\n    return jsonify({\"mesaj\": \"Kullan\u0131c\u0131 ba\u015far\u0131yla olu\u015fturuldu\", \"veri\": data}), 201\n\n<h2>\u00d6rnek ba\u015far\u0131l\u0131 istek:<\/h2>\n<h2>curl -X POST -H \"Content-Type: application\/json\" -d '{\"kullanici_adi\": \"testuser\", \"email\": \"test@example.com\", \"sifre\": \"cokgizlisifre123\", \"yas\": 25}' http:\/\/127.0.0.1:5000\/api\/kullanici<\/h2>\n<h2>\u00d6rnek hatal\u0131 istek (kullanici_adi \u00e7ok k\u0131sa):<\/h2>\n<h2>curl -X POST -H \"Content-Type: application\/json\" -d '{\"kullanici_adi\": \"tu\", \"email\": \"test@example.com\", \"sifre\": \"cokgizlisifre123\"}' http:\/\/127.0.0.1:5000\/api\/kullanici<\/h2>\n<\/code><\/pre>\n<p>Bu k\u00fct\u00fcphaneler, karma\u015f\u0131k do\u011frulama kurallar\u0131n\u0131 tan\u0131mlamay\u0131, hata mesajlar\u0131n\u0131 standartla\u015ft\u0131rmay\u0131 ve kodu daha okunabilir hale getirmeyi b\u00fcy\u00fck \u00f6l\u00e7\u00fcde kolayla\u015ft\u0131r\u0131r.<\/p>\n<h3>Hata Y\u00f6netimi<\/h3>\n<p>Gelen istek verilerini i\u015flerken hatalar\u0131n ortaya \u00e7\u0131kmas\u0131 ka\u00e7\u0131n\u0131lmazd\u0131r. Eksik parametreler, ge\u00e7ersiz formatlar veya sunucu taraf\u0131ndaki sorunlar, uygulaman\u0131z\u0131n uygun \u015fekilde yan\u0131t vermesini gerektirir. Flask, bu t\u00fcr durumlar\u0131 y\u00f6netmek i\u00e7in ara\u00e7lar sunar.<\/p>\n<h4>HTTP Hatalar\u0131<\/h4>\n<p>Flask'ta HTTP hata yan\u0131tlar\u0131 d\u00f6nd\u00fcrmek i\u00e7in <code>abort()<\/code> fonksiyonunu kullanabilirsiniz. Bu, bir HTTP \u00f6zel durumunu tetikler ve Flask bu hatay\u0131 uygun bir HTTP durum koduyla yan\u0131tlar.<\/p>\n<pre><code class=\"language-python\">from flask import Flask, request, abort, jsonify\n\napp = Flask(__name__)\n\n@app.route('\/urun\/<int:urun_id>')\ndef get_urun(urun_id):\n    if urun_id < 1:\n        abort(400, description=\"Ge\u00e7ersiz \u00fcr\u00fcn ID'si.\") # Bad Request\n    \n    # Veritaban\u0131ndan \u00fcr\u00fcn \u00e7ekme\n    urun = {\"id\": urun_id, \"ad\": f\"\u00dcr\u00fcn {urun_id}\"} # \u00d6rnek veri\n    \n    if not urun:\n        abort(404, description=f\"ID {urun_id} ile \u00fcr\u00fcn bulunamad\u0131.\") # Not Found\n        \n    return jsonify(urun)\n<\/code><\/pre>\n<p><code>abort()<\/code> ile tetiklenen hatalar i\u00e7in \u00f6zel hata sayfalar\u0131 tan\u0131mlayabilirsiniz:<\/p>\n<pre><code class=\"language-python\">@app.errorhandler(400)\ndef bad_request(error):\n    return jsonify({\"hata\": \"Ge\u00e7ersiz istek\", \"detay\": str(error)}), 400\n\n@app.errorhandler(404)\ndef not_found(error):\n    return jsonify({\"hata\": \"Kaynak bulunamad\u0131\", \"detay\": str(error)}), 404\n<\/code><\/pre>\n<p>Bu, API'ler i\u00e7in JSON hata yan\u0131tlar\u0131 d\u00f6nd\u00fcrmenin veya web aray\u00fczleri i\u00e7in \u00f6zel HTML hata sayfalar\u0131 sunman\u0131n standart bir yoludur.<\/p>\n<h3>\u0130stek Verilerini \u0130\u015fleme \u0130\u00e7in En \u0130yi Uygulamalar<\/h3>\n<p>Flask'ta gelen istek verilerini i\u015flerken uygulaman\u0131z\u0131n sa\u011flam, g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir olmas\u0131n\u0131 sa\u011flamak i\u00e7in baz\u0131 en iyi uygulamalar\u0131 takip etmek \u00f6nemlidir:<\/p>\n<ol>\n<li><strong>Her Zaman Do\u011frula ve Temizle:<\/strong> Bu, g\u00fcvenlik ve veri b\u00fct\u00fcnl\u00fc\u011f\u00fc i\u00e7in en \u00f6nemli kurald\u0131r. Kullan\u0131c\u0131dan gelen her verinin beklenen format, tip ve aral\u0131kta oldu\u011fundan emin olun. Giri\u015fleri temizleyin (\u00f6rne\u011fin, HTML etiketlerini veya \u00f6zel karakterleri kald\u0131r\u0131n\/ka\u00e7\u0131\u015f karakteri ekleyin) XSS gibi sald\u0131r\u0131lar\u0131 \u00f6nlemek i\u00e7in.<\/li>\n<li><strong><code>request.get()<\/code> Kullan\u0131n:<\/strong> <code>request.args<\/code>, <code>request.form<\/code> ve <code>request.cookies<\/code> gibi s\u00f6zl\u00fck benzeri nesnelere do\u011frudan <code>[]<\/code> ile eri\u015fmek yerine her zaman <code>get()<\/code> metodunu kullan\u0131n. Bu, anahtar\u0131n mevcut olmamas\u0131 durumunda <code>KeyError<\/code> f\u0131rlatmak yerine <code>None<\/code> d\u00f6nd\u00fcrerek uygulaman\u0131z\u0131n daha sa\u011flam olmas\u0131n\u0131 sa\u011flar.<\/li>\n<li><strong>Anlaml\u0131 Hata Mesajlar\u0131 D\u00f6nd\u00fcr\u00fcn:<\/strong> API'ler i\u00e7in JSON format\u0131nda, kullan\u0131c\u0131 aray\u00fczleri i\u00e7in ise insan taraf\u0131ndan okunabilir hata mesajlar\u0131 sunun. Hatalar\u0131n nedenini a\u00e7\u0131k\u00e7a belirtin ancak hassas bilgileri if\u015fa etmeyin.<\/li>\n<li><strong>Dosya Y\u00fcklemelerini G\u00fcvenli Hale Getirin:<\/strong> <code>secure_filename()<\/code> kullan\u0131n, dosya uzant\u0131lar\u0131n\u0131 kontrol edin ve dosya boyutlar\u0131n\u0131 s\u0131n\u0131rlay\u0131n. Y\u00fcklenen dosyalar\u0131 asla do\u011frudan \u00e7al\u0131\u015ft\u0131r\u0131labilir bir dizine kaydetmeyin.<\/li>\n<li><strong>\u0130stek Metodlar\u0131n\u0131 A\u00e7\u0131k\u00e7a Belirtin:<\/strong> Rota dekorat\u00f6rlerinde <code>methods<\/code> parametresini kullanarak hangi HTTP metotlar\u0131n\u0131n hangi rotay\u0131 tetikleyebilece\u011fini a\u00e7\u0131k\u00e7a belirtin.<\/li>\n<li><strong>URL De\u011fi\u015fkenlerini Ak\u0131ll\u0131ca Kullan\u0131n:<\/strong> Kaynaklar\u0131 tan\u0131mlamak i\u00e7in URL de\u011fi\u015fkenlerini kullan\u0131n (<code>\/kullanici\/<id><\/code>). Filtreleme, s\u0131ralama veya sayfalama i\u00e7in sorgu parametrelerini (<code>\/kullanicilar?durum=aktif<\/code>) tercih edin.<\/li>\n<li><strong>\u0130\u00e7erik T\u00fcr\u00fcn\u00fc Kontrol Edin:<\/strong> \u00d6zellikle JSON API'lerinde, <code>request.is_json<\/code> veya <code>request.content_type<\/code> ile gelen iste\u011fin beklenen i\u00e7erik t\u00fcr\u00fcne sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol edin.<\/li>\n<li><strong>K\u00fct\u00fcphanelerden Yararlan\u0131n:<\/strong> WTForms, Marshmallow veya Pydantic gibi k\u00fct\u00fcphaneler, karma\u015f\u0131k do\u011frulama ve serile\u015ftirme g\u00f6revlerini basitle\u015ftirir ve kodunuzu daha d\u00fczenli hale getirir.<\/li>\n<li><strong>Kodu Mod\u00fcler Tutun:<\/strong> B\u00fcy\u00fck uygulamalarda, istek i\u015fleme mant\u0131\u011f\u0131n\u0131 ayr\u0131 mod\u00fcllere veya yard\u0131mc\u0131 fonksiyonlara ay\u0131r\u0131n. Flask Blueprints, uygulaman\u0131z\u0131 daha y\u00f6netilebilir par\u00e7alara ay\u0131rman\u0131za yard\u0131mc\u0131 olur.<\/li>\n<li><strong>G\u00fcnl\u00fckleme (Logging):<\/strong> Gelen isteklerle ilgili \u00f6nemli bilgileri ve hatalar\u0131 g\u00fcnl\u00fc\u011fe kaydedin. Bu, sorun giderme ve g\u00fcvenlik denetimi i\u00e7in \u00e7ok de\u011ferlidir.<\/li>\n<\/ol>\n<h3>Sonu\u00e7<\/h3>\n<p>Flask'ta gelen istek verilerini do\u011fru bir \u015fekilde i\u015flemek, herhangi bir web uygulamas\u0131n\u0131n temelidir. <code>request<\/code> nesnesi, sorgu parametrelerinden form verilerine, JSON y\u00fcklerinden dosya y\u00fcklemelerine kadar her t\u00fcrl\u00fc veriye eri\u015fmek i\u00e7in kapsaml\u0131 bir API sunar. Ancak, sadece verilere eri\u015fmek yeterli de\u011fildir; bu verilerin g\u00fcvenli, do\u011fru ve uygulaman\u0131z\u0131n bekledi\u011fi formatta oldu\u011fundan emin olmak i\u00e7in do\u011frulama, temizleme ve uygun hata y\u00f6netimi s\u00fcre\u00e7leri de kritik \u00f6neme sahiptir. Bu makalede ele al\u0131nan teknikleri ve en iyi uygulamalar\u0131 takip ederek, Flask uygulamalar\u0131n\u0131z\u0131n sa\u011flaml\u0131\u011f\u0131n\u0131, g\u00fcvenli\u011fini ve s\u00fcrd\u00fcr\u00fclebilirli\u011fini art\u0131rabilirsiniz. G\u00fcvenli ve verimli bir web uygulamas\u0131 geli\u015ftirmek i\u00e7in gelen istek verilerini her zaman dikkatle ve \u00f6zenle ele almay\u0131 unutmay\u0131n.<\/p>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Flask&#8217;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber\nModern web uygulamalar\u0131n\u0131n kalbinde, kullan\u0131c\u0131lar\u0131n veya di\u011fer sistemlerin sunu","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-33223","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>Flask&#039;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber - 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\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Flask&#039;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Flask&#039;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber Modern web uygulamalar\u0131n\u0131n kalbinde, kullan\u0131c\u0131lar\u0131n veya di\u011fer sistemlerin sunu\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-31T04:41:03+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=\"18 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Flask&#8217;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-10-31T04:41:03+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/\"},\"wordCount\":2298,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/\",\"name\":\"Flask'ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-31T04:41:03+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Flask&#8217;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber\"}]},{\"@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":"Flask'ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber - 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\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Flask'ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber","og_description":"Flask'ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber Modern web uygulamalar\u0131n\u0131n kalbinde, kullan\u0131c\u0131lar\u0131n veya di\u011fer sistemlerin sunu","og_url":"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-31T04:41:03+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"18 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Flask&#8217;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber","datePublished":"2025-10-31T04:41:03+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/"},"wordCount":2298,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/","name":"Flask'ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-31T04:41:03+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/flaskta-gelen-istek-verilerini-isleme-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Flask&#8217;ta Gelen \u0130stek Verilerini \u0130\u015fleme: Kapsaml\u0131 Bir Rehber"}]},{"@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\/33223","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=33223"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33223\/revisions"}],"predecessor-version":[{"id":33224,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/33223\/revisions\/33224"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=33223"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=33223"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=33223"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}