Programlama yolculuğuma başladığımdan beri ilginç bir model fark ettim: uygulamaların çoğu şablonlu. Evet, bu saf bir gerçek! Tam burada, bu makalenin başında durun ve geliştirdiğiniz tüm projeleri düşünmeye başlayın.
Onların ortak noktaları ne? Yakından bakarsanız birçok temel işlevin farklı projelerde yeniden kullanıldığını göreceksiniz. Bu temel işlevler genellikle kullanıcı kimlik doğrulaması, ödeme işleme, kullanıcı yönetimi ve daha fazlasını içerir.
Bu makalede, tüm bu kalıpların geçmişteki programcılar tarafından zaten yaratıldığına dikkat çekmek istiyorum. Gerçekten şu anda kullandığımız hemen hemen her şey zaten uygulandı. Sadece belirli bir projeye göre bazı işlevleri değiştiriyoruz.
Size Python'daki arka uç geliştirme perspektifinden örnekler sunacağım, ancak bu herhangi bir programlama diline veya yazılım mühendisliği alanındaki herhangi bir alana uygulanabilir.
Peki tüm arka uç uygulamalarının ortak noktası nedir? Hadi bir bakalım!
Not : Eğer OOP (Nesneye Yönelik Programlama) konusunda bilginiz varsa, şablonlanmış modüllerinizi en yüksek soyutlama seviyesi olarak ancak uygulama seviyesinde düşünün ki bu prensibe göre yazılmalıdır.
Her bir bölümü, hemen hemen her arka uç uygulamasına uygulanabilecek temel bileşenlere ayırmak istiyorum.
Temel Bileşenler
2.1 Kullanıcı Modeli
User
en genel sınıfını, herhangi bir kullanıcıya uygulanabilecek niteliklerle tanımlıyoruz.
from werkzeug.security import generate_password_hash, check_password_hash class User: def __init__(self, username, password, email): self.username = username self.password_hash = generate_password_hash(password) self.email = email self.roles = [] def set_password(self, password): self.password_hash = generate_password_hash(password) def check_password(self, password): return check_password_hash(self.password_hash, password)
2.2 Token Yönetimi
Belirteç tabanlı kimlik doğrulama için JWT'yi kullanmak, siber güvenlik ve arka uç geliştirmedeki en iyi uygulamalar açısından iyi bir seçimdir.
def generate_token(user): payload = { 'username': user.username, 'exp': datetime.datetime.utcnow() + datetime.timedelta(hours=1) } return jwt.encode(payload, SECRET_KEY, algorithm='HS256') def verify_token(token): try: payload = jwt.decode(token, SECRET_KEY, algorithms=['HS256']) return payload['username'] except jwt.ExpiredSignatureError: return None except jwt.InvalidTokenError: return None
2.3 Dekoratörler
from functools import wraps from flask import request, jsonify, session def is_authenticated(func): @wraps(func) def decorated_function(*args, **kwargs): if 'user' not in session: return jsonify({"error": "User not authenticated"}), 401 return func(*args, **kwargs) return decorated_function
def roles_required(*roles): def decorator(func): @wraps(func) def decorated_function(*args, **kwargs): user_roles = session.get('roles', []) if not any(role in user_roles for role in roles): return jsonify({"error": "User does not have the required role"}), 403 return func(*args, **kwargs) return decorated_function return decorator
Ve temelde bu kadar! Bu önceden tanımlanmış işlevselliği tüm projelerde kimlik doğrulama için kullanabilirsiniz!
Hemen hemen her uygulama finansal işlemleri yönetir. İster yerel bir kasap dükkanı olsun ister büyük bir işletme devi olsun, ödemeleri toplamak için etkili bir sistem kullanmanız gerekecektir.
Temel Bileşenler
Stripe
veya PayPal
gibi ödeme ağ geçitleriyle bağlantı kurma
3.1 Ödeme Ağ Geçidi Entegrasyonu
Bu, Stripe için somut bir uygulamayla farklı ödeme ağ geçitlerini entegre etmek için bir temel olarak kullanılabilir. Genel olarak kişisel tercihim, ödemeler için StripeAPI
kullanmaktır; çünkü bu, uzun süredir piyasada ve herhangi bir projeye entegrasyonu gerçekten çok kolay.
class PaymentGateway(ABC): @abstractmethod def create_payment_intent(self, amount, currency='gbp'): pass @abstractmethod def confirm_payment(self, payment_id): pass @abstractmethod def handle_webhook(self, payload, sig_header): pass
Bu, ödeme ağ geçidine yönelik en genel örnektir ve ihtiyaçlarınıza göre özel uygulamaya odaklanabilirsiniz.
3.2 Ödeme Modelleri
Ödeme bilgilerini depolamak için modeller tanımlayın. Bu örnek ORM ile kullanılmak üzere uyarlanabilir. Gerekirse daha karmaşık bir sınıf hiyerarşisi oluşturabilirsiniz ancak bu örnek için aşağıdaki kod parçası oldukça yeterli olacaktır.
class Payment: def __init__(self, user_id, amount, currency): self.id = uuid.uuid4() self.user_id = user_id self.amount = amount self.currency = currency self.status = status payments = []
Tüm ödemeleri veritabanına kaydedin ve 3.3 bölümü için işlemleri işlemek için bir Celery
görevi ayarlayın. Veritabanı kayıtları aşağıdaki gibi görünmelidir:
id | user_id | amount | currency | status --------------------------------------+-----------------------------------+--------+----------+---------- e532d653-7c8b-453a-8cd4-3ab956863d72 | 1ff9efb3-d5e8-4e53-854f-4246ba9ff638 | 100.00 | USD | Failed 35985d41-5d54-4021-bed6-82d7233cc353 | a0984002-bace-478e-b6f9-6e4459e1b5ba | 250.50 | EUR | Pending 1ff9efb3-d5e8-4e53-854f-4246ba9ff638 | 9f896874-dc43-4592-8289-d0f7f8b8583a | 99.99 | GBP | Completed
Artık her projeye entegre edilebilecek karmaşık bir sistem oluşturduk. Hala modeli takip ediyor musun? Bu HER YERDE kullanılabilir!
Sonuçta bu verilerin görselleştirilmesi için başka bir uygulama tanımlayabilirsiniz. Şablon oluşturma konusunda haklısın! 😉
E-posta ve bildirimler, kullanıcıların uygulamanızın ömrü hakkında bilgi sahibi olmasını ve etkileşimde kalmasını sağlar. Hesap doğrulama, şifre sıfırlama veya pazarlama iletişimleri için olsun, güvenilir bir e-posta hizmeti her türlü proje için şarttır.
SendGrid
veya Amazon SES
gibi e-posta hizmetlerine bağlanma.
4.1 E-posta Hizmeti Entegrasyonu
EmailService
sınıfı içinde e-posta göndermek için SendGrid
ana mantığını tanımlayın.
import sendgrid from sendgrid.helpers.mail import Mail class EmailService: def __init__(self, api_key): self.sg = sendgrid.SendGridAPIClient(api_key) def send_email(self, from_email, to_email, subject, html_content): email = Mail( from_email=from_email, to_emails=to_email, subject=subject, html_content=html_content ) try: response = self.sg.send(email) return response.status_code except Exception as e: return str(e)
Ödeme ağ geçidinde olduğu gibi, piyasadaki herhangi bir spesifik araç veya ürüne odaklanmanıza gerek yoktur. Bu, herhangi bir proje için nasıl genelleştirilebileceğinin ve şablonlanabileceğinin yalnızca bir örneğidir.
4.2 E-posta Şablonları
Bunun gibi sistemler için en sevdiğim kalıp işleyici kalıbıdır; bir e-posta türü olarak sözlüğe giderek daha fazla anahtar ve içerikli dosyanın yolunu eklersiniz.
email_templates = { 'welcome': “welcome.html”, 'reset_password': "<h1>Reset Your Password</h1><p>Click <a href='{link}'>here</a> to reset your password.</p>" }
Aksi halde aynı amaçlar için bir Enum
tanımlamak güzel olabilir.
4.3 E- posta Gönderme
Sihrin gerçekleşmesi için bir fonksiyona ihtiyacımız var! Aşağıdakileri yazalım:
def send_email(email_service, from_email, to_email, subject, template_name, **template_vars): """ Send an email using the specified email service. """ html_content = get_email_template(template_name, **template_vars) return email_service.send_email(from_email, to_email, subject, html_content)
Bir diğer önemli nokta ise README
.env
config.py
, pyproject.toml,
.pre-commit.yml
gibi tüm arka uç projelere birkaç dosya eklemek ve proje içindeki dosyaların temel yapısını ortaya çıkarmak olacaktır.
Önerilen yapı Python uygulamasına biraz sıkılaştırılmış olsa da, daha önce de belirttiğim gibi, aynı şeyi başka herhangi bir dil veya alan için de yapabilirsiniz.
Ayrıca, en yüksek düzeyde soyutlamayla şablon oluşturmanın ve uygulamanın iyi bir yapısını sürdürmenin,
paket olarak veya mikro hizmet mimarisine ek olarak diğer projeler için yeniden kullanılır.
HER ŞEY ŞABLONU OLABİLİR!
Burada verilen örnekler sadece başlangıçtır; projeleriniz geliştikçe bu modeller daha karmaşık senaryoları kapsayacak şekilde genişletilebilir ve iyileştirilebilir. caching
alma, k8s
, docker
, Devops
altyapısı, CI/CD
ve işlem hatlarını ekleyebilirsiniz.
Basit bir ifadeyi unutmayın: İşinizi düzgün bir şekilde yaptıktan sonra, aynı işi başka bir işi tamamlarken kullanabilirsiniz.
Amaç projeyi, altyapıyı, bileşenleri ve hizmetleri farklı uygulamalarda yeniden kullanılabilir hale getirmektir!
Kendinize bir fincan çay yapın ve uygulamalarınızın hangi bölümlerinin farklı uygulamalarda yeniden kullanılabileceğini düşünün. Yalnızca bazı kod parçalarını ayarlayarak benzer hizmetler oluşturmaya ve işinizi otomatikleştirmeye çalışın!
Okuduğunuz için teşekkürler ve mutlu şablonlamalar!