paint-brush
Yazılım Geliştirmede Şablon Oluşturma: Daha Derin Bir Bakışby@pro1code1hack
235

Yazılım Geliştirmede Şablon Oluşturma: Daha Derin Bir Bakış

Yehor Dremliuha8m2024/07/16
Read on Terminal Reader

Birçok temel işlevsellik farklı projelerde yeniden kullanılmaktadır. Bu işlevler arasında kullanıcı kimlik doğrulaması, ödeme işleme, kullanıcı yönetimi ve daha fazlası yer alır. Bu makalede, tüm bu kalıpların geçmişteki programcılar tarafından zaten yaratıldığına dikkat çekmek istiyorum. Şu anda kullandığımız hemen hemen her şey zaten uygulandı. Sadece belirli bir projeye göre bazı işlevleri değiştiriyoruz.
featured image - Yazılım Geliştirmede Şablon Oluşturma: Daha Derin Bir Bakış
Yehor Dremliuha HackerNoon profile picture
0-item
1-item

1. Giriş

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.

2. Kimlik Doğrulama ve Yetkilendirme

Her bir bölümü, hemen hemen her arka uç uygulamasına uygulanabilecek temel bileşenlere ayırmak istiyorum.


Temel Bileşenler

  1. Kullanıcı Modeli: Kullanıcı adı, şifre, e-posta, roller vb. gibi nitelikleri içeren kullanıcının temsili.
  2. Parola Yönetimi: Parolaları karma ve doğrulama işlevleri.
  3. Token Üretimi: Tokenleri (JWT, OAuth2, vb.) oluşturma ve doğrulama mekanizması.
  4. Ara Yazılım/Dekoratör: Kimlik doğrulama gerektiren rotaları/uç noktaları koruyun.
  5. Rol Yönetimi: Kullanıcı rollerini ve izinlerini atayın ve doğrulayın.


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

  • Dekoratör, kullanıcının sayfaya erişmesine izin verilip verilmediğini kontrol eder.
 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


  • Kullanıcının rolünü kontrol etmek için dekoratör.
 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!

3. Ödemeler ve Faturalandırma

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

  1. Ödeme Ağ Geçidi Entegrasyonu: Stripe veya PayPal gibi ödeme ağ geçitleriyle bağlantı kurma
  2. Ödeme Modelleri: Ödeme verilerini işlemek için modellerin tanımlanması.
  3. Ödeme İşleme: Ödeme yaşam döngüsünün yönetilmesi (başlatma, onaylama vb.).


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! 😉

4. E-posta ve Bildirim Hizmetleri

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.

  1. E-posta Hizmeti Entegrasyonu: SendGrid veya Amazon SES gibi e-posta hizmetlerine bağlanma.
  2. E-posta Şablonları: Çeşitli e-posta türleri için şablonların tanımlanması.
  3. E-posta Gönderme: Entegre hizmeti kullanarak e-posta gönderme işlevleri.


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.



Şekil 1 - Mikro Hizmet Mimarisi Örneği

5. Sonuç

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!