Flask ile Web Uygulamaları Geliştirme Rehberi
Bu makalede, Python’ın popüler mikro web çerçevesi Flask’ı kullanarak web uygulamaları oluşturmayı adım adım öğreneceğiz. Flask, basitliği ve esnekliği ile bilinir, bu da onu hem yeni başlayanlar hem de deneyimli geliştiriciler için mükemmel bir seçim yapar. Bu rehberde, Flask’ın temellerini, kurulumunu, temel kavramlarını ve gerçek dünya uygulamalarını kapsayacağız.
İçindekiler
- Flask Nedir?
- Flask Kurulumu
- Temel Kavramlar
- Route Tanımlama
- Template Motoru (Jinja2)
- Form İşlemleri
- Veritabanı Entegrasyonu
- Hata Yönetimi
- Büyük Uygulamalar İçin Flask
- Örnek Uygulama
- Sonuç
Flask Nedir?
Flask, Armin Ronacher tarafından geliştirilen ve BSD lisansı altında dağıtılan bir Python mikro web çerçevesidir. ‘Mikro’ terimi, Flask’ın temel işlevselliği sağladığı ve ek özellikler için uzantılara güvendiği anlamına gelir. Bu yaklaşım, geliştiricilere uygulamalarının gereksinimlerine en uygun bileşenleri seçme özgürlüğü sunar. Flask, Werkzeug WSGI araç seti ve Jinja2 template motoru üzerine inşa edilmiştir.
Flask Kurulumu
Flask’ı kurmak için Python ve pip’in (Python paket yöneticisi) sisteminizde yüklü olması gerekir. Ardından, aşağıdaki komutu kullanarak Flask’ı kolayca kurabilirsiniz:
pip install Flask
Bu komut, Flask ve bağımlılıklarını otomatik olarak yükleyecektir. Kurulum tamamlandıktan sonra, Flask’ı kullanmaya başlayabilirsiniz.
Temel Kavramlar
Flask ile web uygulamaları geliştirmeye başlamadan önce, bazı temel kavramları anlamak önemlidir. Bunlar şunlardır:
- Route: Bir URL’nin hangi fonksiyon tarafından işleneceğini tanımlar.
- View Fonksiyonu: Bir isteği işleyen ve bir yanıt döndüren fonksiyondur.
- Template: HTML, CSS ve JavaScript gibi statik dosyaların dinamik içerikle birleştirildiği şablonlardır.
- Request: Kullanıcının sunucuya gönderdiği istektir (örneğin, bir web sayfasını görüntülemek için yapılan istek).
- Response: Sunucunun kullanıcıya gönderdiği yanıttır (örneğin, bir HTML sayfası).
Route Tanımlama
Flask’ta route’lar, @app.route()
dekoratörü kullanılarak tanımlanır. Bu dekoratör, bir URL’yi bir view fonksiyonu ile ilişkilendirir. Örneğin:
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Merhaba Dünya!'
if __name__ == '__main__':
app.run(debug=True)
Bu kod, /
URL’sini hello_world()
fonksiyonu ile ilişkilendirir. Bu fonksiyon, ‘Merhaba Dünya!’ metnini döndürür. app.run(debug=True)
satırı, uygulamayı geliştirme modunda başlatır.
Template Motoru (Jinja2)
Flask, Jinja2 template motorunu varsayılan olarak kullanır. Jinja2, dinamik içerik oluşturmak için HTML şablonlarına değişkenler ve kontrol yapıları eklemenize olanak tanır. Örneğin:
from flask import Flask, render_template
app = Flask(__name__)
@app.route('/merhaba/')
def merhaba(isim):
return render_template('merhaba.html', isim=isim)
if __name__ == '__main__':
app.run(debug=True)
Bu kod, /merhaba/<isim>
URL’sini merhaba()
fonksiyonu ile ilişkilendirir. Bu fonksiyon, merhaba.html
şablonunu kullanarak dinamik bir sayfa oluşturur. merhaba.html
dosyası şu şekilde olabilir:
<!DOCTYPE html>
<html>
<head>
<title>Merhaba</title>
</head>
<body>
<h1>Merhaba, {{ isim }}!</h1>
</body>
</html>
{{ isim }}
, Jinja2 tarafından merhaba()
fonksiyonundan geçirilen isim
değişkeni ile değiştirilecektir.
Form İşlemleri
Flask, kullanıcıdan veri almak için formları kolayca işlemenize olanak tanır. Formları oluşturmak ve işlemek için Flask-WTF gibi uzantıları kullanabilirsiniz. İşte basit bir form örneği:
from flask import Flask, render_template, request, flash
from flask_wtf import FlaskForm
from wtforms import StringField, SubmitField
from wtforms.validators import DataRequired
app = Flask(__name__)
app.config['SECRET_KEY'] = 'gizli_anahtar'
class IsimForm(FlaskForm):
isim = StringField('İsminiz:', validators=[DataRequired()])
gonder = SubmitField('Gönder')
@app.route('/', methods=['GET', 'POST'])
def index():
isim = None
form = IsimForm()
if form.validate_on_submit():
isim = form.isim.data
form.isim.data = ''
flash('Form başarıyla gönderildi!')
return render_template('index.html', form=form, isim=isim)
if __name__ == '__main__':
app.run(debug=True)
Bu kod, bir isim alanına sahip bir form oluşturur ve kullanıcıdan alınan ismi index.html
şablonuna gönderir. index.html
dosyası şu şekilde olabilir:
<!DOCTYPE html>
<html>
<head>
<title>Flask Formu</title>
</head>
<body>
<h1>Flask Formu Örneği</h1>
<form method="post">
{{ form.hidden_tag() }}
{{ form.isim.label }} {{ form.isim() }}
{{ form.gonder() }}
</form>
{% if isim %}
<p>Merhaba, {{ isim }}!</p>
{% endif %}
{% with messages = get_flashed_messages() %}
{% if messages %}
<ul class=flashes>
{% for message in messages %}
<li>{{ message }}</li>
{% endfor %}
</ul>
{% endif %}
{% endwith %}
</body>
</html>
Veritabanı Entegrasyonu
Flask, SQLAlchemy gibi ORM (Object-Relational Mapper) kütüphaneleri ile kolayca entegre edilebilir. SQLAlchemy, veritabanı işlemlerini daha kolay ve güvenli hale getirir. İşte SQLAlchemy ile basit bir veritabanı entegrasyonu örneği:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///veritabani.db'
db = SQLAlchemy(app)
class Kullanici(db.Model):
id = db.Column(db.Integer, primary_key=True)
isim = db.Column(db.String(80), unique=True, nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
def __repr__(self):
return '<Kullanici %r>' % self.isim
with app.app_context():
db.create_all()
if __name__ == '__main__':
app.run(debug=True)
Bu kod, bir SQLite veritabanı oluşturur ve Kullanici
adında bir tablo tanımlar. db.create_all()
fonksiyonu, veritabanını ve tabloları oluşturur.
Hata Yönetimi
Flask, hataları yönetmek için çeşitli mekanizmalar sunar. Örneğin, @app.errorhandler()
dekoratörü ile özel hata sayfaları oluşturabilirsiniz:
from flask import Flask, render_template
app = Flask(__name__)
@app.errorhandler(404)
def sayfa_bulunamadi(e):
return render_template('404.html'), 404
if __name__ == '__main__':
app.run(debug=True)
Bu kod, 404 hatası (Sayfa Bulunamadı) için özel bir hata sayfası tanımlar. 404.html
dosyası, hata mesajını ve diğer bilgileri içerebilir.
Büyük Uygulamalar İçin Flask
Flask, büyük ve karmaşık uygulamalar için de uygundur. Büyük uygulamaları yönetmek için modüler bir yapı kullanabilirsiniz. Bu, uygulamanızı daha küçük, yönetilebilir parçalara ayırmanıza olanak tanır. Flask’ta blueprint’ler (taslaklar), modüler uygulamalar oluşturmanıza yardımcı olur.
Örnek Uygulama
Bu bölümde, öğrendiğimiz kavramları kullanarak basit bir blog uygulaması oluşturacağız. Bu uygulama, kullanıcıların makaleler oluşturmasına, düzenlemesine ve görüntülemesine olanak tanır.
Bu uygulama için gerekli dosyalar şunlardır:
app.py
: Uygulama mantığını içerir.templates/
: HTML şablonlarını içerir.static/
: CSS, JavaScript ve resimler gibi statik dosyaları içerir.
app.py
dosyası şu şekilde olabilir:
from flask import Flask, render_template, request, redirect, url_for
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///blog.db'
db = SQLAlchemy(app)
class Makale(db.Model):
id = db.Column(db.Integer, primary_key=True)
baslik = db.Column(db.String(100), nullable=False)
icerik = db.Column(db.Text, nullable=False)
def __repr__(self):
return '<Makale %r>' % self.baslik
with app.app_context():
db.create_all()
@app.route('/')
def index():
makaleler = Makale.query.all()
return render_template('index.html', makaleler=makaleler)
@app.route('/makale/ekle', methods=['GET', 'POST'])
def makale_ekle():
if request.method == 'POST':
baslik = request.form['baslik']
icerik = request.form['icerik']
yeni_makale = Makale(baslik=baslik, icerik=icerik)
db.session.add(yeni_makale)
db.session.commit()
return redirect(url_for('index'))
return render_template('makale_ekle.html')
if __name__ == '__main__':
app.run(debug=True)
templates/index.html
dosyası şu şekilde olabilir:
<!DOCTYPE html>
<html>
<head>
<title>Blog Uygulaması</title>
</head>
<body>
<h1>Blog Makaleleri</h1>
<a href="{{ url_for('makale_ekle') }}">Yeni Makale Ekle</a>
<ul>
{% for makale in makaleler %}
<li><h2>{{ makale.baslik }}</h2><p>{{ makale.icerik }}</p></li>
{% endfor %}
</ul>
</body>
</html>
templates/makale_ekle.html
dosyası şu şekilde olabilir:
<!DOCTYPE html>
<html>
<head>
<title>Makale Ekle</title>
</head>
<body>
<h1>Yeni Makale Ekle</h1>
<form method="post">
<label for="baslik">Başlık:</label><br>
<input type="text" id="baslik" name="baslik"><br><br>
<label for="icerik">İçerik:</label><br>
<textarea id="icerik" name="icerik" rows="4" cols="50"></textarea><br><br>
<input type="submit" value="Kaydet">
</form>
</body>
</html>
Sonuç
Bu makalede, Flask mikro web çerçevesini kullanarak web uygulamaları oluşturmanın temellerini öğrendik. Flask’ın basitliği ve esnekliği, onu web geliştirme projeleriniz için mükemmel bir seçim yapar. Bu rehberde öğrendiğiniz bilgilerle, kendi Flask uygulamalarınızı geliştirmeye başlayabilirsiniz. Unutmayın, sürekli pratik yapmak ve farklı projelerde Flask’ı kullanmak, becerilerinizi geliştirmenin en iyi yoludur.