logo
eng-flag

Flask Notları ve İpuçları

İçindekiler

  1. Kurulum ve Ayarlar
  2. Temel Uygulama Yapısı
  3. Yönlendirme
  4. İstek İşleme
  5. Şablonlar
  6. Formlar
  7. Veritabanı Entegrasyonu
  8. Kimlik Doğrulama
  9. Hata Yönetimi
  10. Yapılandırma
  11. Blueprint'ler
  12. RESTful API'ler
  13. Test Etme
  14. Dağıtım

Kurulum ve Ayarlar

Flask'ı Yükleme

pip install flask

Yeni bir Flask uygulaması oluşturma

from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Merhaba, Dünya!'

if __name__ == '__main__':
    app.run(debug=True)

Uygulamayı çalıştırma

python app.py

Temel Uygulama Yapısı

Minimal Flask uygulaması

from flask import Flask

app = Flask(__name__)

@app.route('/')
def index():
    return 'Ana Sayfa'

@app.route('/merhaba')
def hello():
    return 'Merhaba, Dünya'

if __name__ == '__main__':
    app.run(debug=True)

Yönlendirme

Temel yönlendirme

@app.route('/')
def index():
    return 'Ana Sayfa'

@app.route('/merhaba')
def hello():
    return 'Merhaba, Dünya'

Dinamik yönlendirme

@app.route('/kullanici/<username>')
def show_user_profile(username):
    return f'Kullanıcı {username}'

@app.route('/gonderi/<int:post_id>')
def show_post(post_id):
    return f'Gönderi {post_id}'

HTTP metodları

from flask import request

@app.route('/giris', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        return do_the_login()
    else:
        return show_login_form()

İstek İşleme

İstek verilerine erişim

from flask import request

@app.route('/giris', methods=['POST'])
def login():
    username = request.form['username']
    password = request.form['password']
    # Giriş işlemini gerçekleştir

Dosya yüklemeleri

from flask import request

@app.route('/yukle', methods=['POST'])
def upload_file():
    if 'file' not in request.files:
        return 'Dosya kısmı yok'
    file = request.files['file']
    if file.filename == '':
        return 'Seçili dosya yok'
    if file:
        file.save('/path/to/uploads/' + file.filename)
        return 'Dosya başarıyla yüklendi'

Şablonlar

Şablonları işleme

from flask import render_template

@app.route('/merhaba/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

Şablon sözdizimi (hello.html)

<!doctype html>
<title>Flask'tan Merhaba</title>
{% if name %}
  <h1>Merhaba {{ name }}!</h1>
{% else %}
  <h1>Merhaba, Dünya!</h1>
{% endif %}

Şablon kalıtımı

<!-- base.html -->
<!doctype html>
<html>
  <head>
    {% block head %}
    <title>{% block title %}{% endblock %} - Benim Web Sitem</title>
    {% endblock %}
  </head>
  <body>
    <div id="content">{% block content %}{% endblock %}</div>
  </body>
</html>

<!-- child.html -->
{% extends "base.html" %}
{% block title %}Ana Sayfa{% endblock %}
{% block content %}
  <h1>Ana Sayfa</h1>
  <p>Web siteme hoş geldiniz.</p>
{% endblock %}

Formlar

Flask-WTF kullanarak formlar

from flask_wtf import FlaskForm
from wtforms import StringField, PasswordField, SubmitField
from wtforms.validators import DataRequired, Email

class LoginForm(FlaskForm):
    email = StringField('E-posta', validators=[DataRequired(), Email()])
    password = PasswordField('Şifre', validators=[DataRequired()])
    submit = SubmitField('Giriş Yap')

@app.route('/giris', methods=['GET', 'POST'])
def login():
    form = LoginForm()
    if form.validate_on_submit():
        # Giriş işlemini gerçekleştir
        return 'Başarıyla giriş yapıldı'
    return render_template('login.html', form=form)

Veritabanı Entegrasyonu

Flask-SQLAlchemy kullanımı

from flask_sqlalchemy import SQLAlchemy

app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db'
db = SQLAlchemy(app)

class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(80), unique=True, nullable=False)
    email = db.Column(db.String(120), unique=True, nullable=False)

    def __repr__(self):
        return f'<User {self.username}>'

# Tabloları oluştur
db.create_all()

# Yeni kullanıcı ekle
@app.route('/kullanici_ekle/<username>/<email>')
def add_user(username, email):
    user = User(username=username, email=email)
    db.session.add(user)
    db.session.commit()
    return f'{username} kullanıcısı veritabanına eklendi'

Kimlik Doğrulama

Flask-Login kullanımı

from flask_login import LoginManager, UserMixin, login_user, login_required, logout_user, current_user

login_manager = LoginManager()
login_manager.init_app(app)

class User(UserMixin, db.Model):
    # ... (User model tanımı)

@login_manager.user_loader
def load_user(user_id):
    return User.query.get(int(user_id))

@app.route('/giris', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        user = User.query.filter_by(username=request.form['username']).first()
        if user and user.check_password(request.form['password']):
            login_user(user)
            return 'Başarıyla giriş yapıldı'
    return render_template('login.html')

@app.route('/cikis')
@login_required
def logout():
    logout_user()
    return 'Başarıyla çıkış yapıldı'

@app.route('/korunmus')
@login_required
def protected():
    return f'Merhaba, {current_user.username}!'

Hata Yönetimi

Özel hata sayfaları

@app.errorhandler(404)
def page_not_found(error):
    return render_template('404.html'), 404

@app.errorhandler(500)
def internal_server_error(error):
    return render_template('500.html'), 500

Yapılandırma

Yapılandırma işleme

# config.py
class Config:
    DEBUG = False
    TESTING = False
    DATABASE_URI = 'sqlite:///:memory:'

class ProductionConfig(Config):
    DATABASE_URI = 'mysql://user@localhost/foo'

class DevelopmentConfig(Config):
    DEBUG = True

# app.py
app.config.from_object('config.DevelopmentConfig')

Blueprint'ler

Modüler uygulamalar için blueprint kullanımı

from flask import Blueprint, render_template

admin = Blueprint('admin', __name__, url_prefix='/admin')

@admin.route('/')
def admin_index():
    return 'Yönetici Ana Sayfası'

@admin.route('/kullanicilar')
def users():
    return 'Yönetici Kullanıcılar Sayfası'

# Ana app.py dosyanızda
from admin_blueprint import admin
app.register_blueprint(admin)

RESTful API'ler

Basit bir REST API oluşturma

from flask import jsonify, request

@app.route('/api/kullanicilar', methods=['GET'])
def get_users():
    users = User.query.all()
    return jsonify([user.to_dict() for user in users])

@app.route('/api/kullanicilar', methods=['POST'])
def create_user():
    data = request.get_json()
    new_user = User(username=data['username'], email=data['email'])
    db.session.add(new_user)
    db.session.commit()
    return jsonify(new_user.to_dict()), 201

Test Etme

Flask uygulamaları için test yazma

import unittest
from app import app, db

class FlaskTestCase(unittest.TestCase):
    def setUp(self):
        app.config['TESTING'] = True
        app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///:memory:'
        self.app = app.test_client()
        db.create_all()

    def tearDown(self):
        db.session.remove()
        db.drop_all()

    def test_index(self):
        response = self.app.get('/')
        self.assertEqual(response.status_code, 200)
        self.assertIn(b'Merhaba, Dünya!', response.data)

if __name__ == '__main__':
    unittest.main()

Dağıtım

Üretime hazırlık

from werkzeug.middleware.proxy_fix import ProxyFix

app.wsgi_app = ProxyFix(app.wsgi_app)

if __name__ == '__main__':
    app.run()

Üretim için Gunicorn kullanımı

gunicorn -w 4 -b 127.0.0.1:5000 app:app

2024 © Tüm hakları saklıdır - buraxta.com