-
Notifications
You must be signed in to change notification settings - Fork 0
/
flask-events-app.html
178 lines (145 loc) · 17.5 KB
/
flask-events-app.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
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="utf-8">
<title> Flask ile Adım Adım Etkinlik Uygulaması Yapalı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="Selamlar arkadaşlar, birkaç yazı yazmak istedim hem bu arada belki bazı arkadaşların isteklerini de yerine getirmiş olurum. Amacım bu yazı serisinde Flask ile basit bir etkinlik uygulaması yapmak. Bunun için adım adım gideceğim, yazı serisinin en sonunda Bootstrap ile bir arayüz yazacağız. Sanırım en uzun yazımız da bu olacak. Neyse …" />
<meta name="keywords" content="flask event app, flask sqlalchemy, sqlalchemy, flask mvc, flask">
<meta property="article:tag" content="flask event app" />
<meta property="article:tag" content="flask sqlalchemy" />
<meta property="article:tag" content="sqlalchemy" />
<meta property="article:tag" content="flask mvc" />
<meta property="article:tag" content="flask" />
<link rel="canonical" href="https://enesergun.net/flask-events-app.html"/>
<meta name="description" content=""/>
<!-- og definitions -->
<meta property="og:type" content="article" />
<meta property="og:url" content="https://enesergun.net/flask-events-app.html" />
<meta property="og:title" content="Flask ile Adım Adım Etkinlik Uygulaması Yapalım" />
<meta property="og:description" content="Selamlar arkadaşlar, birkaç yazı yazmak istedim hem bu arada belki bazı arkadaşların isteklerini de yerine getirmiş olurum. Amacım bu yazı serisinde Flask ile basit bir etkinlik uygulaması..." />
<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>Flask ile Adım Adım Etkinlik Uygulaması Yapalım</h1>
<p class="date">Written on <time datetime="2018-02-13T22:19:00+03:00">Feb 13, 2018</time></p>
</header>
<article>
<p>Selamlar arkadaşlar, birkaç yazı yazmak istedim hem bu arada belki bazı arkadaşların isteklerini de yerine getirmiş olurum. Amacım bu yazı serisinde Flask ile basit bir etkinlik uygulaması yapmak. Bunun için adım adım gideceğim, yazı serisinin en sonunda Bootstrap ile bir arayüz yazacağız. Sanırım en uzun yazımız da bu olacak. Neyse bu yazımızda database üzerinde modelleri oluşturacağız. Elimden geldiğince açıklayıcı olmaya çalıştım iyi okumalar dilerim.</p>
<h3>Flask Nedir?</h3>
<p>Flask bir hayat biçi.... :)</p>
<p>Flask bir Python frameworküdür. Tabi genelde en fazla Django bilinir. Django gerçekten her şeyiyle tam bir web frameworkdür fakat bazen bazı işleriniz için daha minimal frameworkler isteyebilirsiniz işte bu gibi durumlar için micro frameworkler ortaya çıkmaktadır. Flask ise micro frameworkdür. Hızlıca kod yazarak prototipleme yapabilirsiniz üstelik bunları MVC yazılım mimarisi ile yapabiliyorsunuz. Flask'i kurmak için</p>
<p>terminalinize:</p>
<div class="highlight"><pre><span></span><code>pip install flask
</code></pre></div>
<p>yazmanız yeterlidir. Ben bu yazıda ve projede SQLite kullanacağım. Siz dilerseniz PostgreSQL veya başka bir DBMS kullanabilirsiniz. Tabi ki SQLite ile birlikte SQLAlchemy kullanmaktan da çekinmeyeceğim. Ben aşağıda ki gibi bir database şeması düşündüm.</p>
<p><img alt="" src="images/dbschema.png"></p>
<h3>Let's go</h3>
<p>Proje klasörünüzü oluşturduğunuzu varsayıyorum. Proje klasörünü oluşturduktan sonra modelleri yazacağımız bir models.py dosyası oluşturalım. Routingleri main.py dosyasında yapacağız.</p>
<p>models.py:</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">flask</span> <span class="kn">import</span> <span class="n">Flask</span>
<span class="kn">from</span> <span class="nn">flask_sqlalchemy</span> <span class="kn">import</span> <span class="n">SQLAlchemy</span>
<span class="n">app</span> <span class="o">=</span> <span class="n">Flask</span><span class="p">(</span><span class="vm">__name__</span><span class="p">)</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SQLALCHEMY_DATABASE_URI'</span><span class="p">]</span> <span class="o">=</span> <span class="s2">"sqlite:///events.db"</span>
<span class="n">app</span><span class="o">.</span><span class="n">config</span><span class="p">[</span><span class="s1">'SQLALCHEMY_TRACK_MODIFICATIONS"] = False</span>
<span class="n">db</span> <span class="o">=</span> <span class="n">SQLAlchemy</span><span class="p">(</span><span class="n">app</span><span class="p">)</span>
</code></pre></div>
<p>Şimdi burada ne yaptığımızı anlatayım. Python dosyamıza Flask modülünü kullanacağımızı söyleyerek import ettik. Daha sonra SQLALchemy'i kullanabilmek için Flask_SQLAlchemy modülünü de import ettik. Burada ben direkt olarak pure SQLAlchemy kullanmadım, flask için yazılmış olanını kullandım. Eğer direkt pure SQLAlchemy kullansaydım database kısmında declarative_base ve session fonksiyonlarını kullanmak zorunda kalacaktım. Bu şekilde bana daha kolay geliyor.</p>
<p>App değişkeninde Flask ile bir uygulama başlatıyoruz ve bu Flask uygulamasının adını <strong>name</strong> veriyoruz. <strong>app.config</strong> kısmında ise <em>SQLALCHEMY_DATABASE_URI</em> kısmında database'imizin <strong>connection_uri</strong> 'sini yazıyoruz. Bu DBMS'inize göre değişmektedir. PostgreSQL için örn: </p>
<div class="highlight"><pre><span></span><code><span class="n">postgresql</span><span class="p">:</span><span class="o">//</span><span class="n">kullaniciadi</span><span class="p">:</span><span class="n">password</span><span class="nd">@ip</span><span class="p">:</span><span class="n">port</span><span class="o">/</span><span class="n">databasename</span>
</code></pre></div>
<p>Aşağıda da değişikliklerin takip edilmesini False olarak veriyoruz.</p>
<h3>Hadi artık modellerimizi yazalım</h3>
<p>Burada direk olarak kodları aşağıya koyacağım, kod bloğunun altına ise açıklamalarını gireceğim.</p>
<div class="highlight"><pre><span></span><code><span class="k">class</span> <span class="nc">events</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</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">event_name</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Text</span><span class="p">(</span><span class="mi">50</span><span class="p">),</span><span class="n">nullable</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">slug</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span><span class="n">nullable</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">organizator</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span><span class="n">db</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="s1">'organization.id'</span><span class="p">))</span>
<span class="k">class</span> <span class="nc">organization</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</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">organization_name</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Text</span><span class="p">(</span><span class="mi">50</span><span class="p">),</span><span class="n">nullable</span><span class="o">=</span><span class="kc">False</span><span class="p">,</span><span class="n">unique</span><span class="o">=</span><span class="kc">True</span><span class="p">)</span>
<span class="n">organization_desc</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Text</span><span class="p">(</span><span class="mi">500</span><span class="p">),</span><span class="n">nullable</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">organization_img</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Text</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">users</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</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">usermail</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span><span class="n">unique</span><span class="o">=</span><span class="kc">True</span><span class="p">,</span><span class="n">nullable</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="n">password</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Text</span><span class="p">,</span><span class="n">nullable</span><span class="o">=</span><span class="kc">False</span><span class="p">)</span>
<span class="k">class</span> <span class="nc">eventspeople</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Model</span><span class="p">):</span>
<span class="nb">id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</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">event_id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span><span class="n">db</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="s1">'events.id'</span><span class="p">))</span>
<span class="n">users_id</span> <span class="o">=</span> <span class="n">db</span><span class="o">.</span><span class="n">Column</span><span class="p">(</span><span class="n">db</span><span class="o">.</span><span class="n">Integer</span><span class="p">,</span><span class="n">db</span><span class="o">.</span><span class="n">ForeignKey</span><span class="p">(</span><span class="s1">'users.id'</span><span class="p">))</span>
</code></pre></div>
<p>Kod bloğunda ki her class database üzerinde bir tablodur ve Flask üzerinde her biri bir Modeldir. Hepsinin zaten database modeli olduğunu class tanımlarken belirttik.</p>
<p>Burada özel değerler göreceksiniz. Bunlar:</p>
<p><strong>primary_key</strong> : Database'e eklenen her öğenin bir ID'ye sahip olmasını ve bu ID'nın unique(eşsiz) olmasını sağlar. Otomatik artan bir biçimdedir. Otomatik artmanın terimsel ismi <em>Auto increment</em>' dır. </p>
<p><strong>nullable</strong>: Burada False verilmiş bu değer, veri eklerken buranın asla boş olamayağını belirtir. Kişiyi buna zorlar.</p>
<p><strong>unique</strong>: Bu değerimiz ise alacağı değeri database içerisinde arar eğer var ise bu kayıt işlemini kabul etmez. Yani kayıt edilecek her şeyin eşsiz olmasını ister. Bknz: Kullanıcı Adları, Emailler.</p>
<p><strong>db.Column</strong>: Bu fonksiyonun aldığı değerlerin bir sütun olduğunu gösteriyor. </p>
<p><strong>db.Integer</strong>: Bu fonksiyon ise bu sütunun değerlerinin sadece Integer yani sayma sayısı olacağını söylüyor.</p>
<p><strong>db.Text(500)</strong>: Bu fonksiyon ise bu sütunun değerlerinin text olacağını ( aslında herşeyi kabul edebileceğini ) gösteriyor. Yanına yazılan 500 rakamı ise o sütunun maksimum değerinin 500 olabileceğini belirtir.</p>
<p><strong>db.ForeignKey()</strong> : Bu fonksiyon aslında tablolar arası ilişki kurmaya yarar terimsel anlamı Relationdır. Bir çok türü vardır. Bunlardan bir kaçı : Foreign Key, ManyToMany, OneToMany . Bu sütuna gelecek değerin aslında diğer bir tabloda ki başka bir veriyi işaret ettiğini belirtir.</p>
<p>Sanırım bu kodda açıklayabileceklerim bu kadar, şimdi sıra geldi database'i oluşturmaya. Kodumuzun en altına </p>
<div class="highlight"><pre><span></span><code><span class="n">db</span><span class="o">.</span><span class="n">create_all</span><span class="p">()</span>
</code></pre></div>
<p>yazarak kodu çalıştırırsanız artık database'iniz oluşturulacak ve işlem yapmaya hazır hale gelecektir.</p>
<p><img alt="" src="images/database.png"></p>
</article>
<footer>
<p>This entry is posted in <a href="https://enesergun.net/category/flask.html">flask</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>