-
Notifications
You must be signed in to change notification settings - Fork 0
/
hug-sqlalchemy-basit-api.html
294 lines (243 loc) · 26.8 KB
/
hug-sqlalchemy-basit-api.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="utf-8">
<title> Hug ve SQLAlchemy ile Basit API Yapımı
</title>
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="HandheldFriendly" content="True" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="author" content="0x656e" />
<meta name="description" content="Selam, Geçenlerde yazı yazdıktan sonra Mirat Can Bayrak dedi ki hug ile ilgili birşeyler yazsana. Meğer kendisi üşenmiş. Neyse hug'a gelelim. Google'da hug diye arattığınızda bulamayabilirsiniz. I need hug. Hug'a erişmek için: HUG Hug Nedir ? Hug falcon altyapısını kullanan bir rest api frameworkü. Peki bize ne vaad ediyor bu hug …" />
<meta name="keywords" content="python, hug, api, sqlalchemy">
<meta property="article:tag" content="python" />
<meta property="article:tag" content="hug" />
<meta property="article:tag" content="api" />
<meta property="article:tag" content="sqlalchemy" />
<link rel="canonical" href="https://enesergun.net/hug-sqlalchemy-basit-api.html"/>
<meta name="description" content=""/>
<!-- og definitions -->
<meta property="og:type" content="article" />
<meta property="og:url" content="https://enesergun.net/hug-sqlalchemy-basit-api.html" />
<meta property="og:title" content="Hug ve SQLAlchemy ile Basit API Yapımı" />
<meta property="og:description" content="Selam, Geçenlerde yazı yazdıktan sonra Mirat Can Bayrak dedi ki hug ile ilgili birşeyler yazsana. Meğer kendisi üşenmiş. Neyse hug'a gelelim. Google'da hug diye arattığınızda..." />
<meta property="og:image" content="https://w0.peakpx.com/wallpaper/212/918/HD-wallpaper-virtual-world-sunset-80s-landscape-retro-theme-tron.jpg" />
<link rel="stylesheet" href="theme/style.css">
<link href="https://enesergun.net/feeds/all.atom.xml" type="application/atom+xml" rel="alternate" title="Enes Ergün Atom Feed" />
</head>
<body>
<div class="container">
<header class="blog-header">
<h1><a href="https://enesergun.net" class="glitch glow" data-text="Enes Ergün">Enes Ergün</a></h1>
<p> Chaotic Neutral / ISTP-T - 30 lvl rogue - Cyber Security </p>
<nav>
<a href="https://enesergun.net/">INDEX</a>
<a href="https://enesergun.net/archives">ARCHIVES</a>
<a href="https://enesergun.net/categories">CATEGORIES</a>
</nav>
</header>
<div class="post">
<header>
<h1>Hug ve SQLAlchemy ile Basit API Yapımı</h1>
<p class="date">Written on <time datetime="2017-09-30T00:59:00+03:00">Sep 30, 2017</time></p>
</header>
<article>
<p>Selam,</p>
<p>Geçenlerde yazı yazdıktan sonra <a href="https://twitter.com/miratcanbayrak">Mirat Can Bayrak</a> dedi ki hug ile ilgili birşeyler yazsana. Meğer kendisi üşenmiş. Neyse hug'a gelelim.</p>
<p>Google'da hug diye arattığınızda bulamayabilirsiniz. I need hug.</p>
<p>Hug'a erişmek için:</p>
<p><a href="http://www.hug.rest/">HUG</a> </p>
<h2>Hug Nedir ?</h2>
<p>Hug falcon altyapısını kullanan bir rest api frameworkü. Peki bize ne vaad ediyor bu hug? </p>
<p><img alt="." src="http://pycnic.nullism.com/images/pycnic-bench.png"></p>
<p>Gördüğünüz gibi kendisi falcon,pycnic den sonra 3.sırada gelmekte. Yani bize hız vaad etmektedir. Bundan sonra ki yazıda pycnic üzerine mi olsa acaba? </p>
<h2>Neden Hug ?</h2>
<p>Normalde ben API veya Web Application yazacaksam ( görende çok yazdım sanacak ) genelde bunu Flask ile yazmaktayım. Çünkü Flask de djangoya nazaran daha özgürsünüz ve Django'nun o katı iskelet yapısı vs. yok. Peki Flask yerine neden hug ? Vallahi onu bende bilmiyorum. Ama yazmak hoşuma cidden hoşuma gitti. Çünkü direkt olarak Cli toollar bile yazabiliyorsunuz. Ayrıca Flaskde ki gibi Flask = app() gibi standart sözdizimleri bulunmamakta.</p>
<h2>Hadi Başlayalım</h2>
<p>Peki ne yapacağız hug ile ? Ben gerçekten blog scripti yazmak isterdim fakat gerek yurtdışına çıkmam gerek gevşekliğim sebebiyle geçen hafta açtığım repoya henüz yeni pushladım kodları. Gerisini siz düşünün. O yüzden bende basit bir Kitap-Yazar scripti yapmaya çalıştım.</p>
<p>Evet başlayalım. Öncelikle kodlara ulaşmak için <a href="https://github.com/ka1nsha/hug-api-example">Tıklayınız</a></p>
<h2>Iskelet Yapımız</h2>
<ol>
<li>Main dosyamız</li>
<li>main.py</li>
<li>Modellerimizi yazdığımız bir dosya</li>
<li>models.py</li>
<li>Model Şemalarımızın bir dosyası</li>
<li>schemas.py</li>
</ol>
<p>Burada genelde bütün kodlarımızı main.py içerisinde yazacağız. Models.py ve Schemas.py dosyalarımıza sadece 1 kere dokunacağız daha sonra sabit kalacaklar.</p>
<h2>Modellerimizi Oluşturalım</h2>
<p>Kitap-Yazar projemizde düşündüğümüzde ne gibi modellerimiz olur ? </p>
<ol>
<li>Kitap</li>
<li>Yazar</li>
</ol>
<p>Tabi siz bunları Tür,Yayıncı vs olarak çoğaltabilirsiniz. Amaç mantığı anlamak.</p>
<p>Kodlara geçelim.</p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">sqlalchemy</span> <span class="k">as</span> <span class="nn">sa</span>
<span class="kn">from</span> <span class="nn">sqlalchemy.ext.declarative</span> <span class="kn">import</span> <span class="n">declarative_base</span>
<span class="kn">from</span> <span class="nn">sqlalchemy.orm</span> <span class="kn">import</span> <span class="n">scoped_session</span><span class="p">,</span> <span class="n">sessionmaker</span><span class="p">,</span> <span class="n">relationship</span><span class="p">,</span> <span class="n">backref</span>
<span class="n">engine</span> <span class="o">=</span> <span class="n">sa</span><span class="o">.</span><span class="n">create_engine</span><span class="p">(</span><span class="s1">'sqlite:///db.db'</span><span class="p">)</span>
<span class="n">session</span> <span class="o">=</span> <span class="n">scoped_session</span><span class="p">(</span><span class="n">sessionmaker</span><span class="p">(</span><span class="n">bind</span><span class="o">=</span><span class="n">engine</span><span class="p">))</span>
<span class="n">Base</span> <span class="o">=</span> <span class="n">declarative_base</span><span class="p">()</span>
<span class="k">class</span> <span class="nc">Author</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
<span class="n">__tablename__</span> <span class="o">=</span> <span class="s1">'authors'</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">sa</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">sa</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">name</span> <span class="o">=</span> <span class="n">sa</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">sa</span><span class="o">.</span><span class="n">String</span><span class="p">)</span>
<span class="k">def</span> <span class="fm">__repr__</span><span class="p">(</span><span class="bp">self</span><span class="p">):</span>
<span class="k">return</span> <span class="s1">'<Author(name=</span><span class="si">{self.name!r}</span><span class="s1">)>'</span><span class="o">.</span><span class="n">format</span><span class="p">(</span><span class="bp">self</span><span class="o">=</span><span class="bp">self</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">Book</span><span class="p">(</span><span class="n">Base</span><span class="p">):</span>
<span class="n">__tablename__</span> <span class="o">=</span> <span class="s1">'books'</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">sa</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">sa</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">primary_key</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">title</span> <span class="o">=</span> <span class="n">sa</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">sa</span><span class="o">.</span><span class="n">String</span><span class="p">)</span>
<span class="n">author_id</span> <span class="o">=</span> <span class="n">sa</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">sa</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span> <span class="n">sa</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="s1">'authors.id'</span><span class="p">))</span>
<span class="n">author</span> <span class="o">=</span> <span class="n">relationship</span><span class="p">(</span><span class="s2">"Author"</span><span class="p">,</span> <span class="n">backref</span><span class="o">=</span><span class="n">backref</span><span class="p">(</span><span class="s1">'books'</span><span class="p">))</span>
<span class="n">Base</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">create_all</span><span class="p">(</span><span class="n">engine</span><span class="p">)</span>
</code></pre></div>
<p>Modüllerimizi, fonksiyonlarını impor ettik bu kısmı hızlı geçiyorum.</p>
<p>Şimdi burada engine değişkenine bizim hangi database'i kullanacağımızı belirtmemiz gerekmekte.</p>
<p>Ben burada sqlite belirttim fakat sizler Postgresql gibi bir çok database belirtebilirsiniz. Onlarında connection_uri'leri genelde benzerdir. Mesela postgresql connection_uri:</p>
<div class="highlight"><pre><span></span><code><span class="n">postgresql</span><span class="p">:</span><span class="o">//</span><span class="n">username</span><span class="nd">@password</span><span class="p">:</span><span class="n">db</span>
</code></pre></div>
<p>gibidir. ( Yanlış hatırlamıyorsam. )</p>
<p>session değişkenine orm için kullanacağımız bind'ı koyuyoruz. Neden böyle yapıyoruz bilmiyorum benimde ezberimden gidiyor bu olay. Aynı şekilde base değişkenini de ezberden kullanıyorum.</p>
<h4>Author Modeli</h4>
<p>Burada bir class içerisinde Author modelimizi belirleyip buna argüman olarak Base değişkenini veriyoruz.</p>
<p>Tablename isminden de anlaşılacağı gibi.</p>
<p>id kısmında bunun bir Column olacağını ve Integer tipinde olacağını ve auto_increment olacağını söylüyoruz.( Primary Key )</p>
<p>name sütununda ise bunun bir string sütunu olacağını ve sınırsız oldugunu söylüyoruz. Buraya güvenlik için sa.String(50) yazabilirsiniz.</p>
<h3>Book Modeli</h3>
<p>Burada da yapı yine aynı şekilde fakat en aşağıda author değişkenini görmektesiniz. Burada database motorumuza bunun Foreign key olacağını yani ( Relational ) ilişkisel olacağını söylüyoruz. Bu ilişkisini Author class'ı ile kuruyoruz.</p>
<p>En aşağıda ise tablolarımızı oluşturuyoruz.</p>
<p><img alt="Database yapısı" src="images/databaseyapisi.png"></p>
<h2>Schema Dosyamız</h2>
<p>Burada asıl amacımız bu modeller çağrıldığında modellerin içinde ki tüm alanları şema olarak bize geri döndürmesidir.</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">marshmallow_sqlalchemy</span> <span class="kn">import</span> <span class="n">ModelSchema</span>
<span class="kn">from</span> <span class="nn">models</span> <span class="kn">import</span> <span class="n">Author</span><span class="p">,</span><span class="n">Book</span>
<span class="k">class</span> <span class="nc">BookSchema</span><span class="p">(</span><span class="n">ModelSchema</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">Book</span>
<span class="k">class</span> <span class="nc">AuthorSchema</span><span class="p">(</span><span class="n">ModelSchema</span><span class="p">):</span>
<span class="k">class</span> <span class="nc">Meta</span><span class="p">:</span>
<span class="n">model</span> <span class="o">=</span> <span class="n">Author</span>
</code></pre></div>
<p>Burada iki şemamıza da hangi modeli baz alacağını gösteriyoruz.</p>
<p>Gelelim zurnanın zırt dediği yere.</p>
<h3>Main Dosyamız</h3>
<p>Hemen kodları yapıştırıp açıklamayı kodların üstünde yapacağım.</p>
<div class="highlight"><pre><span></span><code><span class="c1">#-*- coding:utf-8 -*-</span>
<span class="kn">import</span> <span class="nn">sqlalchemy</span> <span class="k">as</span> <span class="nn">sa</span>
<span class="kn">from</span> <span class="nn">sqlalchemy.orm</span> <span class="kn">import</span> <span class="n">sessionmaker</span>
<span class="kn">from</span> <span class="nn">models</span> <span class="kn">import</span> <span class="n">Author</span><span class="p">,</span><span class="n">Book</span><span class="p">,</span><span class="n">Base</span> <span class="c1"># Modellerimizi import ediyoruz.</span>
<span class="kn">from</span> <span class="nn">schemas</span> <span class="kn">import</span> <span class="n">AuthorSchema</span><span class="p">,</span><span class="n">BookSchema</span> <span class="c1">#Şemalarımızı import ediyoruz.</span>
<span class="kn">import</span> <span class="nn">hug</span> <span class="c1"># Hug Olmazsa olmazımız</span>
<span class="kn">from</span> <span class="nn">falcon</span> <span class="kn">import</span> <span class="o">*</span> <span class="c1"># Yıldız ile import etmeyin siz. HTTP Status Codelar için import ettim.</span>
<span class="n">engine</span> <span class="o">=</span> <span class="n">sa</span><span class="o">.</span><span class="n">create_engine</span><span class="p">(</span><span class="s1">'sqlite:///db.db'</span><span class="p">)</span> <span class="c1"># Database Engine belirttik.</span>
<span class="n">Base</span><span class="o">.</span><span class="n">metadata</span><span class="o">.</span><span class="n">bind</span> <span class="o">=</span> <span class="n">engine</span>
<span class="n">DBSession</span> <span class="o">=</span> <span class="n">sessionmaker</span><span class="p">(</span><span class="n">bind</span><span class="o">=</span><span class="n">engine</span><span class="p">)</span>
<span class="n">session</span><span class="o">=</span> <span class="n">DBSession</span><span class="p">()</span>
<span class="nd">@hug</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'/books'</span><span class="p">)</span> <span class="c1"># /books/ adresine get isteği yapıldığında aşağısı çalışsın diyoruz.</span>
<span class="k">def</span> <span class="nf">getbooks</span><span class="p">(</span><span class="n">response</span><span class="p">):</span>
<span class="n">books</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Book</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span> <span class="c1"># ORM olarak bütün Book tablosunu alıyoruz.</span>
<span class="n">bookschema</span> <span class="o">=</span> <span class="n">BookSchema</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span> <span class="c1"># Buradan da Book şemamızı alıyoruz.</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">bookschema</span><span class="o">.</span><span class="n">dump</span><span class="p">(</span><span class="n">books</span><span class="p">)</span><span class="o">.</span><span class="n">data</span> <span class="c1"># Book şemamızı book tablosu ile bağdaştırıp dataları alıyoruz.</span>
<span class="n">response</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">HTTP_404</span> <span class="c1"># 404 Döndürüyoruz. Açıklayacağım.</span>
<span class="k">return</span> <span class="n">data</span> <span class="c1">#Datamızı Döndürüyoruz.</span>
<span class="nd">@hug</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s1">'/books'</span><span class="p">)</span> <span class="c1"># /books/ adresine post isteği yapıldığında aşağısını çalıştır babuş.</span>
<span class="k">def</span> <span class="nf">addbooks</span><span class="p">(</span><span class="n">body</span><span class="p">,</span><span class="n">response</span><span class="p">):</span> <span class="c1"># body isteğin body'sini belirtir.</span>
<span class="n">authorid</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="s1">'author_id'</span><span class="p">]</span> <span class="c1"># body içerisinde ki author_id yi değişkene atadım.</span>
<span class="n">bookname</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="s1">'bookname'</span><span class="p">]</span> <span class="c1"># body içerisinde ki bookname'i değişkene atadım.</span>
<span class="k">try</span><span class="p">:</span>
<span class="n">bookname</span><span class="p">,</span> <span class="n">authorid</span> <span class="o">=</span> <span class="n">bookname</span><span class="o">.</span><span class="n">decode</span><span class="p">(),</span> <span class="n">authorid</span><span class="o">.</span><span class="n">decode</span><span class="p">()</span>
<span class="n">checkauthor</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Author</span><span class="p">)</span><span class="o">.</span><span class="n">filter_by</span><span class="p">(</span><span class="nb">id</span><span class="o">=</span><span class="n">authorid</span><span class="p">)</span><span class="o">.</span><span class="n">first</span><span class="p">()</span> <span class="c1"># gelen id'ye sahip yazar var mı kontrol ediyorum.</span>
<span class="nb">print</span><span class="p">(</span><span class="n">checkauthor</span><span class="p">)</span> <span class="c1"># kontrol için koydum.</span>
<span class="k">if</span> <span class="n">checkauthor</span> <span class="o">==</span> <span class="kc">None</span><span class="p">:</span>
<span class="n">response</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">HTTP_404</span> <span class="c1"># Eğer yazar yoksa 404 döndür diyorum.</span>
<span class="k">return</span> <span class="n">HTTP_404</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">book</span> <span class="o">=</span> <span class="n">Book</span><span class="p">(</span><span class="n">title</span><span class="o">=</span><span class="n">bookname</span><span class="p">,</span><span class="n">author_id</span><span class="o">=</span><span class="n">authorid</span><span class="p">)</span> <span class="c1"># ID'ye ait yazar var ise kitabı oluşturacak olan ORM'yi hazırlıyoruz.</span>
<span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">book</span><span class="p">)</span> <span class="c1"># Bunu session değişkeni ile database e gönderiyoruz.</span>
<span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span> <span class="c1"># Database'e yazıyoruz.</span>
<span class="n">response</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">HTTP_200</span> <span class="c1">#200 döndürüyoruz.</span>
<span class="k">return</span> <span class="n">falcon</span><span class="o">.</span><span class="n">HTTP_200</span> <span class="c1"># response body 200 döndürüyoruz.</span>
<span class="k">except</span> <span class="ne">TypeError</span><span class="p">:</span>
<span class="n">response</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">HTTP_404</span>
<span class="k">return</span> <span class="n">falcon</span><span class="o">.</span><span class="n">HTTP_404</span>
<span class="nd">@hug</span><span class="o">.</span><span class="n">post</span><span class="p">(</span><span class="s1">'/authors'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">addauthors</span><span class="p">(</span><span class="n">body</span><span class="p">,</span><span class="n">response</span><span class="p">):</span>
<span class="n">session</span><span class="o">.</span><span class="n">rollback</span><span class="p">()</span>
<span class="n">author_name</span> <span class="o">=</span> <span class="n">body</span><span class="p">[</span><span class="s1">'author_name'</span><span class="p">]</span>
<span class="n">author</span> <span class="o">=</span> <span class="n">Author</span><span class="p">(</span><span class="n">name</span><span class="o">=</span><span class="n">author_name</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">add</span><span class="p">(</span><span class="n">author</span><span class="p">)</span>
<span class="n">session</span><span class="o">.</span><span class="n">commit</span><span class="p">()</span>
<span class="n">response</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">HTTP_202</span>
<span class="k">return</span> <span class="n">falcon</span><span class="o">.</span><span class="n">HTTP_202</span>
<span class="nd">@hug</span><span class="o">.</span><span class="n">get</span><span class="p">(</span><span class="s1">'/authors'</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">getauthors</span><span class="p">():</span>
<span class="n">authors</span> <span class="o">=</span> <span class="n">session</span><span class="o">.</span><span class="n">query</span><span class="p">(</span><span class="n">Author</span><span class="p">)</span><span class="o">.</span><span class="n">all</span><span class="p">()</span>
<span class="n">authorschema</span> <span class="o">=</span> <span class="n">AuthorSchema</span><span class="p">(</span><span class="n">many</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">authorschema</span><span class="o">.</span><span class="n">dumps</span><span class="p">(</span><span class="n">authors</span><span class="p">)</span><span class="o">.</span><span class="n">data</span>
<span class="k">return</span> <span class="n">data</span>
</code></pre></div>
<p>Gerisini yazmadım zaten gerisi birbirini tekrar ediyor.</p>
<p>Şimdi burada açıklamam gereken şey eğer aşağıda ki gibi yaparsanız.</p>
<div class="highlight"><pre><span></span><code><span class="k">return</span> <span class="n">HTTP_200</span>
</code></pre></div>
<p>return olarak sayfa 200 dönecektir. Ayrıca response body olarak da 200 dönecektir.</p>
<div class="highlight"><pre><span></span><code><span class="k">return</span> <span class="n">HTTP_404</span>
</code></pre></div>
<p>yaptığımızda ise response body olarak 404 dönecek fakat istek 200 dönecektir. Gerçekte böyle birşey görürseniz ne olur ? WTF bu developer kafayı yemiş dersiniz.</p>
<p>İşte o yüzden bazı route'larda response.status olarak HTTP status code'unu değiştirdim ki yukarıda ki gibi bir durum olmasın diye.</p>
<p><img alt="404dondurdum" src="images/404dondurdum.png"></p>
<div class="highlight"><pre><span></span><code><span class="n">response</span><span class="o">.</span><span class="n">status</span> <span class="o">=</span> <span class="n">HTTP_404</span> <span class="c1"># 404 Döndürüyoruz. Açıklayacağım.</span>
<span class="k">return</span> <span class="n">data</span> <span class="c1">#Datamızı Döndürüyoruz.</span>
</code></pre></div>
<p>Bilerek gözünüze takılsın diye böyle yazdım yani.</p>
<p>Evet şimdi istek yapalım.</p>
<p><img alt="getistek" src="images/jsonreturn.png"></p>
<p>Tataa direk olarak Şemalarımız sayesinde bize geri dönen veri JSON olarak geri döndü.</p>
<p>İşin özetine gelirsek aslında yapacağınız uygulamalar bundan da farklı değil. Biraz daha database işlemleri karmaşıklaşıyor vs.vs</p>
<p>Neyse basit bir şekilde API yapımı bu kadar.</p>
<p>Teşekkürler okuduğunuz için.</p>
<p><img alt="nicecommit" src="images/commitebak.png"></p>
</article>
<footer>
<p>This entry is posted in <a href="https://enesergun.net/category/python.html">python</a>.</p>
</footer>
<div class="comments">
<div id="disqus_thread"></div>
<script type="text/javascript">
var disqus_shortname = '0x656e';
(function() {
var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
(document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
})();
</script>
<noscript>Please enable JavaScript to view the <a href="http://disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript>
<a href="http://disqus.com" class="dsq-brlink">comments powered by <span class="logo-disqus">Disqus</span></a>
</div>
</div>
<footer class="blog-footer">
<ul class="nav">
<li><a href="https://devilinside.me/"> Eşelyon</a></li>
<li><a href="https://medium.com/@brkalbyrk"> Berk Albayrak</a></li>
<li><a href="https://ahmtglr.wordpress.com/"> Ahmet Güler</a></li>
<li><a href="https://kaganisildak.com/"> Kağan Işıldak</a></li>
<li><a href="https://eybisi.run/"> Eybisi</a></li>
<li><a href="https://onur.im/"> Onur Aslan</a></li>
<li><a href="https://canyoupwn.me/"> Canyoupwn.me</a></li>
<li><a href="https://www.oguzozkeroglu.com"> Oğuz Özkeroğlu</a></li>
<li><a href="https://aligoren.com"> Ali Gören</a></li>
<li><a href="https://0xf61.gitlab.io/"> Emir Kurt</a></li>
<br>
<li><a href="www.twitter.com/eness_ergun">Twitter</a></li>
<li><a href="[email protected]">Mail</a></li>
</ul>
<p class="disclaimer">
Built with <a href="http://getpelican.com">Pelican</a>, and <a href="https://github.com/ka1nsha/MBPelican">MB Pelican</a> theme.
</p>
</footer>
</div>
</body>
</html>