paint-brush
सॉफ्टवेयर विकास में टेम्प्लेटिंग: गहराई से देखेंद्वारा@pro1code1hack
377 रीडिंग
377 रीडिंग

सॉफ्टवेयर विकास में टेम्प्लेटिंग: गहराई से देखें

द्वारा Yehor Dremliuha8m2024/07/16
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

कई मुख्य कार्यात्मकताएँ विभिन्न परियोजनाओं में पुनः उपयोग की जाती हैं। इन कार्यात्मकताओं में उपयोगकर्ता प्रमाणीकरण, भुगतान प्रक्रिया, उपयोगकर्ता प्रबंधन, और बहुत कुछ शामिल हैं। इस लेख में मैं यह मुद्दा उठाना चाहूँगा कि ये सभी पैटर्न पहले से ही अतीत के प्रोग्रामर द्वारा बनाए गए थे। लगभग हर चीज़ जो हम अभी उपयोग कर रहे हैं, पहले से ही लागू की गई थी। हम केवल विशिष्ट परियोजना के आधार पर कुछ कार्यक्षमता को संशोधित करते हैं।
featured image - सॉफ्टवेयर विकास में टेम्प्लेटिंग: गहराई से देखें
Yehor Dremliuha HackerNoon profile picture
0-item
1-item

1 परिचय

जब से मैंने प्रोग्रामिंग के साथ अपनी यात्रा शुरू की है, मैंने एक दिलचस्प पैटर्न देखा है: अधिकांश एप्लिकेशन टेम्प्लेटेड हैं। हाँ, यह एक शुद्ध तथ्य है! बस यहीं, इस लेख की शुरुआत में रुकें, और अपने द्वारा विकसित सभी प्रोजेक्ट के बारे में सोचना शुरू करें।


उनमें क्या समानता है? अगर आप ध्यान से देखें, तो आप पाएंगे कि कई मुख्य कार्यात्मकताएँ अलग-अलग परियोजनाओं में दोबारा इस्तेमाल की जाती हैं। इन मुख्य कार्यात्मकताओं में अक्सर उपयोगकर्ता प्रमाणीकरण, भुगतान प्रक्रिया, उपयोगकर्ता प्रबंधन और बहुत कुछ शामिल होता है।


इस लेख में, मैं यह मुद्दा उठाना चाहूँगा कि ये सभी पैटर्न पहले से ही अतीत के प्रोग्रामर द्वारा बनाए गए थे। वास्तव में, हम अभी जो कुछ भी उपयोग कर रहे हैं, वह पहले से ही लागू किया गया था। हम केवल विशिष्ट परियोजना के आधार पर कुछ कार्यक्षमता को संशोधित करते हैं।


मैं आपको पायथन में बैकएंड विकास के परिप्रेक्ष्य से उदाहरण प्रस्तुत करूंगा, लेकिन इसे किसी भी प्रोग्रामिंग भाषा या सॉफ्टवेयर इंजीनियरिंग के किसी भी क्षेत्र में लागू किया जा सकता है।


तो, सभी बैकएंड एप्लीकेशन में क्या समानता है? आइए एक नज़र डालते हैं!


नोट : यदि आप ओओपी (ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग) से परिचित हैं, तो अपने टेम्प्लेटेड मॉड्यूल को उच्चतम स्तर के अमूर्तन के रूप में मानें, लेकिन एप्लिकेशन स्तर पर ताकि इसे इस सिद्धांत के अनुसार लिखा जा सके।

2. प्रमाणीकरण और प्राधिकरण

मैं प्रत्येक अनुभाग को बुनियादी घटकों में विभाजित करना चाहूंगा, जिन्हें लगभग किसी भी बैकएंड एप्लिकेशन पर लागू किया जा सकता है।


मौलिक संघटक

  1. उपयोगकर्ता मॉडल: उपयोगकर्ता का एक प्रतिनिधित्व जिसमें उपयोगकर्ता नाम, पासवर्ड, ईमेल, भूमिकाएं आदि जैसी विशेषताएं शामिल होती हैं।
  2. पासवर्ड प्रबंधन: पासवर्ड को हैश करने और सत्यापित करने के कार्य।
  3. टोकन जनरेशन: टोकन (JWT, OAuth2, आदि) उत्पन्न करने और सत्यापित करने की प्रणाली।
  4. मिडलवेयर/डेकोरेटर: उन रूट/एंडपॉइंट्स को सुरक्षित करें जिनके लिए प्रमाणीकरण की आवश्यकता होती है।
  5. भूमिका प्रबंधन: उपयोगकर्ता भूमिकाएँ और अनुमतियाँ निर्दिष्ट करें और सत्यापित करें।


2.1 उपयोगकर्ता मॉडल

हम User की सबसे सामान्य श्रेणी को उन विशेषताओं के साथ परिभाषित कर रहे हैं जिन्हें किसी भी विशिष्ट उपयोगकर्ता पर लागू किया जा सकता है।

 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 टोकन प्रबंधन

टोकन-आधारित प्रमाणीकरण के लिए JWT का उपयोग करना साइबर सुरक्षा और बैकएंड विकास में सर्वोत्तम प्रथाओं के संदर्भ में एक अच्छा विकल्प है।

 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 सज्जाकार

  • डेकोरेटर यह जांचने के लिए कि क्या उपयोगकर्ता को पृष्ठ तक पहुंचने की अनुमति है।
 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


और मूल रूप से, बस इतना ही! आप सभी परियोजनाओं में प्रमाणीकरण के लिए इस पूर्वनिर्धारित कार्यक्षमता का उपयोग कर सकते हैं!

3. भुगतान और बिलिंग

लगभग हर एप्लीकेशन वित्तीय लेनदेन को संभालती है। चाहे वह स्थानीय कसाई की दुकान हो या कोई बड़ी उद्यम कंपनी, आपको भुगतान एकत्र करने के लिए एक प्रभावी प्रणाली का उपयोग करने की आवश्यकता होगी।


मौलिक संघटक

  1. भुगतान गेटवे एकीकरण: Stripe या PayPal जैसे भुगतान गेटवे से जुड़ना
  2. भुगतान मॉडल: भुगतान डेटा को संभालने के लिए मॉडल परिभाषित करना।
  3. भुगतान प्रसंस्करण: भुगतान जीवनचक्र को संभालना (आरंभ करना, पुष्टि करना, आदि)।


3.1 भुगतान गेटवे एकीकरण

इसका उपयोग विभिन्न भुगतान गेटवे को एकीकृत करने के लिए आधार के रूप में किया जा सकता है, जिसमें स्ट्राइप के लिए एक ठोस कार्यान्वयन है। आम तौर पर, मेरी व्यक्तिगत प्राथमिकता भुगतान के लिए StripeAPI का उपयोग करना है क्योंकि यह बाजार में लंबे समय से है, और वास्तव में, किसी भी परियोजना में एकीकृत करना आसान है।


 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

यह भुगतान गेटवे के लिए सबसे सामान्य उदाहरण है, और आप अपनी आवश्यकताओं के अनुसार विशिष्ट कार्यान्वयन पर ध्यान केंद्रित कर सकते हैं।


3.2 भुगतान मॉडल

भुगतान जानकारी संग्रहीत करने के लिए मॉडल परिभाषित करें। इस उदाहरण को ORM के साथ उपयोग के लिए अनुकूलित किया जा सकता है। यदि आवश्यक हो तो आप कक्षाओं का अधिक जटिल पदानुक्रम बना सकते हैं, लेकिन इस उदाहरण के लिए, निम्नलिखित स्निपेट काफी पर्याप्त होना चाहिए।

 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 = []


सभी भुगतानों को डेटाबेस में सहेजें और 3.3 अनुभाग के लिए लेनदेन को संसाधित करने के लिए Celery कार्य सेट करें। डेटाबेस रिकॉर्ड निम्न की तरह दिखना चाहिए:

 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


अब, हमने एक जटिल प्रणाली बनाई है जिसे किसी भी परियोजना में एकीकृत किया जा सकता है। क्या आप अभी भी पैटर्न का पालन कर रहे हैं? इसका उपयोग हर जगह किया जा सकता है!


आखिरकार, आप इस डेटा के विज़ुअलाइज़ेशन के लिए एक और एप्लिकेशन परिभाषित कर सकते हैं। टेम्प्लेटिंग के बारे में आपकी बात समझ में आ गई! 😉

4. ईमेल और अधिसूचना सेवाएँ

ईमेल और नोटिफ़िकेशन उपयोगकर्ताओं को सूचित रखते हैं और उन्हें आपके ऐप के जीवन में व्यस्त रखते हैं। चाहे वह खाता सत्यापन, पासवर्ड रीसेट या मार्केटिंग संचार के लिए हो, किसी भी प्रकार की परियोजना के लिए एक विश्वसनीय ईमेल सेवा आवश्यक है।

  1. ईमेल सेवा एकीकरण: SendGrid या Amazon SES जैसी ईमेल सेवाओं से जुड़ना।
  2. ईमेल टेम्पलेट्स: विभिन्न ईमेल प्रकारों के लिए टेम्पलेट्स परिभाषित करना।
  3. ईमेल भेजना: एकीकृत सेवा का उपयोग करके ईमेल भेजने के लिए कार्य।


4.1 ईमेल सेवा एकीकरण

EmailService वर्ग के अंदर ईमेल भेजने के लिए SendGrid के मुख्य तर्क को परिभाषित करें।

 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)


पेमेंट गेटवे की तरह, आपको बाज़ार में किसी खास यूटिलिटी या उत्पाद पर ध्यान केंद्रित करने की ज़रूरत नहीं है। यह सिर्फ़ एक उदाहरण है कि इसे कैसे सामान्यीकृत किया जा सकता है और किसी भी प्रोजेक्ट के लिए टेम्पलेट किया जा सकता है।


4.2 ईमेल टेम्पलेट

इस तरह की प्रणालियों के लिए मेरा पसंदीदा पैटर्न हैंडलर्स पैटर्न है; आप शब्दकोश में ईमेल के प्रकार के रूप में अधिक से अधिक कुंजियाँ जोड़ते हैं, तथा सामग्री के साथ फ़ाइल का पथ जोड़ते हैं।


 email_templates = { 'welcome': “welcome.html”, 'reset_password': "<h1>Reset Your Password</h1><p>Click <a href='{link}'>here</a> to reset your password.</p>" }


अन्यथा, समान उद्देश्यों के लिए Enum परिभाषित करना अच्छा हो सकता है।


4.3 ईमेल भेजना

हमें जादू को सच करने के लिए एक फ़ंक्शन की आवश्यकता है! आइए निम्नलिखित लिखें:

 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)


एक अन्य महत्वपूर्ण बिंदु सभी बैकएंड परियोजनाओं में कई फाइलें जोड़ना होगा, जैसे कि README .env config.py , pyproject.toml, .pre-commit.yml और परियोजना के अंदर फाइलों की आधार संरचना तैयार करना।


यद्यपि सुझाई गई संरचना पायथन कार्यान्वयन के लिए थोड़ी सख्त है, जैसा कि मैंने पहले उल्लेख किया है, आप किसी अन्य भाषा या क्षेत्र के लिए भी ऐसा ही कर सकते हैं।


यह भी ध्यान रखना महत्वपूर्ण है कि अमूर्तता के उच्चतम स्तर पर टेम्प्लेटिंग और एप्लिकेशन की अच्छी संरचना बनाए रखना महत्वपूर्ण हो सकता है।

अन्य परियोजनाओं के लिए पैकेज के रूप में या माइक्रोसर्विस आर्किटेक्चर के अतिरिक्त के रूप में पुन: उपयोग किया जा सकता है।



चित्र 1 - माइक्रोसर्विस आर्किटेक्चर उदाहरण

5। उपसंहार

सब कुछ टेम्पलेट किया जा सकता है!


यहाँ दिए गए उदाहरण सिर्फ़ शुरुआत हैं - जैसे-जैसे आपकी परियोजनाएँ विकसित होती हैं, इन पैटर्न को और अधिक जटिल परिदृश्यों को कवर करने के लिए बढ़ाया और परिष्कृत किया जा सकता है। आप caching जोड़कर k8s , docker , Devops इंफ्रास्ट्रक्चर, CI/CD और पाइपलाइन स्थापित कर सकते हैं।


एक सरल कथन याद रखें: एक बार आपने अपना काम ठीक से कर लिया, तो आप उसी काम का उपयोग किसी अन्य काम को पूरा करने के लिए कर सकते हैं।


इसका लक्ष्य परियोजना, बुनियादी ढांचे, घटकों और सेवाओं को विभिन्न अनुप्रयोगों में पुनः प्रयोज्य बनाना है!


अपने लिए एक कप चाय बनाएं और सोचें कि आपके एप्लिकेशन के कौन से हिस्से अलग-अलग ऐप में फिर से इस्तेमाल किए जा सकते हैं। समान सेवाएँ बनाने और अपने काम को स्वचालित करने का प्रयास करें, केवल कुछ कोड टुकड़ों को समायोजित करें!


पढ़ने के लिए धन्यवाद, और टेम्पलेटिंग का आनंद लें!