Python ile Slug Oluşturma: Django, Flask ve Vanilla Python Rehberi

Python'da URL slug oluşturmanın tüm yöntemlerini öğrenin. Django slugify, python-slugify kütüphanesi ve özel fonksiyonlarla SEO dostu URL'ler oluşturun.

Python'da Slug Nedir ve Neden Önemlidir?

Slug, bir URL'nin okunabilir ve SEO dostu kısmıdır. Python'da slug oluşturmak, web uygulamalarınızın arama motoru optimizasyonu için kritik öneme sahiptir.

Yöntem 1: Vanilla Python ile Slug Oluşturma

Herhangi bir kütüphane kullanmadan temel slug fonksiyonu:

import re
import unicodedata

def slugify(text):
    # Unicode karakterleri ASCII'ye dönüştür
    text = unicodedata.normalize('NFKD', text)
    text = text.encode('ascii', 'ignore').decode('ascii')
    
    # Küçük harfe çevir
    text = text.lower()
    
    # Alfanümerik olmayan karakterleri tire ile değiştir
    text = re.sub(r'[^a-z0-9]+', '-', text)
    
    # Baş ve sondaki tireleri kaldır
    text = text.strip('-')
    
    # Birden fazla tireyi tek tireye indir
    text = re.sub(r'-+', '-', text)
    
    return text

# Kullanım
print(slugify("Merhaba Dünya! Bu bir test."))
# Çıktı: merhaba-dunya-bu-bir-test

Yöntem 2: python-slugify Kütüphanesi

En popüler slug kütüphanesi olan python-slugify'ı kullanmak:

# Kurulum
pip install python-slugify

# Kullanım
from slugify import slugify

# Temel kullanım
slug = slugify("Merhaba Dünya!")
print(slug)  # merhaba-dunya

# Türkçe karakterler için
slug = slugify("Şeker Ördek Çığlık")
print(slug)  # seker-ordek-ciglik

# Maksimum uzunluk belirleme
slug = slugify("Bu çok uzun bir başlık olabilir", max_length=20)
print(slug)  # bu-cok-uzun-bir

# Kelime sınırında kesme
slug = slugify("Bu çok uzun bir başlık", max_length=15, word_boundary=True)
print(slug)  # bu-cok-uzun

Yöntem 3: Django'nun Yerleşik slugify Fonksiyonu

Django projelerinde yerleşik slugify kullanımı:

from django.utils.text import slugify

# Temel kullanım
slug = slugify("Hello World")
print(slug)  # hello-world

# Unicode desteği ile
slug = slugify("Привет мир", allow_unicode=True)
print(slug)  # привет-мир

# Model'de otomatik slug oluşturma
from django.db import models
from django.utils.text import slugify

class BlogPost(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200, unique=True, blank=True)
    
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = slugify(self.title)
        super().save(*args, **kwargs)

Yöntem 4: Flask Uygulamalarında Slug

Flask projelerinde slug oluşturma:

from flask import Flask
from slugify import slugify
from werkzeug.utils import secure_filename

app = Flask(__name__)

def generate_slug(title):
    return slugify(title, max_length=60)

# URL route'unda kullanım
@app.route('/blog/')
def blog_post(slug):
    post = Post.query.filter_by(slug=slug).first_or_404()
    return render_template('post.html', post=post)

# SQLAlchemy model'i
from flask_sqlalchemy import SQLAlchemy

db = SQLAlchemy(app)

class Post(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    title = db.Column(db.String(200))
    slug = db.Column(db.String(200), unique=True)
    
    def __init__(self, title):
        self.title = title
        self.slug = generate_slug(title)

Türkçe Karakterler İçin Özel Çözüm

Türkçe karakterleri doğru şekilde dönüştüren fonksiyon:

def turkish_slugify(text):
    # Türkçe karakter dönüşüm tablosu
    tr_map = {
        'ş': 's', 'Ş': 's',
        'ğ': 'g', 'Ğ': 'g',
        'ü': 'u', 'Ü': 'u',
        'ö': 'o', 'Ö': 'o',
        'ı': 'i', 'İ': 'i',
        'ç': 'c', 'Ç': 'c'
    }
    
    # Türkçe karakterleri dönüştür
    for tr_char, en_char in tr_map.items():
        text = text.replace(tr_char, en_char)
    
    # Standart slugify işlemi
    text = text.lower()
    text = re.sub(r'[^a-z0-9]+', '-', text)
    text = text.strip('-')
    text = re.sub(r'-+', '-', text)
    
    return text

# Test
print(turkish_slugify("Türkiye'nin En Güzel Şehirleri"))
# Çıktı: turkiyenin-en-guzel-sehirleri

Benzersiz Slug Oluşturma

Veritabanında çakışmayı önlemek için benzersiz slug:

def generate_unique_slug(model_class, title, slug_field='slug'):
    base_slug = slugify(title, max_length=50)
    slug = base_slug
    counter = 1
    
    while model_class.objects.filter(**{slug_field: slug}).exists():
        slug = f"{base_slug}-{counter}"
        counter += 1
    
    return slug

# Kullanım
class Article(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField(unique=True)
    
    def save(self, *args, **kwargs):
        if not self.slug:
            self.slug = generate_unique_slug(Article, self.title)
        super().save(*args, **kwargs)

Performans İpuçları

Sonuç

Python'da slug oluşturmak için birçok yöntem vardır. Projenizin ihtiyaçlarına göre vanilla Python, python-slugify veya framework'ünüzün yerleşik fonksiyonlarını kullanabilirsiniz. Türkçe ve diğer Latin dışı karakterler için özel dönüşüm fonksiyonları eklemeyi unutmayın.