उदाहरण के तौर पर व्यावहारिक वेब आधारित गहन शिक्षा और सुरक्षा

Daisyकी प्रोफ़ाइल फोटो

द्वारा Daisy

उदाहरण के लिए व्यावहारिक वेब आधारित गहरी शिक्षा और सुरक्षा तीसरा संस्करण शार्लोट हार्पर 3 जुलाई, 2024 Foreword: वेब के लिए सॉफ्टवेयर बिल्डिंग सॉफ्टवेयर में सुरक्षा विचार किसी भी वेब डेवलपर की योजना और निष्पादन का एक महत्वपूर्ण हिस्सा हैं, जबकि एक प्रोटोटाइप इंजीनियरिंग करते हैं जो व्यावहारिक उद्देश्यों के लिए भरोसेमंद, स्थिर और उपयोगी है। DOM (डॉक्यूमेंट ऑब्जेक्ट मार्कअप), HTML, JavaScript, और CSS के कार्यान्वयन के साथ -साथ बैकएंड सॉफ़्टवेयर के कार्यान्वयन के साथ पायथन, C/C ++, Java और Bash को लागू करना, वेब डेवलपर्स को स्वतंत्रता और शक्ति प्रदान करता है, जो विभिन्न प्रकार की परियोजनाओं को बनाने के लिए व्यक्त करता है। रचनात्मकता, उपयोग और कार्यक्षमता में आसानी प्रदान करें, विनम्रता और चरित्र को चित्रित करें, और उपयोग में आसानी के साथ -साथ सुविधा और महत्वपूर्ण सेवाएं प्रदान करें जो सभी औसत जो के लिए आकर्षक हैं, अंतिम उपयोगकर्ता की तलाश में समय को मारने या इंटरनेट पर कुछ करने के लिए, आमतौर पर एक टचस्क्रीन स्मार्टफोन डिवाइस पर। ज्यादातर लोगों को यह भी नहीं पता होगा कि जब वे स्क्रैच से एक वेबसाइट बनाना चाहते हैं, तो कहां से शुरू करें,वे किसी अन्य व्यक्ति की वेबसाइट पर शुरू करते हैं और कार्यक्षमता, निर्भरता, उपयोग में आसानी और विशेष रूप से रचनात्मकता में सीमित कुछ का निर्माण करते हैं, जब वे अपने निपटान में सभी नवीनतम शक्तिशाली उपकरण हो सकते थे ताकि समय को बर्बाद किए बिना कुछ उपयोगी बनाया जा सके, और विशेष रूप से सॉफ्टवेयर के लिए महंगी सदस्यता के लिए भुगतान करने वाले पैसे बर्बाद करना कुछ लोग वैसे भी उपयोग करना चाहते थे, यह देखते हुए कि यह उपयोग और लचीलेपन में आसानी में सीमाएं हैं। यदि आपके पास इस पुस्तक के माध्यम से पढ़ने के लिए कुछ मिनट हैं और सीखें कि मैं आपको क्या सिखाना चाहता हूं, या यहां तक ​​कि मेरे लक्ष्यों के बारे में व्यक्तिगत रूप से बात करें और सही दिशा में कुछ मार्गदर्शन प्राप्त करें, और कोड और अपने स्वयं के सॉफ़्टवेयर को सीखने के लिए प्रेरित हैं। , इस पुस्तक को घर ले जाएं और अगले प्रभावशाली, शक्तिशाली, सुव्यवस्थित और महत्वपूर्ण वेब एप्लिकेशन के निर्माण के लिए सीखने के लिए कुछ समय निर्धारित करें, एक वेबसाइट जो आप पर है और वास्तव में आप चाहते हैं और अपने दर्शकों की जरूरतों को पूरा करते हैं। मेरे बारे में: मैं एक विस्तृत के साथ एक सॉफ्टवेयर डेवलपर हूंC/C ++, जावा, पायथन, HTML, CSS और JAVASCRIPT में अनुभव का अनुभव। मैं उन वेबसाइटों का निर्माण करता हूं जो लोग उपयोग करना चाहते हैं, यात्रा करना चाहते हैं, और यहां तक ​​कि केवल सीखने, फिर से बनाने और समय को मारने के लिए उपयोग करने के आदी हो जाते हैं, और सबसे महत्वपूर्ण बात यह है कि मैं सॉफ्टवेयर बेचता हूं। यदि आपके पास एक विचार था कि आप वास्तव में कैसे देखना चाहते हैं और कार्य करना चाहते हैं, तो आप मेरा समर्थन करने के लिए तैयार थे ताकि मैं आपकी जरूरतों को पूरा कर सकूं, जबकि मैं आपसे मिलूं, और आप स्वयं एक वेबसाइट चलाने की लागतों को कवर करने के लिए तैयार हैं, मैं आपको अगला YouTube, Tiktok, Twitter, Google, या यहां तक ​​कि एक उच्च तकनीक वाले सुरक्षा ऐप का निर्माण करूंगा, केवल आप एक्सेस कर सकते हैं। आपको अपना समय बेचने की कोशिश करने के बजाय, मैं आपको खरीदने की कोशिश कर रहा हूं: मैं आपको एक ऐप (वेबसाइट) बनाने में बात करना चाहता हूं, जो पहले से मौजूद जानकारी के साथ खुद को एक स्वतंत्र सॉफ्टवेयर डेवलपर होने की आवश्यकता है। उद्यमी, जो भी आप चाहते हैं, उसमें एक सफल कैरियर का नेतृत्व करते हैं। और मुझे स्पष्ट होना चाहिए, मैं जो शिक्षा आपको दे रहा हूं वह अनौपचारिक होगा। आप स्कूल जा सकते हैं और यह सब एक के साथ सीख सकते हैंRMAL शिक्षा, या यहां तक ​​कि इस पुस्तक को स्कूल में पढ़ें, अपने असाइनमेंट को पूरा करें, और अपनी शिक्षा से बहुत दूर ले जाएं, लेकिन मैं आपको औपचारिक रूप से हॉट सीट पर नहीं डालूंगा और आपको असाइनमेंट पूरा करने के लिए कहूंगा। मैं आपका प्रोफेसर नहीं हूं, आप मेरे बारे में एक ऐसे दोस्त की तरह सोच सकते हैं जो आपको अपनी व्यक्तिगत सफलता द्वारा संचालित कैरियर की ओर मार्गदर्शन करना चाहता है। और मैं आपको सफलता नहीं बेच रहा हूं, आपको इसे अपने समय के साथ खरीदने की आवश्यकता होगी। कोड को सीखने में एक सीखने की अवस्था है और यह कभी भी आसान नहीं था, या यहां तक ​​कि माना जाता है। आपको संभवतः उतनी मेहनत करने की आवश्यकता है जितनी संभव हो सके और कोशिश करना और असफल होना जारी रखें और फिर भी प्रयास करें जब आप खुद को सीखने और बनाने के लिए निराश हैं। यह कोड की प्रकृति में ही है। कोड एक कंपाइलर द्वारा चलाया जाता है जिसे प्रोग्रामर त्रुटि संदेश देने के लिए डिज़ाइन किया गया है, और ये आपको सिखाएंगे कि कैसे कोड करें, भले ही आप अपने खोज इंजन में त्रुटि की नकल कर रहे हों और अन्य लोगों के उदाहरणों को पढ़ रहे हों। और मुझे कहना होगा, आपको बेहद समृद्ध, स्मार्ट, सफल होने की आवश्यकता नहीं है,एक ऐप बनाने के लिए एन डिटेल ओरिएंटेड या संगठित। कंप्यूटर आपके लिए उस संगठन की देखभाल करता है। आपको बस परीक्षण और त्रुटि के माध्यम से दृढ़ रहने की आवश्यकता है, ध्यान बनाए रखें और जो आप करते हैं उस पर कड़ी मेहनत करें, और आप जो करते हैं, उसकी संपूर्णता में एक बहुत ही सफल कैरियर होगा। मैं कौन हूं: मुझे एहसास है कि अंतिम खंड सीखने के बारे में अधिक था और इस पुस्तक से आपका एक तरीका है। मैं वास्तव में कौन हूँ? यह एक जटिल प्रश्न है। मैं उस पर स्पष्ट नहीं हूं, क्योंकि मैं चिकित्सा स्थितियों से पीड़ित हूं, जो मेरे लिए कई बार कोड या इस पुस्तक को भी लिखना मुश्किल बना सकता है, जबकि समाजीकरण और पहचान के मुद्दों के साथ चुनौतियां पेश करते हैं जो मेरे जीवन को और अधिक कठिन बनाते हैं जब यह अपना परिचय देने की बात आती है । संक्षेप में, यदि आप इस पुस्तक को पढ़ रहे हैं, तो आप इसे घर ले आए क्योंकि आप इसके माध्यम से फ़्लिप किए और सोचा कि यह उपयोगी था, या यहां तक ​​कि अगर आप अभी तक पढ़ते हैं, तो आप एक ऐसे व्यक्ति की तरह हैं जो आपको सफल होना चाहते हैं सब कुछ जो आप करते हैं। मैं खुद एक इंजीनियर हूं, एक सॉफ्टवेयरडेवलपर, और एक छात्र, और मैं इस पुस्तक को अन्य छात्रों के लिए लिख रहा हूं, जो सॉफ्टवेयर की एक हैंडबुक होने से अपने जीवन को आसान बनाना चाहते हैं, उन्हें अपने जीवन को आसान बनाने की आवश्यकता है, जो एक बड़ी पहेली की तरह एक साथ एक साथ काम करने के लिए एक साथ मिलकर अपने जीवन को आसान बनाने की आवश्यकता है। , उपयोगी, बड़े, कार्यात्मक, सामंजस्यपूर्ण और आकर्षक ऐप जो व्यवसाय की रेखा से कोई फर्क नहीं पड़ता, सफलता को चला सकता है। मोटे तौर पर, यह वही है जो मैं करता हूं: मैं अपने आप को और अन्य लोगों की मदद करने के लिए ऐप्स का निर्माण करता हूं। मैं एक लेखक भी हूं, हालांकि यह मेरा पहला प्रकाशन है जिसे मैं अपने पोर्टफोलियो को एक उपयोगी दस्तावेज में एक साथ रखने के लिए पूरा करने का इरादा रखता हूं, और मैं एक कलाकार भी हूं। मैं आपको यह मानता हूँ, मैं एक अजीब व्यक्ति हूँ। मैं सही नहीं हूं, मैंने कानून के साथ INS चलाया है, यहां तक ​​कि मुझे कॉलेजों और विश्वविद्यालयों को छोड़ने के लिए और अधिक सफलता के साथ खुद के लिए एक नाम बनाने की कोशिश करने के लिए राज्यों को छोड़ने के लिए अग्रणी है। मैं जन्म से एक महिला हूं, मैं मेकअप पहनती हूं, खुद की तस्वीरें लेती हूं, कपड़े पहनती हूं, कपड़े और अन्य महिला कपड़े पहनती हूं, और मैं खुद के प्रति सचेत रहती हूंस्वभाव से पुरुष। मेरे पास अतीत में अन्य लोगों के साथ मुद्दे हैं जो वेबैप लिखने और निर्माण के साथ संघर्ष करते हैं, और मैं माफी मांगता हूं कि मैं इस पुस्तक को आपके हाथों में जल्द ही प्राप्त करने में सक्षम नहीं हूं: आपको इसकी आवश्यकता थी। आप उन कोड को पढ़ना और लिखना चाहेंगे जो मेरा जैसा दिखता है और मेरी तरह काम करता है और एक ही काम करता है, लेकिन इससे भी बेहतर है, क्योंकि अगर आप अपने कीबोर्ड को मैश करने के बजाय इस पुस्तक को खरीद सकते हैं जैसे कि मैं सिर्फ एक किताब बनाने के लिए खुद को पैसे पूछने के लिए करता हूं। इसके लिए, आपके पास ऐसे संसाधन हैं जिन्हें आपको अपने जीवन में सफल होने की आवश्यकता है। मेरे पास परिवार के बड़े होने, स्वास्थ्य की स्थिति, डॉक्टर, मीडिया और कानून के साथ सभी प्रकार के मुद्दे थे, और मेरा कोड उस संघर्ष को गहराई से दर्शाता है जो एक विभाजित और निराश दुनिया में नारीवाद और महिला प्रकृति है। हालाँकि, यह पुस्तक ऐसी चीज है जिसके बारे में मैं गहराई से परवाह करता हूं, मेरे बच्चे, मेरे पोर्टफोलियो और मेरी आजीविका, इसलिए मैं आपके विचार की सराहना करता हूं जब आप पाठ को घर लेते हैं और मुझसे सीखने के लिए ध्यान से उस पर ध्यान से पोर करते हैं। कृपया ध्यान रखें कि मैं सही नहीं हूं,पुस्तक में त्रुटियां, संशोधन और नए संस्करण होंगे, और आपको अपने तार्किक मस्तिष्क के साथ सोचने की आवश्यकता होगी कि आप मेरे लेखन के साथ एक सफल अनुभव प्राप्त कर सकते हैं। इसके अलावा, यह समझें कि जब आप लिखते समय चुनौतियों का सामना करते हैं, तब भी मेरा मतलब है। इसके बारे में इस तरह से सोचें: जब आप कुछ भी करने के लिए एक कंप्यूटर सिस्टम किराए पर ले सकते हैं, तो आप संभवतः डिजिटल स्पेस में कल्पना कर सकते हैं, आपके द्वारा की गई सभी जानकारी को संग्रहीत कर सकते हैं, #$%! Yze और इसे व्यवस्थित करें, और इसे समझने के लिए, आप करेंगे, आप करेंगे अनिवार्य रूप से उस जानकारी के साथ कठिनाइयों का सामना करना पड़ता है जिसे आप अंतर्ग्रहण कर रहे हैं और यहां तक ​​कि प्रकाशन भी। मैं आपको यह बताता हूं क्योंकि मैं उसी कठिनाइयों का सामना करता हूं। अपने स्वयं के जोखिम पर इस पुस्तक का उपयोग करें, अपने समुदाय और समुदायों के साथ काम करें जो आपके लिए एक सुरक्षित सेटिंग के भीतर सॉफ़्टवेयर बनाने के लिए उपलब्ध है, और जब आप असफल होते हैं या गलत तरीके से सफल होते हैं, तो व्यक्तिगत रूप से चीजों को न लें: यह है कि मुझे यह कैसे मिला है , और क्यों मैं आपको यह पाठ क्यों ला सकता हूं और आपको पागलपन के रास्ते पर जाने के बिना सफल होने में मदद करता हैमुझे बर्बाद कर दिया, फटा हुआ और भयावह किया, जबकि मैं सामान्य समस्याओं का सामना करता हूं, जो हर कोई वैश्विक स्तर पर करता है, जिस पर हम काम करेंगे, इंटरनेट पर हम काम करेंगे। आप बहुत परिचित नहीं हो सकते हैं कि मैं केवल कुछ शब्दों के साथ कौन हूं, लेकिन मैं आपको पढ़ने के लिए प्रोत्साहित करता हूं, आप मुझे जानेंगे कि आप अपने काम को पूरा करने के लिए अपनी परियोजनाओं का निर्माण करते समय मुझे पढ़ना और समझना जारी रखेंगे। इस पुस्तक के साथ कोई होमवर्क नहीं होगा, जब तक कि आपके प्रोफेसर या शिक्षक आपको कोई भी असाइन नहीं करते हैं, लेकिन मैं आपको खुद को प्रोजेक्ट्स का एक पोर्टफोलियो बनाने के लिए प्रोत्साहित करता हूं जैसा कि आप साथ पढ़ते हैं, साथ ही साथ एक कैपस्टोन प्रोजेक्ट भी दिखाते हैं कि आप कैसे कर सकते हैं जो आपने सीखा है उसे लागू करें। मेरी कैपस्टोन प्रोजेक्ट इस पुस्तक में जो कुछ भी आप पढ़ेंगे, उसमें से अधिकांश के लिए आधार है, क्योंकि इसमें मेरी पिछली परियोजनाओं, कोड को शामिल किया गया है, जिसे मैंने बनाया है और हाथ से व्यवस्थित रूप से लिखना सीखा है, और विचारों और युक्तियों की एक विस्तृत श्रृंखला जिसने मुझे मदद की है। उस बिंदु पर सफल हो जहां मैं एक साधारण ऐप को स्पिन कर सकता हूंUlly में दिखाया गया है और एक लोकप्रिय ऐप की तरह दिखता है और व्यवहार करता है जिसे आप अपने दोस्त या परिवार को इंटरनेट पर उपयोग करते हुए देख सकते हैं, आपको विज्ञापन में, या समाचार में। यह पुस्तक क्या है: यह पुस्तक उदाहरण के लिए एक ट्यूटोरियल है। आप यहां कोड पा सकते हैं, कोड को कैस...
उदाहरण के तौर पर व्यावहारिक वेब आधारित गहन शिक्षा और सुरक्षा

उदाहरण के लिए व्यावहारिक वेब आधारित गहरी शिक्षा और सुरक्षा तीसरा संस्करण शार्लोट हार्पर 3 जुलाई, 2024 Foreword: वेब के लिए सॉफ्टवेयर बिल्डिंग सॉफ्टवेयर में सुरक्षा विचार किसी भी वेब डेवलपर की योजना और निष्पादन का एक महत्वपूर्ण हिस्सा हैं, जबकि एक प्रोटोटाइप इंजीनियरिंग करते हैं जो व्यावहारिक उद्देश्यों के लिए भरोसेमंद, स्थिर और उपयोगी है। DOM (डॉक्यूमेंट ऑब्जेक्ट मार्कअप), HTML, JavaScript, और CSS के कार्यान्वयन के साथ -साथ बैकएंड सॉफ़्टवेयर के कार्यान्वयन के साथ पायथन, C/C ++, Java और Bash को लागू करना, वेब डेवलपर्स को स्वतंत्रता और शक्ति प्रदान करता है, जो विभिन्न प्रकार की परियोजनाओं को बनाने के लिए व्यक्त करता है। रचनात्मकता, उपयोग और कार्यक्षमता में आसानी प्रदान करें, विनम्रता और चरित्र को चित्रित करें, और उपयोग में आसानी के साथ -साथ सुविधा और महत्वपूर्ण सेवाएं प्रदान करें जो सभी औसत जो के लिए आकर्षक हैं, अंतिम उपयोगकर्ता की तलाश में समय को मारने या इंटरनेट पर कुछ करने के लिए, आमतौर पर एक टचस्क्रीन स्मार्टफोन डिवाइस पर। ज्यादातर लोगों को यह भी नहीं पता होगा कि जब वे एक वेबसाइट बनाना चाहते हैं तो कहां से शुरू करेंस्क्रैच, वे किसी अन्य व्यक्ति की वेबसाइट पर शुरू करते हैं और कार्यक्षमता, निर्भरता, उपयोग में आसानी और विशेष रूप से रचनात्मकता में सीमित कुछ का निर्माण करते हैं, जब वे अपने निपटान में सभी नवीनतम शक्तिशाली उपकरण हो सकते थे ताकि समय को बर्बाद किए बिना कुछ उपयोगी बनाया जा सके। , और विशेष रूप से सॉफ्टवेयर के लिए महंगी सदस्यता के लिए भुगतान करने वाले पैसे बर्बाद करना कुछ लोग वैसे भी उपयोग करना चाहते थे, यह उपयोग और लचीलेपन में आसानी में सीमाएं हैं। यदि आपके पास इस पुस्तक के माध्यम से पढ़ने के लिए कुछ मिनट हैं और सीखें कि मैं आपको क्या सिखाना चाहता हूं, या यहां तक ​​कि मेरे लक्ष्यों के बारे में व्यक्तिगत रूप से बात करें और सही दिशा में कुछ मार्गदर्शन प्राप्त करें, और कोड और अपने स्वयं के सॉफ़्टवेयर को सीखने के लिए प्रेरित हैं। , इस पुस्तक को घर ले जाएं और अगले प्रभावशाली, शक्तिशाली, सुव्यवस्थित और महत्वपूर्ण वेब एप्लिकेशन के निर्माण के लिए सीखने के लिए कुछ समय निर्धारित करें, एक वेबसाइट जो आप पर है और वास्तव में आप चाहते हैं और अपने दर्शकों की जरूरतों को पूरा करते हैं। मेरे बारे में: मैं एक सॉफ्टवेयर डेवलपर हूंC/C ++, जावा, पायथन, HTML, CSS और जावास्क्रिप्ट में अनुभव की सीमा। मैं उन वेबसाइटों का निर्माण करता हूं जो लोग उपयोग करना चाहते हैं, यात्रा करना चाहते हैं, और यहां तक ​​कि केवल सीखने, फिर से बनाने और समय को मारने के लिए उपयोग करने के आदी हो जाते हैं, और सबसे महत्वपूर्ण बात यह है कि मैं सॉफ्टवेयर बेचता हूं। यदि आपके पास एक विचार था कि आप वास्तव में कैसे देखना चाहते हैं और कार्य करना चाहते हैं, तो आप मेरा समर्थन करने के लिए तैयार थे ताकि मैं आपकी जरूरतों को पूरा कर सकूं, जबकि मैं आपसे मिलूं, और आप स्वयं एक वेबसाइट चलाने की लागतों को कवर करने के लिए तैयार हैं, मैं आपको अगला YouTube, Tiktok, Twitter, Google, या यहां तक ​​कि एक उच्च तकनीक वाले सुरक्षा ऐप का निर्माण करूंगा, केवल आप एक्सेस कर सकते हैं। आपको अपना समय बेचने की कोशिश करने के बजाय, मैं आपको खरीदने की कोशिश कर रहा हूं: मैं आपको एक ऐप (वेबसाइट) बनाने में बात करना चाहता हूं, जो पहले से मौजूद जानकारी के साथ खुद को एक स्वतंत्र सॉफ्टवेयर डेवलपर होने की आवश्यकता है। उद्यमी, जो भी आप चाहते हैं, उसमें एक सफल कैरियर का नेतृत्व करते हैं। और मुझे स्पष्ट होना चाहिए, मैं जो शिक्षा आपको दे रहा हूं वह अनौपचारिक होगा। आप स्कूल जा सकते हैं और यह सब एक के साथ सीख सकते हैंऔपचारिक शिक्षा, या यहां तक ​​कि इस पुस्तक को स्कूल में पढ़ें, अपने असाइनमेंट को पूरा करें, और अपनी शिक्षा से बहुत दूर ले जाएं, लेकिन मैं औपचारिक रूप से आपको हॉट सीट पर नहीं डालूंगा और आपको असाइनमेंट पूरा करने के लिए कहूंगा। मैं आपका प्रोफेसर नहीं हूं, आप मेरे बारे में एक ऐसे दोस्त की तरह सोच सकते हैं जो आपको अपनी व्यक्तिगत सफलता द्वारा संचालित कैरियर की ओर मार्गदर्शन करना चाहता है। और मैं आपको सफलता नहीं बेच रहा हूं, आपको इसे अपने समय के साथ खरीदने की आवश्यकता होगी। कोड को सीखने में एक सीखने की अवस्था है और यह कभी भी आसान नहीं था, या यहां तक ​​कि माना जाता है। आपको संभवतः उतनी मेहनत करने की आवश्यकता है जितनी संभव हो सके और कोशिश करना और असफल होना जारी रखें और फिर भी प्रयास करें जब आप खुद को सीखने और बनाने के लिए निराश हैं। यह कोड की प्रकृति में ही है। कोड एक कंपाइलर द्वारा चलाया जाता है जिसे प्रोग्रामर त्रुटि संदेश देने के लिए डिज़ाइन किया गया है, और ये आपको सिखाएंगे कि कैसे कोड करें, भले ही आप अपने खोज इंजन में त्रुटि की नकल कर रहे हों और अन्य लोगों के उदाहरणों को पढ़ रहे हों। और मुझे कहना होगा, आपको बेहद अमीर होने की जरूरत नहीं है, स्मार्ट,एक ऐप बनाने के लिए निबंध, या यहां तक ​​कि विस्तार से उन्मुख या व्यवस्थित। कंप्यूटर आपके लिए उस संगठन की देखभाल करता है। आपको बस परीक्षण और त्रुटि के माध्यम से दृढ़ रहने की आवश्यकता है, ध्यान बनाए रखें और जो आप करते हैं उस पर कड़ी मेहनत करें, और आप जो करते हैं, उसकी संपूर्णता में एक बहुत ही सफल कैरियर होगा। मैं कौन हूं: मुझे एहसास है कि अंतिम खंड सीखने के बारे में अधिक था और इस पुस्तक से आपका एक तरीका है। मैं वास्तव में कौन हूँ? यह एक जटिल प्रश्न है। मैं उस पर स्पष्ट नहीं हूं, क्योंकि मैं चिकित्सा स्थितियों से पीड़ित हूं, जो मेरे लिए कई बार कोड या इस पुस्तक को भी लिखना मुश्किल बना सकता है, जबकि समाजीकरण और पहचान के मुद्दों के साथ चुनौतियां पेश करते हैं जो मेरे जीवन को और अधिक कठिन बनाते हैं जब यह अपना परिचय देने की बात आती है । संक्षेप में, यदि आप इस पुस्तक को पढ़ रहे हैं, तो आप इसे घर ले आए क्योंकि आप इसके माध्यम से फ़्लिप किए और सोचा कि यह उपयोगी था, या यहां तक ​​कि अगर आप अभी तक पढ़ते हैं, तो आप एक ऐसे व्यक्ति की तरह हैं जो आपको सफल होना चाहते हैं सब कुछ जो आप करते हैं। मैं खुद एक इंजीनियर हूं,डेवलपर, और एक छात्र, और मैं इस पुस्तक को अन्य छात्रों के लिए लिख रहा हूं, जो सॉफ्टवेयर की एक हैंडबुक होने से अपने जीवन को आसान बनाना चाहते हैं, उन्हें अपने जीवन को आसान बनाने की आवश्यकता है, जो एक बड़ी पहेली की तरह एक साथ एक साथ काम करने के लिए एक साथ मिलकर अपने जीवन को आसान बनाने की आवश्यकता है। , उपयोगी, बड़े, कार्यात्मक, सामंजस्यपूर्ण और आकर्षक ऐप जो व्यवसाय की रेखा से कोई फर्क नहीं पड़ता, सफलता को चला सकता है। मोटे तौर पर, यह वही है जो मैं करता हूं: मैं अपने आप को और अन्य लोगों की मदद करने के लिए ऐप्स का निर्माण करता हूं। मैं एक लेखक भी हूं, हालांकि यह मेरा पहला प्रकाशन है जिसे मैं अपने पोर्टफोलियो को एक उपयोगी दस्तावेज में एक साथ रखने के लिए पूरा करने का इरादा रखता हूं, और मैं एक कलाकार भी हूं। मैं आपको यह मानता हूँ, मैं एक अजीब व्यक्ति हूँ। मैं सही नहीं हूं, मैंने कानून के साथ INS चलाया है, यहां तक ​​कि मुझे कॉलेजों और विश्वविद्यालयों को छोड़ने के लिए और अधिक सफलता के साथ खुद के लिए एक नाम बनाने की कोशिश करने के लिए राज्यों को छोड़ने के लिए अग्रणी है। मैं जन्म से एक महिला हूं, मैं मेकअप पहनती हूं, खुद की तस्वीरें लेती हूं, कपड़े पहनती हूं, कपड़े और अन्य महिला कपड़े पहनती हूं, और मैं खुद के प्रति सचेत रहती हूंस्वभाव से महिला। मेरे पास अतीत में अन्य लोगों के साथ मुद्दे हैं जो वेबैप लिखने और निर्माण के साथ संघर्ष करते हैं, और मैं माफी मांगता हूं कि मैं इस पुस्तक को आपके हाथों में जल्द ही प्राप्त करने में सक्षम नहीं हूं: आपको इसकी आवश्यकता थी। आप उन कोड को पढ़ना और लिखना चाहेंगे जो मेरा जैसा दिखता है और मेरी तरह काम करता है और एक ही काम करता है, लेकिन इससे भी बेहतर है, क्योंकि अगर आप अपने कीबोर्ड को मैश करने के बजाय इस पुस्तक को खरीद सकते हैं जैसे कि मैं सिर्फ एक किताब बनाने के लिए खुद को पैसे पूछने के लिए करता हूं। इसके लिए, आपके पास ऐसे संसाधन हैं जिन्हें आपको अपने जीवन में सफल होने की आवश्यकता है। मेरे पास परिवार के बड़े होने, स्वास्थ्य की स्थिति, डॉक्टर, मीडिया और कानून के साथ सभी प्रकार के मुद्दे थे, और मेरा कोड उस संघर्ष को गहराई से दर्शाता है जो एक विभाजित और निराश दुनिया में नारीवाद और महिला प्रकृति है। हालाँकि, यह पुस्तक ऐसी चीज है जिसके बारे में मैं गहराई से परवाह करता हूं, मेरे बच्चे, मेरे पोर्टफोलियो और मेरी आजीविका, इसलिए मैं आपके विचार की सराहना करता हूं जब आप पाठ को घर लेते हैं और मुझसे सीखने के लिए ध्यान से उस पर ध्यान से पोर करते हैं। कृपया ध्यान रखें कि मैं नहीं हूंect, इस पुस्तक में त्रुटियां, संशोधन और नए संस्करण होंगे, और आपको अपने तार्किक मस्तिष्क के साथ सोचने की आवश्यकता होगी कि आप मेरे लेखन के साथ एक सफल अनुभव प्राप्त करने के लिए सबसे अच्छा कर सकते हैं। इसके अलावा, यह समझें कि जब आप लिखते समय चुनौतियों का सामना करते हैं, तब भी मेरा मतलब है। इसके बारे में इस तरह से सोचें: जब आप कुछ भी करने के लिए एक कंप्यूटर सिस्टम किराए पर ले सकते हैं, तो आप संभवतः डिजिटल स्पेस में कल्पना कर सकते हैं, आपके द्वारा की गई सभी जानकारी को संग्रहीत कर सकते हैं, #$%! Yze और इसे व्यवस्थित करें, और इसे समझने के लिए, आप करेंगे, आप करेंगे अनिवार्य रूप से उस जानकारी के साथ कठिनाइयों का सामना करना पड़ता है जिसे आप अंतर्ग्रहण कर रहे हैं और यहां तक ​​कि प्रकाशन भी। मैं आपको यह बताता हूं क्योंकि मैं उसी कठिनाइयों का सामना करता हूं। अपने स्वयं के जोखिम पर इस पुस्तक का उपयोग करें, अपने समुदाय और समुदायों के साथ काम करें जो आपके लिए एक सुरक्षित सेटिंग के भीतर सॉफ़्टवेयर बनाने के लिए उपलब्ध है, और जब आप असफल होते हैं या गलत तरीके से सफल होते हैं, तो व्यक्तिगत रूप से चीजों को न लें: यह है कि मुझे यह कैसे मिला है , और क्यों मैं आपको यह पाठ क्यों ला सकता हूं और पागलपन के रास्ते पर बिना किसी विचलन के सफल होने में मदद करता हूंमुझे बर्बाद कर दिया, फटा हुआ और भयावह है, जबकि मैं सामान्य समस्याओं का सामना करता हूं, जो हर कोई वैश्विक स्तर पर करता है, जिस पर हम काम करेंगे, इंटरनेट पर हम काम करेंगे। आप बहुत परिचित नहीं हो सकते हैं कि मैं केवल कुछ शब्दों के साथ कौन हूं, लेकिन मैं आपको पढ़ने के लिए प्रोत्साहित करता हूं, आप मुझे जानेंगे कि आप अपने काम को पूरा करने के लिए अपनी परियोजनाओं का निर्माण करते समय मुझे पढ़ना और समझना जारी रखेंगे। इस पुस्तक के साथ कोई होमवर्क नहीं होगा, जब तक कि आपके प्रोफेसर या शिक्षक आपको कोई भी असाइन नहीं करते हैं, लेकिन मैं आपको खुद को प्रोजेक्ट्स का एक पोर्टफोलियो बनाने के लिए प्रोत्साहित करता हूं जैसा कि आप साथ पढ़ते हैं, साथ ही साथ एक कैपस्टोन प्रोजेक्ट भी दिखाते हैं कि आप कैसे कर सकते हैं जो आपने सीखा है उसे लागू करें। मेरी कैपस्टोन प्रोजेक्ट इस पुस्तक में जो कुछ भी आप पढ़ेंगे, उसमें से अधिकांश के लिए आधार है, क्योंकि इसमें मेरी पिछली परियोजनाओं, कोड को शामिल किया गया है, जिसे मैंने बनाया है और हाथ से व्यवस्थित रूप से लिखना सीखा है, और विचारों और युक्तियों की एक विस्तृत श्रृंखला जिसने मुझे मदद की है। उस बिंदु पर सफल हो जहां मैं एक साधारण ऐप को स्पिन कर सकता हूंपूरी तरह से चित्रित किया गया है और एक लोकप्रिय ऐप की तरह दिखता है और व्यवहार करता है जिसे आप अपने दोस्त या परिवार को इंटरनेट पर उपयोग करते हुए देख सकते हैं, आपको या समाचार में विज्ञापित कर सकते हैं। यह पुस्तक क्या है: यह पुस्तक उदाहरण के लिए एक ट्यूटोरियल है। आप यहां कोड पा सकते हैं, कोड को कैसे सीखें, डिबगिंग कोड की जानकारी और त्रुटियों को ठीक करने के लिए निर्देश, समस्या निवारण चरणों, अपने कोड को वापस कैसे सहेजें और फिर से तैनात करें, यदि कोई भी आपके कोड को तोड़ता है, तो अपने कोड को सुरक्षित करें, तैनात करें। आपका कोड, इंटरैक्टिव वेबसाइटों का निर्माण करें जो मनोरंजक, आकर्षक और नशे की लत हैं, और आपको यह समझ में आएगा कि मैं कौन हूं, क्यों महत्वपूर्ण है, और अपने आप को, अपने ऐप और कंपनी की छवि को कैसे चित्रित करें, साथ ही साथ आपके अंतिम उपयोगकर्ताओं, आपकी वेबसाइट के आगंतुकों के लिए संभव के रूप में सबसे आकर्षक होने के लिए आप जो सॉफ़्टवेयर का निर्माण करते हैं, वह सबसे अच्छा प्रकाश में बनता है। इस पुस्तक में, मैं एक प्लेटफ़ॉर्म के साथ -साथ सुरक्षा के रूप में वेब पर ध्यान केंद्रित करने के साथ सॉफ्टवेयर डिजाइन के कई उदाहरणों का प्रदर्शन करूंगा। हम एक बुनियादी निर्माण करके सीखने के अनुभव को शुरू करेंगेबैकअप और स्क्रिप्टिंग सुविधाओं के साथ यूनिक्स शेल का उपयोग करके ओजेक्ट करें। फिर, हम एक बुनियादी ब्लॉग वेबसाइट की जांच करेंगे, हमारे ब्लॉग को फोटो और वीडियो सुविधाओं के साथ अपग्रेड करेंगे और साथ ही इन सुविधाओं का उपयोग मुफ्त सॉफ्टवेयर का उपयोग करके सुरक्षा समाधानों को नियोजित करने के लिए करेंगे, और एक प्लग करने योग्य प्रमाणीकरण मॉड्यूल (PAM) का उपयोग करके हमारे सर्वर को सुरक्षित करेंगे। फिर हम अन्य अवधारणाओं के बीच वीडियो एडिटिंग, वॉयस डोनेशन, बारकोड स्कैनिंग और ऑप्टिकल कैरेक्टर रिकग्निशन की खोज करते हुए फाइल हैंडलिंग और प्रोसेसिंग की समीक्षा करेंगे। जिस तरह से हम एपीआई की जांच करेंगे, जो हमें अपने सॉफ़्टवेयर को मुफ्त और भुगतान किए गए विकल्पों के साथ अधिक उपयोगी और सुरक्षित बनाने में मदद करेगा। जिस तरह से, हम भौतिक सुरक्षा और आतंकवादी उपकरणों जैसे कि आग्नेयास्त्रों और मुनिशन डिजाइन और विनिर्माण जैसे बैरल और रिपीटर डिजाइन, बुर्ज और ड्रोन डिजाइन, और अन्य प्रिंसिपल शामिल हैं, जो हम अपने सॉफ़्टवेयर की सुरक्षा के लिए मौजूदा नेटवर्क पर अपने सॉफ़्टवेयर के साथ एकीकृत करेंगे। और आत्मरक्षा और प्रतिद्वंद्वी को प्रदर्शित करता है। हम गेम, 2 डी और 3 डी के निर्माण के रास्ते में ब्रेक लेंगेइंजन एंडिंग इंजन, और बुनियादी आयामी रेंडरिंग सॉफ्टवेयर के केस स्टडी उदाहरणों में एम्बेडेड हार्डवेयर के साथ काम करें और क्रमशः सिलिकॉन रबर में एक इलेक्ट्रॉनिक वाइब्रेटिंग मालिश कास्ट। जिस तरह से, हम अपने सॉफ़्टवेयर को बेहतर ढंग से सुरक्षित करने के लिए पहले से ही उपलब्ध मशीन लर्निंग सॉल्यूशंस को भी नियोजित करेंगे। हम प्रक्रिया को सुव्यवस्थित और सुरक्षित करने के लिए वेब के लिए उपलब्ध स्टॉक टूल भी लगाएंगे। यह पुस्तक एक वेब एप्लिकेशन के निर्माण में आपकी सफलता के लिए एक मार्गदर्शिका है और इसे कंप्यूटर और एम्बेडेड मैकेनिकल सिस्टम के एक पेशेवर नेटवर्क के साथ एकीकृत करना है, और कुल मिलाकर सॉफ्टवेयर बनाने के लिए एक गाइड और कोई पृष्ठभूमि ज्ञान या पिछले अनुभव के साथ हार्डवेयर एम्बेडेड है। यह पुस्तक क्या नहीं है: यदि आप वास्तव में एक वेबसाइट चाहते हैं, तो आप बस एक साधारण स्टोर सेट कर सकते हैं और जो आपको चाहिए, उसे बेच सकते हैं, एक ब्लॉग पोस्ट करें, फ़ोटो या वीडियो पोस्ट करें, या अन्यथा कभी भी एक ही लाइन कोड लिखे बिना। यह पुस्तक वह नहीं है। यह पुस्तक आपको सिखाएगी कि कैसे सॉफ्टवेयर का निर्माण किया जाए जो अधिक उपयोगी हो, पूरी तरह सेकिसी भी सॉफ़्टवेयर की तुलना में विशेष रूप से, कार्यात्मक और सुरक्षित, जिसे आप पहले से ही पा सकते हैं, क्योंकि यह नवीनतम सॉफ़्टवेयर को तैनात करता है जो अभी भी प्रोटोटाइप है, एक पैमाने पर चलने वाली पुरानी कंपनियों पर चलाने के लिए महंगा हो सकता है, और पीछे की ओर अपील नहीं करता है, कन्ट्रॉल्यूटेड कंपनियों को स्थापित किया गया है। उन लोगों के लिए पैसा कमाएं जो वास्तव में कुछ भी नहीं कर रहे हैं। यदि आप इस पुस्तक का बारीकी से पालन करते हैं, तो आप कोड, रिसर्च कोड लिखना चाहेंगे, अपने स्वयं के ऐप्स का निर्माण करेंगे, और आप जो करते हैं उससे पैसे कमाएंगे। मैं इस पुस्तक से पैसे कमाऊंगा, यहां तक ​​कि शुरुआती चरणों में भी, क्योंकि इसमें उन जानकारी शामिल हैं जिन्हें लोगों की आवश्यकता है और पढ़ना चाहते हैं, और पहले से ही खरीद रहे हैं जब वे मेरे ऐप्स खरीदते हैं या उपयोग करते हैं। यह पुस्तक आपके लिए एक ऐप का निर्माण नहीं करेगी, लेकिन यह आपको सही दिशा में इंगित करेगा और आपको उन उपकरणों के साथ बांटना होगा जिनकी आपको आवश्यकता है और कौशल और युक्तियां जो वेब के लिए सॉफ्टवेयर बनाने में आपकी खुद की सफलता की सुविधा प्रदान करेंगे, हर पंक्ति के साथ कोड आपको एक उदाहरण के रूप में लिखने की आवश्यकता होगी, आप सॉफ्टवेयर और आपके समर्थकों, मेहमानों, ग्राहक में एक साथ एक साथ तैयार होने के लिए तैयार हैं,Riends, परिवार, आगंतुक, ठेकेदार, और इंटरनेट के लोग उपयोग और समर्थन करना चाहते हैं। आप क्या सीखेंगे: यह पुस्तक आपको सिखाएगी कि कैसे सॉफ्टवेयर, वास्तव में कार्यात्मक, उपयोगी सॉफ़्टवेयर, मीडिया रिकॉर्डिंग, चेहरे की पहचान, मशीन पठनीय ज़ोन बारकोड स्कैनिंग, वेब एपीआई को प्रमाणित करने, रिकॉर्ड और रेंडर करने के लिए वीडियो और फ़ोटो, और ब्लूटूथ जैसे संदेशों का आदान -प्रदान करने के लिए सुरक्षा सुविधाएँ कैसे सिखाएगी। और क्षेत्र (NFC) संचार के पास। यह पुस्तक आपको सिखाएगी कि कैसे एक नेटवर्क कंप्यूटर का उपयोग करें, डेबियन लिनक्स पर ध्यान केंद्रित करते हुए, अपने सॉफ़्टवेयर को एक सीमलेस, स्वचालित ब्रीज़ को स्थापित करने और बैकअप देने के लिए बैश कोड का निर्माण कैसे करें, कैसे डायनेमिक मैसेज, स्टाइल की सेवा के लिए पायथन कोड का निर्माण करें। बूटस्ट्रैप के साथ सीएसएस शैलियों का उपयोग करना अच्छी तरह से चीजें, नेटवर्क डिवाइस के माध्यम से उपयोगकर्ता लॉगिन और अन्तरक्रियाशीलता को सक्षम करें, अन्य वेबसाइटों के साथ इंटरैक्टिव मीडिया और नेटवर्क का निर्माण करें, जो सत्यापन या अन्य के लिए पाठ संदेश जैसी सुरक्षा सुविधाओं की पेशकश करते हैं उद्देश्य, आईडी स्कैनिंग, छवि और वीडियो मॉडरेशन, डेटाअपने सॉफ़्टवेयर को सुरक्षित रखने, भुगतान प्रसंस्करण, क्रिप्टोक्यूरेंसी ट्रेडिंग, एसिंक्रोनस कार्यों और बहुत कुछ रखने के लिए। आप सीखेंगे कि बैटरी, चार्जर्स, माइक्रोकंट्रोलर, सर्किट, मोटर्स और सेंसर के साथ, सोल्डर, वायर और 3 डी प्रिंट के साथ -साथ कास्ट सामग्री का उपयोग करके अपने स्वयं के ब्लूटूथ डिवाइस का निर्माण कैसे करें। मैं एडिटिव मैन्युफैक्चरिंग और टूल और डाई मेकिंग पर लागू 3 डी डिज़ाइन प्रिंसिपलों को प्रदर्शित करूंगा, इसलिए आप एकीकृत बैटरी, चार्जर, इलेक्ट्रॉनिक सर्किट और कार्यात्मक आउटपुट के साथ अपने स्वयं के एम्बेडेड, हार्डवेयर डिवाइस का निर्माण करने में सक्षम हैं। और उन्हें ब्लूटूथ और वेब के साथ नेटवर्क करें। विशेष रूप से, हम दो केस स्टडीज, एक वाइब्रेटिंग मसाज और एक होममेड बन्दूक की जांच करेंगे, दोनों ओपनकैड में प्रोग्राम किए गए हैं, जो कि ग्राफिकल इंटरफ़ेस या कमांड लाइन यूटिलिटी के रूप में उपलब्ध है और इसे तेज परिणाम के लिए एक वेब में एकीकृत किया जा सकता है। आप सीखेंगे कि बिना किसी पूर्व अनुभव के जमीन से एक वेबसाइट का निर्माण और तैनात कैसे करें, इसे कार्यात्मक, सुरक्षित, सुंदर, उपयोगी और सबसे अधिक बनाएंmportately व्यावहारिक। आप सीखेंगे कि साइट को सुरक्षित और अधिक व्यावहारिक बनाने के लिए मशीन लर्निंग और कंप्यूटर विजन का उपयोग कैसे करें, अपनी वेबसाइट से अधिक व्यावहारिक, रिकॉर्ड वीडियो और ऑडियो को रिकॉर्ड करें, अपनी आवाज दान करें, संगीत बनाएं और उपयोगी नमूने बनाने के लिए ऑडियो को मॉड्यूलेट करें, और कैसे शोर के माध्यम से तोड़ना करें वेबसाइटों के सर्वोत्तम संभव नेटवर्क का निर्माण करने के लिए अन्य वेबसाइटों का लाभ उठाना, जिन्हें आप अपने द्वारा पेश की जाने वाली सभी उपयोगी जानकारी को साझा करने के लिए सीधे अपने से लिंक कर सकते हैं, और इससे भी महत्वपूर्ण बात यह है कि लोगों को आपके सॉफ़्टवेयर और व्यवसाय में लाएं। इस पुस्तक को मीडिया, सुरक्षा और मशीन लर्निंग पर सबसे अधिक ध्यान केंद्रित किया जाएगा, जो प्रमुख तीन घटक हैं जो आपको सही उपयोगकर्ताओं को उलझाकर वेब के लिए उपयोगी सॉफ़्टवेयर बनाने और गलत लोगों को इस तरह से विघटित करने में मदद करेंगे जो यथार्थवादी, व्यावहारिक, व्यावहारिक है, हाथ पर और आकर्षक, जबकि स्वचालित, और मजबूत भी। यह पुस्तक यूनिक्स, विशेष रूप से डेबियन (उबंटू), बैश शेल, पायथन, एचटीएमएल, सीएसएस, जावास्क्रिप्ट और कई उपयोगी सॉफ्टवेयर पैकेजों के लिए सिखाती हैn अनुरोधों की तरह, साथ ही साथ GIT और FFMPEG जैसे उपयोगी बैश सॉफ्टवेयर। मैं आपको यह भी सिखाऊंगा कि क्रिप्टोक्यूरेंसी को स्वचालित रूप से कैसे व्यापार किया जाए, और क्रिप्टोक्यूरेंसी में या नियमित डेबिट कार्ड से भुगतान किया जाए, जबकि आप अपने आगंतुकों को अपने राजस्व का एक हिस्सा भी भुगतान करते हैं यदि आप ऐसा करना चुनते हैं। मैं आपको सिखाऊंगा कि कैसे विज्ञापन के माध्यम से अपनी वेबसाइट से पैसे कमाएं, कैसे खोज इंजन के लिए अपने ऐप को तैयार करें और इसे तेजी से बनाएं, पहली रैंकिंग में रैंक किया गया है कि आपके ग्राहक आपको खोजने के लिए क्या खोजेंगे, और कई सामान्य रूप से रैंकिंग संभव के रूप में खोज। मैं आपको सिखाऊंगा कि आप अपने सॉफ़्टवेयर को कैसे बेचें, इसका विज्ञापन करें, अपनी सेवाओं की तलाश करने वाले ग्राहकों से अपील करें, और पहले से मौजूद रास्ते में इंटरनेट पर अपने लिए एक नाम बनाएं, जो पहले से मौजूद हैं, सस्ती हैं, और अच्छी तरह से काम करते हैं। मैं आपको सिखाऊंगा कि आपके डेटा को क्लाउड कंप्यूटरों पर कैसे सहेजा जाए जो आपके लिए काम करते हैं और आपके डेटा को सस्ते में सहेजते हैं, कैसे योजना बनाएं और एक ऐसी वेबसाइट का निर्माण करें जो आपके उपयोगकर्ताओं को क्या चाहते हैं और आप क्या चाहते हैं, और अपने उपयोगकर्ताओं को कैसे संलग्न रखेंअपनी साइट को उनके फोन पर एक टैप दूर करें, जिसमें सूचना, ईमेल, पाठ संदेश, फोन कॉल, और अधिक रास्ते हैं, जो आपके उपयोगकर्ताओं को आपकी वेबसाइट पर वापस लाने के लिए आपके पास ही सुरक्षित एक बटन के क्लिक के पीछे अपने निपटान में हैं। यह पुस्तक बड़ी मात्रा में मीडिया को प्रकाशित करने और वितरित करने की व्यावहारिकता पर ध्यान केंद्रित करेगी, पाठ से लेकर फ़ोटो से लेकर वीडियो तक ऑडियो तक, अंतिम उपयोगकर्ताओं (आपके ग्राहक) पर एक अच्छी छाप बनाती है, और अपने आप को किसी भी तरह से बेचना है जो आप बनाने के लिए करते हैं। एक वेबसाइट, एक ऐप जो आपके और आप का प्रतिनिधि है, और आपको, आपके सॉफ़्टवेयर और आपकी कंपनी को सबसे अच्छे तरीके से अच्छा लगता है। आप मेरे साथ कुछ टिप्स और ट्रिक्स भी सीखेंगे, कोडिंग टिप्स, मेकअप और फोटोग्राफी, मॉडलिंग और अभिनय जैसे व्यावहारिक घमंड से, और अधिक, जो उपलब्ध सभी उपकरणों का उपयोग करके अपने और आपकी कंपनी को सबसे अच्छा संभव प्रकाश में चित्रित करने के लिए महत्वपूर्ण होगा। आपके लिए उतनी ही सामग्री वितरित करते समय जितना आपको अपने लाने के लिए प्लेटफार्मों के एक स्वस्थ संतुलन की आवश्यकता होती हैई अधिक प्रयास, काम, या धन के साथ आवश्यक से अधिक नहीं है। इस पुस्तक को एक कारण के लिए "प्रैक्टिकल वेब आधारित डीप लर्निंग एंड सिक्योरिटी बाय उदाहरण" कहा जाता है: यह कोड को सीखने से संबंधित है, विशेष रूप से वेब के लिए, विशेष रूप से सुरक्षा पर ध्यान केंद्रित करने के साथ, एक व्यावहारिक दृष्टिकोण से, कार्य कोड के उदाहरणों के साथ जो कार्य करता है। पाठ में उल्लिखित व्यावहारिक उद्देश्य। इस पाठ के सीखने के घटक में मशीन लर्निंग भी शामिल है, कोड मैं आपको दिखाएगा कि वेब के लिए कैसे चलाना है जो कंप्यूटर विजन, चेहरे की पहचान, छवि और वीडियो मॉडरेशन, छवि वृद्धि, संकल्प वृद्धि, संकल्प वृद्धि, छवि कैप्शनिंग और अन्य कार्यों को संभालेगा। भविष्यवाणी मेट्रिक्स छवियों से खट्टा है, जैसे कि एक प्रामाणिक, कंप्यूटर-स्थानांतरित छवि, या एक ऑप्टिकल कॉपी (एक छवि की एक तस्वीर, या मुद्रित फोटो) के रूप में छवि की प्रकृति। जब वेब सुरक्षा और सॉफ्टवेयर सुरक्षा की बात आती है, तो मशीन लर्निंग बहुत महत्वपूर्ण है, क्योंकि यह उन कार्यों को लागू कर सकता है जो अन्यथा असंभव थे। आपका कंप्यूटरआपको पासकोड के साथ लॉग इन करें, लेकिन यदि यह आपके चेहरे के साथ लॉग इन करता है तो इसका उपयोग करना सुरक्षित हो सकता है। आप एक सर्वर कंप्यूटर को यह सुरक्षित बना सकते हैं, एक कंप्यूटर जो सामान्य रूप से आपको एक उपयोगकर्ता नाम और पासकोड के लिए पूछेगा और आपको लॉग इन करेगा, शायद प्रत्येक नए लॉगिन या नए आईपी पते के लिए एक पुष्टि टोकन के साथ, लेकिन यदि आप बड़े पैमाने पर निर्माण कर रहे हैं, तो आसान है। उपयोग, मौलिक रूप से सुरक्षित और शक्तिशाली सॉफ्टवेयर, यह पर्याप्त हो सकता है। अपने सॉफ़्टवेयर को किसी और के सॉफ़्टवेयर से बहुत करीब से बांधना, जैसे ईमेल सेवा या पाठ संदेश सेवा, आपके सॉफ़्टवेयर को सुरक्षित करने के लिए पर्याप्त नहीं है, या किसी को भी (आपके द्वारा उपयोग की जाने वाली कोई भी साइट)। जो कोई भी सॉफ्टवेयर बनाता है, वह जो त्रुटिहीन रूप से सुरक्षित है, उसे कुछ समझ में आता है। सॉफ्टवेयर स्वाभाविक रूप से असुरक्षित है क्योंकि हम जिन उपकरणों और खातों का उपयोग करते हैं, वे हमेशा हमारे निपटान में नहीं होते हैं, वे सॉफ्टवेयर के लिए बीमार इरादे वाले किसी भी व्यक्ति के हाथों में हो सकते हैं और इसलिए सॉफ्टवेयर के लिए जोखिम पैदा कर सकते हैं। यह इस पुस्तक का ध्यान केंद्रित है। एक नेटवर्क कंप्यूटर डिफ़ॉल्ट रूप से हैएक लंबी कुंजी टोकन के साथ सुरक्षित, कहा जाता है और SSH या सुरक्षित शेल कुंजी, और अन्यथा एक वेब सर्वर के साथ सबसे अच्छा सुरक्षित है, क्योंकि वेब सर्वर ओपन एक्सेस के साथ -साथ सर्वर पर चलने वाले कला सुरक्षा उपकरणों की स्थिति प्रदान करता है। वेब सर्वर के पास उपयोगकर्ता के वेब ब्राउज़र तक पहुंच है, जो यकीनन उपयोगकर्ता के डिवाइस का सबसे शक्तिशाली हिस्सा है, क्योंकि यह वह स्थान है जहां उपयोगकर्ता नेटवर्क सॉफ़्टवेयर तक पहुंच सकता है। यह टूलकिट पाठ को प्रस्तुत कर सकता है, आपके द्वारा देखे जाने वाले वेबपेज, और छवियों, ऑडियो और वीडियो (जैसे कि एक चेहरे या एक राज्य आईडी की तस्वीर) को रिकॉर्ड कर सकते हैं, ब्लूटूथ रेडियो उपकरणों को पढ़ और लिख सकते हैं, और पास फ़ील्ड को पढ़ और लिख सकते हैं। ट्रांसपोंडर टैग, सस्ती कुंजी कार्ड, एफओबी, स्टिकर, रिंग्स और यहां तक ​​कि चिप प्रत्यारोपण अद्वितीय सीरियल नंबरों के साथ जिन्हें वेब साइट से बंधे वेब सर्वर द्वारा उत्पन्न और मान्य डेटा के साथ पढ़ा और लिखा जा सकता है। अपने निपटान में सभी उपकरणों का उपयोग करते हुए, इस पुस्तक के साथ आप खुद को एक सुरक्षित वेबसाइट बनाने के लिए ज्ञान से लैस करेंगे, और कुल मिलाकर एURE नेटवर्केड कंप्यूटर सिस्टम जो आपके लिए काम करता है, आपकी बोली लगाता है, और सही लगता है और लगता है। कहां से शुरू करें: आप उस खंड को छोड़ने के लिए स्वागत करते हैं, जिसे मैं इस पुस्तक के साथ शुरू करता हूं, या किसी भी खंड के साथ, सटीक कोड के लिए, विशेष रूप से यदि आपके पास पहले या उपरोक्त उपकरणों में से किसी के साथ कोडिंग के साथ अनुभव है, तो मैं इस पुस्तक में विस्तार से वर्णन करूंगा। साथ ही उपयोग के मामलों और व्यावहारिक उदाहरणों का दस्तावेजीकरण। यदि आपके पास कोड लिखने में अनुभव नहीं है, तो मैं आपको इस पुस्तक के सभी को पढ़ने की सलाह देता हूं, और विशेष रूप से आपको पिछले अनुभागों को पढ़ने की सलाह देता हूं, यह सुनिश्चित करने के लिए कि यह पुस्तक आपके लिए सही है। यदि यह पुस्तक आपके लिए सही नहीं है, तो इसे किसी मित्र या रिश्तेदार को उपहार में देने पर विचार करें, जो स्वयं वेब विकास के बारे में जानने में रुचि रखते हैं, और यहां तक ​​कि इसे वापस उधार लेने पर विचार करें और उनसे सीखने के लिए कि वे अंतराल को भरने के लिए जहां मैं आपको विफल कर देता हूं शिक्षक, या अन्य शिक्षकों ने मेरे सामने किया। यदि आप एक उपयोगी बनाने का इरादा रखते हैं, तो आप जहां करेंगे, इस पुस्तक का हर हिस्सा उपयोगी होगापीपी, और विचार करें कि सबसे अच्छे ऐप्स को अंतिम उपयोगकर्ता को ध्यान में रखते हुए बनाया गया है: अपने ग्राहक को जानें। अब आप मुझे जानते हैं, आप इस पुस्तक को जानते हैं, और आप शुरू करने के लिए तैयार हैं। शुरू करने के लिए, एक कंप्यूटर को पकड़ो (यहां तक ​​कि एक बॉक्स स्टोर, अमेज़ॅन, या एक पुराने डेस्कटॉप से ​​सबसे सस्ता लैपटॉप काम करता है, और इसे एक तरह से सेट करें जो आपके लिए काम करता है। इस पुस्तक को कैसे पढ़ें: पाठ पर प्रकाश डाला गया, यह दर्शाता है कि पाठ एक कमांड प्रॉम्प्ट में है, जहां आप आपके द्वारा चलाए गए कोड को लिखेंगे। कमांड प्रॉम्प्ट भारी कीबोर्ड पर केंद्रित है और इसके लिए कोई क्लिक करने की आवश्यकता नहीं है, अपने वर्कफ़्लो को तेज करना और चीजों को आप पर आसान बनाना है। शुरू करना: चलो गोता लगाते हैं। हम एक स्थानीय मशीन पर कोड का निर्माण शुरू करेंगे और इंटरनेट से जुड़ी वेबसाइट के निर्माण के बिना शुरू करेंगे। यह शुरू करने के लिए सुरक्षित है, कुछ भी नहीं है, और आपके लिए आसान है। आपके ऑपरेटिंग सिस्टम के आधार पर, बैश शेल में शामिल होना थोड़ा अलग होगा। मैक ओएस के लिए, मैं इस बिंदु पर एक वर्चुअल मशीन स्थापित करने की सलाह देता हूं, क्योंकि आपको सबसे अधिक अनुकूलता मिलेगीवर्चुअल मशीन। वर्चुअलबॉक्स और पैरालेल जैसे विभिन्न प्रदाता आपके लिए एक वर्चुअल मशीन चला सकते हैं, हालांकि मशीन पर सीधे उबंटू को स्थापित करना भी संभव है, यदि आप एक देशी वातावरण का उपयोग करना पसंद करते हैं जो एक तेज, सुव्यवस्थित अनुभव बनाने के लिए अनुशंसित है। यदि आप लिनक्स या विंडोज का उपयोग कर रहे हैं, जो मैं सुझाता हूं, तो एक प्रोजेक्ट बनाना काफी आसान होना चाहिए। अपने टर्मिनल को खोलें, जैसा कि आप फिट देखते हैं, आकार को समायोजित करें, और चरण 2 का अनुसरण करें। यदि आप विंडोज का उपयोग कर रहे हैं, तो कृपया चरण 1 का पालन करें। चरण 1: - विंडोज उपयोगकर्ता केवल विंडोज में, व्यवस्थापक और टाइप के रूप में कमांड प्रॉम्प्ट ओपन wsl -install चरण 2: - यहां जारी रखें, या यदि आप विंडोज का उपयोग नहीं कर रहे हैं तो यहां चरण 1 को छोड़ दें एक खुले टर्मिनल में, (आपके ओएस पर निर्भर करता है, जिसे विंडोज में उबंटू कहा जाता है, मैक या लिनक्स में टर्मिनल, या एक समान नाम), एक प्रोजेक्ट बनाकर शुरू होता है। हम इसे MKDIR कमांड के साथ करते हैं, जो एक निर्देशिका बनाता है। यदि आपको अपनी परियोजना को संग्रहीत करने के लिए एक निर्देशिका बनाने की आवश्यकता है, जो अनुशंसित है, का उपयोग करेंसीडी कमांड को निर्देशिका में बदलने के लिए और और CD/PATH/TO/DIRECTORY - पथ फ़ोल्डर (फ़ाइलें) है जो आपकी गंतव्य निर्देशिका से पहले है, आपका डिफ़ॉल्ट पथ ~ या/होम/उपयोगकर्ता नाम है (जहां उपयोगकर्ता नाम आपका उपयोगकर्ता नाम है)। डिफ़ॉल्ट निर्देशिका में बदलने के लिए, सीडी या सीडी टाइप करें ~ MKDIR उदाहरण - निर्देशिका के नाम के साथ "उदाहरण" को बदलें अब आपके पास अपनी परियोजना के लिए एक कार्यशील निर्देशिका है। इस निर्देशिका को सहेजना इतना महत्वपूर्ण है कि यदि आपको एक अलग मशीन पर स्विच करने या आपके द्वारा लिखे गए कोड को तैनात करने की आवश्यकता है, तो यह वेब के लिए तैयार है, हम अगले कुछ चरणों में अपनी निर्देशिका का बैकअप लेने के लिए एक स्क्रिप्ट का निर्माण करेंगे। लेकिन एक स्क्रिप्ट का निर्माण थोड़ा कोड लेता है, और कोड को यथासंभव उपयोगी होने के लिए स्वचालित करने की आवश्यकता है। तो आइए पहले स्क्रिप्ट बनाने के लिए एक स्क्रिप्ट का निर्माण करें। आइए स्क्रिप्ट बनाकर और इसे निष्पादन योग्य बनाकर शुरू करें। हम सूडो का उपयोग करेंगे, CHMOD और इसके लिए स्पर्श करेंगे, और स्क्रिप्ट को कॉल करेंगे


sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
अब हमने स्क्रिप्ट बनाई है, इसे निष्पादन योग्य बना दिया है, और इसे संपादित करने के लिए तैयार हैं। नैनो एक पाठ संपादक है जो आपको बिना क्लिक किए पाठ को संपादित करने देगा, जो कि ग्राफिकल यूजर इंटरफेस का उपयोग करने की तुलना में बहुत आसान है। नैनो के साथ एक फ़ाइल को संपादित करने के लिए, नैनो और फिर फ़ाइल के लिए मार्ग का उपयोग करें। एक स्क्रिप्ट बनाने के लिए जो एक स्क्रिप्ट बनाती है, यह हमारी स्क्रिप्ट को पहले स्थान पर बनाने के समान है। हम ऊपर के रूप में उसी कोड का उपयोग करेंगे, स्क्रिप्ट के नाम की जगह, एक तर्क पैरामीटर, $ 1 के साथ "Ascript"। यह हमें केवल SUDO Ascript Newscript टाइप करके स्क्रिप्ट को कॉल करने देता है, जिस बिंदु पर हम आपकी स्क्रिप्ट के नाम के साथ "न्यूज़स्क्रिप्ट" को बदलकर कोई भी नई स्क्रिप्ट बना सकते हैं। नैनो में कोड की तरह दिखना चाहिए:

sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
और नैनो को बंद करने के लिए, हम नियंत्रण कुंजी को पकड़ सकते हैं और x को दबा सकते हैं, फिर y को निरूपित करने के लिए हम फ़ाइल को सहेज रहे हैं, और रिटर्न हिट कर रहे हैं। अब एक स्क्रिप्ट को संपादित करने के लिए इन तीन कमांडों को टाइप करने के बजाय, हम स्क्रिप्ट को फिर से संपादित करने के लिए सूडो Ascript Ascript टाइप करने में सक्षम होंगे। यह सही है! और किसी भी नई स्क्रिप्ट को शेल में कॉल करके आसानी से चलाया जा सकता है। आइए अब हमारे काम को सहेजें: आइए हमारी नई स्क्रिप्ट को बचाने के लिए एक बैकअप स्क्रिप्ट लिखें और फिर इसे हमारी प्रोजेक्ट डायरेक्टरी में वापस करें, जबकि बैकअप स्क्रिप्ट का बैकअप लें।

sudo ascript backup
अब, नैनो में:

sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
MKDIR के साथ आपके द्वारा बनाई गई परियोजना का मार्ग कहां/पथ//निर्देशिका है। बाद में हम सीखेंगे कि एक लूप और एक सूची के साथ इस तरह की दोहराव वाले रास्तों को कैसे कॉपी किया जाए, जो कम कोड है, लेकिन अब आइए इसे सरल रखें और कुछ लाइनें हों। इस स्क्रिप्ट को चलाने और अपने कोड को बैकअप करने के लिए, फाइल को नैनो में कंट्रोल+x, y और रिटर्न के साथ सहेजें, और नीचे अपने शेल में टाइप करें

backup
यदि आपको इस पुस्तक को पढ़ते समय और शेल में अनुसरण करते समय एक पासवर्ड के लिए संकेत दिया जाता है, तो कृपया अपना उपयोगकर्ता पासवर्ड सही ढंग से दर्ज करें, कमांड को फिर से चलाने से पहले आपको तीन कोशिशें होंगी। आप ऊपर और नीचे तीर का उपयोग कर सकते हैं और उन्हें संपादित करने और उन्हें संपादित करने के लिए, क्या आपको दो बार कुछ भी चलाने की आवश्यकता है। सिंपल प्रेस अप और डाउन रुक -रुक कर एक कमांड का चयन करने के लिए, कमांड को दाएं, बाएं तीर के साथ संपादित करने से पहले और कीबोर्ड के साथ -साथ कीबोर्ड को हटा दें, और इसे रिटर्न के साथ चलाएं। बधाई हो! आप एक भयानक बैकअप स्क्रिप्ट बनाने में कामयाब रहे, जो अपने कार्यशील निर्देशिका में दो महत्वपूर्ण शेल स्क्रिप्ट का समर्थन करती है। हम बाद में चीजों को स्थानांतरित कर सकते हैं क्योंकि परियोजना बड़ी हो जाती है, लेकिन यह अभी के लिए काम करता है। चलो क्लाउड में बैकअप लेने के लिए आगे बढ़ते हैं, हम इसके लिए GitHub का उपयोग करेंगे (हालांकि बैकअप के लिए कई अन्य Git समाधान हैं, वे सभी एक ही हैं।) Git एक Version Control सॉफ्टवेयर है जो आपको अपने संपादन को वापस करने देता है सॉफ्टवेयर के रूप में आप उन्हें एक सर्वर के लिए बनाते हैं, जबकिइसके अलावा आपको पासवर्ड या कुंजी के पीछे अपने सॉफ़्टवेयर की पूरी प्रतियां डाउनलोड करने में सक्षम हैं। यह आपके सॉफ़्टवेयर को बचाने में महत्वपूर्ण है, विशेष रूप से जब हम सुरक्षित लिनक्स उदाहरणों में माइग्रेट करते हैं, जो कभी -कभी तब टूट जाते हैं जब कोड की एक लाइन विफल हो जाती है, तो आपको लॉक कर दिया जाता है, जबकि आपका कोड वापस नहीं किया जा सकता है यदि आपको इसे वापस करने का मौका नहीं मिलता है स्वचालित रूप से, जिसे हम कवर करेंगे। यदि आप पहले से ही इस बिंदु पर एक Ubuntu वर्चुअल मशीन का उपयोग नहीं कर रहे हैं, तो मैं इस बिंदु पर एक Ubuntu वर्चुअल मशीन का उपयोग कर सकता हूं क्योंकि यह एक काम करने वाली वेबसाइट बनाने और गहरी सीखने के लिए आवश्यक सभी पैकेजों को स्थापित करते समय आपके जीवन को आसान बना देगा। आपके कंप्यूटर पर संचालन। हम निकट भविष्य में कोड को एक वेब सर्वर पर ले जाएंगे, लेकिन हम यह सुनिश्चित करना चाहते हैं कि हमारे वेब सर्वर के पीछे कम से कम कुछ परतें हैं जो फ़िशिंग के लिए प्रतिरोधी हैं, और करने के लिए कई लिनक्स पैकेजों को नियुक्त करते हैं यह। यदि आप अभी भी मैक ओएस का उपयोग करना चाहते हैं, तो आपको खोज और स्थापित करने के लिए स्वागत हैई आवश्यक पैकेज ऑनलाइन, लेकिन इस पुस्तक या श्रृंखला को कवर करने वाले हर पैकेज के लिए विकल्प नहीं हो सकते हैं। आइए कमांड सूडो Ascript चलाकर बैकअप स्क्रिप्ट के साथ हमारे काम करने के लिए कुछ कमांड जोड़ें

# …
git add –all
git commit -m “backup”
git push -u origin master
एक बार फिर, सहेजने के लिए एक्स को नियंत्रित करें। अब हमें इस परियोजना के लिए कुछ समय कॉन्फ़िगरेशन करने की आवश्यकता है। क्योंकि यह जल्द ही एक गिट प्रोजेक्ट होगा, हमें हर बार हर कमांड को टाइप करने की आवश्यकता नहीं है, जब हम एक गिट रिपॉजिटरी से तैनात करते हैं, लेकिन जब हम अपनी तैनाती स्क्रिप्ट लिखते हैं तो हम इसे लटकाएंगे। शुरू करने के लिए, आइए सुनिश्चित करें कि हम सही निर्देशिका में हैं और Git रिपॉजिटरी को इनिशियलाइज़ करते हैं और SSH कुंजी उत्पन्न करते हैं।

cd /path/to/directory
git init
git branch -m master
ssh-keygen
SSH-KEYGEN टाइप करने के बाद, नई कुंजी को होम फ़ोल्डर में एक फ़ोल्डर के तहत सहेजा जाना चाहिए जिसे .ssh कहा जाता है। इसे id_rsa.pub कहा जाता है। आइए इस कुंजी को ढूंढें और इसे कॉपी करें। इसे देखने के लिए,

cd ~
cat .ssh/id_rsa.pub
अंतिम कमांड द्वारा लौटाए गए पाठ को कॉपी करें, और अपने खाते में SSH कुंजी जोड़ने से पहले, अपने Git प्रदाता (आदर्श रूप से GitHub) के साथ एक खाता बनाएं। एक बार जब आपके पास कोई खाता है, तो मेनू में एक्सेस के तहत SSH और GPG कुंजी में अपनी SSH कुंजी जोड़ने से पहले ऊपरी दाएं मेनू पर क्लिक करें और सेटिंग्स दर्ज करें। एक SSH कुंजी जोड़ें और एक नया रिपॉजिटरी बनाने के लिए GitHub में लौटने और लौटने से पहले इसे चिपकाकर और इसे एक शीर्षक देकर अपना जोड़ें। यह अन्य GIT प्रदाताओं के लिए समान है, आपको उनके दस्तावेज पढ़ने की आवश्यकता होगी। नए रिपॉजिटरी कॉन्फ़िगरेशन में, अपने रिपॉजिटरी को एक वर्णनात्मक नाम दें और यह तय करें कि आप इसे प्रकाशित करना चाहते हैं, और अभी तक समावेश के लिए कोई फ़ाइलों को कॉन्फ़िगर करना सुनिश्चित करें। एक बार रिपॉजिटरी बनाने के बाद, SSH URL के साथ क्लोन कॉपी करें, और इसे निम्न कमांड में पेस्ट करें।

git remote add git://… (your remote URL)
अब आप सीडी के साथ अपने रिपॉजिटरी में वापस जा सकते हैं, आप इससे परिचित होंगे। बैकअप के साथ अब अपनी बैकअप स्क्रिप्ट का प्रयास करें महान! अब हम वास्तव में कोडिंग प्राप्त कर सकते हैं। अब Django स्थापित करते हैं कि हम बैश और git पर एक अच्छी समझ है। Django हमें अपने सॉफ़्टवेयर को स्वचालित रूप से वापस करने देगा, बैश भी ऐसा कर सकता है, लेकिन Django में एक सरल सुरक्षित कार्यान्वयन होना चाहिए (इसे अक्षम किया जा सकता है और अधिक आसानी से कॉन्फ़िगर किया जा सकता है)। Ubuntu में सॉफ़्टवेयर स्थापित करने के लिए, हम SUDO Apt-Get कमांड का उपयोग करेंगे। सबसे पहले, आइए हम पहले से मौजूद सॉफ़्टवेयर को अपडेट और अपग्रेड करते हैं। यह sudo apt-get अपडेट और sudo apt-get अपग्रेड -Y के साथ किया जा सकता है। इसके बाद, चलो पायथन और हमारे आभासी वातावरण, हमारे कोड का घर, निम्न कमांड के साथ स्थापित करें: sudo apt-get python-is-python3 python3-venv स्थापित करें यह सब आपको Ubuntu उदाहरण में सॉफ्टवेयर इंस्टॉल के मामले में Django के साथ जाने की आवश्यकता है। विंडोज और लिनक्स के लिए यह काफी सीधा होना चाहिए, लेकिन मैक के लिए आप एक वर्चुअल मशीन स्थापित करना चाहते हैं औरवर्चुअलबॉक्स या पैरालेल्स डेस्कटॉप जैसे मुफ्त या भुगतान किए गए वर्चुअल वातावरण का उपयोग करके लिनक्स उस पर और उबंटू वातावरण को सेटअप करने के लिए ऊपर दिए गए चरणों को फिर से बनाएं। उबंटू इस मामले में महत्वपूर्ण है क्योंकि यह सॉफ्टवेयर है जो वेबसाइटें चलती हैं और यह उन्हें उपरोक्त सभी सॉफ्टवेयर के साथ वेबसाइटों की मेजबानी करने में सक्षम बनाता है। चलो Django में खुदाई करते हैं। हमारी निर्देशिका में फिर से, साथ

python -m venv venv # वर्चुअल वातावरण बनाता है जहां कोड संग्रहीत होता है
source venv/bin/activate # आभासी वातावरण को सक्रिय करता है
pip install Django
django-admin startproject mysite . # जहां MySite वह परियोजना है जो मैं अपनी वर्तमान निर्देशिका में शुरू कर रहा हूं।
Django बस हमें शुरू कर रहा है, क्योंकि Django वेब सर्वर की मेजबानी कर रहा है और वह सब कुछ कर रहा है जो हमें एक बुनियादी स्थानीय वेबसाइट प्राप्त करने और चलाने के लिए आवश्यक है। अब जब हमारे पास Django स्थापित है, तो आइए सेटिंग्स को थोड़ा संपादित करें ताकि यह काम करने के लिए कि हमें कैसे चाहिए। सबसे पहले, आइए एक नया ऐप बनाएं

python manage.py startapp feed
आप देखेंगे कि पहले ऐप को फ़ीड कहा जाता है। ऐप को जो कुछ भी पसंद है, उसे बुलाया जाना चाहिए, और हम नए ऐप बनाएंगे, लेकिन प्रत्येक ऐप का नाम हर बार जब एप्लिकेशन को कोड में संदर्भित किया जाता है, तो यह लगातार होना चाहिए। एक नया ऐप जोड़ने के लिए, हम हमेशा सेटिंग्स को संपादित करेंगे। नैनो का उपयोग करना,

nano app/settings.py
सेटिंग्स में, इंस्टॉल किए गए_Apps ढूंढें और [] को 3 लाइनों में अलग करें। खाली केंद्र रेखा पर चार स्थानों का उपयोग करके, 'फ़ीड', या अपने ऐप का नाम जोड़ें। सेटिंग्स का यह खंड।

INSTALLED_APPS = [
    'feed',
]
इससे पहले कि हम भूल जाएं, चलो परीक्षण करें कि Django काम कर रहा है। कमांड पायथन Manage.py Runserver 0.0.0.0:8000 का उपयोग करते हुए, हम सर्वर चला सकते हैं और फिर कंप्यूटर पर एक वेब ब्राउज़र में नेविगेट कर सकते हैं, जो Http: // localhost: 8000 पर कोड चला रहे हैं और एक उदाहरण वेबपेज देखें (यह काम करता है!) नियंत्रण C के साथ सर्वर को छोड़ दें, किसी भी अन्य कमांड के समान। अब, चलो कुछ पायथन कोड लिखने में खुदाई करते हैं। Django के तीन मुख्य घटक हैं, वे सभी पूरी तरह से कोड द्वारा चलते हैं। घटकों को मॉडल, व्यू और टेम्पलेट कहा जाता है, और प्रत्येक उपयोगकर्ता को वेबपेज देने से पहले क्रमशः उच्च और निचले स्तर पर होता है। मॉडल वह कोड है जो डेटाबेस में पुनर्प्राप्ति, क्रम और प्रतिपादन के लिए जानकारी संग्रहीत करता है। दृश्य तय करता है कि मॉडल को कैसे प्रदान किया जाता है, हेरफेर किया जाता है, और संशोधित किया जाता है, लगभग हर दृश्य सीधे एक मॉडल का उपयोग करेगा। टेम्पलेट HTML कोड है जिसमें कुछ अतिरिक्त घंटियाँ और सीटी टेम्पलेट भाषा कहा जाता है। टेम्पलेट को उस दृश्य द्वारा प्रदान किया जाता है जहां यह पायथन कोड से भरा है औरदृश्य से मॉडल और सूचना (usuall स्ट्रिंग्स और पूर्णांक) जैसे संदर्भ। Django के अन्य घटक भी हैं, जिनमें शामिल हैं, लेकिन सीमित नहीं: सेटिंग्स, जो ऐप को कॉन्फ़िगर करती है जैसा कि हमने चर्चा की थी। URL, जो पैटर्न हैं कि उपयोगकर्ता वेब एप्लिकेशन के विशिष्ट भागों तक पहुंच प्राप्त करने के लिए अनुसरण करता है। फॉर्म, जो यह परिभाषित करते हैं कि सर्वर को भेजी जाने वाली जानकारी को कैसे संभाला जाता है और डेटाबेस के साथ -साथ उपयोगकर्ता को भी प्रदान किया जाता है। ये सर्वर साइड पर प्रसंस्करण जानकारी की नींव हैं, और किसी भी प्रकार की जानकारी को कंप्यूटर स्टोर, सबसे विशेष रूप से टेक्स्ट स्ट्रिंग्स, नंबर और ट्रू/फाल्स बूलियन (आमतौर पर चेकबॉक्स) को स्वीकार कर सकते हैं। टेम्प्लेट, जो HTML कोड और टेम्प्लेट भाषा हैं और पायथन और HTML के बीच की खाई को पाटते हैं, जिसका अर्थ है कि पायथन की जानकारी को HTML कोड के रूप में परोसा जा सकता है जिसे कोई भी एक्सेस कर सकता है और प्रतिबंधित एक्सेस के साथ एक वेबसाइट को सुरक्षित कर सकता है, जबकि पायथन कोड को वेब और उपयोगी के लिए सुलभ बना सकता है। एक दूरस्थ डिवाइस पर विभिन्न उद्देश्यों के लिए जो नहीं करता हैEED सर्वर के पास होना चाहिए। स्टेटिक फाइलें, जो आमतौर पर जावास्क्रिप्ट होती हैं और यह लाइब्रेरी होती है जो सर्वर परोसती है और टेम्पलेट के साथ जुड़ी होती है। मीडिया फाइलें, जो सर्वर परोसती है या बाहरी रूप से होस्ट की जाती है, या केवल प्रोसेस किए जाने से पहले सर्वर को लिखी जाती है और होस्टिंग के लिए किसी अन्य सर्वर (एक बकेट) पर पोस्ट की जाती है। मिडिलवेयर, जो कोड के टुकड़े हैं जो हर दृश्य के रूप में एक ही समय में चलाए जाते हैं और दृश्य में "शामिल" माना जाता है। संदर्भ प्रोसेसर, जो प्रत्येक दृश्य के संदर्भ को संसाधित करते हैं और अतिरिक्त संदर्भ जोड़ने के लिए उपयोग किए जाते हैं। परीक्षण, जो मान्य करते हैं कि उपयोगकर्ता या अनुरोध दृश्य प्रदान करने से पहले कुछ आवश्यकताओं को पारित करता है। उपभोक्ता, जो यह तय करते हैं कि WebSockets कैसे संभालते हैं और संचार का जवाब देते हैं। व्यवस्थापक, जिसका उपयोग मॉडल को पंजीकृत करने के लिए किया जाता है ताकि उन्हें Django व्यवस्थापक पृष्ठ के भीतर विस्तार से हेरफेर किया जा सके, जहां डेटाबेस को एक ग्राफिकल इंटरफ़ेस के माध्यम से प्रशासित किया जा सकता है। अजवाइन, जो Django कोड के अतुल्यकालिक कार्यों को परिभाषित करता हैNNING तुरंत अगले कार्य या कोड की लाइन के लिए आगे बढ़ने से पहले। Django में कई अन्य घटक हो सकते हैं, जिन पर हम यहां विस्तार से चर्चा करेंगे। Django को अधिक कार्यात्मक बनाने के बहुत सारे तरीके हैं, Websockets जोड़ते हैं, जो तेज, सुव्यवस्थित संचार चैनल, अजवाइन हैं, जो अतुल्यकालिक कार्यों को निष्पादित करता है, और Django का विस्तार करने के लिए सॉफ़्टवेयर के अन्य टुकड़ों की एक भीड़, विशेष रूप से दृश्य कार्यों में, जहां अधिकांश में से अधिकांश कोड निष्पादित किया जाता है। दृश्य कार्य महत्वपूर्ण हैं क्योंकि वे आमतौर पर कोड के प्रत्येक टुकड़े को घोषित करते हैं जो एक विशिष्ट URL पैटर्न, या सर्वर के एक खंड के लिए विशिष्ट है। सबसे पहले, आइए व्यू फ़ंक्शंस का पता लगाएं। देखें फ़ंक्शंस आयात को दर्शाने वाले कोड के साथ शुरू होते हैं जो दृश्य में उपयोग किए जाएंगे, और नियमित फ़ंक्शन परिभाषाओं या कक्षाओं का उपयोग करके परिभाषित किए जाते हैं। सबसे सरल दृश्य फ़ंक्शन परिभाषा डीईएफ द्वारा परिभाषित किए गए हैं, और एक मूल टेम्पलेट के साथ एक HTTPRESPONSE लौटाएं। आइए "हैलो वर्ल्ड" पाठ को वापस करने के लिए एक बुनियादी दृश्य को परिभाषित करके शुरू करें। याद रखें कि हर बार जब आप जोड़ते हैंDef, If, जबकि, के लिए, आदि जैसे एक बयान को पूरा करें, आपको अपने फ़ंक्शन पर लागू होने वाली प्रत्येक पूर्ववर्ती परिभाषाओं के लिए 4 रिक्त स्थान जोड़ने की आवश्यकता होगी। हम जल्द ही इनमें से प्रत्येक में क्या करेंगे। हमारी साइट की निर्देशिका से, नैनो का उपयोग करके फ़ीड/views.py फ़ाइल को संपादित करें और निम्नलिखित पंक्तियों को अंत में जोड़ें

from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world')
Django का Httpresponse एक टेक्स्ट स्ट्रिंग के साथ प्रतिक्रिया करता है, जिसे उद्घाटन और समापन के साथ दर्शाया गया है। ' हर बार जब आप किसी फ़ंक्शन या क्लास को जानकारी देते हैं, जैसे अनुरोध या स्ट्रिंग, आपको कोष्ठक (, खोलना और बंद) का उपयोग करना होगा। यह सब हम अभी तक अपने दृष्टिकोण को देखने की जरूरत नहीं है। बेशक, हमने सर्वर को यह नहीं बताया कि दृश्य वास्तव में कहां है, हमें अभी भी एक पथ को परिभाषित करने की आवश्यकता है जिसके द्वारा दृश्य को प्रस्तुत करना चाहिए। आइए ऐप/urls.py में एक बुनियादी पथ को परिभाषित करके शुरू करें, और हम बाद में पथ समूहों में मिलेंगे। App/urls.py में, हमने जो दृश्य बनाया था, उसके आयात के आयात के बाद आयात बयानों के बाद एक पंक्ति जोड़ें।

from feed import views as feed_views
अब, आइए व्यू पैटर्न को परिभाषित करें। देखें पैटर्न में तीन घटक होते हैं, पथ घटक, जो सर्वर को बताता है कि दृश्य सर्वर के भीतर मौजूद है (URL पथ जो उपयोगकर्ता को नेविगेशन बार में वेबपेज में प्रवेश करने के लिए टाइप करता है), दृश्य घटक जहां दृश्य निर्दिष्ट किया गया है, और एक दृश्य के लिए अनुकूल नाम इसलिए टेम्पलेट के साथ काम करते समय इसे पुनः प्राप्त करना आसान है, विशेष रूप से इसलिए यह नाम बदला जा सकता है और यदि आवश्यक हो तो किसी अन्य दृश्य के लिए जगह बनाने या अधिक तार्किक नाम लेने के लिए अद्यतन किया जा सकता है। यह इस तरह से चीजों को करने और लचीला होने के लिए समझ में आता है, क्योंकि आपका कोडबेस एक बदलते वातावरण होगा जिसे मूल्यवान और काम करने में आसान होने के लिए लचीलेपन और सुधार की आवश्यकता होती है। यहां आपका दृश्य कैसा दिखेगा, आप इसे urlpatterns = [ऐप/urls.py का अनुभाग जोड़ सकते हैं। दृश्य पैटर्न को ऊपर वर्णित तीन घटकों और पथ नामक एक फ़ंक्शन के साथ परिभाषित किया गया है। आपके URL पैटर्न एक सूची हैं, इसलिए उनमें प्रत्येक आइटम को हमेशा समाप्त करना सुनिश्चित करेंएक अल्पविराम के साथ, क्योंकि यह प्रत्येक को अलग करता है। प्रत्येक आइटम को एक नई लाइन पर भी जाना चाहिए, एक बार फिर से चार रिक्त स्थान के साथ, सेटिंग्स में ऐप की तरह। हम एक खाली स्ट्रिंग फ़ंक्शन के साथ दृश्य के पहले घटक को परिभाषित करेंगे, ताकि वेब सर्वर की रूट डायरेक्टरी पर चलने वाला दृश्य बनाया जा सके। आपका urls.py अब जैसा दिखना चाहिए

from feed import views as feed_views

urlpatterns = [
    path('', feed_views.hello, name='hello'),
]
यह Django के साथ एक वेबसाइट बनाने का आधार है जो पूरी तरह से स्थिर है। एक अधिक गतिशील वेबसाइट बनाने के लिए जहां हम कैशिंग जानकारी शुरू कर सकते हैं, जैसे चित्र, वीडियो, ऑडियो और अधिक, हमें मॉडल का उपयोग करने की आवश्यकता होगी, जिसे हम आगे देखेंगे। अभी के लिए, आइए हमारे कोड की जांच करें और सर्वर को चलाएं। त्रुटियों के लिए कोड की जांच करने के लिए, चलाएँ:

python manage.py check
यदि कोई त्रुटि संदेश हैं, तो आपको अपने ऐप में किए गए परिवर्तनों की सावधानीपूर्वक समीक्षा करनी चाहिए और यह देखना चाहिए कि क्या कुछ ऐसा है जिसे तय करने की आवश्यकता है, जैसे कि एक बाहरी या कमी वाले स्थान, एक अतिरिक्त चरित्र, एक अघोषित स्ट्रिंग, किसी भी टाइपो, किसी भी गलती से हटाए गए चरित्र, या कुछ और। त्रुटि संदेश के माध्यम से पढ़ना (यदि आपके पास एक है), तो आपको एक फ़ाइल के साथ एक फ़ाइल का पथ देखने में सक्षम होना चाहिए या लाइन नंबर के साथ संपादित किया गया है, इसलिए उस फ़ाइल और लाइन को देखें और देखें कि क्या आप कुछ भी ठीक कर सकते हैं जो वहां है । यदि आपने समस्या तय कर ली है, तो उपरोक्त कमांड को फिर से चलाएं। जब आपका सॉफ़्टवेयर चलाने के लिए तैयार होता है और काम कर रहा होता है, तो आपको आउटपुट दिखाई देगा "सिस्टम चेक की पहचान कोई समस्या नहीं है।" अब आप जाने के लिए तैयार हैं। सर्वर को चलाएं:

python manage.py runserver 0.0.0.0:8000
अब एक वेब ब्राउज़र खोलें और http: // localhost: 8000 पर नेविगेट करें। आपको अपने विचार में HTTPRESPONSE फ़ंक्शन के कोष्ठक और उद्धरणों में लौटाया गया पाठ देखना चाहिए। यह सिर्फ एक मूल उदाहरण है, लेकिन अगर आपने इसे दूर कर दिया है, तो आप लिनक्स, बैश, पायथन और Django के काम की मूल बातें समझते हैं। आइए कुछ डेटाबेस मॉडलिंग में गहराई से खुदाई करें, और जानकारी संग्रहीत करने में एक पायथन वर्ग की शक्ति का पता लगाएं। फिर, हम जावास्क्रिप्ट और मशीन लर्निंग का उपयोग करके अपनी साइट को पूरी तरह से चित्रित, लचीला और सुरक्षित बनाने से पहले हम HTML और CSS पर पकड़ प्राप्त करना शुरू कर देंगे। कक्षाएं आपके ऐप के मॉडल में संग्रहीत की जाती हैं। नैनो का उपयोग करके, ऐप/models.py संपादित करें और एक नया वर्ग जोड़ें। एक वर्ग को वर्ग की परिभाषा के साथ परिभाषित किया गया है और इसे एक सुपरक्लास पारित किया गया है, जिससे यह विरासत में मिला है, इस मामले में मॉडल। कक्षा का नाम वर्ग की परिभाषा के बाद आता है, और वर्ग की परिभाषा के बाद A: (बृहदान्त्र) का उपयोग किया जाता है, इससे पहले कि वर्ग से बंधी विशेषताओं और फ़ंक्शन परिभाषाओं को नीचे निरूपित किया जाता है। हमारी कक्षाएक आईडी की आवश्यकता है जिसे हम इसे पुनः प्राप्त करने और इसे अद्वितीय रखने के लिए उपयोग कर सकते हैं, और इसे कुछ जानकारी संग्रहीत करने के लिए एक पाठ क्षेत्र की भी आवश्यकता है। बाद में हम एक टाइमस्टैम्प, फाइलें, बूलियन (सच्ची या झूठी परिभाषाएं जोड़ सकते हैं जो हमारे कोड को मॉडल के साथ क्या करना है, इस बारे में निर्णय लेने में मदद कर सकते हैं, और इसका उपयोग इसे सॉर्ट करने के लिए किया जा सकता है), एक उदाहरण मॉडल को एक उपयोगकर्ता को लॉग इन करने के लिए टाई करने के लिए एक उदाहरण सर्वर में, और अधिक। आइए कोड को अनपैक करें

from django.db import models # आयात जो हमारी कक्षा को परिभाषित करने के लिए उपयोग किया जाता है और यह विशेषताएँ हैं

class Post(models.Model): # हमारी कक्षा की परिभाषा ही
    id = models.AutoField(primary_key=True) # हमारे मॉडल की आईडी, एक स्वचालित रूप से उत्पन्न कुंजी जो हमें मॉडल को क्वेरी करने देगी, इसे अद्वितीय रखेगी, और जब हमें मॉडल के साथ बातचीत करने की आवश्यकता होती है, तो यह उपयोगी होता है।
    text = models.TextField(default='') # हमारे क्लास स्टोर, इस मामले में, कुछ पाठ, एक खाली स्ट्रिंग के लिए डिफ़ॉल्ट।
फाइल को बंद करें और सहेजें जैसा कि हमने पहले किया था। कई अन्य फ़ील्ड और विकल्प हैं जो हम इस वर्ग को अपडेट करेंगे जब हम इस वर्ग को अपडेट करते हैं क्योंकि हमारा ऐप विकसित होता है, लेकिन यह कुछ पाठ पोस्ट करने के लिए ऐप बनाने की बुनियादी आवश्यकताएं हैं। हालाँकि, यह मॉडल अकेले काम नहीं करेगा। जैसा कि पहले वर्णित है, हमें इस मॉडल को काम करने के लिए एक कस्टम दृश्य और कस्टम URL पैटर्न की आवश्यकता होगी, और हमें एक टेम्पलेट के साथ एक फॉर्म की भी आवश्यकता होगी। आइए पहले फॉर्म का पता लगाएं। एक फॉर्म को परिभाषित करने के लिए, नैनो के साथ ऐप/फॉर्म को संपादित करें और निम्न पंक्तियों को जोड़ें। हमें दो आयात, हमारे फॉर्म क्लास, साथ ही हमारे द्वारा बनाए गए मॉडल (Feed.models.post), मॉडल के समान एक वर्ग परिभाषा और मेटा नामक एक उपवर्ग के साथ एक फ़ील्ड की आवश्यकता होगी जो मॉडल को परिभाषित करेगा। साथ। फॉर्म में एक इनिशियलाइज़ेशन फ़ंक्शन भी हो सकता है जो अनुरोध, मॉडल या अन्यथा में जानकारी के आधार पर इसे सेट करता है, हम बाद में इसका पता लगाएंगे। मॉडल फॉर्म इतने उपयोगी हैं क्योंकि वे एक मॉडल बना सकते हैं या एक मॉडल को संपादित भी कर सकते हैं,इसलिए हम दोनों के लिए उनका उपयोग करेंगे। चलो एक रूप में एक को परिभाषित करते हैं

from django import forms
from feed.models import Post

class PostForm(forms.ModelForm):
    text = forms.CharField(widget=forms.Textarea)
    class Meta:
        model = Post
        fields = ('text',)
यह एक रूप और मॉडल कैसा दिखता है, इसकी मूल बातें हैं। इस मॉडल फॉर्म का उपयोग किसी पोस्ट को तत्काल या संपादित करने के लिए किया जा सकता है, इसमें शामिल पाठ को बदलना। हम इस फॉर्म को अगले दृश्य में एकीकृत करते हैं। सबसे पहले, चलो माइग्रेशन बनाते हैं और डेटाबेस को माइग्रेट करते हैं ताकि हमारा कोड मॉडल के साथ बातचीत कर सके जब यह चलता है। ऐसा करने के लिए, निम्नलिखित कमांड चलाएं:

python manage.py makemigrations
python manage.py migrate
इसे निष्पादित करने में एक मिनट का समय लगेगा, लेकिन एक बार जब यह होता है, तो यह आपको सॉफ्टवेयर में दृश्य, मिडिलवेयर या कहीं और में मॉडल तक पहुंचने की अनुमति देगा। आइए एक दृश्य बनाकर जारी रखें जहां हम अपने मॉडल को देख सकते हैं। फ़ीड/views.py संपादित करें और निम्नलिखित कोड जोड़ें, जैसा कि उल्लेख किया गया है। आपको # साइन के बाद कुछ भी जोड़ने की आवश्यकता नहीं होगी, वह कोड टिप्पणी है जो कोड के बारे में जानकारी को निरूपित करने के लिए उपयोग की जाती है। हम अपने मॉडल को विचारों में आयात करके शुरू करेंगे, और इसे एक संदर्भ में जोड़कर जहां हम इसे एक टेम्पलेट में प्रदर्शन के लिए एक सूची के रूप में प्रस्तुत कर सकते हैं। अगला, हम एक टेम्पलेट जोड़ेंगे जहां हम मॉडल के आधार पर एक नई ऑब्जेक्ट बनाने और इसे सर्वर पर पोस्ट करने के लिए फॉर्म और मॉडल को एक बटन के साथ प्रस्तुत कर सकते हैं। यह जटिल लगता है, इसलिए चलो इसे कदम से कदम रखें। इससे पहले कि हम दृश्य खत्म कर दें, आइए एक टेम्पलेट बनाएं जो सिर्फ मॉडल को प्रस्तुत करता है और सुनिश्चित करें कि हम इसे शेल में एक नई पोस्ट बनाकर देख सकते हैं। यहां बताया गया है कि कैसे देखें:

from feed.models import Post
from django.shortcuts import render, redirect
from django.urls import reverse

def feed(request):
    posts = Post.objects.all() # डेटाबेस में अब तक सभी पोस्ट क्वेरी करें
    return render(request, 'feed/feed.html', {
        'posts': posts,
    })
यह सब बहुत सरल लगता है जब तक हम नीचे तक नहीं पहुंचते। रेंडर, पिछले उदाहरण की तरह HTTP प्रतिक्रिया के बजाय फ़ंक्शन द्वारा लौटा दिया गया मान, हमेशा अपने पहले इनपुट के रूप में एक अनुरोध लेता है, एक संदर्भ को स्वीकार करता है (इस मामले में डेटाबेस में पोस्ट), जिसे अब टेम्पलेट में प्रदान किया जा सकता है , और फ़ंक्शन में परिभाषित टेम्पलेट लौटाता है। टेम्पलेट एक HTML दस्तावेज़ होने जा रहा है, जिसमें Jinja2 नामक भाषा का एक छोटा सा हिस्सा है, जो HTML में पायथन की जानकारी प्रदान करता है। टेम्प्लेट बनाना शुरू करने के लिए, फ़ीड में दो निर्देशिकाएं बनाएं।

mkdir feed/templates
mkdir feed/templates/feed
अगला, ऊपर निर्देशिका में एक टेम्पलेट संपादित करें, फ़ीड/टेम्प्लेट/फ़ीड, और इस उदाहरण के लिए कोड जोड़ें। आइए इस उदाहरण के लिए टेम्पलेट को देखें।
 
<!doctype HTML>
<html>
<body>
<legend>Feed</legend>
<hr>
{% for post in posts %}
<p>{{ post.text }}</p>
{% endfor %}
</body>
</html>
 
यह एक बहुत ही सरल टेम्पलेट है। यह HTML टैग खोलने और बंद करने को परिभाषित करता है, एक दस्तावेज़ प्रकार का टैग, एक लीजेंड शीर्षक के साथ एक बॉडी टैग, एक ब्रेक टैग जो स्क्रीन पर एक छोटी लाइन जोड़ता है, और लूप के लिए जो प्रत्येक पोस्ट को एक पैराग्राफ के रूप में पोस्ट की सूची में प्रस्तुत करता है टेम्पलेट। यह सब पोस्ट को प्रस्तुत करने के लिए है, लेकिन डेटाबेस में अभी तक कोई भी नहीं है। चलो शेल के साथ कुछ बनाएं। हम प्रबंधक के साथ शेल चला सकते हैं

python manage.py shell
अब, चलो हमारे पोस्ट मॉडल आयात करते हैं

from feed.models import Post
अगला, हम एक स्ट्रिंग के साथ एक साधारण पोस्ट बनाएंगे और शेल से बाहर निकलेंगे। स्ट्रिंग कुछ भी हो सकता है, जब तक यह मान्य पाठ है।

Post.objects.create(text='hello world')
exit()
अंत में, हमें अपने फ़ीड में एक URL पैटर्न जोड़ने की आवश्यकता होगी। क्योंकि हमारा फ़ीड ऐप कई URL का उपयोग करेगा और हम फ़ाइल आकार को छोटा रखना चाहते हैं, आइए हमारे फ़ीड ऐप में एक स्थानीय urls.py बनाएं जो इस तरह दिखता है:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.feed, name='feed'),
]
हमें बेस ऐप में urls.py को संपादित करने की भी आवश्यकता होगी, जो भी हमने इसे कॉल करने का फैसला किया, यह पहली निर्देशिका थी जिसे हमने बनाया था। App/app.py संपादित करें और URL पैटर्न में निम्नलिखित जोड़ें

from django.urls import include # शीर्ष पर

urlpatterns = [
    # ... पिछला कोड यहाँ
    path('feed/', include(('feed.urls'), namespace='feed')),
]
अब, जब हम पायथन Manage.py Runserver के साथ सर्वर चलाते हैं, तो हम अपने द्वारा बनाए गए पृष्ठ को देखेंगे क्योंकि हमारे पास मॉडल, दृश्य और टेम्पलेट के साथ -साथ URL पैटर्न भी है, साथ ही डेटाबेस में आइटम भी हैं। अगला, आइए हम बनाए गए फॉर्म को लागू करें और अपने पोस्ट बनाना शुरू करें। लेकिन इससे पहले कि हम बहुत अधिक कोड लिखें, आइए पहले लिखी गई स्क्रिप्ट का उपयोग करके एक बैकअप बनाएं, बैकअप। इस स्क्रिप्ट को शेल में चलाएं, कुछ क्षणों की प्रतीक्षा करें, और सभी कोड हमारे गिट रिपॉजिटरी तक समर्थित हो जाएंगे।

backup
फॉर्म को लागू करना अपेक्षाकृत सरल है। हम अपने फॉर्म को आयात करेंगे, दृश्य में एक पोस्ट अनुरोध हैंडलर जोड़ेंगे, और उसी दृश्य पर पुनर्निर्देशित करने से पहले डेटाबेस में पोस्ट को सहेजेंगे। हम पहले से आयात किए गए रीडायरेक्ट फ़ंक्शन का उपयोग कर सकते हैं, और दृश्य पैटर्न के लिए URL प्राप्त करने के लिए रिवर्स नामक एक अन्य फ़ंक्शन। हम इसे स्ट्रिंग 'फीड: फ़ीड' के साथ क्वेरी करेंगे क्योंकि शामिल पैटर्न का नामस्थान फ़ीड है, और दृश्य को फ़ीड भी कहा जाता है।

from feed.forms import PostForm

def feed(request):
    posts = Post.objects.all() # डेटाबेस में अब तक सभी पोस्ट क्वेरी करें
    if request.method == 'POST': # पोस्ट अनुरोध को संभालें
        form = PostForm(request.POST) # फॉर्म का एक उदाहरण बनाएं और उस पर डेटा सहेजें
        if form.is_valid(): # प्रपत्र को मान्य करें
            form.save() # नई वस्तु को सहेजें
        return redirect(reverse('feed:feed')) # एक अनुरोध के साथ एक ही URL पर पुनर्निर्देशित करें
    return render(request, 'feed/feed.html', {
        'form': PostForm(), # फॉर्म को संदर्भ में पास करना सुनिश्चित करें ताकि हम इसे प्रस्तुत कर सकें।
        'posts': posts,
    })
अब, हमें नए फॉर्म के लिए टेम्पलेट को अपडेट करना होगा। हम इसका उपयोग करके ऐसा कर सकते हैं
HTML में टैग करें और एक सबमिट बटन के साथ HTML टेम्पलेट में फॉर्म प्रदान करें। हमें एक सीएसआरएफ टोकन, एक टोकन की भी आवश्यकता होगी जो बाहरी साइटों को पहले एक पृष्ठ लोड किए बिना फॉर्म में पोस्ट करने से रोकता है।
 
<!doctype HTML>
<html>
<body>
<legend>Feed</legend>
<form method=”POST”>
{% csrf_token %}
{{ form }}
<button type=”submit”>New Post</button>
</form>
<hr>
{% for post in posts %}
<p>{{ post.text }}</p>
{% endfor %}
</body>
</html>
 
चलो इसे तोड़ते हैं। एक नया फॉर्म क्लास, एक टोकन, फॉर्म ही और एक सबमिट बटन है। बहुत सरल है, लेकिन जब हम इस पर एक नज़र डालते हैं, तो हम इसे बेहतर बनाना चाहते हैं। यह काम करता है, हम फॉर्म के साथ नए पोस्ट पोस्ट कर सकते हैं और वे अब डेटाबेस में सहेजे जाते हैं। यहां कुछ चीजें चल रही हैं। हम यह घोषित करने के लिए HTML टैग का उपयोग करते हैं कि दस्तावेज़ एक HTML दस्तावेज़ है, हम फॉर्म के लिए टोकन को रेंडर करने के लिए एक टेम्प्लेट टैग ({ %… %}) का उपयोग करते हैं, और फॉर्म को रेंडर करने के लिए दूसरा, {{…}}। हमारे पास ब्लॉक टैग और एक टेम्पलेट टैग का उपयोग करके पाठ को रेंडर करने के लिए एक लूप भी है। ब्लॉक टैग वास्तव में महत्वपूर्ण हैं क्योंकि हम परिभाषित कर सकते हैं कि टेम्पलेट के वर्गों को उनके साथ कैसे प्रदान किया जाता है, और टेम्पलेट टैग इस बात का आधार हैं कि हम अपने कोड में चर कैसे डालते हैं। अब हमें अपने ऐप को बेहतर बनाने की जरूरत है, क्योंकि अभी के लिए यह वास्तव में बुनियादी दिखता है। हम इसे CSS का उपयोग करके, या तो इनलाइन, या दस्तावेज़ में प्रत्येक ऑब्जेक्ट से जुड़ी कक्षाओं में कर सकते हैं। सीएसएस वास्तव में अच्छा है क्योंकि यह पृष्ठ पर सब कुछ बताता है कि यह कैसे दिखना चाहिए,और यह वास्तव में अच्छा लग सकता है। कुछ पुस्तकालय हैं जो ऐसा कर सकते हैं, लेकिन मेरा व्यक्तिगत जाना बूटस्ट्रैप है। बूटस्ट्रैप को उनकी वेबसाइट से डाउनलोड किया जा सकता है,Getbootstrap.com/। एक बार, इंस्टॉलेशन डॉक्स को पढ़ने के लिए बटन दबाएं, और CDN सेक्शन के माध्यम से शामिल कोड को कॉपी करें। आपको हेड नामक एक टैग में, अपने HTML दस्तावेज़ के शीर्ष पर इस कोड की आवश्यकता होगी। इसके अलावा, आइए आगे बढ़ें और एक बेस टेम्पलेट बनाएं ताकि हमें प्रत्येक टेम्पलेट में इन लिंक को फिर से बनाने की आवश्यकता न हो। MKDIR टेम्प्लेट के साथ टेम्प्लेट नामक एक नई निर्देशिका बनाएं, और फिर टेम्प्लेट/base.html को संपादित करें। इसे ऐसा दिखना चाहिए:
 
<!doctype HTML>
<html>
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
 
CSS और जावास्क्रिप्ट, .CSS और .JS फ़ाइलों को कॉपी करना सुनिश्चित करें, क्योंकि हमें भविष्य में हमारी साइट को अधिक कार्यात्मक बनाने के लिए जावास्क्रिप्ट की आवश्यकता होगी। अब, चलो बैश शेल पर लौटते हैं और एक त्वरित कमांड चलाते हैं। याद रखें, यदि आपको कभी भी आभासी वातावरण तक पहुंचने की आवश्यकता है, तो स्रोत venv/bin/सक्रिय करें। यह आपको स्थानीय रूप से पायथन पैकेजों को इस तरह से स्थापित करने देगा जो Django उन्हें एक्सेस करने देता है। Django बूटस्ट्रैप कक्षाओं द्वारा उत्पन्न हमारे रूपों को देने के लिए, हम एक पायथन पैकेज का उपयोग करेंगे, जिसे क्रिस्पी फॉर्म कहा जाता है। हम इसे निम्नलिखित कमांड के साथ डाउनलोड कर सकते हैं

pip install django-crispy-forms
एक बार यह स्थापित हो जाने के बाद, इसे सेटिंग्स में जोड़ें।

INSTALLED_APPS = [
    # … पिछला कोड यहाँ
    'crispy_forms',
]
अब, हमारे फ़ीड टेम्पलेट में वापस, हम कुछ चीजों को हटा सकते हैं। आइए दस्तावेज़ की शुरुआत और अंत को हटा दें और इसे हमारे बेस टेम्पलेट से विरासत के साथ बदलें, विस्तार और ब्लॉक परिभाषा का उपयोग करके। इसके अलावा, हम लोड के साथ एक टेम्पलेट फ़िल्टर आयात और फॉर्म में एक टेम्पलेट फ़िल्टर जोड़ेंगे। अंत में, आइए एक बटन की तरह दिखने के लिए फॉर्म पर बटन पर एक बूटस्ट्रैप क्लास जोड़ें। यह इस तरह दिखना चाहिए:
 
{% extends 'base.html' %}
{% block body %}
{% load crispy_forms_tags %}
<form method=”POST”>
{% csrf_token %}
{{ form|crispy }}
<button type=”submit” class=”btn btn-outline-primary”>New Post</button>
</form>
<hr>
{% for post in posts %}
<p>{{ post.text }}</p>
{% endfor %}
{% endblock %}
 
सुंदर! यह पहले से ही काफी कोड है। अगला, हमें इसका परीक्षण करना चाहिए और सुनिश्चित करना चाहिए कि हम देख सकते हैं कि सब कुछ अच्छा लग रहा है, और यह भी सुनिश्चित करें कि सब कुछ ठीक से काम कर रहा है। पिछले निर्देशों के अनुसार सर्वर को चलाएं और सुनिश्चित करें कि साइट ठीक दिखती है और ठीक काम करती है। अच्छा काम! आप अगले चरण पर जाने के लिए तैयार हैं, जिसमें हम समान URL, फॉर्म, व्यू और टेम्प्लेट का उपयोग करके उपयोगकर्ता लॉगिन कार्यक्षमता जोड़ेंगे। बेस टेम्प्लेट महत्वपूर्ण है, और हम इसे संशोधित करना जारी रखेंगे और आवश्यकतानुसार परिवर्तन करेंगे, लेकिन अब आइए अपनी साइट को और अधिक सुरक्षित बनाने पर ध्यान केंद्रित करें, उपयोगकर्ताओं को उपयोगकर्ता नाम और पासकोड के साथ लॉग इन करने में सक्षम बनाकर, और अंततः और भी महत्वपूर्ण जानकारी है कि आपके ऐप को सुरक्षित रखने में मदद करेगा और केवल आपके स्वयं के खाते को आपके द्वारा सुलभ। ऐसा करने के लिए, हमें Django में निर्मित उपयोगकर्ता मॉडल का उपयोग करना होगा। उपयोगकर्ता मॉडल एक डेटाबेस मॉडल है, जो हमारी पोस्ट की तरह है, जिसे उपयोगकर्ता को वेबसाइट में लॉग इन करने के लिए प्रदान किया जा सकता है। भविष्य में, इससे पहले कि हम साइट को इंटरनेट पर तैनात करें, हम करेंगेइस मॉडल को इसके लिए जिम्मेदार अन्य मॉडलों के साथ विस्तारित करें, और लॉगिन के लिए अतिरिक्त सुरक्षा उपायों का निर्माण करें जो फ़िशिंग के लिए प्रतिरोधी हैं। हम कुछ निर्मित लॉगिन रूपों का उपयोग करके शुरू करेंगे जो Django प्रदान करता है। सबसे पहले, आइए एक नया ऐप बनाएं जिसका उपयोग हम मूल लॉगिन पेज के लिए टेम्प्लेट और विचारों को प्रस्तुत करने के लिए करेंगे। हम ऐप को सुरक्षित करने के लिए निरंतर लॉगिन चुनौतियों का प्रतिनिधित्व करने के लिए अन्य ऐप भी बनाएंगे, जिसमें एक पिनकोड, चेहरे की पहचान, क्षेत्र संचार के पास, बाहरी उपकरणों, मल्टी फैक्टर प्रमाणीकरण और फिंगरप्रिंट मान्यता शामिल हैं। हमने पहले ही एक ऐप शुरू करने के बारे में बात की थी। हमारी निर्देशिका से, आभासी वातावरण के अंदर, प्रबंधित करें।

python manage.py startapp users
अब, हमारे पास नए ऐप के लिए एक निर्देशिका होनी चाहिए। आइए उस निर्देशिका में एक दृश्य बनाकर शुरू करें जो उपयोगकर्ता लॉगिन से मेल खाती है। Django ने उपयोगकर्ता लॉगिन के लिए विचारों में बनाया है, लेकिन ये हमारे लिए उपयुक्त नहीं होंगे क्योंकि हमें एक कस्टम दृश्य की आवश्यकता है, जो अधिमानतः एक परिभाषा के साथ किया जाता है। इस दृश्य में, हम पोस्ट अनुरोध के लिए जाँच करके शुरू करेंगे, अनुरोध पास करें। उपयोगकर्ताओं/views.py में, निम्न कोड जोड़ें

from django.shortcuts import render, redirect
from django.urls import reverse
from django.contrib.auth.forms import AuthenticationForm, SetPasswordForm
from django.contrib.auth import authenticate, logout
from django.contrib.auth import login as auth_login
from django.contrib import messages

def login(request):
    if request.method == “POST”:
        username = request.POST['username'] # पोस्ट अनुरोध से उपयोगकर्ता नाम और पासवर्ड प्राप्त करें
        password = request.POST['password'] # उपयोगकर्ता को प्रमाणित करें
        user = authenticate(username=username, password=password)
        if user:
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
            messages.success(request, 'Your password was accepted. Please continue')
            return redirect(reverse('feed:feed'))
        else: messages.warning(request, 'Username or password incorrect. Please try again')
    return render(request, 'users/login.html', {'form': AuthenticationForm()})
यह सब आपको एक बुनियादी लॉगिन दृश्य की आवश्यकता है। अब, आइए बेस टेम्पलेट को बढ़ाकर दृश्य के लिए एक फॉर्म बनाएं। हम उपयोगकर्ताओं के फ़ोल्डर में टेम्प्लेट के लिए एक नई निर्देशिका बनाकर शुरू करेंगे।

mkdir users/templates
mkdir users/templates/users
अब, हमें उपयोगकर्ताओं/टेम्प्लेट/उपयोगकर्ताओं/login.html को संपादित करने में सक्षम होना चाहिए। जब हम इस पर होते हैं, तो हम उपयोगकर्ता को साइन अप करने की अनुमति देने के लिए एक टेम्पलेट बनाएंगे।

nano users/templates/users/login.html
अब, टेम्पलेट में,
 
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<form method="POST">
    {% csrf_token %}
    <fieldset class="form-group">
        <legend class="border-bottom mb-4 break">Log In</legend>
        {{ form|crispy }}
    </fieldset>
    <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Login</button>
    </div>
</form>
{% endblock %}
 
यह एक लॉगिन टेम्पलेट की मूल बातें है। यह वास्तव में संरचना में अन्य टेम्पलेट की तरह है, लेकिन जब यह प्रस्तुत किया जाता है तो यह थोड़ा अलग दिखता है। हम इस कोड को एक और समान समान टेम्प्लेट बनाने के लिए कॉपी कर सकते हैं जिसे रजिस्टर। Html कहा जाता है, जहां हम शब्दांकन को बदल देंगे और हमारे द्वारा निर्मित एक नए रूप का उपयोग करेंगे। चलो पहले टेम्पलेट बनाते हैं। उपयोगकर्ताओं/टेम्प्लेट/उपयोगकर्ताओं को संपादित करें/register.html और निम्न कोड जोड़ें:
 
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<form method="POST">
    {% csrf_token %}
    <fieldset class="form-group">
        <legend class="border-bottom mb-4 break">Create an account</legend>
        {{ form|crispy }}
    </fieldset>
    <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Register</button>
    </div>
</form>
{% endblock %}
 
अब, आइए अपने उपयोगकर्ता पंजीकरण के लिए एक फॉर्म बनाएं और एक मॉडल के साथ अपने उपयोगकर्ता लॉगिन को अपग्रेड करने से पहले दृश्य पर वापस जाएँ। हम इस फॉर्म को शुरू करने के लिए बुनियादी बना देंगे, लेकिन भविष्य में अधिक विवरण और सुरक्षा सुविधाओं जैसे कि समझौतों और कैप्चा को शामिल करें। नैनो उपयोगकर्ताओं/forms.py के साथ फॉर्म संपादित करें, और निम्न कोड जोड़ें।

from django import forms
from django.contrib.auth.models import User
from django.contrib.auth.forms import UserCreationForm

class UserRegisterForm(UserCreationForm):
    email = forms.EmailField()

    class Meta:
        model = User
        fields = ['username', 'email', 'password1', 'password2']
इसलिए हमारे पास यहां एक और रूप है, जो काफी सरलता से काम करता है। यह उपयोगकर्ता नाम, ईमेल और पासवर्ड के साथ एक उपयोगकर्ता रजिस्टर फॉर्म है, साथ ही एक पुष्टि पासवर्ड फ़ील्ड भी है। ध्यान दें कि यह फॉर्म नियमित रूपों का विस्तार नहीं करता है। वर्ग वर्ग, यह एक मॉडल फॉर्म है जिसका अर्थ है कि इसमें मेटा है। एक फ़ील्ड को केवल एक ही परिभाषित किया गया है, और क्लास मेटा मॉडल को परिभाषित करता है जो प्रपत्र बाकी जानकारी से मेल खाता है जो फॉर्म में लिखा जाएगा। इसमें से अधिकांश पहले से ही Django के UserCreationForm में निर्मित हैं, इसलिए हम इसका उपयोग वर्ग के आधार के रूप में करेंगे (कोष्ठक में पारित)। इसके बाद, हम एक उपयोगकर्ता को पंजीकृत करने के दृश्य की जांच करेंगे, अब हमारे पास एक फॉर्म और एक टेम्पलेट है। यह एक मोडफॉर्म है, जैसे नए पोस्ट व्यू में एक। उपयोगकर्ताओं को संपादित करें/views.py और निम्न कोड जोड़ें:

# … राशियाँ
from .forms import UserRegisterForm

def register(request):
    if request.method == “POST”:
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            messages.success(request, 'Welcome to the app, {}.'.format(user.username))
    return render(request, 'users/register.html', {'form': UserRegisterForm})
यह सब हमें एक उपयोगकर्ता को पंजीकृत करने की आवश्यकता है, लेकिन हमारे पास अधिक जानकारी होनी चाहिए। हम उस समय को जानना चाहते हैं जो उपयोगकर्ता पंजीकृत था, वे किस समय साइट पर थे, उनके बारे में कुछ जानकारी, जैसे कि जीवनी, टाइमज़ोन, आदि। इसके अलावा, हमें उपयोगकर्ता के लिए खाते में अपने फ़ीड मॉडल, पोस्ट को अपडेट करने की आवश्यकता होगी प्रत्येक उपयोगकर्ता को मॉडल और विशेषता पोस्ट। ऐसा करने के लिए, हम दोनों ऐप्स में मॉडल को अपडेट करेंगे। आइए फीड मॉडल को संपादित करके शुरू करें। यह अब इस तरह दिखना चाहिए:

from django.db import models # … राशियाँ
from django.contrib.auth.models import User

class Post(models.Model):
    id = models.AutoField(primary_key=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # इस लाइन में जोड़ें
    text = models.TextField(default='')
फ़ाइल में जोड़े गए दूसरी पंक्ति पर ध्यान दें। यह एक विदेशी कुंजी है, जो प्रत्येक पोस्ट को प्रति पोस्ट एक एकल उपयोगकर्ता को विशेषता देगा, इसलिए हम यह सुनिश्चित कर सकते हैं कि हम पोस्ट को उपयोगकर्ता-प्रति-उपयोगकर्ता आधार पर सहेजते हैं और कोई भी पोस्ट उपयोगकर्ता को इसे जिम्मेदार ठहराए बिना नहीं बनाया जा सकता है। हम इस विदेशी कुंजी को उस वर्ग के साथ परिभाषित करते हैं जो यह प्रतिनिधित्व करता है, पोस्ट सुनिश्चित करने के लिए एक डिलीट तर्क उपयोगकर्ताओं के साथ हटा दिया जाता है, शून्य और खाली तर्क यह सुनिश्चित करने के लिए कि हम उपयोगकर्ता को हटा सकते हैं यदि आवश्यक हो, और हम पहले से ही पोस्ट पर उपयोगकर्ता की कमी के लिए समायोजित कर सकते हैं बनाया गया, और एक संबंधित नाम, जिसका उपयोग हम उपयोगकर्ता द्वारा बनाए गए पोस्ट ऑब्जेक्ट को संदर्भित करने के लिए कर सकते हैं। यह संबंधित नाम, पोस्ट के लेखक के विपरीत, पोस्ट के लेखक, हमें उपयोगकर्ता देता है जिसने पोस्ट को स्वयं पोस्ट किया था। अब हम उन पोस्ट को प्राप्त कर सकते हैं जो user.posts.all (), या लेखक.पोस्ट्स। सभी () को चलाकर बना सकते हैं। अब, आइए हमारे लॉगिन को और अधिक लचीला बनाएं। हम पहले से ही अपनी साइट को फ़िशिंग के लिए बहुत कम असुरक्षित बना सकते हैं, बस उस समय की संख्या को सीमित करके हम एक लॉगिन को अनुमति देंगेसाइट, यह काफी आसान है। आइए प्रत्येक उपयोगकर्ता के बारे में कुछ जानकारी संग्रहीत करना शुरू करें क्योंकि हम अपना ऐप विकसित करना जारी रखते हैं। उपयोगकर्ताओं/मॉडल को संपादित करना, निम्नलिखित जोड़ें

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
    account_created = models.DateTimeField(default=timezone.now)
    last_seen = models.DateTimeField(default=timezone.now)
    can_login = models.DateTimeField(default=timezone.now)
    preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
    bio = models.TextField(blank=True, default='')
ध्यान दें कि यह मॉडल पोस्ट मॉडल के समान है। हमारे पास एक अतिरिक्त आयात है, टाइमज़ोन, जो हमें डेटाइम फ़ील्ड पर डिफॉल्ट सेट करने की अनुमति देगा, और हमारे पास पोस्ट की तरह एक CharacterFeild और TextField भी है। इन सभी टाइमस्टैम्प का उपयोग करने से हमें साइट को सुरक्षित करने और इसके उपयोग को समझने में मदद मिलती है, और पाठ फ़ील्ड हमें वेबसाइट पर प्रत्येक उपयोगकर्ता, या लेखक के बारे में जानकारी प्रदान करते हैं। OnetOonefield एकमात्र मामूली विचार होना चाहिए, यह वास्तव में एक पूर्वगामी के समान व्यवहार करता है, लेकिन केवल एक बाद के मॉडल के साथ। इस तरह, उपयोगकर्ता के पास केवल एक प्रोफ़ाइल है, जबकि उनके पास कई पोस्ट हो सकते हैं। अब, आइए हमारे लॉगिन में सुधार करें और प्रोफ़ाइल के लिए ध्यान देने के लिए विचारों को पंजीकृत करें। सबसे पहले, उपयोगकर्ताओं/विचारों को संपादित करें और रजिस्टर दृश्य पर ध्यान केंद्रित करें:

# … राशियाँ
from .forms import UserRegisterForm

def register(request):
    if request.method == “POST”:
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            Profile.objects.create(user=user) # उपयोगकर्ता के लिए एक प्रोफ़ाइल बनाने के लिए, इस लाइन को जोड़ना सुनिश्चित करें
            messages.success(request, 'Welcome to the app, {}.'.format(user.username))
    return render(request, 'users/register.html', {'form': UserRegisterForm})
यह केवल किसी भी जानकारी को भरने के बिना, उपयोगकर्ता के लिए एक प्रोफ़ाइल बनाता है। अब, हम यह सुनिश्चित करना चाहते हैं कि उपयोगकर्ता खाता बहुत बार लॉग इन नहीं किया जा सकता है, या कम से कम पासवर्ड को अक्सर आजमाया नहीं जा सकता है, इसलिए आइए लॉगिन दृश्य को अपडेट करें।

# … राशियाँ
from .models import Profile
from django.utils import timezone
import datetime

def login(request):
    if request.method == “POST”:
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user and user.profile.can_login < timezone.now(): # ध्यान दें कि अब हम जांचते हैं कि क्या उपयोगकर्ता लॉग इन कर सकता है
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
            messages.success(request, 'Your password was accepted. Please continue.')
            return redirect(reverse('feed:feed'))
        else: # यदि लॉगिन सफल नहीं था,
            messages.warning(request, 'Username or password incorrect. Please try again.')
            user = User.objects.filter(username=username).first() # यह वह हिस्सा है जहां हम उपयोगकर्ताओं को प्रोफ़ाइल अपडेट करते हैं
            if user: 
                profile = user.profile
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # इसलिए वे कुछ सेकंड के लिए फिर से लॉग इन नहीं कर सकते
                profile.save()
    return render(request, 'users/login.html', {'form': AuthenticationForm()})
यह सुरक्षा का मूल मौलिक है। सुनिश्चित करें कि साइट किसी के लिए असुरक्षित नहीं है, बस हर संभव पासवर्ड संयोजन की कोशिश कर रहा है, या यहां तक ​​कि उनमें से कुछ एक ही समय में भी। यह उस साधारण उपयोगकर्ता के लिए निराशाजनक नहीं होगा जो अपने पासकोड को जानता है और बस कुछ उपकरणों पर लॉग इन करता है, लेकिन यह कई फ़िशिंग रोबोटों को ऐप से बाहर रखेगा। ध्यान दें कि हमने एक चर, CAN_LOGIN के साथ एक IF स्टेटमेंट जोड़ा, जो अतीत में एक समय होना चाहिए, और इसे उसी उपयोगकर्ता नाम का उपयोग करके प्रत्येक असफल लॉगिन के साथ अपडेट करना चाहिए। इस तरह, एक दुर्भावनापूर्ण उपयोगकर्ता जल्दी से पास कहीं भी पासवर्ड का अनुमान लगाने में सक्षम नहीं होगा। DateTime.Timedelta () में सेकंड की संख्या को भी अपडेट किया जा सकता है, और वेबसाइट अधिक सेकंड के साथ अधिक लचीला अभी तक थोड़ा कम उपयोग करने योग्य होगी। मैं 15 के साथ शुरू करने की सलाह देता हूं। याद रखें, हमने अपने काम को बचाने के लिए एक बैकअप स्क्रिप्ट का निर्माण किया, तो चलिए आगे बढ़ते हैं और हमारे पास अब तक जो कुछ भी है, वह सुनिश्चित करने के लिए कि हमारे पास सब कुछ बच गया है। कमांड चलाएं:

sudo backup
एक बार फिर, यह आपके काम को अब तक बचाएगा। मैं अपने काम को बचाने के लिए लगातार बैकअप चलाने की सलाह देता हूं, और आप स्वचालित रूप से बैकअप नौकरी भी चलाना चाह सकते हैं। आप क्रोन नामक यूनिक्स उपयोगिता का उपयोग करके ऐसा कर सकते हैं। इस उपयोगिता को सक्रिय करने के लिए, निम्न कमांड चलाएं और अपना पासवर्ड दर्ज करें:

sudo crontab -e
यदि आपने पहले से ही नैनो के लिए विकल्प 1 का चयन नहीं किया है, तो पाठ संपादक आपको पहले से परिचित होना चाहिए, और तीर कुंजियों का उपयोग करके फ़ाइल के नीचे स्क्रॉल करें। निम्न पंक्ति जोड़ें:

0 * * * * sudo backup
क्रोन प्रारूप मिनट, घंटे, महीने का दिन, महीने, सप्ताह का दिन का उपयोग करता है, जहां एक * या एक संख्या का प्रतिनिधित्व करता है जब कमांड चलाना है। मिनट के लिए 0 और * बाकी विकल्पों के लिए * का उपयोग करके, हम मिनट की शुरुआत में हर घंटे के पहले मिनट पर एक कमांड चला सकते हैं। यह हमें स्वचालित रूप से कोड वापस करने देता है। सूडो के साथ निष्पादित होने पर क्रोन की सभी नौकरियां रूट के रूप में चलती हैं, इसलिए हमें हर घंटे पासवर्ड टाइप करने की आवश्यकता नहीं होगी। पासवर्ड का उपयोग किए बिना हमारे कोड का बैकअप लेना आसान बनाने के लिए, आइए हमारे बैकअप कमांड के लिए पासवर्ड को अक्षम करें। हम निम्नलिखित कमांड को निष्पादित करके और पासवर्ड दर्ज करके ऐसा करेंगे:

sudo visudo
अब, चलो फ़ाइल के नीचे स्क्रॉल करें और एक और पंक्ति जोड़ें:

ALL ALL=NOPASSWD: /bin/backup
यह हमें पासवर्ड के बिना किसी भी उपयोगकर्ता के रूप में कमांड "बैकअप" चलाने देता है। इसके लिए प्रारूप आसान है, बस "सभी = nopasswd:/bin/" के साथ लाइन को उपसर्ग करें और कमांड के साथ समाप्त करें, उदाहरण के लिए/बिन/बैकअप, जो/USR/BIN/में मौजूद है। अब, आइए ईमेल के साथ काम करना शुरू करें। वेबसाइटों के लिए ईमेल वास्तव में महत्वपूर्ण है, क्योंकि यह एक वेबसाइट को अधिक सुरक्षित रखने का एक तरीका है, सत्यापित करें कि उपयोगकर्ता वास्तविक लोग हैं, और यहां तक ​​कि ग्राहकों के लिए बाजार उत्पाद या सेवाएं भी हैं। बहुत से लोग जो अक्सर इंटरनेट को रोजाना अपने ईमेल की जांच करते हैं, और उन उत्पादों और सेवाओं के बारे में सभी प्रकार के मार्केटिंग ईमेल प्राप्त करते हैं जिनमें वे रुचि रखते हैं। कुछ विकल्प हैं जब यह एक Django वेबसाइट पर ईमेल को सक्षम करने की बात आती है, और आप चुनने के लिए स्वागत करते हैं जो भी आपके लिए सबसे अच्छा काम करता है। सबसे पहले, आप एक ईमेल सेवा के लिए भुगतान कर सकते हैं जो आपको अपने डोमेन से ईमेल भेजने में सक्षम करेगा और न्यूनतम कोड की आवश्यकता है। कई सेवाएं हैं जो इसे प्रदान करती हैं, जैसे कि Google कार्यक्षेत्र, Sendinblue, Mailgun, और बहुत कुछ। अन्यथा, आप अच्छी तरह से इमारत से दूर हैंखरोंच से अपने सर्वर के भीतर आपकी अपनी ईमेल सेवा। मैं इस विकल्प की सलाह देता हूं, भले ही यह अधिक कोड हो और विशेष होस्टिंग की आवश्यकता हो। आप अपने होम कंप्यूटर से एक मेल सर्वर शुरू करने में सक्षम नहीं होंगे, इसलिए चलो आगे बढ़ें और क्लाउड में एक सर्वर शुरू करने और अपने स्वयं के मेल सर्वर बनाने से पहले ईमेल भेजने के लिए कॉन्फ़िगरेशन और कोड की जांच करें। सबसे पहले, निम्नलिखित के साथ सेटिंग्स को संपादित करें

nano app/settings.py
जहां ऐप आपके द्वारा StartApp के साथ बनाए गए ऐप का नाम है। निम्नलिखित पंक्तियाँ जोड़ें:

SITE_NAME = 'Django App'

EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'localhost'
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_ADDRESS = username@server.com'
EMAIL_HOST_USER = 'username'
EMAIL_HOST_PASSWORD = config['EMAIL_HOST_PASSWORD']
DEFAULT_FROM_EMAIL = '{} <{}>'.format(SITE_NAME, EMAIL_HOST_USER)
जब आप अपने ऐप को तैनात करने के लिए तैयार होते हैं, तो इन्हें बदलना सुनिश्चित करें, हम बाद में इसे फिर से करेंगे। Email_address सेटिंग वह ईमेल होनी चाहिए जिसे आप भेजना चाहते हैं, और पासवर्ड (ईमेल_हॉस्ट_पासवर्ड) को उस सर्वर के लिए आपके द्वारा उत्पन्न पासवर्ड पर सेट किया जाना चाहिए। मैं एक कॉन्फ़िगर फ़ाइल से पासवर्ड लोड करता हूं, इसे निम्नलिखित तर्क का उपयोग करके कोड से बाहर रखने के लिए, सेटिंग्स में इन लाइनों के ऊपर।

import os
import json
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
फिर, मैंने nano का उपयोग करके /etc/config.json में कॉन्फ़िगरेशन के साथ एक JSON फ़ाइल सेट की है। फ़ाइल को संपादित करने के लिए:

sudo nano /etc/config.json
निम्नलिखित पंक्तियाँ जोड़ें:

{
	“EMAIL_HOST_PASSWORD”: “<some password here>”
}
हम कॉन्फ़िगर फ़ाइल को संपादित करना जारी रखेंगे और उन सभी पासवर्डों और कुंजियों को जोड़ेंगे जो हम ऐप में उपयोग करेंगे। अभी के लिए, आइए जल्दी से जांचें कि पायथन का उपयोग करके ईमेल कैसे भेजें। सबसे पहले, आइए एक सत्यापन ईमेल के लिए एक टेम्पलेट बनाएं जिसे हम अपने उपयोगकर्ताओं को भेज सकते हैं, और इसे उपयोगकर्ता टेम्प्लेट निर्देशिका में डाल सकते हैं। यह टेम्पलेट HTML में लिखा जाएगा।

nano users/templates/users/verification_email.html
 
<h1>Django App - Verify Your Email</h1>
<p>Dear {{ user.username }},</p>
<p>To verify your email, please <a href="{{ base_url }}{% url 'users:activate' uidb64=uid token=token %}">click here</a>.</p>

<p>Alternatively, you can paste the following link in your browser's address bar:</p>
<p>{{ base_url }}{% url 'users:activate' uidb64=uid token=token %}</p>

<p>The link will expire in 30 minutes.</p>
<p>If you have not requested a verification email you can simply ignore this email.</p>
<p>See you there,</p>
<p>Daisy</p>
 
यह ईमेल काफी सरल है। यह एक उपयोगकर्ता, साइट के लिए आधार URL, और एक उपयोगकर्ता आईडी और टोकन का संदर्भ लेता है जो उपयोगकर्ता के ईमेल को सत्यापित करने के लिए उपयोग किया जाता है। सेटिंग्स में बेस URL को परिभाषित करना सुनिश्चित करें। इससे पहले कि हम टेम्पलेट को रेंडर करने के लिए कुछ पायथन कोड लिखें। आगे बढ़ें और निम्नलिखित लाइनों को APP/SETTINGS.PY, शुरुआत के पास जोड़ें।

SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'

BASE_URL = PROTOCOL + '://' + DOMAIN
आखिरकार, जब आपकी साइट इंटरनेट के लिए तैयार हो जाती है और आप इसे तैनात करते हैं, तो आप अपने डोमेन को परिभाषित करना चाहेंगे क्योंकि आप साइट का प्रतिनिधित्व करने के लिए खरीदे गए डोमेन नाम के रूप में हैं। यह वह नाम है जिसे आप अपनी साइट तक पहुंचने के लिए नवबार में टाइप करेंगे। अभी के लिए, आप डोमेन को खाली छोड़ सकते हैं या किसी प्लेसहोल्डर का उपयोग कर सकते हैं। आप SITE_NAME को एक ऐसे नाम में भी बदलना चाहेंगे जिसे आप अपनी साइट को अपनी चुनने के लिए देना चाहते हैं। इससे पहले कि हम ईमेल भेजें, आइए एक टोकन जनरेटर बनाएं ताकि हमारे पास एक खाता सक्रियण टोकन हो जो कभी भी समाप्त नहीं होता है। हम एक खाता सक्रियण टोकन के निर्माण और आयात करके ऐसा कर सकते हैं जो निम्नलिखित की तरह दिखता है। फ़ाइल संपादित करें:

nano users/tokens.py
निम्न कोड जोड़ें:

from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six
class TokenGenerator(PasswordResetTokenGenerator):
    def _make_hash_value(self, user, timestamp):
        return (
            six.text_type(user.pk) + six.text_type(timestamp)
        )
account_activation_token = TokenGenerator()
unsubscribe_token = TokenGenerator()
यह मूल टोकन जनरेटर एक टोकन उत्पन्न करता है जिसे हम उपयोगकर्ता को एक URL में भेज सकते हैं और उपयोगकर्ता उनके ईमेल को सत्यापित करने और उनके खाते को सक्रिय करने के लिए उपयोग कर सकता है। अगला, आइए देखें कि ईमेल कैसे भेजें। नैनो का उपयोग करके, उपयोगकर्ताओं/ईमेल को संपादित करें।

nano users/email.py
सत्यापन HTML ईमेल भेजना इस तरह दिखेगा:

from django.contrib.auth import get_user_model
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes
from django.core.mail import EmailMultiAlternatives
from django.shortcuts import render
from .tokens import account_activation_token
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.template import Template, Context
from django.conf import settings
import traceback

def send_verification_email(user):
    User = get_user_model()
    mail_subject = '[{}] Activate your account.'.format(settings.SITE_NAME)
    html_message = render_to_string('users/verification_email.html', {
        'user': user,
        'domain': settings.DOMAIN,
        'protocol': 'https',
        'uid': urlsafe_base64_encode(force_bytes(user.pk)),
        'token': account_activation_token.make_token(user),
    })
    send_html_email(user, mail_subject, html_message)
यह काफी सरल है। हम उन कार्यों को आयात करते हैं जिन्हें हमें ईमेल भेजने की आवश्यकता होती है, ईमेल को टेम्प्लेट और हमारी सेटिंग्स के साथ रेंडर करें, और फिर हम ईमेल को टेम्पलेट नाम से परिभाषित करते हैं और इसे किसी फ़ंक्शन का उपयोग करके उपयोगकर्ता को भेजते हैं। आप देखेंगे कि हमने मेल भेजने के लिए फ़ंक्शन को परिभाषित नहीं किया है, Send_html_email, फिर भी, तो आइए हम इसे उस कोड के नीचे लिखते हैं जो हमने पहले से ही उपयोगकर्ताओं/ईमेल में जोड़ा है।

def send_html_email(user, mail_subject, html_message):
    to_email = user.email
    username = user.username
    if to_email == '':
        return None
    unsub_link = settings.BASE_URL + user.profile.create_unsubscribe_link()
    html_message = html_message + "<p><a href=\"" + unsub_link +  "\" + title=\"Unsubscribe from " + settings.SITE_NAME + " emails\">Unsubscribe</a></p></body></html>"
    msg = EmailMultiAlternatives(mail_subject, strip_tags(html_message), settings.DEFAULT_FROM_EMAIL, [to_email], headers={'List-Unsubscribe' : '<' + unsub_link + '>'},)
    msg.attach_alternative(html_message, "text/html")
    profile = user.profile
    try:
        msg.send(fail_silently=False)
        if not profile.email_valid:
            profile.email_valid=True
            profile.save()
    except:
        profile.email_valid=False
        profile.save()
यह थोड़ा अधिक जटिल है, और हम अभी तक इस कोड को चलाने के लिए तैयार नहीं हैं। ध्यान दें कि हम एक UNSUB_LINK को परिभाषित कर रहे हैं, जिस लिंक को उपयोगकर्ता हमारे ईमेल से सदस्यता समाप्त करने के लिए उपयोग कर सकता है। यह महत्वपूर्ण है, क्योंकि उपयोगकर्ताओं को हमारे ईमेल से बाहर निकलने में सक्षम होने की आवश्यकता होगी जब तक कि वे उन्हें किसी भी समय नहीं देखना चाहते। हम अपने संदेश के लिए एक पाठ विकल्प भी जोड़ते हैं, जो HTML टैग से छीन लिया गया HTML संदेश है। अंत में, हम जांचते हैं कि क्या ईमेल भेजा गया है, और यदि यह नहीं था, तो हम उपयोगकर्ता की प्रोफ़ाइल में चिह्नित करते हैं कि उनका ईमेल मान्य नहीं है। आइए उपयोगकर्ता मॉडल पर वापस जाएं ताकि हम यह सब काम कर सकें। हमें सदस्यता समाप्त करने के लिए एक लिंक उत्पन्न करने के लिए एक फ़ंक्शन को परिभाषित करने की आवश्यकता है, और एक बूलियन फ़ील्ड को परिभाषित करने के लिए यह चिह्नित करने के लिए कि उपयोगकर्ता का ईमेल मान्य नहीं है। सबसे पहले, उपयोगकर्ताओं/मॉडल के शीर्ष पर निम्नलिखित आयात जोड़ें।

nano users/models.py

# …
from django.core.signing import TimestampSigner, BadSignature, SignatureExpired
from django.urls import reverse
इसके बाद, आइए टोकन बनाने के लिए उपयोगकर्ता मॉडल में फ़ंक्शंस जोड़ें और ईमेल को सक्रिय करने के लिए उपयोग किए जाने वाले टोकन की जांच करें, साथ ही उपयोगकर्ता को सफलतापूर्वक अपने मेल को प्राप्त करने के लिए सहेजने के लिए फ़ील्ड भी। उपयोगकर्ताओं/मॉडल में फिर से, निम्न कोड को मॉडल के अंत में जोड़ें (इंडेंटेड कोड)

# …
    email_valid = models.BooleanField(default=True)
    
    def make_token(self):
        return TimestampSigner().sign(self.user.username)

    def check_token(self, token):
        try:
            key = '%s:%s' % (self.user.username, token)
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # 30 दिनों के लिए मान्य
        except (BadSignature, SignatureExpired):
            return False
        return True

    def create_unsubscribe_link(self):
        username, token = self.make_token().split(":", 1)
        return reverse('users:unsubscribe', kwargs={'username': username, 'token': token,})
यह काफी सरल है, हम एक टाइमस्टैम्पसिग्नर का उपयोग करते हैं, जो एक बुनियादी क्रिप्टोग्राफी उपकरण है, एक टोकन बनाने के लिए जो एक निश्चित समय के बाद समाप्त हो जाएगा, और हम यह भी जांचने के लिए एक और फ़ंक्शन का उपयोग करते हैं कि क्या यह मान्य है। हम इन टोकन का उपयोग दो बार करते हैं, एक बार ईमेल को सत्यापित करने के लिए, और एक बार एक अनसब्सक्राइब लिंक के लिए। अब जब हमारे पास ये हैं, तो हमें जो काम करना होगा, वह विचारों में है। उपयोगकर्ताओं/विचारों के भीतर, आइए ईमेल पते को सत्यापित करने के लिए, और सदस्यता समाप्त करने के लिए दृश्य जोड़ें।

nano users/views.py
सबसे पहले, निम्नलिखित आयात जोड़ें। मैंने कुछ अतिरिक्त में फेंक दिया, इसलिए हमें बाद में फिर से अधिक आइटम आयात नहीं करना पड़ेगा।

from django.contrib.auth import logout
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.models import User
from django.utils.encoding import force_str
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
import json
import requests
import datetime, traceback
from django.contrib import messages
from .models import Profile
from django.utils import timezone
from django.views.decorators.cache import never_cache
from .email import send_verification_email # सत्यापन ईमेल भेजने वाले फ़ंक्शन को आयात करना सुनिश्चित करें
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.utils.decorators import method_decorator
from django.http import HttpResponseRedirect
from django.conf import settings
from django.utils import timezone
import datetime
import pytz
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_decode
from .tokens import account_activation_token
आपके पास पहले से ही इनमें से कुछ आयात हो सकते हैं, लेकिन यह उन्हें दोहराने के लिए चोट नहीं करता है। आपको सत्यापन ईमेल भेजने वाले फ़ंक्शन को आयात करने की आवश्यकता है, साथ ही अन्य आयातों के बीच, उपयोगकर्ताओं से खाता_एक्टिवेशन_टोकन। अब, फ़ाइल के नीचे, निम्न कोड जोड़ें:

def unsubscribe(request, username, token):
    user = get_object_or_404(User, username=username)
    if((request.user.is_authenticated and request.user == user) or user.profile.check_token(token)):
        # उन्हें अनसब्सक्राइब करें
        profile = user.profile
        profile.subscribed = False
        profile.save()
        return render(request, 'users/unsubscribe.html')
    # अन्यथा पेज लॉगिन करने के लिए पुनर्निर्देशित करें
    messages.warning(request,f'Your unsubscribe link has expired. Please log in to unsubscribe.')
    next_url = reverse('users:unsubscribe', kwargs={'username': username, 'token': token,})
    return HttpResponseRedirect('%s?next=%s' % (reverse('login'), next_url))

def activate(request, uidb64, token):
    try:
        uid = force_str(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    ip = get_client_ip(request)
    if user is not None and account_activation_token.check_token(user, token):
        user.profile.email_verified = True
        user.profile.save()
        user.save()
# sendwelcomeemail (अनुरोध, उपयोगकर्ता)
        messages.success(request, f'Thanks for confirming your email! You can now log into your account, and a welcome email has been sent to you.')
        return redirect(user.profile.create_face_url())
    else:
        messages.success(request, f'Your activation link has expired. Please request a new activation link.')
        return redirect('verify:verify')

def resend_activation(request):
    if request.method == 'POST':
        form = ResendActivationEmailForm(request.POST)
        email = request.POST['email']
        try:
            user = User.objects.get(email=email)
            send_verification_email(user)
            messages.success(request,'Your verification email sent. Please click the link in your email to verify your account.')
            return redirect(reverse('verify:verify'))
        except:
            messages.warning(request,f'Your email is not correct. Please try again.')
    else:
        form = ResendActivationEmailForm()
    return render(request,'users/resend_activation.html',{'form': form, 'title': 'Resend Activation', 'small': True})
यह बहुत अधिक कोड है। चलो इसे तोड़ते हैं। पहला फ़ंक्शन, स्वच्छ और सरल, मेलिंग सूची से उपयोगकर्ता को अनसब्सक्राइब करता है। दूसरा फ़ंक्शन उनके ईमेल को सक्रिय करता है, और आप देखेंगे कि मैंने एक टिप्पणी फ़ंक्शन, SendwelComeEmail जोड़ा। आपका स्वागत है एक ईमेल टेम्पलेट और फ़ंक्शन परिभाषा का उपयोग करने के लिए एक स्वागत योग्य ईमेल भेजने के लिए, मैं अभी तक नहीं है। अंतिम फ़ंक्शन जो मैंने फेंक दिया है वह महत्वपूर्ण है, क्योंकि सक्रियण ईमेल समाप्त हो जाते हैं। इसलिए, हमें कुछ समय सक्रियण ईमेल को फिर से भेजना होगा। हम इसके लिए एक मूल फॉर्म का उपयोग कर सकते हैं, और सत्यापन ईमेल भेजने के लिए फ़ंक्शन को कॉल कर सकते हैं। इससे पहले कि हम ऐसा करें, आइए सुनिश्चित करें कि यह पहले स्थान पर भेजा जा रहा है, रजिस्टर दृश्य में एक फ़ंक्शन कॉल जोड़कर। रजिस्टर व्यू में रीडायरेक्ट से ठीक पहले इस लाइन को जोड़ें, DEF रजिस्टर, उपयोगकर्ताओं/व्यूज में।

nano users/views.py

# … (बाद में) डीईएफ रजिस्टर (अनुरोध):
            send_verification_email(user)
# … (पहले) रीडायरेक्ट (
आपको उस कोड स्निपेट में पहली और अंतिम पंक्तियों को जोड़ने की आवश्यकता नहीं है, बस सुनिश्चित करें कि रजिस्टर व्यू उपयोगकर्ता को सत्यापन ईमेल भेजता है। इसे ऐसा दिखना चाहिए:

# … राशियाँ
from .forms import UserRegisterForm

def register(request):
    if request.method == “POST”:
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            send_verification_email(user) # इस लाइन को जोड़ना सुनिश्चित करें!
            messages.success(request, 'Welcome to the app, {}.'.format(user.username))
    return render(request, 'users/register.html', {'form': UserRegisterForm})
अब, हमें सक्रियण ईमेल को फिर से तैयार करने के लिए एक फॉर्म जोड़ना होगा। उपयोगकर्ताओं/forms.py में, निम्न फॉर्म जोड़ें:

# … (राशि)
class ResendActivationEmailForm(forms.Form):
    email = forms.EmailField(required=True)
हमें इस रेसेंड ईमेल सक्रियण फॉर्म के अनुरूप एक टेम्पलेट की भी आवश्यकता होगी। आइए इस टेम्पलेट को जोड़ें। फ़ाइल को संपादित करें:

nano users/templates/users/resend_activation.html
अगला, फ़ाइल में निम्न कोड जोड़ें।

{% extends 'base.html' %}
{% block content %}
{% load crispy_forms_tags %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Resend activation email</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-secondary" type="submit">Resend activation email</button>
            </div>
        </form>
{% endblock %}
वाह, यह बहुत कुछ है! अब, जब हम अपने सर्वर पर कोड को तैनात करते हैं, तो हम HTML ईमेल भेजने में सक्षम होंगे और ईमेल में एक क्लिक के साथ उपयोगकर्ता खातों को सक्रिय करेंगे। हम एक साधारण स्वागत ईमेल भी भेजना चाहते हैं, तो आइए देखें कि यह कैसे करना है। उपयोगकर्ताओं/ईमेल में वापस।, निम्न कोड जोड़ें:

def sendwelcomeemail(user):
    User = get_user_model()
    html = open('{}/users/welcome_email.html'.format(settings.BASE_DIR)).read()
    subject = 'Welcome to ' + settings.SITE_NAME + ', {{ username }}!'
    template = Template(html)
    subjtemplate = Template(subject)
    context = Context({'username': user.username, 'base_url': settings.BASE_URL, 'model_name': 'Daisy Holton, 'site_name': settings.SITE_NAME})
    renderedtemplate = template.render(context)
    subjcontext = Context({'username': user.username})
    subjrenderedtemplate = subjtemplate.render(subjcontext)
    send_html_email(user, subjrenderedtemplate, renderedtemplate)
इसके अलावा, हमें इस सभी जानकारी को प्रस्तुत करने के लिए एक टेम्पलेट की आवश्यकता होगी। मेरी वेबसाइट पर, टेम्प्लेट नीचे की तरह दिखता है, लेकिन आप इसे प्रारूपित करने के लिए स्वागत करते हैं, हालांकि आप इसे पसंद करते हैं।
 
<html>
<body>
<h3>Welcome to {{ site_name }}</h3>
<p>Hello {{ username }},</p>
<p>We are happy to see you here! Thank you for joining {{ site_name }} and being a part of the fun. To get started, here are a few things you can do after you verify your identity.</p>
<ol>
    <li><a href="{{ base_url }}/" title="Use the app">Use the app</a>. This is the main page of {{ site_name }}</li>
    <li><a href="{{ base_url }}/feed/profile/Clementine/" title="See my profile">Visit my private {{ site_name }} profile</a>. This is a page for anyone wanting to get to know me.</li>
    <li><a href="{{ base_url }}/feed/profiles/" title="See all profiles currently on the site">More profiles</a>. You can find these people on the site, and see their content.</li>
    <li><a href="{{ base_url }}/feed/all/" title="See everything on {{ site_name }}">See all posts here</a>. This is the private front page of {{ site_name }}.</li>
</ol>
<p>There is even more on the site, so feel free to visit and see what you find. You can share the site with any of the social buttons on each page. I hope you enjoy your time with {{ site_name }}! Thanks for being here.</p>
<p>With much love,</p>
<p>{{ model_name }}</p>
<a href="{{ base_url }}" title="{{ site_name }}">{{ base_url }}</a>
 
ध्यान दें कि हमारे पास क्लोजिंग बॉडी या HTML टैग नहीं हैं, क्योंकि जब हम HTML अनसब्सक्राइब लिंक जोड़ते हैं तो हम इन्हें जोड़ते हैं। ये महत्वपूर्ण हैं, लेकिन हम उन्हें दो बार परिभाषित नहीं करना चाहते हैं। तो आगे क्या है? हमने एक लंबा सफर तय किया है। वास्तव में, हमें साइट को एक सर्वर पर तैनात करने के लिए तैयार होना चाहिए। हम @login_required डेकोरेटर जोड़ सकते हैं और अपने विचारों को सुरक्षित कर सकते हैं, उपयोगकर्ता साइनअप ले सकते हैं, आज्ञाकारी ईमेल भेज सकते हैं, और कैश जानकारी भेज सकते हैं, जो कि प्रासंगिक रहने के लिए एक वेबसाइट को क्या करने की आवश्यकता है, इसका आधार है। हम कुछ और उपयोगी सुविधाएँ जोड़ेंगे, और फिर हमारी साइट को सुरक्षित और उपयुक्त बनाने के लिए एक मेल सर्वर, डोमेन कॉन्फ़िगरेशन और फ़िल्टर सेट करने के लिए, एक दूरस्थ सर्वर पर हमारे कोड को तैनात करने के लिए एक आधार बनाएंगे। हमें एक पासवर्ड रीसेट दृश्य की भी आवश्यकता होगी, तो चलो वास्तव में जल्दी में जोड़ें। Django का बनाया गया पासवर्ड रीसेट दृश्य कुछ कार्यों में टूट गया है, लेकिन हम देखेंगे कि कैसे अपना खुद का दृश्य, ईमेल टेम्पलेट, प्रपत्र और URL पैटर्न लिखें। यहाँ उपयोगकर्ताओं/विचारों में दृश्य कैसा दिखता है।

# ... राशि
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth.forms import SetPasswordForm
from django.utils.http import urlsafe_base64_decode

def password_reset(request, uidb64, token):
    user = get_object_or_404(User, id=urlsafe_base64_decode(uidb64))
    if request.method == 'POST':
        form = SetPasswordForm(user, request.POST)
        if form.is_valid() and default_token_generator.check_token(user, token):
            form.save()
            messages.success(request, 'Your password has been reset.')
        elif not form.is_valid():
            messages.warning(request, 'Your passwords do not match, or do not meet the requirements. Please try again.')
            return redirect(request.path)
        else:
            messages.warning(request, 'Your password reset link has expired. Please create a new one.')
        return redirect(reverse('users:login'))
    return render(request, 'users/password_reset_confirm.html', {
        'title': 'Reset your Password',
        'form': SetPasswordForm(user)
यह फ़ॉर्म Django में बनाया गया है, लेकिन हमें पासवर्ड रीसेट, उपयोगकर्ताओं/टेम्प्लेट/उपयोगकर्ताओं/पासवर्ड_सेट_कॉनफिम। Html की पुष्टि करने के लिए एक टेम्पलेट की आवश्यकता होगी
 
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Reset Password</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Reset Password</button>
            </div>
        </form>
{% endblock content %}
 
हमारे पास उपयोगकर्ताओं/टेम्प्लेट/उपयोगकर्ताओं/password_reset.html में एक साधारण फॉर्म के साथ एक पासवर्ड रीसेट ईमेल भेजने के लिए एक टेम्पलेट भी है।
 
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Reset Password</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Request Password Reset</button>
            </div>
        </form>
{% endblock content %}
 
ईमेल के लिए टेम्पलेट स्वयं सरल है, यह एक मूल HTML फ़ाइल है जो उपयोगकर्ताओं/टेम्प्लेट/उपयोगकर्ताओं/password_reset_email.html में पासवर्ड को रीसेट करने के लिए एक लिंक प्रदान करता है। Django स्वचालित रूप से इस फ़ाइल की व्याख्या करेगा।
 
<h1>Uglek - Reset Your Password</h1>
<p>Hello,</p>
<p>To reset your password, please <a href="https:/uglek.com{% url 'password_reset_confirm' uidb64=uid token=token %}">click here</a>.</p>
<p>Alternatively, you can paste the following link into your browser:</p>
<p>https://uglek.com{% url 'password_reset_confirm' uidb64=uid token=token %}</p>
<p>If you have not requested a password reset you can simply ignore this email.</p>
<p>Thanks for joining us,</p>
<p>Daisy</p>
 
हमें दो और टेम्प्लेट की भी आवश्यकता होगी। पहला यह पुष्टि करना है कि ईमेल भेजा गया है। इन के लिए दृश्य पहले से ही Django में हैं, इसलिए हमें बस उन्हें urls.py में संबोधित करने की आवश्यकता है। यह टेम्प्लेट उपयोगकर्ताओं/टेम्प्लेट/उपयोगकर्ताओं/पासवर्ड_रेसेट_डोन। Html पर स्थित है
 
{% extends 'base.html' %}
{% block content %}
  <div class="media-body">
    <div class="alert alert-info">
        An email has been sent with instructions to reset your password.
    </div>
  </div>
{% endblock content %}
 
और अंत में, यह पुष्टि करने के लिए कि पासवर्ड रीसेट पूरा हो गया है, उपयोगकर्ताओं/टेम्प्लेट/उपयोगकर्ता/पासवर्ड_रेसेट_कॉम्प्लेट। Html
 
{% extends 'base.html' %}
{% block content %}
 <div class="media-body">
    <div class="alert alert-info">
        Your password has been set.
    </div>
    <a href="{% url 'users:login' %}">Sign In Here</a>
  </div>
{% endblock content %}
 
अब, हमें इन विचारों के लिए URL पैटर्न की आवश्यकता है। उपयोगकर्ताओं/urls.py में, निम्न URL पैटर्न जोड़ें:

urlpatterns = [
    # ... पिछले url यहाँ
    path('password-reset/',
         auth_views.PasswordResetView.as_view(
             template_name='users/password_reset.html',
             html_email_template_name='users/password_reset_html_email.html'
         ),
         name='password_reset'),
    path('password-reset/done/',
         auth_views.PasswordResetDoneView.as_view(
             template_name='users/password_reset_done.html'
         ),
         name='password_reset_done'),
    path('password-reset-confirm/<uidb64>/<token>/',
         auth_views.PasswordResetConfirmView.as_view(
             template_name='users/password_reset_confirm.html'
         ),
         name='password_reset_confirm'),
    path('password-reset-complete/',
         auth_views.PasswordResetCompleteView.as_view(
             template_name='users/password_reset_complete.html'
         ),
         name='password_reset_complete'),
]
चार टेम्प्लेट, यह बहुत कुछ है! लेकिन अब हम निश्चित रूप से उपयोगकर्ता के पासवर्ड को रीसेट करने में सक्षम हो सकते हैं, हमें किसी भी समय वेब ब्राउज़र से, सभी की आवश्यकता है। मैं समझता हूं कि यह बहुत अधिक कोड है। अगर यह आपके सिर पर थोड़ा सा लगता है, तो यह ठीक है। आप सुधार करेंगे, आपकी समझ में सुधार होगा, और आप बहुत जल्द कोड के साथ बहुत अधिक सक्षम हो जाएंगे। यदि आप पूरी तरह से खो गए हैं, तो मैं इस सॉफ़्टवेयर में वापस आने की सलाह देता हूं, बाद में एक स्व-पुस्तक सीखने के लिए ऑनलाइन कोड पाठ्यक्रम पर काम करने के बाद ऑनलाइन। ये आम तौर पर आरंभ करने के लिए स्वतंत्र होते हैं, और जब आप इस परियोजना में वापस आते हैं तो आपको सफल होने की जरूरत है। यदि आपको लगता है कि आप जारी रखने के लिए तैयार हैं, तो आगे पढ़ें, अगला, हम आपके कोड को एक रिमोट सर्वर पर तैनात करने और एक मेल सर्वर सेट करने के साथ -साथ BASH का उपयोग करके अपनी तैनाती को स्वचालित करने के लिए कवर करेंगे ताकि आप हमेशा एक नई प्रोजेक्ट सेट कर सकें। कुछ सरल आदेश। रिमोट सर्वर पर तैनात करने से पहले हमें जो आखिरी चीज करनी है, वह हमारी साइट को थोड़ा और अधिक सुरक्षित बनाती है। आपध्यान दें कि लॉगिन दृश्य केवल एक उपयोगकर्ता नाम और पासवर्ड लेता है, और कोई बहु कारक प्रमाणीकरण या एक समय कोड नहीं है। यह एक आसान फिक्स है, और एक ही कोड के साथ, हम अपनी साइट को टेक्स्ट मैसेज भेज सकते हैं और यहां तक ​​कि सर्वर को भेजे गए पाठ संदेशों के प्रति उत्तरदायी हो सकते हैं। शुरू करने के लिए, हम उपयोगकर्ता मॉडल में वापस जाएंगे और एक टाइमस्टैम्प हस्ताक्षरकर्ता जोड़ेंगे जो प्रत्येक लॉगिन का प्रतिनिधित्व करेगा। हम उपयोगकर्ता मॉडल में एक अद्वितीय, घूर्णन पहचानकर्ता भी जोड़ेंगे जिसका उपयोग हमारे लॉगिन में अतिरिक्त सुरक्षा जोड़ने के लिए किया जाएगा। उपयोगकर्ता मॉडल, उपयोगकर्ताओं/मॉडल को संपादित करना, निम्नलिखित जोड़ें

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
# UUID, टाइमस्टैम्प हस्ताक्षरकर्ता और URL जनरेटर (रिवर्स) आयात करना सुनिश्चित करें
import uuid
from django.core.signing import TimestampSigner, BadSignature, SignatureExpired
from django.urls import reverse

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
    account_created = models.DateTimeField(default=timezone.now)
    last_seen = models.DateTimeField(default=timezone.now)
    can_login = models.DateTimeField(default=timezone.now)
    preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
    bio = models.TextField(blank=True, default='')
    # इस कोड को यहां जोड़ें
    uid = models.CharField(max_length=32, default=uuid.uuid4, null=True, blank=True)
    mfa_enabled = models.BooleanField(default=False)
    enable_mfa = models.BooleanField(default=False)
    phone_number = models.CharField(default='', null=True, blank=True, max_length=15)
    verification_code = models.CharField(default='', null=True, blank=True, max_length=15)
    verification_code_length = models.IntegerField(default=6)
    mfa_code_expires = models.DateTimeField(default=timezone.now)
    mfa_attempts = models.IntegerField(default=0)

    def make_auth_token(self):
        return TimestampSigner().sign(self.uid)

    # और इस फ़ंक्शन को जोड़ें
    def create_auth_url(self):
        username, token = self.make_auth_token().split(":", 1)
        return reverse('users:mfa', kwargs={'username': username, 'token': token,})

    def check_auth_token(self, token):
        try:
            key = '%s:%s' % (self.uid, token)
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # 3 मिनट के लिए मान्य
        except (BadSignature, SignatureExpired):
            return False
        return True
सुनिश्चित करें कि आपके उपयोगकर्ता/models.py इस तरह दिखते हैं, इसके अलावा टिप्पणियों के अलावा ( #के साथ लाइनों पर कोड)। इसे तोड़कर, यह सरल है। हमारे पास कुछ आयात हैं, एक टाइमस्टैम्पसिग्नर जो एक क्रिप्टोग्राफिक उपयोगिता है जो एक सुरक्षित कोड उत्पन्न कर सकती है और यह सुनिश्चित करने के लिए इसे सत्यापित कर सकती है कि यह मान्य है, केवल एक बार उपयोग किया गया है, और एक निश्चित संख्या में सेकंड से अधिक पुराना नहीं है। हम एक UUID का भी उपयोग करते हैं, जो एक अद्वितीय पहचानकर्ता है जो टोकन के हस्ताक्षर में हमारे उपयोगकर्ता की पहचान करता है, और URL में जहां टोकन उपयोगकर्ता को भेजा जाता है। हम दो कारक प्रमाणीकरण दृश्य बनाने के लिए इस मूल क्रिप्टोग्राफी का उपयोग करेंगे। इससे पहले कि हम कुछ और करें, चलो माइग्रेशन चलाएं ताकि हमारे उपयोगकर्ता मॉडल अपडेट हो जाएं। Manage.py के साथ निर्देशिका में, माइग्रेशन बनाने और पूरा करने के लिए निम्नलिखित कमांड चलाएं।

source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
यह महत्वपूर्ण है क्योंकि हर बार जब हम मॉडल में बदलाव करते हैं, तो हमें टेबल बनाने और डेटाबेस को डिफॉल्ट के साथ अपडेट करने की आवश्यकता होगी, इससे पहले कि हम वास्तव में मॉडल का उपयोग कर सकें। अगला, आइए एक माध्यमिक प्रमाणीकरण दृश्य के लिए पुनर्निर्देशित करने के लिए हमारे लॉगिन दृश्य को सुधारें। उपयोगकर्ताओं/views.py में, लॉगिन फ़ंक्शन को हटा दें और URL पर पुनर्निर्देशित करें जो हमने अभी उपयोगकर्ता मॉडल में उत्पन्न किया है।

# … राशियाँ

def login(request):
    if request.method == “POST”:
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user and user.profile.can_login < timezone.now(): # ध्यान दें कि अब हम जांचते हैं कि क्या उपयोगकर्ता लॉग इन कर सकता है
            # यहाँ था Auth_login फ़ंक्शन निकालें
            messages.success(request, 'Your password was accepted. Please continue.')
            if user.profile.mfa_enabled:
                return redirect(user.profile.create_auth_url()) # ध्यान दें कि हम यहां एक नए URL पर पुनर्निर्देशित करते हैं
            else: # यदि उपयोगकर्ता बहु-कारक प्रमाणीकरण का उपयोग नहीं कर रहा है, तो बस उन्हें लॉग इन करें।
                auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
                return redirect('feed:feed')
        else: # यदि लॉगिन सफल नहीं था,
            messages.warning(request, 'Username or password incorrect. Please try again.')
            user = User.objects.filter(username=username).first() # यह वह हिस्सा है जहां हम उपयोगकर्ताओं को प्रोफ़ाइल अपडेट करते हैं
            if user: 
                profile = user.profile
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # इसलिए वे कुछ सेकंड के लिए फिर से लॉग इन नहीं कर सकते
                profile.save()
    return render(request, 'users/login.html', {'form': AuthenticationForm()})
तो यह बहुत सरल है, अब हमारे पास दो कारक प्रमाणीकरण दृश्य को पुनर्निर्देशित करने का एक तरीका है जब हम इसे बनाते हैं। यदि उपयोगकर्ता ने फोन नंबर नहीं जोड़ा है, तो हमारे पास एक गिरावट भी है। हम जल्द ही एक फोन नंबर जोड़ने के लिए एक बुनियादी दृश्य जोड़ेंगे और जल्द ही एक पाठ संदेश के साथ लॉग इन करेंगे। सबसे पहले, हमें अपने कोड से एक पाठ संदेश भेजने का एक आसान तरीका चाहिए। ऐसा करने के लिए, हम कई एपीआई से चुन सकते हैं, लेकिन मेरी राय में सबसे आसान एक ट्विलियो है। वे छोटी परियोजनाओं के साथ -साथ थोक छूट के लिए भी अच्छा मूल्य निर्धारण प्रदान करते हैं। Twilio.com पर एक खाता बनाएँ, अपनी परियोजना के बारे में कुछ विवरण भरें, एक फ़ोन नंबर खरीदें, और अपनी API कुंजी को अपनी सेटिंग्स पर कॉपी करें। फिर, इस कोड को एक नई फ़ाइल, उपयोगकर्ताओं/sms.py के तहत जोड़ें।

nano users/sms.py

# सभी आवश्यक पैकेज आयात करें
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
import traceback

account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER

# यह कोड ट्विलियो के साथ पाठ भेजता है
def send_text(target_phone, text):
    from twilio.rest import Client
    try:
        client = Client(account_sid, auth_token)
        if len(target_phone) >= 11:
            message = client.messages.create(
                to=target_phone,
                from_=source_phone,
                body=text)
    except:
        print(traceback.format_exc())

# इतने सारे अंकों के साथ एक नंबर प्राप्त करने के लिए एक सहायक फ़ंक्शन
def get_num_length(num, length):
    n = ''
    for x in range(length):
        n = n + str(num)
    return int(n)

# उपयोगकर्ता को सत्यापित करने के लिए पाठ भेजें
def send_verification_text(user):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    user.profile.verification_code = code
    user.profile.mfa_code_expires = timezone.now() + datetime.timedelta(minutes=3)
    user.profile.save()
    send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))

# इस फ़ंक्शन के साथ कोई उपयोगकर्ता कोई भी पाठ भेजें
def send_user_text(user, text):
    send_text(user.profile.phone_number, text)

# इस फ़ंक्शन के साथ कोड को मान्य करें
def check_verification_code(user, code):
    user.profile.mfa_attempts += 1
    result = user.profile.verification_code != None and code != '' and user.profile.verification_code == code and user.profile.mfa_code_expires > timezone.now() and user.profile.mfa_attempts <= 3
    if user.profile.mfa_attempts < 3 and result:
        user.profile.verification_code_length = 6
    elif user.profile.mfa_attempts > 2 and not result:
        user.profile.verification_code_length = 8
    user.profile.save()
    return result

# समय को मान्य करें
def check_verification_time(user):
    result = user.profile.mfa_code_expires > timezone.now()
    return result
अपनी सेटिंग्स को उचित रूप से बदलना सुनिश्चित करें, इन पंक्तियों को अपनी कुंजी के साथ जोड़ना:

# अपने ट्विलियो डैशबोर्ड से इनकी कॉपी करना सुनिश्चित करें
TWILIO_ACCOUNT_SID = “<your sid>”
TWILIO_AUTH_TOKEN = “<your token>”
PHONE_NUMBER = “<your twilio phone number>”
SITE_NAME = “<Your site name>”
AUTH_VALID_MINUTES = 3 # TFA पृष्ठ के मिनटों की संख्या एक बार त्वरित होने के बाद सक्रिय होती है
सबसे पहले, हमें अपने दो कारक प्रमाणीकरण विचारों के लिए रूपों की आवश्यकता होगी। उपयोगकर्ताओं/forms.py को संपादित करना, निम्न कोड जोड़ें।

# … राशियाँ
from django import forms

# हमारे फोन नंबर में प्रवेश करने के लिए एक फॉर्म
class PhoneNumberForm(forms.Form):
    phone_number = forms.RegexField(regex=r'^\+?1?\d{9,15}$', error_messages = {'invalid': "Phone number must be entered in the format: '+999999999'. Up to 15 digits is allowed."})
    def __init__(self, *args, **kwargs):
        super(PhoneNumberForm, self).__init__(*args, **kwargs)
        self.fields['phone_number'].label = phone_number_label

# प्रमाणीकरण के लिए एक फॉर्म
class TfaForm(forms.Form):
    code = forms.IntegerField(required=False)
    def __init__(self, *args, **kwargs):
        super(TfaForm, self).__init__(*args, **kwargs)
        self.fields['code'].widget.attrs.update({'autocomplete': 'off'})
    help_texts = {
        'code': 'Please enter the six digit code after sending it to your phone with the button above.'
    }
अगला, आइए उपयोगकर्ताओं/विचारों में दृश्य बनाएं।

# ... आयात
from django.http import HttpResponseRedirect
from .forms import PhoneNumberForm, TfaForm

def mfa(request, username, token):
    user = User.objects.filter(profile__uuid=username).first()
    if not user: return HttpResponseRedirect(reverse('verify:age') + '?next=' + request.GET.get('next') if request.GET.get('next') else '/go/' if request.user.is_authenticated and request.user.profile.vendor else '/' if request.user.is_authenticated else reverse('users:login'))
    user = get_object_or_404(User, profile__uuid=username)
    next = request.GET.get('next','')
    if not user.profile.mfa_enabled:
        if not check_verification_time(user):
            user.profile.mfa_enabled = False
            user.profile.enable_two_factor_authentication = True
            user.profile.phone_number = '+1'
            user.profile.save()
            print('Logging in user')
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
            messages.warning(request, 'Please enter a valid phone number and verify it with a code.')
            return redirect(reverse('users:mfa_onboarding'))
    if request.method == 'POST':
        form = TfaForm(request.POST)
        code = form.data['code']
        if code and code != '' and code != None:
            token_validated = user.profile.check_auth_token(token)
            p = user.profile
            is_verified = check_verification_code(user, int(code))
            p.mfa_authenticated = is_verified
            if token_validated:
                if is_verified:
                    user.profile.mfa_enabled = True
                    user.profile.save()
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
                    p.verfication_code = None
                    p.uid = get_uuid()
                    p.save()
                    messages.success(request, 'You have been authenticated. Welcome.')
                    qs = '?'
                    for key, value in request.GET.items():
                        qs = qs + key + '=' + value + '&'
                    if next != '' and not (next.startswith('/accounts/logout/') or next.startswith('/accounts/login/') or next.startswith('/admin/login/') or next.startswith('/accounts/register/')):
                        return HttpResponseRedirect(ext)
                    elif next.startswith('/accounts/logout/') or next.startswith('/accounts/login/') or next.startswith('/accounts/register/'):
                        return redirect('feed:feed')
                    elif request.META.get('HTTP_REFERER', '/').startswith('/accounts/login/'):
                        return redirect(reverse('feed:feed'))
                    elif not next:
                        return redirect(reverse('feed:feed')
                    else:
                        return HttpResponseRedirect('feed:feed')
                else:
                    messages.warning(request, 'The code you entered was not recognized. Please try again.')
            elif not token_validated:
                messages.warning(request, 'The URL token has expired or was not recognized. Please try again.')
                logout(request)
                return redirect(reverse('users:login'))
            if p.mfa_attempts > 3:
                messages.warning(request, 'You have entered the incorrect code more than 3 times. please send yourself a new code.')
                p.verification_code = None
                p.save()
        elif user.profile.can_send_mfa < timezone.now():
            user.profile.mfa_attempts = 0
            user.profile.can_send_mfa = timezone.now() + datetime.timedelta(minutes=2)
            user.profile.save()
            send_verification_text(user)
            messages.success(request, "Please enter the code sent to your phone number. The code will expire in 3 minutes.")
        else:
            messages.warning(request, 'You are sending too many two factor authentication codes. Wait a few minutes before sending another code.')
    form = TfaForm()
    hide_logo = None
    if user.profile.hide_logo:
        hide_logo = True
    return render(request, 'users/mfa.html', {'title': 'Enter Code', 'form': form, 'xsmall': True, 'user': user, 'hide_logo': hide_logo, 'accl_logout': user.profile.shake_to_logout, 'preload': False})

@login_required
def mfa_onboarding(request):
    if request.method == 'POST':
        form = PhoneNumberForm(request.POST)
        request.user.profile.phone_number = form.data['phone_number'].replace('-', '').replace('(','').replace(')','')
        request.user.profile.mfa_enabled = True
        request.user.profile.enable_two_factor_authentication = True
        request.user.profile.save()
        messages.success(request, 'You have added a phone number to your account.')
        user = request.user
        return redirect(user.profile.create_auth_url())
    form = PhoneNumberForm(initial={'phone_number': request.user.profile.phone_number if request.user.profile.phone_number else '+1'})
    return render(request, 'users/mfa_onboarding.html', {'title': 'Enter your phone number', 'form': form, 'small': True})
हमें इन दोनों विचारों के लिए टेम्प्लेट की भी आवश्यकता होगी। आइए पहले MFA टेम्पलेट जोड़ें।

nano users/templates/users/mfa.html
इस HTML कोड को टेम्पलेट में जोड़ें
 
{% extends 'base.html' %}
{% block content %}
{% load app_filters %}
{% load crispy_forms_tags %}
        <form action="{{ request.path }}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}" method="POST">
            {% csrf_token %}
            <legend class="border-bottom mb-4">Enter Verification Code</legend>
            <p>Step 1: Send the code</p>
	    <i>Never share your code with anyone, as it can be used to access your account temporarily.</i>
	    <div class="form-group">
                <button class="btn btn-outline-primary" type="submit">Send code</button>
            </div>
	    <hr>
	    <p>Step 2: Enter the code</p>
            <fieldset class="form-group">
                {{ form|crispy }}
		<p>Press the enter button to send yourself the code at {{ user.profile.phone_number|securephone }}. Then, enter the code and press enter.</p>
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-secondary" type="submit">Enter code</button>
            </div>
        </form>
{% endblock %}
 
यह बहुत ही आत्म व्याख्यात्मक है। फ़ॉर्म या तो एक कोड या एक खाली कोड भेजता है, और यदि हम एक खाली कोड प्राप्त करते हैं, तो आप कोड भेजते हैं, आप उस दृश्य में देखेंगे। फिर हमारे पास सिर्फ दो सबमिट बटन हैं, और इस तरह से हम किसी भी बटन के साथ कोड भेज सकते हैं। अगला, हम फ़ोन नंबर जोड़ने के लिए एक सरल फॉर्म जोड़ेंगे।

nano users/templates/users/mfa_onboarding.html
निम्नलिखित HTML जोड़ें:
 
{% extends 'base.html' %}
{% block content %}
{% load crispy_forms_tags %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Set Up Two Factor Authentication</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-secondary" type="submit">Add phone number</button>
            </div>
        </form>
{% endblock %}
 
यह फॉर्म बहुत सरल है, यह हमारे द्वारा बनाए गए फोन नंबर फॉर्म को प्रस्तुत करता है और उपयोगकर्ता को एक फोन नंबर जोड़ने देता है। यह वास्तव में अच्छा लग रहा है! जब तक सब कुछ ठीक से सेट हो जाता है, तब तक हमें संदेश भेजने में सक्षम होना चाहिए, और जैसे ही हम URL पैटर्न जोड़ते हैं, उपयोगकर्ता को उनके फ़ोन नंबर के साथ लॉग इन करते हैं। आखिरी चीज जो हमें सेट करने की आवश्यकता है वह एक प्रोफ़ाइल दृश्य है ताकि हम यह सुनिश्चित कर सकें कि उपयोगकर्ता लॉग इन किए बिना अपना फोन नंबर बदल सकता है। इसके अलावा, आखिरकार, हम "स्टॉप टू क्विट" विकल्प जोड़ना चाहेंगे, इसलिए उपयोगकर्ता पाठ कर सकता है भविष्य के पाठ संदेशों से बाहर निकलने के लिए "स्टॉप"। आइए उपयोगकर्ताओं/दृश्य में एक प्रोफ़ाइल दृश्य जोड़ें। यह दृश्य उपयोगकर्ता के जैव, ईमेल, उपयोगकर्ता नाम और फोन नंबर को अपडेट करेगा, साथ ही हमें मल्टी फैक्टर प्रमाणीकरण को सक्षम करने की अनुमति देगा। सबसे पहले, हमें उपयोगकर्ताओं/रूपों में दो और रूपों की आवश्यकता होगी।

# ... राशि
class UserUpdateForm(forms.ModelForm):
    email = forms.EmailField()
    class Meta:
        model = User
        fields = ['username', 'email']

phone_number_label = 'Phone number (no spaces, parenthesis \'(\' or dashes \'-\', numbers beginning with + only)'

class ProfileUpdateForm(forms.ModelForm):
    subscribed = forms.BooleanField(required=False)
    phone_number = forms.CharField(required=False)
    def __init__(self, *args, **kwargs):
        super(ProfileUpdateForm, self).__init__(*args, **kwargs)
    class Meta:
        model = Profile
        fields = ['bio', 'phone_number', 'enable_mfa', 'subscribed']
अगला, हम इन दोनों रूपों का उपयोग करने के लिए एक दृश्य बना सकते हैं। उपयोगकर्ताओं/views.py को संपादित करें और दृश्य में जोड़ें।

# ये आयात जोड़ें
from .forms import UserUpdateForm, ProfileUpdateForm
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_exempt
from .models import Profile
from .mfa import send_user_text

@csrf_exempt
@never_cache
@login_required
def profile(request):
    if request.method == 'POST':
        u_form = UserUpdateForm(request.POST, instance=request.user)
        p_form = ProfileUpdateForm(request.POST,
                                       request.FILES,
                                       instance=request.user.profile)
        if u_form.is_valid() and p_form.is_valid():
            new_phone_number = p_form.data['phone_number']
            u_form.save()
            profile = p_form.save(commit=False)
            profile.phone_number = profile.phone_number.replace('-', '').replace('(','').replace(')','')
            profile.save()
            if new_phone_number != oldprofile.phone_number and oldprofile.phone_number and len(oldprofile.phone_number) >= 11:
                profile.mfa_enabled = True
                profile.save()
                send_text(oldprofile.phone_number, 'Your phone number has been updated to ' + new_phone_number + '. Please refer to texts on that phone to log in. If you didnt make this change, please call us. - {}'.format(settings.SITE_NAME))
            if profile.enable_two_factor_authentication and profile.phone_number and len(profile.phone_number) < 11:
                profile.enable_two_factor_authentication = False
                messages.success(request, f'Two factor authentication can\'t be activated without entering a phone number. Please enter a phone number to enable two factor authentication.')
            profile.save()
            if new_phone_number != oldprofile.phone_number and new_phone_number and len(new_phone_number) >= 11:
                send_user_text(request.user, 'You have added this number to {} for two factor authentication. You can now use your number for two factor authentication. If you didnt make this change, please call us. - {}'.format(settings.SITE_NAME, settings.DOMAIN))
                profile.mfa_enabled = True
                profile.mfa_code_expires = timezone.now() + datetime.timedelta(minutes=3)
                profile.save()
                return redirect(profile.create_auth_url())
            messages.success(request, f'Your profile has been updated!')
            print('Profile updated')
            return redirect('users:profile')
    else:
        u_form = UserUpdateForm(instance=request.user)
        p_form = ProfileUpdateForm(instance=request.user.profile, initial={'phone_number': request.user.profile.phone_number if request.user.profile.phone_number else '+1'})
    context = {
        'u_form': u_form,
        'p_form': p_form,
        'title':'Update Your Profile',
    }
    return render(request, 'users/profile.html', context)
हमें इस दृश्य के लिए एक टेम्पलेट की भी आवश्यकता होगी।

nano users/templates/users/profile.html
 
{% extends "base.html" %}
{% load crispy_forms_tags %}
{% load feed_filters%}
{% block content %}
	<h2>Edit Your Profile</h2>  
	<form method="POST" enctype="multipart/form-data" id="profile-form">
          {% csrf_token %}
          <fieldset class="form-group">
              <legend class="border-bottom mb-4 mt-4">Profile info</legend>
              {{ u_form|crispy }}
              {{ p_form|crispy }}
          </fieldset>
          <div class="form-group">
              <button class="btn btn-outline-info" type="submit">Update}</button>
          </div>
	</form>
        <p style="text-color: green;" class="hide" id="posted">Saved</p>

{% endblock content %}
{% block javascript %}
var form = document.getElementById('profile-form');
$('input').change(function(){
	var formdata = new FormData(form);
	$.ajax({
		url: window.location.href,
		type: "POST",
		data: formdata,
		processData: false,
		contentType: false,
		timeout: 1000 * 60,
                success: function(data) {
                  $(posted).removeClass("hide");
		  setTimeout(function() {
			$(posted).addClass("fade-hidden");
			setTimeout(function() {
				$(posted).addClass("hide");
				$(posted).removeClass("fade-hidden");
			}, 2000);
		  }, 2000);
                }
	});
});
{% endblock %}
 
आप देखेंगे कि यह एक काफी सरल रूप है, लेकिन इसमें कुछ जावास्क्रिप्ट है जो स्वचालित रूप से फॉर्म की सामग्री को पोस्ट करते हैं क्योंकि वे अपडेट किए जाते हैं। यह उपयोगी है, इसलिए आप हर बार सबमिट करने के बिना संपादन करने में सक्षम हैं। इसके बाद, हमें उपयोगकर्ताओं के URL पटर में इन सभी विचारों का प्रतिनिधित्व करने वाले URL की आवश्यकता है। उपयोगकर्ताओं/urls.py को संपादित करें और इस कोड को जोड़ें:

# … पिछला कोड, आयात
from django.urls import path
from . import views

app_name='users'

urlpatterns = [
# ... URL पैटर्न जो हमने पहले दर्ज किया था, अगली तीन लाइनें जोड़ें
    path('mfa/<str:username>/<str:token>/', views.mfa, name='mfa'),
    path('mfa/onboarding/', views.mfa_onboarding, name='mfa_onboarding'),
    path('profile/', views.profile, name='profile'),
]
अब हमारी परियोजना का परीक्षण करने के लिए एक अच्छा समय है। लेकिन पहले, चलो एक और बैकअप चलाते हैं।

backup
और सर्वर चलाएं। इससे पहले कि हम एक लिनक्स सर्वर पर तैनात करें, खाते पर दो कारक प्रमाणीकरण को सक्षम करना एक अच्छा विचार है। हम इसे अपने प्रोफ़ाइल URL,/उपयोगकर्ताओं/प्रोफ़ाइल/में जा रहे हैं, और हमारे फ़ोन नंबर में प्रवेश करने के बाद प्रमाणीकरण को सक्षम करने के लिए बॉक्स की जाँच करेंगे, और फिर फॉर्म सबमिट करेंगे।

python manage.py runserver localhost:8000
अपने वेब ब्राउज़र पर जाकर वेबपेज पर जाएं, मैं इस उदाहरण में Google क्रोम का उपयोग कर रहा हूं, और URL https: // localhost: 8000/खातों/प्रोफ़ाइल/में प्रवेश कर रहा हूं। यदि आवश्यक हो तो आप लॉग इन कर सकेंगे और दो कारक प्रमाणीकरण को सक्षम करें। इस परियोजना को चलाने के लिए एक सर्वर की आवश्यकता होती है ताकि यह वास्तव में मेल भेज सके। लेकिन पहले, हमें त्रुटियों को देखने का एक तरीका चाहिए। आप देखेंगे कि यदि आप सर्वर को डिबग मोड में चलाते हैं, तो सेटिंग्स के साथ। डिबग मोड का उपयोग किए बिना त्रुटियों को दिखाने के लिए, जो एक उत्पादन सर्वर पर असुरक्षित है, हमें इसके लिए एक दृश्य जोड़ना चाहिए। सबसे महत्वपूर्ण त्रुटियां हमें संभालने में सक्षम होने की आवश्यकता है: त्रुटि 500 ​​- हमारे कोड के साथ एक समस्या त्रुटि 404 - एक पृष्ठ जो नहीं मिला (टूटा हुआ URL) त्रुटि 403 - एक अनुमति से वंचित त्रुटि आइए इन त्रुटियों को संभालने के लिए एक नया ऐप जोड़ें, जिन्हें त्रुटियां कहा जाता है।

python manage.py startapp errors
इसे सेटिंग्स में जोड़ें।

handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
यह सब हमें त्रुटि दृश्य, टेम्प्लेट और थोड़ा सा मिडलवेयर के अलावा की आवश्यकता है। चलो उन लोगों को परिभाषित करते हैं:

from django.shortcuts import render, redirect
from django.http import HttpResponse
from stacktrace.models import Error
from errors.middleware import get_current_exception
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import user_passes_test
from .logs import get_logs
from face.tests import is_superuser_or_vendor
from django.views.decorators.csrf import csrf_exempt
from errors.highlight import highlight_code
from django.shortcuts import redirect
from django.urls import reverse

# यहां अपने विचार बनाएं।
@login_required
@user_passes_test(is_superuser_or_vendor)
def logs(request):
    logs = highlight_code(get_logs())
    return render(request, 'errors/live_error.html', {'title': 'Error Logs', 'pagetitle': 'Error Logs', 'notes': 'These are the recent error logs.', 'trace': logs, 'full': True})

@login_required
@user_passes_test(is_superuser_or_vendor)
def logs_api(request):
    logs = highlight_code(get_logs())
    return HttpResponse(logs)

@login_required
def handler404(request, exception):
    if not request.path.endswith('/'): return redirect(request.path + '/')
    return render(request, 'errors/error.html', {'title': 'Error 404', 'pagetitle': 'Error 404', 'notes': 'This page was not found on the server. It may have moved or been deleted.', 'is_404': True})

def handler500(request):
    print(get_current_exception())
    user = None
    if hasattr(request, 'user') and request.user and request.user.is_authenticated:
        user = request.user
    try:
        Error.objects.create(user=user, stack_trace=get_current_exception(), notes='Logged by 500 handler.')
    except: pass
    return render(request, 'errors/error.html', {'title': 'Error 500', 'pagetitle': 'Error 500', 'notes': 'There is a problem with the server, or with a request coming from you. Thank you for your understanding while we get things set up.', 'trace': get_current_exception()})

def handler403(request, exception):
    return render(request, 'errors/error.html', {'title': 'Error 403', 'pagetitle': 'Error 403', 'notes': 'You don\'t have permission to preform this request. If you think this is in error, please contact the server administrator.', 'is_403': True})

def handler400(request, exception):
    return render(request, 'errors/error.html', {'title': 'Error 400', 'pagetitle': 'Error 400', 'notes': 'This was a bad request.'})
अगला, आइए इन त्रुटियों को संभालने के लिए मिडलवेयर को परिभाषित करें। हम पहले हमारे मिडलवेयर के नाम के साथ, सेटिंग्स में मिडलवेयर_क्लास में जोड़कर ऐसा करेंगे।

MIDDLEWARE_CLASSES = [
    # ... पिछला मिडलवेयर
    'errors.middleware.ExceptionVerboseMiddleware,
]
अगला, चलो मिडलवेयर जोड़ें।

from threading import local
import traceback
from django.utils.deprecation import MiddlewareMixin

_error = local()

class ExceptionVerboseMiddleware(MiddlewareMixin):
    def process_exception(self, request, exception):
        _error.value = traceback.format_exc()

def get_current_exception():
    try:
        return _error.value
    except AttributeError:
        return None

def set_current_exception(exception):
    try:
        _error.value = exception
    except AttributeError:
        print('Attribute error setting exception.')
हम एक थ्रेडिंग स्थानीय का उपयोग करके वर्तमान अपवाद प्राप्त करने के लिए एक फ़ंक्शन जोड़ते हैं, जो हमें अपने कोड में किसी भी त्रुटि का पता लगाने में मदद करता है। टेम्प्लेट के संदर्भ में, हमें केवल एक की आवश्यकता है, क्योंकि हम गतिशील रूप से शीर्षक को दृश्य में परिभाषित करते हैं। टेम्पलेट को केवल शीर्षक और "ट्रेस", हमारी त्रुटि ट्रेसबैक को संदर्भ से प्रस्तुत करने की आवश्यकता है।

nano errors/templates/errors/error.html
 
{% extends 'base.html' %}
{% block content %}
<h1>{{ pagetitle }}</h1>
<p>{{ trace }}</p>
{% endblock %}
 
यह अभी तक हमारा सबसे सरल टेम्पलेट है, लेकिन यह है कि हमारी परियोजना में त्रुटियों को देखना कितना आसान है। अगला, आइए सेटिंग्स में डिबग को अक्षम करें।

nano app/settings.py
इस पंक्ति को खोजें जहां यह सही है, और इसे झूठे में बदल दें

DEBUG = False
आगे बढ़ें और अब ऐप का बैकअप लें। हम एक रिमोट लिनक्स सर्वर पर तैनात करने के लिए तैयार हैं, और वहां से सुविधाएँ जोड़ते रहते हैं।

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

nano users/models.py
यह वही है जो हम जो मॉडल जोड़ रहे हैं वह जैसा दिखना चाहिए। हमें किसी भी तरीके की आवश्यकता नहीं है, बस एक आईडी, उपयोगकर्ता, टाइमस्टैम्प, समाप्ति, लंबाई और किसी भी बहु कारक प्रमाणीकरण के खिलाफ प्रयासों को संग्रहीत करने के लिए चर (फोन या ईमेल पर भेजे गए 123456 जैसा कोड)।

# एक बुनियादी टोकन वेबसाइट पर लॉग इन करने के लिए उपयोग किया जाता है
class MFAToken(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='mfa_tokens')
    timestamp = models.DateTimeField(default=timezone.now)
    expires = models.DateTimeField(default=timezone.now)
    token = models.CharField(default='', max_length=100)
    length = models.IntegerField(default=6)
    attempts = models.IntegerField(default=0)
    uid = models.CharField(default=uuid.uuid4, max_length=100)
आइए अपने उपयोगकर्ता के लिए एक विशेषाधिकार भी जोड़ें, और हम इसे मैन्युअल रूप से अभी के लिए सेट करेंगे, अंततः विशेष रूप से विशेषाधिकार प्राप्त उपयोगकर्ताओं को स्वचालित रूप से सूचीबद्ध करने के लिए माइग्रेट करने से पहले। उपयोगकर्ता मॉडल में, इस लाइन को प्रोफ़ाइल में जोड़ें:

    vendor = models.BooleanField(default=False)
डेटाबेस में किसी भी परिवर्तन के साथ, हमें माइग्रेशन करने और डेटाबेस को माइग्रेट करने की आवश्यकता है, जब भी हम Django में एक मॉडल को संपादित करते हैं। याद रखें, ऐसा करने के लिए हम पहले स्रोत का उपयोग करते हैं (यदि यह पहले से ही उपयोग नहीं किया गया है क्योंकि टर्मिनल खुला था) और फिर पायथन को प्रबंधित करने के लिए।

cd project-directory-you-named # (यदि ज़रूरत हो तो)
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
अभी के लिए, आप शेल का उपयोग करके आपके द्वारा बनाए गए किसी भी खाते को विक्रेताओं के रूप में सूचीबद्ध कर सकते हैं।

python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
अब, आइए इस टोकन का उपयोग करने के लिए हमारे बहु कारक प्रमाणीकरण दृश्य को विकसित करें। सबसे पहले, हमें अपने MFA सहायक उपयोगिताओं को संशोधित करने की आवश्यकता है। नैनो का उपयोग करना,

nano users/mfa.py

from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken

account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER

def send_text(target_phone, text):
    from twilio.rest import Client
    try:
        client = Client(account_sid, auth_token)
        if len(target_phone) >= 11:
            message = client.messages.create(
                to=target_phone,
                from_=source_phone,
                body=text + ' Text STOP to cancel.')
    except:
        messages.warning(get_current_request(), 'There was an error sending the message.')
        print(traceback.format_exc())

def get_num_length(num, length):
    n = ''
    for x in range(length):
        n = n + str(num)
    return int(n)

def send_verification_text(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))

def send_verification_email(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))

def send_user_text(user, text):
    send_text(user.profile.phone_number, text)

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result

# अपने ईमेल या फोन नंबर का उपयोग करके उपयोगकर्ता को प्रमाणित करें
def mfa(request, username, usertoken):
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # URL में पारित मान द्वारा टोकन को फ़िल्टर करें (एक UUID)
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # यदि यह सत्र नहीं बनाया गया है, तो इसे बनाएं
    user = User.objects.filter(id=token.user.id).first() # टोकन से उपयोगकर्ता प्राप्त करें
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # यदि वे पहले से ही प्रमाणित हैं, तो उन्हें लॉग इन करें
    if not user: raise PermissionDenied() # इनकार अगर कोई उपयोगकर्ता नहीं मिला था
    next = request.GET.get('next','')
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # प्रामाणिक टोकन की जाँच करें
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # यदि वे पहले से लॉग इन नहीं हैं, तो उपयोगकर्ता में लॉग इन करें
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # उनके बहु कारक प्रमाणीकरण पर एक समाप्ति निर्धारित करें
        user.profile.save()
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # उपयोगकर्ता को अगले पृष्ठ पर पुनर्निर्देशित करें
    if not user.profile.mfa_enabled: # जाँच करें कि क्या MFA सक्षम है
        if not check_verification_time(user, token): # समय की जाँच करें
            user.profile.mfa_enabled = False # फ़ोन नंबर साफ़ करें
            user.profile.enable_two_factor_authentication = True # MFA सक्षम करें
            user.profile.phone_number = '+1' # फ़ोन नंबर अक्षम करें
            user.profile.save() # प्रोफ़ाइल सहेजें
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # यदि उनका MFA सक्षम नहीं है, तो उपयोगकर्ता को लॉग इन करें
            messages.warning(request, 'Please enter a valid phone number and verify it with a code.')
            return redirect(reverse('users:mfa_onboarding'))
    if request.method == 'POST' and not fraud_detect(request, True): # यदि अनुरोध एक पोस्ट अनुरोध है
        form = TfaForm(request.POST) # फॉर्म को त्वरित करें
        code = str(form.data.get('code', None)) # कोड प्राप्त करें
        if code and code != '' and code != None: # सुनिश्चित करें कि यह खाली नहीं है
            token_validated = user.profile.check_auth_token(usertoken) # प्रामाणिक टोकन की जाँच करें
            p = user.profile
            is_verified = check_verification_code(user, token, code) # कोड की जाँच करें
            p.mfa_authenticated = is_verified
            if token_validated: # अगर सब कुछ
                if is_verified: # क्रम में है
                    user.profile.mfa_enabled = True # MFA सक्षम करें (यदि पहले से सक्षम नहीं है)
                    user.profile.save()
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # उपयोगकर्ता में लॉग इन करें
                    face = user.faces.filter(session_key=None).last() 
                    p.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES)
                    p.save()
                    messages.success(request, 'You have been authenticated. Welcome.')
                    qs = '?'
                    for key, value in request.GET.items(): # अगले पैरामीटर के लिए एक querystring का निर्माण करें (यदि कोई हो)
                        qs = qs + key + '=' + value + '&'
                    if next != '' and not (next.startswith('/accounts/logout/') or  next.startswith('/accounts/login/') or next.startswith('/admin/login/') or next.startswith('/accounts/register/')):
                        return HttpResponseRedirect(next) # पुनर्निर्देशन
                    elif next.startswith('/accounts/logout/') or next.startswith('/accounts/login/') or next.startswith('/accounts/register/'):
                        return redirect(reverse('/'))
                    elif request.META.get('HTTP_REFERER', '/').startswith('/accounts/login/'):
                        return redirect(reverse('/'))
                    elif not next:
                        return redirect(reverse('/'))
                    else:
                        return HttpResponseRedirect(reverse('verify:age') + '?next=' + request.META.get('HTTP_REFERER', '/'))
                else:
                    messages.warning(request, 'The code you entered was not recognized. Please try again.')
            elif not token_validated: # यदि टोकन अमान्य था
                messages.warning(request, 'The URL token has expired or was not recognized. Please try again.')
                logout(request)
                return redirect(reverse('users:login'))
            if p.mfa_attempts > 3: # अगर बहुत सारे प्रयास थे
                messages.warning(request, 'You have entered the incorrect code more than 3 times. please send yourself a new code.')
                p.verification_code = None
                p.save()
        elif user.profile.can_send_mfa < timezone.now():
            user.profile.mfa_attempts = 0
            user.profile.can_send_mfa = timezone.now() + datetime.timedelta(minutes=2)
            user.profile.save()
            if form.data.get('send_email', False): # ईमेल (या पाठ) भेजें
                send_mfa_verification_email(user, token)
            else:
                send_verification_text(user, token)
            messages.success(request, "Please enter the code sent to your phone number or email. The code will expire in 3 minutes.")
        elif user.profile.can_send_mfa < timezone.now() + datetime.timedelta(seconds=115):
            messages.warning(request, 'You are sending too many two factor authentication codes. Wait a few minutes before sending another code.')
    form = TfaForm()
    hide_logo = None
    if user.profile.hide_logo:
        hide_logo = True
    if request.user.is_authenticated: return redirect(reverse('/'))
    # फॉर्म को प्रस्तुत करें (अनुरोध प्राप्त करने के लिए)
    return render(request, 'users/mfa.html', {'title': 'Enter Code', 'form': form, 'xsmall': True, 'user': user, 'hide_logo': hide_logo, 'accl_logout': user.profile.shake_to_logout, 'preload': False, 'autofocus': request.method == 'POST'})
जब हम इस कोड में जोड़ रहे हैं, तो ईमेल भेजने के लिए फ़ंक्शन को आयात करना सुनिश्चित करें। फ़ाइल के शीर्ष पर, उपयोगकर्ता दृश्य (अन्य आयात के साथ), जोड़ें

from .mfa import send_verification_email as send_mfa_verification_email
अब, हमें उस फ़ंक्शन को लिखने की आवश्यकता है, इससे पहले कि कोई भी काम करेगा। यह हमारे भेजें ईमेल फ़ंक्शन का विस्तार करना चाहिए, और बस सत्यापन कोड के साथ उपयोगकर्ता को एक ईमेल भेजें।

nano users/mfa.py

def send_verification_email(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
इसलिए यह सब बहुत अच्छा काम करता है, अब हमारे पास एक मल्टी फैक्टर ऑथेंटिकेशन सिस्टम है जो लॉग इन करने के लिए एक फोन नंबर या ईमेल पर निर्भर करता है। लेकिन हमें उन उपयोगकर्ताओं को हटाने, या कम से कम उन उपयोगकर्ताओं को छिपाने की भी आवश्यकता है जो हमारी शर्तों के साथ सहयोग नहीं कर रहे हैं। ये स्पैमर, रोबोट या कोई भी हो सकता है जो हमारे काम के लिए अच्छी तरह से मतलब नहीं है। मेरी वेबसाइट पर उपयोगकर्ताओं की निगरानी के लिए मेरे पास एक दृश्य देखें:

# मात्रा
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import user_passes_test
from .tests import is_superuser_or_vendor # हमें यह परीक्षण बनाने की आवश्यकता होगी

@login_required
@user_passes_test(is_superuser_or_vendor)
def users(request):
    # उपयोगकर्ताओं की सूची प्राप्त करें
    new_today = User.objects.filter(is_active=True, date_joined__gte=timezone.now() - datetime.timedelta(hours=24)).count()
    new_this_month = User.objects.filter(is_active=True, date_joined__gte=timezone.now() - datetime.timedelta(hours=24*30)).count()
    subscribers = User.objects.filter(is_active=True, profile__subscribed=True).count()
    return render(request, 'users/users.html', { # एक टेम्पलेट में उपयोगकर्ताओं को लौटाएं
        'title': 'All Accounts',
        'users': User.objects.all(),
        'new_today': new_today,
        'new_this_month': new_this_month,
        'subscribers': subscribers
    })
ध्यान दें कि यह कोड एक परीक्षण का उपयोग करता है, हमें इस परीक्षण को एक test.py फ़ाइल में घोषित करना होगा और इसे आयात करना होगा। उपयोगकर्ताओं/tests.py का संपादन, चलो परीक्षण बनाते हैं।

def is_superuser_or_vendor(user):
    return user.profile.vendor or user.is_superuser
यह उपयोगकर्ताओं/उपयोगकर्ताओं के साथ मिलकर है। HTML टेम्पलेट, जो कुछ इस तरह दिखता है:
 
{% extends 'base.html' %}
{% load app_filters %}
{% block content %}
<h1>All Registered Visitors</h1>
<p>{{ new_today|nts|capitalize }} new today, {{ new_this_month|nts }} new this month, {{ subscribers|nts }} subscribers, {{ users.count|nts }} total.</p>
<hr style="color: red;">
{% for user in users %}
{% include 'users/_user.html' %}
<hr style="color: blue;">
{% endfor %}
{% endblock %}
 
ध्यान दें कि टेम्पलेट में एक और टेम्पलेट, उपयोगकर्ता/_user.html शामिल हैं। एक टेम्पलेट का उपयोग करते समय जिसमें एक सबटेम्प्लेट होता है और इसका उपयोग नहीं करता है, यह विस्तार करने के लिए फ़ाइल के नाम से पहले एक अंडरस्कोर (_) जोड़ने के लिए एक अच्छा विचार है, ताकि टेम्प्लेट को अलग किया जा सके। ध्यान दें कि यह बहुत अधिक जिंजा है, आपके पास इन सभी चर को परिभाषित नहीं हो सकता है। लेकिन यह मेरा कोड जैसा दिखता है।
 
{% load app_filters %}
<div>
<img src="{{ user.profile.get_image_url }}" alt="@{{ user.profile.name }}'s profile photo" width="120" height="120" align="left" style="margin-top:5px; margin-right:10px; margin-bottom:10px; border-radius: 50%;"/>
    <div class="article-metadata">
      <p class="mr-2">@{{ user.username }} - {{ user.profile.name }} ({{ user.profile.preferred_name }})</p>
      <small class="text-muted">Last seen {{ user.profile.last_seen|date:"F d, Y" }} {{ user.profile.last_seen|time:"H:i" }}</small>
      <small class="text-muted">Joined on {{ user.profile.date_joined|date:"F d, Y" }} {{ user.profile.date_joined|time:"H:i" }}</small>
      <small>{{ user.email }}</small>
      {% if user.profile.phone_number %}<small><i class="bi bi-phone-fill"></i>{{ user.profile.phone_number }}</small>{% endif %}
      {% if user.verifications.last %}
      <small>'{{ user.verifications.last.full_name }}'</small>
      <small><i class="bi bi-123"></i> {{ user.verifications.last.document_number }}</small>
      <small><i class="bi bi-calendar-heart-fill"></i> {{ user.verifications.last.birthdate }}</small>
      <a href="{{ user|document_front }}" class="btn btn-sm btn-outline-primary" title="ID front"><i class="bi bi-person-badge-fill"></i> ID front</a>
      <a href="{{ user|document_back }}" class="btn btn-sm btn-outline-primary" title="ID back"><i class="bi bi-upc-scan"></i> ID back</a>
      {% endif %}
      <small># {{User.id}} </small>
      <small>{% if user.profile.subscribed %}Subscribed{% else %}Not subscribed{% endif %}</small>
    </div>
    {%if not user.is_superuser %}
    <div style="float: right;">{% include 'users/toggle_active.html' %}</div>
    {% endif %}
    {% autoescape off %}    
    <p class="article-content">{{ user.bio }}</p>
    {% endautoescape %}
    <hr>
    <p>{% if user.profile.identity_verified %}Verified user.{% else %}Unverified user.{% endif %} Verifications: {{ user.verifications.count|nts }}</p>
 
हमें एक और सबटेम्प्लेट की भी आवश्यकता है, togle_active.html। यह टेम्पलेट एक ऐसा रूप होना चाहिए जो हमें टॉगल करने की अनुमति देता है कि क्या कोई उपयोगकर्ता सक्रिय है।
 
<form style="display: inline-block;" action="{% url 'users:toggle-user-active' user.id %}" method="POST" id="publishForm">
<button class="btn btn-sm btn-outline-danger" type="submit">{% if user.is_active %}<i class="bi bi-eye-fill"></i>{% else %}<i class="bi bi-eye-slash-fill"></i>{% endif %}</button>
</form>
 
हमें उपयोगकर्ता गतिविधि, और उचित URL पैटर्न को टॉगल करने के लिए एक दृश्य जोड़ने की आवश्यकता होगी। जब हम इस पर होते हैं, तो आइए किसी उपयोगकर्ता को हटाने के लिए एक दृश्य जोड़ें यदि हमें इसकी आवश्यकता है।

from django.views.decorators.csrf import csrf_exempt

@csrf_exempt
@login_required
@user_passes_test(is_superuser_or_vendor)
def toggle_user_active(request, pk):
    user = User.objects.get(id=pk)
    if request.method == 'POST':
        user.is_active = not user.is_active
        user.save()
    return HttpResponse('<i class="bi bi-eye-fill"></i>' if user.is_active else '<i class="bi bi-eye-slash-fill"></i>')


# आयात
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import DeleteView

class UserDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = User
    success_url = '/' # सफलता URL पर पुनर्निर्देशित
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

    def test_func(self): # परीक्षण करें कि यदि उपयोगकर्ता सुपरयूज़र है और उसे हटाने की अनुमति है
        user = self.get_object()
        if self.request.user != user and self.request.user.is_superuser:
            return True
        return False
हालांकि यह आवश्यक होने पर व्यावहारिक है, उपयोगकर्ता को हटाना ज्यादातर समय आवश्यक नहीं होना चाहिए, हम केवल उन उपयोगकर्ताओं की दृश्यता को टॉगल कर सकते हैं जो साइट पर जाते हैं यदि हमें उन्हें खारिज करने की आवश्यकता है। URL पैटर्न जो हमने जोड़े जो इस तरह दिखते हैं। नैनो के साथ, उपयोगकर्ताओं/urls.py को संपादित करें और इन पंक्तियों को जोड़ें:

nano users/urls.py
लाइनों को उपयोगकर्ता के विचारों में पथों की सूची में जाना चाहिए, समाप्त होने से पहले "] लेकिन शुरुआत के बाद" ["।

# …
    path('user/<int:pk>/delete/', UserDeleteView.as_view(template_name='blog/user_confirm_delete.html'), name='delete-user'),
    path('user/<int:pk>/active/', views.toggle_user_active, name='toggle-user-active'),
# …
अब, साइट का बैकअप लेना सुनिश्चित करें ताकि आप इसे वेब सर्वर पर डाउनलोड कर सकें, जिस पर हम काम करना जारी रखेंगे। कमांड लाइन से,

sudo backup
अब हमारी साइट का समर्थन किया गया है। इसलिए अब हमारे पास कुछ और उपयोगी विशेषताएं हैं। लेकिन यहाँ बड़ी तस्वीर के बारे में क्या? यह कोड अभी भी इंटरनेट से सुलभ नहीं है, हमारे पास अभी तक कोई मेल सर्वर नहीं है, और हमें अपने ऐप का विस्तार करने की आवश्यकता है, जिसमें व्यापक सत्यापन प्रक्रिया को शामिल करने के लिए अपने ऐप का विस्तार करने की आवश्यकता है, जिससे हमें साइट का पता लगाने में मदद मिल सके, साथ ही विशेषाधिकार प्राप्त उपयोगकर्ताओं को प्रमाणित करने के लिए सुरक्षित प्रोटोकॉल के साथ । हम यह सब प्राप्त करेंगे। अब के लिए सबसे महत्वपूर्ण बात सिर्फ इस कोड को ऑनलाइन प्राप्त कर रही होगी, जिसे हम एक उबंटू सर्वर पर बैश की कुछ पंक्तियों के साथ कर सकते हैं। हालांकि आपको इसके लिए एक सर्वर किराए पर लेना होगा, जब तक कि आपके पास घर पर एक सर्वर और एक व्यावसायिक इंटरनेट सदस्यता नहीं है जो आपको पोर्ट खोलने की अनुमति देता है। मैं व्यक्तिगत रूप से अपनी वेबसाइट को एक HP Z440 पर चलाता हूं जो मेरे अपार्टमेंट में स्थापित है, लेकिन यह आमतौर पर एक वर्चुअल प्राइवेट सर्वर (VPS) को किराए पर लेने के लिए बुनियादी आवश्यकताओं के लिए बहुत सस्ता है। ध्यान रखें कि अब हम जिस कोड को चला रहे हैं वह अपेक्षाकृत पतली है, इसे बनाए रखने और बेहतर होने से पहले इसे बेहतर बनाने की आवश्यकता होगीएक उत्पाद बनाने के लिए हमें क्या उपयोग करने के लिए तैयार है। सावधान रहें कि आप इंटरनेट के साथ क्या करते हैं, सुनिश्चित करें कि यदि आप इस साइट को सार्वजनिक रूप से एक लिनक्स सर्वर पर वेब पर तैनात करते हैं, तो आपके पास अपनी वेबसाइट के साथ अवांछित इंटरैक्शन को ब्लॉक करने की योजना है। यह संभावना पहली बार में एक समस्या नहीं होगी, लेकिन हम मशीन लर्निंग, आर्टिफिशियल इंटेलिजेंस और कंप्यूटर विजन सहित इस से निपटने के लिए विभिन्न प्रकार के समाधानों पर गौर करेंगे। जब यह एक समस्या बन जाती है, तो समाधान के लिए इस पाठ में आगे देखें। वीपीएस किराए पर लेने के संदर्भ में, बहुत सारे स्थान हैं जो आप जा सकते हैं। Google क्लाउड में VPS सर्वर, Ionos, Kamatera, Amazon AWS हैं, और अधिक प्रदाता क्लाउड सर्वर समाधान प्रदान करते हैं जो हमारी आवश्यकताओं के अनुरूप होंगे। आपको उनके फॉर्म के माध्यम से क्लिक करना होगा और आरंभ करने के लिए एक योजना का चयन करना होगा। आप किसी भी प्रदाता के साथ एक बुनियादी योजना के साथ जा सकते हैं, लेकिन सुनिश्चित करें कि प्रदाता आपको ईमेल भेजने के लिए पोर्ट मेल सर्वर पोर्ट खोलने की अनुमति देता है (यह पोर्ट 587 और पोर्ट 25 होना चाहिए), कुछ प्रदाता इन पोर्ट को ब्लॉक करते हैं। अब तक मेरे पास हैआयनोस और कामेटेरा के साथ ईएसटी अनुभव, दोनों मुझे असीमित ईमेल भेजने की अनुमति देंगे और उनका मूल्य निर्धारण बहुत सस्ता है। आप SSH या SECURE SHELL नामक एक प्रोटोकॉल पर अपने नए सर्वर से कनेक्ट करेंगे, जो आपको अपने व्यक्तिगत कंप्यूटर से, अपने व्यक्तिगत कंप्यूटर की तरह सर्वर के साथ दूर से इंटरफ़ेस करने की अनुमति देता है। जब आप सर्वर सेट करते हैं, तो होस्टिंग प्रदाता आपको एक SSH कुंजी जोड़ने के लिए कहने जा रहा है, या वे आपको एक उपयोगकर्ता नाम और पासवर्ड देंगे। SSH कुंजी यह है कि आप कोड को संपादित करने के लिए कमांड लाइन से सर्वर पर कैसे लॉग इन करेंगे। SSH उत्पन्न करने के लिए नीचे SSH-KEYGEN विकल्प का उपयोग करें

ssh-keygen
फ़ाइल को सहेजें और यदि आपको आवश्यकता हो तो इसे अधिलेखित करें, यदि आप पहले से ही नहीं हैं तो अपनी SSH कुंजी को घुमाना अच्छा है। अब, आप अपने SSH कुंजी को देखने के लिए निम्न कमांड का उपयोग कर सकते हैं। आप इसे अपने रिमोट सर्वर पर कॉपी करना चाहेंगे ताकि आप इसे प्रमाणित करने के लिए उपयोग कर सकें।

cat ~/.ssh/id_rsa.pub
यदि आप उस कमांड को टाइप करते समय एक SSH कुंजी देखने में सक्षम नहीं थे ("ssh-rsa aaa" के साथ शुरू होने वाले अंकों और पत्रों की एक लंबी स्ट्रिंग और पत्र), एक RSA कुंजी उत्पन्न करने का प्रयास करें (वे अधिक सुरक्षित हैं, इसलिए मैं उन्हें उपयोग करने की सलाह देता हूं ।) निम्नलिखित कोड 4096 बिट RSA SSH कुंजी उत्पन्न करेगा।

ssh-keygen -t rsa -b 4096
Ubuntu चलाने वाला एक VPS बनाएँ, हालांकि आप ऐसा करने की योजना बना रहे हैं। एक बार जब आप प्रदाताओं की वेबसाइट (kamatera.com, ionos.com या इसी तरह) पर प्रपत्रों के माध्यम से क्लिक करके एक VPS बना लेते हैं, तो आप लॉग इन करना चाहते हैं। ऐसा करने के लिए, अपने IP पते (पता (पता (पता) के साथ SSH कमांड का उपयोग करें यह xx.xx.xx.xx की तरह दिखता है)। आपको हमारे द्वारा बनाए गए सर्वर पर डिफ़ॉल्ट उपयोगकर्ता नाम के प्रति संवेदनशील होने की आवश्यकता होगी, उदाहरण के लिए, उबंटू।

ssh ubuntu@XX.XX.XX.XX
आपसे एक पासवर्ड के लिए कहा जा सकता है, यदि आपसे पासवर्ड के लिए कहा जाता है, तो इसे दर्ज करें। हम डिफ़ॉल्ट उपयोगकर्ता नाम का उपयोग नहीं करेंगे, इसलिए आइए एक नया उपयोगकर्ता बनाकर और उनके खाते में एक SSH कुंजी जोड़कर शुरू करें। आइए एक नई SSHD_CONFIG फ़ाइल जोड़कर शुरू करें, जो सर्वर को बताता है कि SSH का उपयोग कैसे करें।

nano sshd_config

# यह SSHD सर्वर सिस्टम-वाइड कॉन्फ़िगरेशन फ़ाइल है।  देखना
# अधिक जानकारी के लिए sshd_config (5)।

# यह SSHD path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/गेम के साथ संकलित किया गया था

# डिफ़ॉल्ट SSHD_CONFIG में विकल्पों के लिए उपयोग की जाने वाली रणनीति के साथ भेज दिया गया
# OpenSSH अपने डिफ़ॉल्ट मान के साथ विकल्पों को निर्दिष्ट करना है जहां
# संभव है, लेकिन उन्हें छोड़ दो टिप्पणी की।  असंबद्ध विकल्प ओवरराइड करते हैं
# डिफ़ॉल्ट मान।

# पोर्ट 22
# पता
# सूची पता 0.0.0.0
# सुनो adress ::

# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key

# सिफर और कुंजीयन
# Rekeylimit डिफ़ॉल्ट कोई नहीं

# लॉगिंग
# सिसलोगफैसिलिटी प्रामाणिक
# Loglevel जानकारी

# प्रमाणीकरण:

# Logringracetime 2m
# परमिट्रोटलोगिन निषेध-पत्रकार
# सख्ती
# Maxauthtries 6
# मैक्सिस 10

PubkeyAuthentication yes

# भविष्य में डिफ़ॉल्ट रूप से अवहेलना करने के लिए .ssh/अधिकृत_केस 2 की अपेक्षा करें।
AuthorizedKeysFile	.ssh/authorized_keys .ssh/authorized_keys2

# अधिकृत

# अधिकृत नहीं
# अधिकृत

# इसके लिए काम करने के लिए आपको/etc/ssh/ssh_nokn_hosts में होस्ट कीज़ की भी आवश्यकता होगी
# HostBasedAuthentication नहीं
# यदि आप पर भरोसा नहीं करते हैं तो हां में बदलें ~/.ssh/got_hosts
# Hostbasedauthentication
# अनदेखी
# उपयोगकर्ता के ~/.rhosts और ~/.shosts फ़ाइलों को न पढ़ें
# अज्ञानी हाँ

# स्पष्ट पाठ पासवर्ड को अक्षम करने के लिए, यहां नहीं बदलें!
PasswordAuthentication no
# Parmitemptypasswords नहीं

# चुनौती-प्रतिक्रिया पासवर्ड को सक्षम करने के लिए हां में बदलें (के साथ सावधान मुद्दे)
# कुछ पाम मॉड्यूल और धागे)
KbdInteractiveAuthentication no

# केर्बरोस विकल्प
# Kerberosauthentication नहीं
# Kerberosorlocalpasswd हाँ
# Kerberosticketcleanup हाँ
# Kerberoscotted रॉड नहीं

# GSSAPI विकल्प
# Gssapiauthentication नहीं
# Gssapicleanupcredentials हाँ
# Gssapistrictacceptorcheck हाँ
# Gssapikeyexchange नहीं

# PAM प्रमाणीकरण, खाता प्रसंस्करण को सक्षम करने के लिए इसे 'हां' पर सेट करें,
# और सत्र प्रसंस्करण। यदि यह सक्षम है, तो PAM प्रमाणीकरण होगा
# kbdinteractiveauthentication और के माध्यम से अनुमति दी जाए
# PasswordAuthentication।  आपके PAM कॉन्फ़िगरेशन के आधार पर,
# KBDInteractiveAuthentication के माध्यम से PAM प्रमाणीकरण बाईपास हो सकता है
# "परमिट्रोटलोगिन के बिना-पैसवर्ड" की सेटिंग।
# यदि आप बस पाम खाता चाहते हैं और सत्र चेक बिना चलाने के लिए
# PAM प्रमाणीकरण, फिर इसे सक्षम करें लेकिन पासवर्ड सेट करें
# और kbdinteractiveauthentication 'नहीं'।
UsePAM yes

# Yellagentforverving YES
# Allowtcpforverving YES
# गेटवेपोर्ट्स नहीं
X11Forwarding yes
# X11DISPLAYOFFSET 10
# X11uselocalhost हाँ
# परमिट्टी हाँ
PrintMotd no
# PrintLastLog हाँ
# Tcpkeepalive हाँ
# में permittuenvironment
# संपीड़न विलंब
# ग्राहक अंतराल 0
# ClientaliveCountMax 3
# में इस्तेमाल किया
# Pidfile /run/sshd.pid
# मैक्सस्टार्टअप 10: 30: 100
# Pemittunl नहीं
# Chrootdirectory कोई नहीं
# संस्करण परिशिष्ट कोई नहीं

# कोई डिफ़ॉल्ट बैनर पथ नहीं
Banner /etc/banner

# ग्राहक को स्थानीय चर चर पास करने की अनुमति दें
AcceptEnv LANG LC_*

# कोई सबसिस्टम का डिफ़ॉल्ट ओवरराइड करें
Subsystem	sftp	/usr/lib/openssh/sftp-server

# प्रति-उपयोगकर्ता आधार पर ओवरराइडिंग सेटिंग्स का उदाहरण
# उपयोगकर्ता anoncvs मैच करें
# X11forwverding नहीं
# Allowtcpforwarding नहीं
# में अनुमति देना
# Forcecommand cvs सर्वर
PermitRootLogin no
याद रखें, फ़ाइल को बचाने के लिए Ctrl+x और y। इसके बाद, आइए एक मूल स्क्रिप्ट लिखें जिसे इनिशियलाइज़ (हमारे उपयोगकर्ता के डिफ़ॉल्ट होम डायरेक्टरी में सभी) कहा जाता है।

nano initialize
इन लाइनों को फ़ाइल में जोड़ें, प्रतिस्थापित करेंअपने SSH कुंजी के साथ आपको कैट का उपयोग करके मिला। (.ssh/id_rsa.pub)

# !
sudo apt install -y nano git openssh-server
sudo cp sshd_config /etc/ssh/sshd_config
sudo service ssh restart
sudo service sshd restart
echo "/root/.ssh/id_rsa" | sudo su root -c "ssh-keygen -t rsa -N ''"
echo "root ssh key:"
sudo su root -c "cat /root/.ssh/id_rsa.pub"
sudo adduser --disabled-password --gecos "" team
sudo passwd -d team
sudo usermod -aG sudo team
echo "/home/team/.ssh/id_rsa" | su team -c "ssh-keygen -t rsa -N ''"
cat /home/team/.ssh/id_rsa.pub >> /home/team/.ssh/authorized_keys
echo '<key here>' >> /home/team/.ssh/authorized_keys
echo "team ssh key:"
cat /home/team/.ssh/id_rsa.pub
इस फ़ाइल के माध्यम से आपको चलने के लिए, आइए लाइन द्वारा लाइन शुरू करें। पहली पंक्ति कंपाइलर को बताती है कि यह एक बैश स्क्रिप्ट है। फिर हम निर्भरताएं स्थापित कर रहे हैं, सही निर्देशिका में sshd_config की नकल कर रहे हैं, SSH को पुनरारंभ कर रहे हैं, रूट के लिए SSH कुंजी उत्पन्न कर रहे हैं, उपयोगकर्ता 'टीम' को जोड़ते हैं (आप इसके लिए एक नाम चुन सकते हैं, अपने नाम और अक्षम पासवर्ड के साथ Adduser कमांड का उपयोग करें और पासवर्ड का उपयोग करें। अब)। हम SUDO समूह में टीम भी जोड़ते हैं, उनकी SSH कुंजी उत्पन्न करते हैं, अधिकृत कुंजियों और उनके साथ -साथ हमारी कुंजी जोड़ते हैं, और उनकी कुंजी को भी प्रिंट करते हैं। यह नया उपयोगकर्ता यह होगा कि हम साइट में कैसे लॉग इन करते हैं। एक नए टर्मिनल में, आगे बढ़ें और फिर से सर्वर खोलें।

ssh team@XX.XX.XX.XX
आपको इस बार एक पासवर्ड की आवश्यकता नहीं होनी चाहिए, जैसा कि आपके पास एक SSH कुंजी है। हमने साइट को अधिक सुरक्षित रखने के लिए पासवर्ड के साथ लॉगिन भी अक्षम कर दिया है। अब, यह सर्वर इस पर कोई जानकारी नहीं होने के साथ पूरी तरह से खाली हो जाता है। आइए हम GIT से हमारी परियोजना को क्लोन करके शुरू करें ताकि हम इसे दूरस्थ मशीन पर डाउनलोड और चला सकें। SSH से जुड़े दूरस्थ सर्वर पर, पहले अपने SSH कुंजी प्रिंट करें:

cat ~/.ssh/id_rsa.pub
इसके बाद, इस कुंजी को Git सेटिंग्स में पेस्ट करें जैसे हमने पहले किया था कि हम अपने Git रिपॉजिटरी को सेट करें। अब हम अपनी परियोजना को सीधे सर्वर पर क्लोन कर सकते हैं। सुनिश्चित करें कि आपने स्थानीय रूप से पहले प्रोजेक्ट का बैकअप लिया है, इसलिए यह डाउनलोड करने के लिए Git सर्वर पर है।

git clone git://github.com/you/yourproject.git
उत्तम। अब सभी फाइलें यहाँ हैं। हम उन्हें एलएस के साथ देख सकते हैं

ls
अब, आइए सर्वर सेट करना शुरू करें। सबसे पहले, अपनी परियोजना निर्देशिका को एक सरल, यादगार नाम में कॉपी करें जिसे हम परियोजना के लिए उपयोग करेंगे।

cp -r yourproject whatyoucalledit
जहां "WhateouCaldEdit" आपके प्रोजेक्ट का नया नाम है। अगला, हमें सर्वर को सेट करने के लिए एक बुनियादी उपयोगिता का निर्माण करना होगा। हम इस उपयोगिता को बचाएंगे और भविष्य में इसका उपयोग करेंगे। इस उपयोगिता का निर्माण करने के लिए, आइए एक उपयोगकर्ता बाइनरी बनाएं ताकि हम एक स्क्रिप्ट को संपादित करें। बैश का उपयोग करना, संपादित करें/usr/bin/ascript

sudo nano /usr/bin/ascript
वहां सूडो का उपयोग करना सुनिश्चित करें ताकि आपके पास फ़ाइल को संपादित करने की अनुमति हो। फ़ाइल में, इन पंक्तियों को जोड़ें:

# !
if [ ! -f /usr/bin/$1 ]; then
    sudo touch /usr/bin/$1
    echo "# !
    sudo chmod a+x /usr/bin/$1
    sudo nano /usr/bin/$1
    echo $1 | sudo tee -a /etc/ascripts
else
    sudo chmod a+x /usr/bin/$1
    sudo nano /usr/bin/$1
fi
याद रखें कि यह स्क्रिप्ट एक तर्क, स्क्रिप्ट नाम, $ 1 के रूप में लेता है। पहले यह जांचता है कि क्या फ़ाइल मौजूद है, या अन्यथा इसे बनाता है, स्क्रिप्ट को घोषित करने के लिए पहली पंक्ति जोड़ता है, बैश है, इसकी अनुमति बदल देता है, इसे संपादित करता है, और इसके नाम को /etc /ascripts में जोड़ता है जो हमें स्क्रिप्ट के नामों को संग्रहीत करने देता है। बना रहे हैं। यदि फ़ाइल पहले से मौजूद है, तो बस अनुमतियाँ बदलें और इसे संपादित करें। फ़ाइल को सहेजें, और आगे हम इसे अनुमतियों को बदल देंगे। जब तक हम इस स्क्रिप्ट का उपयोग करते हैं, हमें फिर से ऐसा नहीं करना पड़ेगा।

sudo chmod a+x /usr/bin/ascript
उत्तम। अब सेटअप नामक एक स्क्रिप्ट बनाएं। सबसे पहले, आपको अभिभूत करने के लिए नहीं, लेकिन एक नज़र डालें कि मेरी सेटअप स्क्रिप्ट कैसी दिखती है। हम इस स्क्रिप्ट के माध्यम से चलेंगे कि इस स्क्रिप्ट को आपके प्रोजेक्ट में कैसा दिखना चाहिए, आपको शुरू करने के लिए मेरी स्क्रिप्ट में सब कुछ की आवश्यकता नहीं होगी।

# !
SECONDS=0
PYTHON_VERSION=3.12
echo "femmebabe installer initialized."
# sudo chmod a+x स्क्रिप्ट/usersetup
# ./scripts/usersetup
# Ssh-keyen
# परियोजना निर्देशिका
DIR="/home/team/femmebabe"
USER="team"
# लॉग कमांड
echo "Logging commands"
sudo cp log/commands.log /var/log/commands.log
sudo chmod -R a+w /var/log
sudo chown -R :syslog /var/log
echo $'alias venv="source /home/team/femmebabe/venv/bin/activate"' | sudo tee -a /home/team/.profile
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a /etc/bashrc
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a "/home/team/.bashrc"
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a /root/.bashrc
echo "source /etc/bashrc" | sudo tee -a /home/team/.profile
echo "/var/log/commands.log" | sudo tee -a /etc/logrotate.d/syslog
echo "local6.*    /var/log/commands.log" | sudo tee -a "/etc/rsyslog.d/bash.conf"
sudo service rsyslog restart
# नैनो विन्यास
echo "set tabsize 4" >> .nanorc
echo "set tabstospaces" >> .nanorc
# Git config
echo "Git configuration"
sudo git config --global user.email "jasper.camber.holton@gmail.com" && sudo git config --global user.name "Jasper Holton"
git config --global user.email "jasper.camber.holton@gmail.com"
git config --global user.name "Jasper Holton"
git config --global --add safe.directory $"$DIR"
sudo ssh-keyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/known_hosts
sudo ssh-keyscan -t rsa github.com | sudo tee -a /root/.ssh/known_hosts
echo "Mounting setup"
sudo mount -o remount,size=16G,exec /tmp
# अद्यतन और स्थापित करें
echo "Update and install packages"
sudo apt update && sudo NEEDRESTART_MODE=a apt upgrade -y
sudo apt purge postgresql-client-14 postgresql-client-common postgresql-common postgresql-contrib postgresql -y
echo "postfix postfix/mailname string femmebabe.com" | sudo debconf-set-selections
echo "postfix postfix/main_mailer_type string 'Internet Site'" | sudo debconf-set-selections
sudo NEEDRESTART_MODE=a DEBIAN_FRONTEND=noninteractive apt install -y postfix
sudo NEEDRESTART_MODE=a apt install -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cmake python-is-python3 python3-venv python3-pip python3-django expect tesseract-ocr openjdk-8-jdk redis-server libopencv-dev python3-opencv python3-dev libsasl2-dev opendkim opendkim-tools dovecot-core dovecot-pop3d dovecot-imapd auditd procmail libpq-dev postgresql postgresql-contrib libheif-dev snapd git software-properties-common certbot python3-certbot-apache
echo "-a exit,always -F arch=b64 -F euid=0 -S execve" | sudo tee -a /etc/audit/audit.rules
echo "-a exit,always -F arch=b32 -F euid=0 -S execve" | sudo tee -a /etc/audit/audit.rules
# क्लैमव एंटीवायरस सक्षम करें
echo "Starting antivirus"
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
# होस्टनाम सेट करें
echo "127.0.0.1 femmebabe" | sudo tee -a /etc/hosts
sudo hostnamectl set-hostname localhost
# सेटअप पोस्टग्रेस
echo "Postgres setup"
sudo -u postgres psql -U postgres -c "DROP DATABASE database;"
sudo -u postgres psql -U postgres -c "CREATE DATABASE database;"
sudo -u postgres psql -U postgres -c "CREATE USER django WITH PASSWORD 'password';"
sudo -u postgres psql -U postgres -c "ALTER ROLE django SET client_encoding TO 'utf8';"
sudo -u postgres psql -U postgres -c "ALTER ROLE django SET default_transaction_isolation TO 'read committed';"
sudo -u postgres psql -U postgres -c "ALTER ROLE django SET timezone TO 'UTC';"
sudo -u postgres psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE database TO django;"
# सेटअप बैकअप डेटाबेस
echo "Building database from backup, this may take a while."
cat db.json.?? > db.json
echo "Configuring firewall"
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow 22
sudo ufw allow http
sudo ufw allow https
sudo ufw allow 'Postfix'
sudo ufw allow 'Postfix SMTPS'
sudo ufw allow 'Postfix Submission'
sudo ufw allow 'Dovecot POP3'
sudo ufw allow 'Dovecot Secure POP3'
sudo ufw allow 110/tcp
sudo ufw allow 25/tcp
echo "y" | sudo ufw enable
# अक्षम ipatables
echo "Configuring firewall"
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
sudo iptables-save
# BitDefender स्थापित करें
cd $DIR
echo "Runnning BitDefender antivirus installer"
wget https://cloud.gravityzone.bitdefender.com/Packages/NIX/0/7aTSsy/setup_downloader.tar
mkdir bitdefender
tar -xf setup_downloader.tar -C bitdefender
sudo rm setup_downloader.tar
sed -i -e 's/{LOGINPASSWD/z&A*3BPd_qBGUMs/g' bitdefender/installer
sudo chmod a+x bitdefender/installer
sudo ./bitdefender/installer
# सेटअप पोस्टफिक्स
cd $DIR
echo "Mail services configuration"
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.backup
sudo cp config/etc_postfix_main.cf /etc/postfix/main.cf
sudo cp config/etc_postfix_master.cf /etc/postfix/master.cf
sudo cp config/etc_default_opendkim /etc/default/opendkim
sudo cp config/etc_dovecot_conf.d_10-auth.conf /etc/dovecot/conf.d/10-auth.conf
sudo cp config/etc_dovecot_conf.d_10-master.conf /etc/dovecot/conf.d/10-master.conf
sudo cp config/etc_dovecot_dovecot.conf /etc/dovecot/dovecot.conf
sudo cp config/etc_dovecot_passwd /etc/dovecot/passwd
sudo cp config/etc_opendkim.conf /etc/opendkim.conf
sudo cp config/etc_default_opendkim /etc/default/opendkim
sudo adduser postfix opendkim
sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
sudo mkdir /etc/opendkim/keys/femmebabe.com
sudo mkdir /var/spool/postfix/opendkim
sudo echo "*@femmebabe.com     sendonly._domainkey.femmebabe.com" | sudo tee -a /etc/opendkim/signing.table
sudo echo "sendonly._domainkey.femmebabe.com    femmebabe.com:sendonly:/etc/opendkim/keys/femmebabe.com/sendonly.private" | sudo tee -a /etc/opendkim/key.table
sudo echo "127.0.0.1" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "localhost" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "*.femmebabe.com" | sudo tee -a /etc/opendkim/trusted.hosts
sudo chown -R opendkim:opendkim /etc/opendkim
sudo opendkim-genkey -b 2048 -d femmebabe.com -D /etc/opendkim/keys/femmebabe.com -s sendonly -v
sudo chmod go-rw /etc/opendkim/keys
sudo chown opendkim:opendkim /etc/opendkim/keys/femmebabe.com/sendonly.private
sudo chown opendkim:postfix /var/spool/postfix/opendkim
cd $DIR
sudo cp mailbox/* /var/mail/
sudo chown :users /var/mail/*
sudo chmod -R a+rwx /var/mail/*
sudo systemctl restart opendkim postfix dovecot
# DIRS बनाएँ
cd $DIR
mkdir media/audio
mkdir media/audio/fingerprints
mkdir media/security
mkdir media/secure
mkdir media/secure/media
mkdir media/secure/video
mkdir media/secure/profile
mkdir media/secure/face
mkdir media/images
mkdir media/live
mkdir media/live/files
mkdir media/live/stills
mkdir media/files
mkdir temp
mkdir temp/data
mkdir temp/gfpgan
mkdir mail/inbox
mkdir mailbox
# सेटअप virtuealenv
cd $DIR
echo "Creating virtual environment"
python -m venv venv
source venv/bin/activate
# निर्भरता प्राप्त करें और निर्माण करें
echo "Getting and building dependencies, this may take a whike"
cd $DIR
git clone https://github.com/sukhitashvili/violence-detection.git
cp config/vd-requirements.txt violence-detection/requirements.txt
cp config/vd-model.py violence-detection/model.py
cd violence-detection
pip3 install -r requirements.txt
cd $DIR
wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P experiments/pretrained_models
git clone https://github.com/TencentARC/GFPGAN.git
git clone https://github.com/davisking/dlib.git
cd dlib
mkdir build; cd build; cmake ..; cmake --build .
cd ..
source venv/bin/activate
python setup.py install
cd $DIR
source venv/bin/activate
cd $DIR/GFPGAN/
echo "Installing python dependencies"
pip install basicsr
pip install facexlib
pip install -r requirements.txt
python setup.py develop
pip install realesrgan
cd $DIR
sudo chown -R team:users gfpgan
echo "Installing ta-lib"
wget https://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
tar xvzf ta-lib-0.4.0-src.tar.gz
sudo rm ta-lib-*
cd ta-lib
sudo ./configure
sudo make
sudo make install
# फ़ायरवॉल नियम सेट करें
cd $DIR
# PYPI निर्भरता स्थापित करें
echo "Installing remaining python dependencies (this may take a while)"
sudo systemctl mask tmp.mount
cd $DIR
source venv/bin/activate
pip3 install -U "celery[redis]"
pip3 install -r requirements.txt --use-deprecated=legacy-resolver --use-pep517
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP OPENCV-PYTHON == 4.5.5.64 स्थापित करें
# PIP स्थापित OpenCV-Contrib-Python == 4.5.5.64
pip3 install --upgrade opencv-python-headless
pip3 uninstall channels
pip3 uninstall daphne
pip3 install channels["daphne"]
pip3 install Pillow==9.5.0
pip3 install librosa
pip3 install -U 'Twisted[tls,http2]'
pip3 install --upgrade certifi requests urllib3 numpy oauthlib twisted pyjwt sqlparse cryptography astral webauthn docbarcodes pdf417 deepface --no-cache-dir
pip3 install tensorflow==2.15.1
# CERTBOT स्थापित करें
echo "Installing certificates"
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo snap install redis
sudo systemctl enable apache2
sudo systemctl start apache2
# रन सर्टर्बोट
sudo certbot --apache --non-interactive --agree-tos --domains femmebabe.com --email jasper.camber.holton@gmail.com
# डाक -सर्वर को पुनः लोड करें
sudo systemctl restart opendkim postfix dovecot
# COPY CERTS
# Sudo cp /etc/lettesencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/lettesencrypt/live/femmebabe.com/cert.pem cert.pem
# पैबंद
cp scripts/content.py $"/home/team/femmebabe/venv/lib/python${PYTHON_VERSION}/site-packages/pyxb/binding/content.py"
cp scripts/pwa_webpush_forms.py $"/home/team/femmebabe/venv/lib/python${PYTHON_VERSION}/site-packages/pwa_webpush/forms.py"
cp scripts/webauth_views.py $"/home/team/femmebabe/venv/lib/python${PYTHON_VERSION}/site-packages/webauth/views.py"
cp scripts/json.py $"venv/lib/python${PYTHON_VERSION}/site-packages/django/core/serializers/json.py"
# उपयोगकर्ता सेटिंग्स सेट करें
sudo gpasswd -a www-data users
# अनुमतियाँ सेट करें
echo "Setting permissions"
sudo chown -R team:users cache/
sudo chmod a+rwx -R cache/
# sudo chown -r टीम: उपयोगकर्ता/var/run/
# SUDO CHOWN ROOT: रूट/रन/SUDO/TS -R
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /var/log/redis
sudo chmod -R u+rwX,g+rwX,u+rx /var/log/redis
sudo chmod +r /etc/redis/redis.conf
sudo chown -R team:users /var/log/
sudo chown -R :users .././
sudo chmod -R g+rwX ./
sudo chmod -R g+rX .././
sudo chmod -R g-rwX ../.ssh
sudo chmod 774 ./
# SUDO CHMOD 664 DB.SQLITE3
# sudo chown www-data: उपयोगकर्ता db.sqlite3
sudo chown -R www-data:www-data media/
sudo chown www-data:users ./
sudo chown -R team:users media/
sudo chown -R team:users ./
sudo chown -R team:users ./gfpgan/
sudo chown -R team:users ./temp/
sudo chmod a+r team /var/mail/$USER
# कॉपी कॉन्फ़िगरेशन और अनुमतियाँ सेट करें
echo "Configuring remaining services"
sudo cp config/apis.json /etc/apis.json
sudo cp config/config.json /etc/config.json
sudo cp config/femmebabe-le-ssl.conf /etc/apache2/sites-available/femmebabe-le-ssl.conf
sudo cp config/etc_dovecot_passwd /etc/dovecot/passwd
sudo cp config/etc_init.d_celery /etc/init.d/celery
sudo cp config/etc_init.d_celerybeat /etc/init.d/celerybeat
sudo cp config/etc_default_celerybeat /etc/default/celerybeat
sudo cp config/etc_default_celery /etc/default/celery
sudo cp config/etc_systemd_system_daphne.service /etc/systemd/system/daphne.service
sudo cp config/etc_systemd_system_celery.service /etc/systemd/system/celery.service
sudo cp config/etc_systemd_system_celerybeat.service /etc/systemd/system/celerybeat.service
sudo chmod a+x /etc/init.d/celery
sudo chmod a+x /etc/init.d/celerybeat
# डेटाबेस सेटअप
echo "Running migrations, this should be quick"
python manage.py makemigrations
python manage.py migrate --run-syncdb
echo "Loading data, this may take a while"
python manage.py loaddata db.json
echo "Setup crontab/sudoers configuration"
sudo crontab -l -u root | cat - config/crontab | sudo crontab -u root -
sudo sh -c "cat config/sudoers >> /etc/sudoers"
# पाम कॉन्फ़िगरेशन इंजेक्ट करें और दोषपूर्ण SSH कॉन्फ़िगरेशन निकालें
# sudo sed -i '' -e '$ d' /tc/pam.d/sshd
# Sudo sed -i '' -and $ d ' /etc /प्रोफ़ाइल
echo "session required pam_exec.so seteuid /home/team/femmebabe/pam.sh" | sudo tee -a /etc/pam.d/sshd
echo "session required pam_exec.so seteuid /home/team/femmebabe/logout.sh" | sudo tee -a /etc/pam.d/sshd
sudo chmod a+x pam.sh
sudo rm /etc/ssh/sshd_config.d/50-cloud-init.conf
# बिन स्क्रिप्ट कॉपी करें और अनुमतियाँ सेट करें
echo "Copying scripts"
sudo cp scripts/reload /usr/bin/
sudo cp scripts/check /usr/bin/
sudo cp scripts/enagpu /usr/bin/
sudo cp scripts/disgpu /usr/bin/
sudo cp scripts/activate /usr/bin/
sudo cp scripts/backup /usr/bin/
sudo cp scripts/ascript /usr/bin/
sudo cp scripts/setup /usr/bin/
sudo cp scripts/addsetup /usr/bin/
sudo cp scripts/watchlogs /usr/bin/
sudo cp scripts/logs /usr/bin/
sudo cp scripts/cmds /usr/bin/
sudo cp scripts/setup /usr/bin/
sudo cp scripts/pushweb /usr/bin/
sudo cp scripts/purgecache /usr/bin/
sudo cp config/banner /etc/banner
cd /usr/bin/
sudo chmod a+x activate
sudo chmod a+x backup
sudo chmod a+x ascript
# सेवाओं को पुनः लोड और सक्षम करें
echo "Enabling services"
sudo systemctl daemon-reload
sudo systemctl enable daphne.service
sudo systemctl enable celery.service
sudo systemctl enable celerybeat.service
sudo systemctl enable clamav-daemon
sudo systemctl start daphne.service
sudo systemctl start celery.service
sudo systemctl start celerybeat.service
sudo systemctl start clamav-daemon
# Apache मॉड्यूल सक्षम करें
echo "Enabling apache2"
sudo a2enmod rewrite
sudo a2enmod wsgi
sudo a2enmod headers
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# डिफ़ॉल्ट साइट अक्षम करें
sudo a2dissite 000-default
sudo a2dissite 000-default-le-ssl
# साइट के लिए सक्षम करें
sudo a2ensite femmebabe-le-ssl
# डेमॉन को पुनः लोड करें और अपाचे, पोस्टफिक्स और ओपेंडकिम को पुनरारंभ करें
sudo systemctl daemon-reload
sudo systemctl restart apache2
sudo systemctl restart opendkim postfix
sudo systemctl start daphne
# अनुमतियाँ सेट करें
sudo chown -R :www-data /var/www/
sudo chown -R :www-data /var/www/.deepface
# स्वैप कॉन्फ़िगरेशन
echo "Allocating swap, this may take a while"
sudo swapoff /swapfile
sudo rm /swapfile
sudo fallocate -l 8G /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1024 count=8388608
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo "/swapfile swap swap defaults 0 0" | sudo tee -a /etc/fstab
sudo swapon --show
# आतिन कैप्शन इंजन
echo "Initializing routine caption"
/home/team/femmebabe/venv/bin/python /home/team/femmebabe/routine_caption.py
/home/team/femmebabe/venv/bin/python /home/team/femmebabe/setup_mail.py
# सेटअप गिट
echo "Setting up git"
cd $DIR
sudo rm -r .git
git init --initial-branch=main
echo "Setting user password"
sudo usermod --password $(echo team | openssl passwd -1 -stdin) team
# डोमेन कॉन्फ़िगरेशन के लिए IPv6 और opendkim दिखाएं
echo "COPY the below information to domain configuration."
hostname -I
ip a | grep inet
ip -6 addr | grep "scope link"
sudo cat /etc/opendkim/keys/femmebabe.com/sendonly.txt | tr -d '\n' | sed 's/\s//g' | sed 's/""//g' | awk -F'[)(]' '{print $2}'
# सेटअप पूरा हुआ
echo "Setup completed in"
wc -l scripts/setup
echo "lines of code."
echo "Total time:"
duration=$SECONDS
echo "$((duration / 60)) minutes and $((duration % 60)) seconds elapsed."
echo "TODO:"
echo "- COPY above IPv6 address to domain DNS configuration"
echo "- COPY domain key to domain DNS configuration"
echo "- ADD new git repository with git remote add originlab <repo>."
echo "- OPEN port 25"
echo "- INSTALL antivirus as per reccomendations"
echo "- TEST"
echo "If neccesary,"
echo "- DEBUG"
echo "- FIX setup and backup scripts"
echo "- Fix server"
echo ""
echo "Thank you for using the femmebabe installer. Have a great day!"
echo "Goodbye."
यह बहुत सेटअप है! संक्षेप में, यह कोड कमांड को लॉग करता है, नैनो और गिट को कॉन्फ़िगर करता है, फ़ाइलों पर प्रतियां, डाउनलोड करता है और उबंटू एप्ट पैकेज, पायथन निर्भरताएं, पोस्टफिक्स को कॉन्फ़िगर करता है, पोस्टग्रेसक्यूएल (डेटाबेस सर्वर) को कॉन्फ़िगर करता है और डेटाबेस को लोड करता है, यूएफडब्ल्यू (एक अपूर्ण फ़ायरवॉल) कॉन्फ़िगर करता है, Iptables को अक्षम करता है, एक एंटीवायरस डाउनलोड करता है, निर्देशिका, क्लोन निर्भरता बनाता है, प्रमाण पत्र स्थापित करता है और सेट करता है सर्वर, कॉन्फ़िगरेशन इंस्टॉल करता है, शुरू करता है और सक्षम करता है, स्वैप आवंटित करता है, अनुमतियाँ सेट करता है, और आईपी, आईपीवी 6 पते और opendkim कुंजी को प्रिंट करता है। काफी सरल, लेकिन यह बहुत सारे कोड की तरह दिखता है। हमें इसकी बहुत आवश्यकता नहीं होगी क्योंकि हमारे पास निर्भरता नहीं है, हम अजवाइन, अजवाइन या डैफने का उपयोग नहीं कर रहे हैं, लेकिन हम उनमें से कुछ को शुरू करने के लिए वैसे भी स्थापित करेंगे। ध्यान दें कि इस कोड में कई बार घोषित एक डोमेन है। हमें एक डोमेन नाम (जो एक छोटा सा वार्षिक शुल्क है) भी खरीदना होगा। मैं एक डोमेन खरीदने के लिए स्क्वायरस्पेस की सलाह देता हूं, उनका लेआउट हैसहज और उपयोग करने में आसान। आप अपनी पसंद का कोई भी डोमेन खरीद सकते हैं, लेकिन मैं इस उदाहरण में डोमेन FemMebabe.com का उपयोग कर रहा हूं। एक बार जब आप एक डोमेन खरीद लेते हैं, तो स्क्वायरस्पेस डीएनएस कॉन्फ़िगरेशन पैनल पर जाएं और आईपी पते द्वारा सर्वर में अपने डोमेन को इंगित करने वाला एक रिकॉर्ड जोड़ें। इसे ऐसा दिखना चाहिए: @ A xx.xx.xx.xx होस्ट के रूप में @ ऑपरेटर के साथ, इस डोमेन और रूट डोमेन के तहत सभी उप -डोमेन का अर्थ है सभी सर्वर पर पुनर्निर्देशित करेंगे। घोषित करने के लिए और भी रिकॉर्ड हैं, लेकिन मेल भेजने के लिए तैयार होने के बाद हम इन पर आगे बढ़ सकते हैं। ध्यान रखें, सर्वर से सफलतापूर्वक मेल भेजने में सक्षम होने से पहले कई दिन लग सकते हैं। हम जो DNS रिकॉर्ड सेट कर रहे हैं, वह प्रचार करने में समय लगेगा। वैसे भी, हमें शुरू करने के लिए एकमात्र रिकॉर्ड एक रिकॉर्ड है। इसलिए अब हम अपनी परियोजना के अनुसार नीचे की स्क्रिप्ट भर सकते हैं और इसे चला सकते हैं। आइए एक छोटी सेटअप स्क्रिप्ट के साथ शुरू करें, बस एक बुनियादी प्रगति के लिए हमें क्या चाहिए। हम अभी तक बहुत सारी निर्भरता या Postgresql का उपयोग नहीं करेंगे, हम अभी करेंगेएक बुनियादी HTTP सर्वर और जब यह किया जाता है तो इसे प्रमाणित करने के बारे में चिंता करें। याद रखें, एक HTTPS प्रमाणपत्र प्राप्त करने और सर्वर को सुरक्षित रूप से चलाने के लिए, हमें एक सर्वर किराए के साथ एक डोमेन खरीदना होगा। अभी के लिए, इस फ़ाइल में "टीम" को अपने उपयोगकर्ता के नाम से बदलें, "dir" अपनी परियोजना की निर्देशिका के साथ, और <> टैग में अपने ईमेल और डोमेन की आपूर्ति करें। इसके अतिरिक्त, इससे पहले कि हम इस कोड को चलाते हैं, हमें होस्टिंग प्रदाता को फायरवॉल में सेटिंग्स को बदलने की आवश्यकता है, यदि कोई हो। आमतौर पर यह आपके होस्टिंग प्रदाता के 'नेटवर्क' टैब में होता है, या यदि आप स्वयं होस्टिंग कर रहे हैं, तो अपने राउटर के 'पोर्ट फ़ॉरवर्डिंग' अनुभाग में। यदि आप सेल्फ होस्टिंग का उपयोग कर रहे हैं, तो आप अपने सर्वर मशीन के पते के साथ अपने राउटर के माध्यम से एक स्थिर आईपी भी सेट करना चाहेंगे। आपको रीड/राइट एक्सेस के लिए निम्नलिखित पोर्ट खोलने होंगे। 22 (एसएसएच) 25 (मेल) 587 (मेल) 110 (मेल क्लाइंट) 80 (HTTP) 443

# !
SECONDS=0
PYTHON_VERSION=3.12
echo "femmebabe installer initialized."
DIR="/home/team/<yourproject>"
USER="team"
# लॉग कमांड
echo "Logging commands"
sudo cp log/commands.log /var/log/commands.log
sudo chmod -R a+w /var/log
sudo chown -R :syslog /var/log
echo $'alias venv="source /home/team/femmebabe/venv/bin/activate"' | sudo tee -a /home/team/.profile
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a /etc/bashrc
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a "/home/team/.bashrc"
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a /root/.bashrc
echo "source /etc/bashrc" | sudo tee -a /home/team/.profile
echo "/var/log/commands.log" | sudo tee -a /etc/logrotate.d/syslog
echo "local6.*    /var/log/commands.log" | sudo tee -a "/etc/rsyslog.d/bash.conf"
sudo service rsyslog restart
# नैनो विन्यास
echo "set tabsize 4" >> .nanorc
echo "set tabstospaces" >> .nanorc
# Git config
echo "Git configuration"
sudo git config --global user.email "<youremail>@gmail.com" && sudo git config --global user.name "<yourname>"
git config --global --add safe.directory $"$DIR"
sudo ssh-keyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/known_hosts
sudo ssh-keyscan -t rsa github.com | sudo tee -a /root/.ssh/known_hosts
# अद्यतन और स्थापित करें
echo "Update and install packages"
sudo apt update && sudo NEEDRESTART_MODE=a apt upgrade -y
sudo apt purge postgresql-client-14 postgresql-client-common postgresql-common postgresql-contrib postgresql -y
echo "postfix postfix/mailname string femmebabe.com" | sudo debconf-set-selections
echo "postfix postfix/main_mailer_type string 'Internet Site'" | sudo debconf-set-selections
sudo NEEDRESTART_MODE=a DEBIAN_FRONTEND=noninteractive apt install -y postfix
sudo NEEDRESTART_MODE=a apt install -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cmake python-is-python3 python3-venv python3-pip python3-django expect tesseract-ocr openjdk-8-jdk redis-server libopencv-dev python3-opencv python3-dev libsasl2-dev opendkim opendkim-tools dovecot-core dovecot-pop3d dovecot-imapd auditd procmail libpq-dev postgresql postgresql-contrib libheif-dev snapd git software-properties-common certbot python3-certbot-apache
# क्लैमव एंटीवायरस सक्षम करें
echo "Starting antivirus"
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
# होस्टनाम सेट करें
echo "127.0.0.1 femmebabe" | sudo tee -a /etc/hosts
sudo hostnamectl set-hostname femmebabe
# सेटअप बैकअप डेटाबेस
echo "Building database from backup, this may take a while."
cat db.json.?? > db.json
echo "Configuring firewall"
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow 22
sudo ufw allow http
sudo ufw allow https
sudo ufw allow 'Postfix'
sudo ufw allow 'Postfix SMTPS'
sudo ufw allow 'Postfix Submission'
sudo ufw allow 'Dovecot POP3'
sudo ufw allow 'Dovecot Secure POP3'
sudo ufw allow 110/tcp
sudo ufw allow 25/tcp
echo "y" | sudo ufw enable
# अक्षम ipatables
echo "Configuring firewall"
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
sudo iptables-save
# सेटअप virtuealenv
cd $DIR
echo "Creating virtual environment"
python -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
# CERTBOT स्थापित करें
echo "Installing certificates"
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo snap install redis
sudo systemctl enable apache2
sudo systemctl start apache2
# रन सर्टर्बोट
sudo certbot --apache --non-interactive --agree-tos --domains femmebabe.com --email <youremail>@gmail.com
# उपयोगकर्ता सेटिंग्स सेट करें
sudo gpasswd -a www-data users
# अनुमतियाँ सेट करें
echo "Setting permissions"
sudo chown -R team:users cache/
sudo chmod a+rwx -R cache/
# sudo chown -r टीम: उपयोगकर्ता/var/run/
# SUDO CHOWN ROOT: रूट/रन/SUDO/TS -R
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /var/log/redis
sudo chmod -R u+rwX,g+rwX,u+rx /var/log/redis
sudo chmod +r /etc/redis/redis.conf
sudo chown -R team:users /var/log/
sudo chown -R :users .././
sudo chmod -R g+rwX ./
sudo chmod -R g+rX .././
sudo chmod -R g-rwX ../.ssh
sudo chmod 774 ./
sudo chown -R www-data:www-data media/
sudo chown www-data:users ./
sudo chown -R team:users media/
sudo chown -R team:users ./
# सेवाओं को पुनः लोड और सक्षम करें
echo "Enabling services"
sudo systemctl daemon-reload
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
# Apache मॉड्यूल सक्षम करें
echo "Enabling apache2"
sudo a2enmod rewrite
sudo a2enmod wsgi
sudo a2enmod headers
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
# डेमॉन को पुनः लोड करें और अपाचे, पोस्टफिक्स और ओपेंडकिम को पुनरारंभ करें
sudo systemctl daemon-reload
sudo systemctl restart apache2
sudo systemctl restart opendkim postfix
# डोमेन कॉन्फ़िगरेशन के लिए IPv6 और opendkim दिखाएं
echo "COPY the below information to domain configuration."
hostname -I
ip a | grep inet
ip -6 addr | grep "scope link"
इस कोड को चलाने से पहले, सुनिश्चित करें कि आपके द्वारा खरीदा गया डोमेन सर्वर से जुड़ा हुआ है। ऐसा करने के लिए, अपने स्थानीय मशीन पर एक टर्मिनल खोलें, और इस कमांड को अपने डोमेन के साथ चलाएं:

ping femmebabe.com # पिंग के बाद, यहां अपना डोमेन डालें
यदि सभी अच्छी तरह से दिखते हैं और सर्वर प्रतिक्रिया भेज रहा है, तो हम स्क्रिप्ट को चलाने और पैकेज स्थापित करने के साथ -साथ हमारे अपाचे सर्वर को शुरू करने, सक्षम करने और प्रमाणित करने के लिए तैयार हैं। यह पोस्टफिक्स को कॉन्फ़िगर करने के लिए आवश्यक सभी सेटअप नहीं है, हम उस सेटअप को बाद में अधिक देखेंगे। अभी के लिए, इस सेटअप कोड को चलाएं और अपने सर्वर को स्थापित करने और प्रमाणित करने में कुछ मिनट लगने चाहिए। एक बार फिर, आपके द्वारा खरीदे गए नाम के अनुसार स्क्रिप्ट में नाम, ईमेल और डोमेन नाम को बदलना सुनिश्चित करें। अब जब सर्वर का प्रावधान हो गया है, तो आप किसी भी वेब ब्राउज़र में URL पर जा सकते हैं और यह सुनिश्चित करने के लिए जांच कर सकते हैं कि सर्वर HTTPS चला रहा है। यदि यह नहीं है, तो DNS रिकॉर्ड्स को पकड़ने के लिए थोड़ी देर प्रतीक्षा करें और फिर प्रमाणन प्रमाणन को पुनः प्राप्त करने के लिए निम्नलिखित कमांड चलाएं:

sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
जब तक आपने सब कुछ सही ढंग से कॉन्फ़िगर किया है, तब तक आपको अपाचे के डिफ़ॉल्ट पृष्ठ तक पहुंचने में सक्षम होना चाहिए ताकि यह जान सकें कि आपका कोड काम कर रहा है और एक लाइव वेबपेज प्रदर्शित कर रहा है। अगला, आइए सेटिंग्स को संपादित करें। हमारे डिफ़ॉल्ट डिबग मोड को उत्पादन में बदलने के लिए। हम सेटिंग्स में डोमेन को भी कॉन्फ़िगर करेंगे, साथ ही आंतरिक आईपी भी।

nano yourproject/settings.py
सेटिंग्स में, इन पंक्तियों को बदलें/जोड़ें।

DEBUG = False

# साइट विन्यास
SITE_NAME = 'Femme Babe'
PROTOCOL = 'https'
DOMAIN = 'femmebabe.com'
SITE_ID = 1
BASE_URL = PROTOCOL + '://' + DOMAIN
ALLOWED_HOSTS = [DOMAIN]

INTERNAL_IPS = [
    'XX.XX.XX.XX',
]
अब, हमें Apache2 को कॉन्फ़िगर करना होगा। आइए उस कॉन्फिग फ़ाइल को संपादित करें जिसे हम इस लाइन के साथ तैनात करेंगे:

sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
इस कॉन्फ़िगर फ़ाइल में हमारा डोमेन नाम होना चाहिए, और उपयोगकर्ता और प्रोजेक्ट का नाम। मैं डोमेन नाम FemMebabe.com, उपयोगकर्ता नाम टीम और प्रोजेक्ट नाम FemMebabe का उपयोग कर रहा हूं।

ServerSignature Off
ServerTokens Prod
<IfModule mod_ssl.c>
<VirtualHost *:80> 
	Redirect permanent / https://femmebabe.com/
</VirtualHost>
<VirtualHost *:443>
	ServerName femmebabe.com
	ServerAdmin team@femmebabe.com
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined
	
	Alias /static /home/team/femmebabe/static
	<Directory /home/team/femmebabe/static>
		Require all granted
	</Directory>

Alias /media/icons /home/team/femmebabe/media/
<Directory /home/team/femmebabe/media>
Require all granted
</Directory>

	<Directory /home/team/femmebabe/femmebabe>
		<Files wsgi.py>
			Require all granted
		</Files>
	</Directory>

	WSGIScriptAlias / /home/team/femmebabe/femmebabe/wsgi.py
	WSGIDaemonProcess femmebabe python-path=/home/team/femmebabe/ python-home=/home/team/femmebabe/venv header-buffer-size=100000000000 user=team
	WSGIProcessGroup femmebabe
	WSGIApplicationGroup %{GLOBAL}
	
	<Directory /home/team/femmebabe/static>
                Options Indexes FollowSymLinks
                AllowOverride All
	</Directory>

	<IfModule mod_rewrite.c>
		RewriteEngine on
		RewriteCond %{REQUEST_URI} \.(css|webp|webm|gif|png|mp3|wav|jpeg|jpg|svg|webp)$ [NC]
		RewriteCond %{HTTP_REFERER} !^https://femmebabe.com/media/.*$ [NC]
		RewriteRule ^(.+?)/$ /media/$1 [F,L]
	</IfModule>

	Include /etc/letsencrypt/options-ssl-apache.conf
	SSLCertificateFile /etc/letsencrypt/live/femmebabe.com/fullchain.pem
	SSLCertificateKeyFile /etc/letsencrypt/live/femmebabe.com/privkey.pem

	Header set X-Frame-Options: "SAMEORIGIN"
	Header set Access-Control-Allow-Origin "https://femmebabe.com"

	TimeOut 60000
	LimitRequestBody 0

	<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|webp|JPG|JPEG|wav|mp3|mp4|public|js|css|swf|webp|svg)$">
		Header set Cache-Control "max-age=30, public"
	</FilesMatch>
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
	ServerName femmebabe.com
	ServerAdmin team@femmebabe.com
	DocumentRoot /var/www/html

	ErrorLog ${APACHE_LOG_DIR}/error.log
	CustomLog ${APACHE_LOG_DIR}/access.log combined

	RewriteEngine on
	RewriteCond %{SERVER_NAME} =femmebabe.com
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>
अपने सर्वर को कॉन्फ़िगर करते समय इस उदाहरण कोड में प्रोजेक्ट, निर्देशिका और डोमेन के नाम को बदलना सुनिश्चित करें। अब, हमें डिफ़ॉल्ट साइट को अक्षम करना होगा। यह बैश का उपयोग करके किया जा सकता है।

sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
अगला, हम डिफ़ॉल्ट साइट को सक्षम कर सकते हैं और अपाचे 2 को फिर से लोड कर सकते हैं, बैश का उपयोग करके भी। /Etc/apache2/साइट्स-उपलब्ध/में संपादन करते समय आपके द्वारा घोषित फ़ाइल के नाम के साथ Femmebabe को बदलना याद रखें।

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
नवबार में अपने डोमेन पर वापस जाएं। आपको उस साइट को देखना चाहिए जिसे आपने अपने वेब ब्राउज़र में कॉन्फ़िगर किया है। बधाई हो! यदि आप इसे नहीं देखते हैं, तो आपको कुछ बदलाव करने की आवश्यकता हो सकती है। अपनी परियोजना में सेटिंग्स की सावधानीपूर्वक समीक्षा करें, अपाचे कॉन्फ़िगरेशन, और सुनिश्चित करें कि आपके पास कोई त्रुटि नहीं है, और त्रुटियों के लिए परियोजना की जांच करने के लिए निम्नलिखित कमांड चलाएं।

cd projectname
source venv/bin/activate
python manage.py check
यदि आपके पास अपने पायथन प्रोजेक्ट में त्रुटियां हैं, तो उन्हें पता करें कि वे कहाँ हैं और उन्हें ठीक करते हैं। आप अपनी सभी त्रुटियों को देखने में सक्षम नहीं हो सकते हैं, जहां वे हैं, इस पर निर्भर करता है, इसलिए यदि आपके पास कोई त्रुटि है जो बस कहता है कि "पॉपुलेट नहीं है", वर्चुअल वातावरण में निम्नलिखित फ़ाइल को संपादित करें, रजिस्ट्री, को उजागर करने के लिए, गलती।

nano venv/lib/python3.12/site-packages/django/apps/registry.py
लाइन 83 पर स्क्रॉल करें, जहां इस रनटाइम त्रुटि को उठाया गया है (RUNTIMEERROR ("पॉपुलेट () reentrant नहीं है")), और इस लाइन से पहले एक टिप्पणी जोड़ें, फिर एक ही इंडेंटेशन के साथ, self.app_configs = {} जोड़ें। यह इस तरह दिखता है:

            if self.loading:
                # AppConfig.ready () चलाने से बचने के लिए reentrant कॉल को रोकें
                # दो बार तरीके।
# RuntimeError बढ़ाएँ ("पॉपुलेट () reentrant नहीं है")
                self.app_configs = {}
            self.loading = True
आप फिर से परियोजना की जांच कर सकते हैं और त्रुटि को उजागर कर सकते हैं।

python manage.py check
फिर आप त्रुटि देख सकते हैं और इसे ठीक कर सकते हैं। जब आपके पास यह तय हो जाता है और कोड बिना किसी त्रुटि के संकलन करता है, तो फ़ाइल को वापस बदलना सुनिश्चित करें ताकि यह इस तरह दिखे:

            if self.loading:
                # AppConfig.ready () चलाने से बचने के लिए reentrant कॉल को रोकें
                # दो बार तरीके।
                raise RuntimeError("populate() isn't reentrant")
# self.app_configs = {}
            self.loading = True
बशर्ते सर्वर ऑनलाइन हो, जब हम इसमें कोई और बदलाव करते हैं, तो हमें सर्वर को फिर से लोड करने के लिए निम्नलिखित कमांड का उपयोग करने की आवश्यकता है:

sudo systemctl reload apache2
बहुत बढ़िया! लेकिन मेल भेजने के बारे में क्या? ईमेल भेजना शुरू करने के लिए, हमें पहले डोमेन कॉन्फ़िगरेशन को अपडेट करना होगा। यह आपके DNS पैनल में स्क्वायरस्पेस में होना चाहिए, या जो भी डोमेन नाम रजिस्ट्रार चुना गया है। हमें कॉन्फ़िगरेशन को इंस्टॉल करने और जोड़ने और कुछ कमांड चलाने की भी आवश्यकता होगी। सबसे पहले, आइए सर्वर का IPv6 पता प्राप्त करें। फिर हम आपके DNS खोलेंगे और रिकॉर्ड जोड़ेंगे। सर्वर का IPv6 पता प्राप्त करने के लिए, इस कमांड का उपयोग करें:

ip -6 addr
अब, हम निम्न रिकॉर्ड्स को DNS सेटिंग्स में जोड़ सकते हैं। मेरे रिकॉर्ड इस तरह दिखते हैं। हालाँकि, आपके रिकॉर्ड के लिए, आपको IP पते को अपने IP (75.147.182.214 नहीं, यह मेरा नहीं है) के साथ बदलना चाहिए। इसके अलावा FemMebabe.com के स्थान पर अपना डोमेन जोड़ें, साथ ही पिछले कमांड के साथ पाया गया आपका IPv6 पता (आप मेरा उपयोग नहीं कर सकते, Fe80 :: 725a: FFF: FE49: 3E02)। अब के लिए डोमेनकी के बारे में चिंता न करें, यह तब बनाया जाता है जब हम पोस्टफिक्स, मेल सर्वर, Opendkim के साथ सेट करते हैं, और कुंजी प्रिंट करते हैं। हम इसे अंतिम कॉन्फ़िगर करेंगे। @ ए एन/ए 75.147.182.214 @ मंडल 10 femmebabe.com @ पीटीआर एन/ए femmebabe.com @ TXT एन/ए Txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: fff: fe49: 3e02 ~ सभी default._bimi TXT एन/ए v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg _dmarc TXT एन/ए v = dmarc1; पी = कोई नहीं sendonly._domainkey TXT एन/एअब, हमें पोस्टफिक्स के लिए कुछ लगातार कॉन्फ़िगरेशन जोड़ना होगा। हमें केवल यह सुनिश्चित करने की आवश्यकता है कि हम डोमेन नाम, FemMebabe.com को बदल दें, जिस डोमेन नाम का आप उपयोग कर रहे हैं। आइए एक -एक करके सभी कॉन्फ़िगर फ़ाइलों को देखें, और उन्हें ओएस पर स्थापित करने के लिए, हमारी परियोजना में कॉन्फ़िगर नामक एक निर्देशिका में स्थापित करें।

nano config/etc_postfix_main.cf
इस पाठ को फ़ाइल में जोड़ें

# एक टिप्पणी के लिए /usr/share/postfix/main.cf.dist देखें, अधिक पूर्ण संस्करण


# डेबियन विशिष्ट: एक फ़ाइल नाम निर्दिष्ट करना पहले का कारण होगा
# नाम के रूप में उपयोग की जाने वाली उस फ़ाइल की लाइन।  डेबियन डिफ़ॉल्ट
# is /etc /mailname है।
# myorigin = /etc /mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# Appering .Domain MUA का काम है।
append_dot_mydomain = no

# "विलंबित मेल" चेतावनियों को उत्पन्न करने के लिए अगली पंक्ति को अस्वीकार करें
# देरी_वारिंग_टाइम = 4h

readme_directory = no

# Http://www.postfix.org/compatibility_readme.html देखें।
# ताजा इंस्टॉल।
compatibility_level = 3.6



# टीएलएस पैरामीटर
smtpd_tls_cert_file=/etc/letsencrypt/live/femmebabe.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/femmebabe.com/privkey.pem
smtpd_tls_security_level=may

smtp_tls_CApath=/etc/ssl/certs
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

smtpd_relay_restrictions = permit_sasl_authenticated, defer_unauth_destination
myhostname = femmebabe.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = /etc/mailname
mydestination = femmebabe.com, localhost, $myhostname
smtp_helo_name = femmebabe.com
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all

# मिल्टर विन्यास
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

smtp_tls_security_level = encrypt
smtp_tls_loglevel = 1

virtual_transport=lmtp:unix:private/dovecot-lmtp

smtpd_sasl_path = private/auth
अगला विन्यास!

nano config/etc_postfix_master.cf
इन पंक्तियों को जोड़ें:

# 
# पोस्टफिक्स मास्टर प्रक्रिया कॉन्फ़िगरेशन फ़ाइल।  प्रारूप पर विवरण के लिए
# फ़ाइल में, मास्टर (5) मैनुअल पेज देखें (कमांड: "मैन 5 मास्टर" या
# ऑन-लाइन: http://www.postfix.org/master.5.html)।
# 
# इस फ़ाइल को संपादित करने के बाद "पोस्टफिक्स रीलोड" निष्पादित करना न भूलें।
# 
# ====================================================================== =============================
# सेवा प्रकार निजी असुरक्षित chroot वेकअप मैक्सप्रोक कमांड + args
# (हाँ) (हाँ) (नहीं) (कभी नहीं) (100)
# ====================================================================== =============================
smtp      inet  n       -       y       -       -       smtpd
# smtp inet n - y - 1 पोस्टस्क्रीन
# smtpd पास - - y - - smtpd
# DNSBLOG UNIX - - Y - 0 DNSBLOG
# Tlsproxy Unix - - y - 0 tlsproxy
# एक चुनें: केवल लूपबैक क्लाइंट के लिए सबमिशन सक्षम करें, या किसी भी क्लाइंट के लिए।
# 127.0.0.1:submission inet n - y - - smtpd
submission inet n       -       y       -       -       smtpd
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_wrappermode=no
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
# -ओ syslog_name = पोस्टफिक्स/सबमिशन
# -O SMTPD_TLS_SECURITY_LEVEL = ENCRYPT
# -ओ smtpd_sasl_auth_enable = हाँ
# -ओ smtpd_tls_auth_only = हाँ
# -ओ smtpd_reject_unlisted_recipient = नहीं
# -ओ smtpd_client_restrictions = $ mua_client_restrictions
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTRICTIONS
# -O SMTPD_SENDER_RESTRICTIONS = $ MUA_SENDER_RESTRICTIONS
# -ओ SMTPD_RECIPIENT_TRASTRICTIONS =
# -O SMTPD_RELAY_RESTRICTIONS = PERMIT_SASL_AUTHENTICATED, अस्वीकार करें
# -ओ milter_macro_daemon_name = मूल
# एक चुनें: केवल लूपबैक क्लाइंट के लिए, या किसी भी क्लाइंट के लिए SMTPs सक्षम करें।
# 127.0.0.1:smtps inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -ओ syslog_name = postfix/smtps
# -ओ smtpd_tls_wrappermode = हाँ
# -ओ smtpd_sasl_auth_enable = हाँ
# -ओ smtpd_reject_unlisted_recipient = नहीं
# -ओ smtpd_client_restrictions = $ mua_client_restrictions
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTRICTIONS
# -O SMTPD_SENDER_RESTRICTIONS = $ MUA_SENDER_RESTRICTIONS
# -ओ SMTPD_RECIPIENT_RESTRICTIONS =
# -O SMTPD_RELAY_RESTRICTIONS = PERMIT_SASL_AUTHENTICATED, अस्वीकार करें
# -ओ milter_macro_daemon_name = मूल
# 628 inet n - y - - qmqpd
pickup    unix  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
# QMGR UNIX N - N 300 1 OQMGR
tlsmgr    unix  -       -       y       1000?   1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       y       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       y       -       -       smtp
relay     unix  -       -       y       -       -       smtp
        -o syslog_name=postfix/$service_name
# -ओ smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
postlog   unix-dgram n  -       n       -       1       postlogd
# 
# ====================================================================== =====================
# नॉन-पोस्टफिक्स सॉफ्टवेयर के लिए इंटरफेस। मैनुअल की जांच करना सुनिश्चित करें
# यह पता लगाने के लिए कि गैर-पोस्टफिक्स सॉफ़्टवेयर के पृष्ठ क्या विकल्प चाहते हैं।
# 
# निम्नलिखित सेवाओं में से कई पोस्टफिक्स पाइप (8) डिलीवरी का उपयोग करते हैं
# प्रतिनिधि।  $ {प्राप्तकर्ता} के बारे में जानकारी के लिए पाइप (8) महिला पृष्ठ देखें
# और अन्य संदेश लिफाफा विकल्प।
# ====================================================================== =====================
# 
# मेल प्राप्त करने का स्थान। विवरण के लिए PostFix MailDrop_readme फ़ाइल देखें।
# Main.cf में भी निर्दिष्ट करें: maildrop_destination_recipient_limit = 1
# 
maildrop  unix  -       n       n       -       -       pipe
  flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
# 
# ====================================================================== =====================
# 
# हाल के साइरस संस्करण मौजूदा "LMTP" मास्टर.सीएफ प्रविष्टि का उपयोग कर सकते हैं।
# 
# Cyrus.conf में निर्दिष्ट करें:
# Lmtp cmd = "lmtpd -a" सुनो = "localhost: lmtp" proto = tcp4
# 
# निम्नलिखित में से एक या एक से अधिक में निर्दिष्ट करें:
# Mailbox_transport = lmtp: inet: localhost
# Virtual_transport = lmtp: inet: localhost
# 
# ====================================================================== =====================
# 
# साइरस 2.1.5 (अमोस गौक्स)
# Main.cf में भी निर्दिष्ट करें: cyrus_destination_recipient_limit = 1
# 
# साइरस यूनिक्स - एन एन - - पाइप
# झंडे = drx उपयोगकर्ता = cyrus arg =/cyrus/bin/delive -e -r $ {प्रेषक} -m $ {एक्सटेंशन} $ {उपयोगकर्ता}
# 
# ====================================================================== =====================
# साइरस के माध्यम से वितरण का पुराना उदाहरण।
# 
# ओल्ड -सीरस यूनिक्स - एन एन - - पाइप
# झंडे = r उपयोगकर्ता = साइरस argv =/cyrus/bin/delive -e -m $ {एक्सटेंशन} $ {उपयोगकर्ता}
# 
# ====================================================================== =====================
# 
# कॉन्फ़िगरेशन विवरण के लिए PostFix UUCP_README फ़ाइल देखें।
# 
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
# 
# अन्य बाहरी वितरण विधियाँ।
# 
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
और opendkim कॉन्फ़िगरेशन। Opendkim उन्हें अधिक सुरक्षित बनाने के लिए डोमेन कुंजी के साथ ईमेल सर्वर की पहचान करता है। इसके बिना, मेल पर हस्ताक्षर नहीं किया गया है और यह एक इनबॉक्स में नहीं बना सकता है।

nano config/etc_default_opendkim
इन पंक्तियों को जोड़ें:

# नोट: यह एक विरासत कॉन्फ़िगरेशन फ़ाइल है। इसका उपयोग opendkim द्वारा नहीं किया जाता है
# SystemD सेवा। कृपया संबंधित कॉन्फ़िगरेशन मापदंडों का उपयोग करें
# इसके बजाय /etc/opendkim.conf।
# 
# पहले, कोई डिफ़ॉल्ट सेटिंग्स को यहां संपादित करेगा, और फिर निष्पादित करेगा
# /lib/opendkim/opendkim.service.generate systemd ओवरराइड फ़ाइलों को उत्पन्न करने के लिए
# /etc/systemd/system/opendkim.service.d/override.conf और
# /etc/tmpfiles.d/opendkim.conf। जबकि यह अभी भी संभव है, यह अब है
# सीधे /etc/opendkim.conf में सेटिंग्स को समायोजित करने की सिफारिश की।
# 
# Daemon_opts = ""
# UNIX सॉकेट का उपयोग करने के लिए/var/spool/postfix/run/opendkim में बदलें
# एक chroot में पोस्टफिक्स:
# Rundir =/was/spool/postfix/run/opendkim
RUNDIR=/run/opendkim
# 
# एक वैकल्पिक सॉकेट निर्दिष्ट करने के लिए असंबद्ध
# ध्यान दें कि इसे सेट करने से opendkim.conf में किसी भी सॉकेट मान को ओवरराइड किया जाएगा
# गलती करना:
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
# पोर्ट 54321 पर सभी इंटरफेस पर सुनें:
# सॉकेट = inet: 54321
# पोर्ट 12345 पर लूपबैक पर सुनें:
# सॉकेट = inet: 12345@लोकलहोस्ट
# सुनो 192.0.2.1 पोर्ट 12345 है:
# सॉकेट = inet: 12345@192.0.2.1
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=

nano config/etc_dovecot_conf.d_10-master.conf
इन पंक्तियों को जोड़ें:

0-master.conf 
# default_process_limit = 100
# default_client_limit = 1000

# डिफ़ॉल्ट VSZ (वर्चुअल मेमोरी आकार) सेवा प्रक्रियाओं के लिए सीमा। यह मुख्य रूप से है
# खाने से पहले मेमोरी को लीक करने वाली प्रक्रियाओं को पकड़ने और मारने का इरादा है
# सब कुछ।
# default_vsz_limit = 256m

# लॉगिन उपयोगकर्ता आंतरिक रूप से लॉगिन प्रक्रियाओं द्वारा उपयोग किया जाता है। यह सबसे अविश्वसनीय है
# Dovecot सिस्टम में उपयोगकर्ता। यह किसी भी चीज़ तक पहुंच नहीं होनी चाहिए।
# default_login_user = dovenull

# आंतरिक उपयोगकर्ता का उपयोग अप्रत्याशित प्रक्रियाओं द्वारा किया जाता है। यह से अलग होना चाहिए
# लॉगिन उपयोगकर्ता, ताकि लॉगिन प्रक्रियाएं अन्य प्रक्रियाओं को परेशान न कर सकें।
# default_internal_user = dovecot

service imap-login {
  inet_listener imap {
    # पोर्ट = 143
  }
  inet_listener imaps {
    # पोर्ट = 993
    # ssl = हाँ
  }

  # नई प्रक्रिया शुरू करने से पहले कनेक्शन की संख्या को संभालने के लिए। आम तौर पर
  # एकमात्र उपयोगी मान 0 (असीमित) या 1 हैं। 1 अधिक सुरक्षित है, लेकिन 0
  # तेजी से है। <doc/wiki/loginprocess.txt>
  # Service_count = 1

  # हमेशा अधिक कनेक्शन की प्रतीक्षा करने के लिए प्रक्रियाओं की संख्या।
  # Process_min_avail = 0

  # यदि आप service_count = 0 सेट करते हैं, तो आपको शायद इसे बढ़ाने की आवश्यकता है।
  # Vsz_limi = $ default_vsz_limit
}

service pop3-login {
  inet_listener pop3 {
    # पोर्ट = 110
  }
  inet_listener pop3s {
    # पोर्ट = 995
    # ssl = हाँ
  }
}

service submission-login {
  inet_listener submission {
    # पोर्ट = 587
  }
}

service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    group = postfix
    mode = 0666
    user = postfix
  }

  # यदि आप उपरोक्त यूनिक्स सॉकेट का उपयोग नहीं कर सकते हैं तो केवल INET श्रोता बनाएं
  # inet_lister lmtp {
    # पूरे इंटरनेट के लिए LMTP को दृश्यमान बनाने से बचें
    # पता =
    # पोर्ट =
  # }
}

service imap {
  # अधिकांश मेमोरी MMAP () आईएनजी फ़ाइलों पर जाती है। आपको इसे बढ़ाने की आवश्यकता हो सकती है
  # यदि आपके पास विशाल मेलबॉक्स हैं तो सीमा।
  # Vsz_limi = $ default_vsz_limit

  # अधिकतम। IMAP प्रक्रियाओं की संख्या (कनेक्शन)
  # process_limit = 1024
}

service pop3 {
  # अधिकतम। POP3 प्रक्रियाओं की संख्या (कनेक्शन)
  # Process_limit = 1024
}

service submission {
  # अधिकतम। SMTP सबमिशन प्रक्रियाओं की संख्या (कनेक्शन)
  # Process_limit = 1024
}

service auth {
  # AUTH_SOCKET_PATH डिफ़ॉल्ट रूप से इस UserDB सॉकेट को इंगित करता है। यह आम तौर पर है
  # Dovecot-lda, doveadm, संभवतः IMAP प्रक्रिया, आदि द्वारा उपयोग किया जाता है
  # इस सॉकेट के लिए पूर्ण अनुमतियाँ सभी उपयोगकर्ताओं की एक सूची प्राप्त करने में सक्षम हैं और
  # हर किसी के UserDB लुकअप के परिणाम प्राप्त करें।
  # 
  # डिफ़ॉल्ट 0666 मोड किसी को भी सॉकेट से कनेक्ट करने की अनुमति देता है, लेकिन
  # UserDB लुकअप केवल तभी सफल होगा जब UserDB "UID" फ़ील्ड देता है
  # कॉलर प्रक्रिया के यूआईडी से मेल खाता है। इसके अलावा अगर कॉलर का यूआईडी या जीआईडी ​​मेल खाता है
  # सॉकेट का यूआईडी या जीआईडी ​​लुकअप सफल होता है। कुछ और असफलता का कारण बनता है।
  # 
  # सभी उपयोगकर्ताओं को देखने के लिए कॉलर को पूर्ण अनुमतियाँ देने के लिए, मोड को सेट करें
  # 0666 के अलावा कुछ और और dovecot कर्नेल को लागू करने देता है
  # अनुमतियाँ (उदा। 0777 सभी को पूर्ण अनुमतियों की अनुमति देता है)।
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

service auth-worker {
  # ऑथ वर्कर प्रक्रिया को डिफ़ॉल्ट रूप से रूट के रूप में चलाया जाता है, ताकि यह एक्सेस कर सके
  # /आदि/छाया। यदि यह आवश्यक नहीं है, तो उपयोगकर्ता को बदल दिया जाना चाहिए
  # $ DEFAULT_INTERAL_USER।
  # उपयोगकर्ता = रूट
}

service dict {
  # यदि तानाशाही प्रॉक्सी का उपयोग किया जाता है, तो मेल प्रक्रियाओं को इसके सॉकेट तक पहुंच होनी चाहिए।
  # उदाहरण के लिए: मोड = 0660, समूह = vmail और ग्लोबल mail_access_groups = vmail
  unix_listener dict {
    # मोड = 0600
    # उपयोगकर्ता =
    # समूह =
  }
}
एक बार फिर, इन सभी फ़ाइलों में डोमेन को बदलना सुनिश्चित करें, FemMebabe.com, आपके द्वारा चुने गए डोमेन के साथ। अगली फ़ाइल को संपादित करें, Dovecot का कॉन्फ़िगरेशन,

nano config/etc_dovecot_dovecot
और इन पंक्तियों को जोड़ें

## ओवेकॉट कॉन्फ़िगरेशन फ़ाइल

# यदि आप जल्दी में हैं, तो http://wiki2.dovecot.org/quickconfiguration देखें

# "doveconf -n" कमांड परिवर्तित सेटिंग्स का एक साफ आउटपुट देता है। इसका इस्तेमाल करें
# Dovecot मेलिंग सूची में पोस्ट करते समय फ़ाइलों को कॉपी और पेस्ट करने के बजाय।

# '# 'चरित्र और सब कुछ के बाद इसे टिप्पणियों के रूप में माना जाता है। अतिरिक्त स्थान
# और टैब को नजरअंदाज कर दिया जाता है। यदि आप इनमें से किसी एक का उपयोग स्पष्ट रूप से करना चाहते हैं, तो डालें
# value inside quotes, eg.: key = "# चार और अनुगामी व्हाट्सएप "

# अधिकांश (लेकिन सभी नहीं) सेटिंग्स को अलग -अलग प्रोटोकॉल और/या द्वारा ओवरराइड किया जा सकता है
# स्रोत/गंतव्य IPS उदाहरण के लिए, वर्गों के अंदर सेटिंग्स रखकर:
# प्रोटोकॉल imap {}, स्थानीय 127.0.0.1 {}, दूरस्थ 10.0.0.0/8 {}

# प्रत्येक सेटिंग के लिए डिफ़ॉल्ट मान दिखाए जाते हैं, यह असमानता की आवश्यकता नहीं है
# वे। ये इसके अपवाद हैं, हालांकि: कोई खंड नहीं (जैसे नामस्थान {})
# या प्लगइन सेटिंग्स को डिफ़ॉल्ट रूप से जोड़ा जाता है, वे केवल उदाहरण के रूप में सूचीबद्ध हैं।
# पथ भी केवल वास्तविक चूक के साथ उदाहरण हैं जो कॉन्फ़िगर पर आधारित हैं
# विकल्प। यहाँ सूचीबद्ध पथ कॉन्फ़िगर -prefix =/usr के लिए हैं
# --sysconfdir =/etc-localstatatedir =/var

# स्थापित प्रोटोकॉल सक्षम करें
!include_try /usr/share/dovecot/protocols.d/*.protocol

# आईपी ​​या होस्ट की एक अल्पविराम अलग सूची जहां कनेक्शन के लिए सुनना है।
# "*" सभी IPv4 इंटरफेस में सुनता है, "::" सभी IPv6 इंटरफेस में सुनता है।
# यदि आप गैर-डिफॉल्ट पोर्ट या कुछ अधिक जटिल निर्दिष्ट करना चाहते हैं, तो
# conf.d/master.conf को संपादित करें।
# सुनो = *, ::

# आधार निर्देशिका जहां रनटाइम डेटा को स्टोर करने के लिए।
# base_dir =/var/run/dovecot/

# इस उदाहरण का नाम। मल्टी-इंस्टेंस सेटअप doveadm और अन्य कमांड में
# उपयोग कर सकते हैं -i <Inst_name> यह चुनने के लिए कि किस उदाहरण का उपयोग किया गया है (एक विकल्प
# से -सी <config_path>)। इंस्टेंस नाम को भी डोवेकॉट प्रक्रियाओं में जोड़ा गया है
# पीएस आउटपुट में।
# उदाहरण_नाम = dovecot

# ग्राहकों के लिए अभिवादन संदेश।
# login_greeting = dovecot तैयार।

# विश्वसनीय नेटवर्क रेंज की अंतरिक्ष अलग सूची। इनमें से कनेक्शन
# IPs को अपने IP पते और पोर्ट को ओवरराइड करने की अनुमति है (लॉगिंग के लिए और
# प्रमाणीकरण चेक के लिए)। disable_plaintext_auth को भी अनदेखा किया जाता है
# ये नेटवर्क। आमतौर पर आप अपने IMAP प्रॉक्सी सर्वर को यहां निर्दिष्ट करेंगे।
# login_trusted_networks =

# लॉगिन एक्सेस चेक सॉकेट्स की अंतरिक्ष अलग सूची (जैसे TCPWRAP)
# login_access_sockets =

# Proxy_maybe = हाँ के साथ अगर प्रॉक्सी गंतव्य इनमें से किसी भी ips से मेल खाता है, तो मत करो
# प्रॉक्सिंग। यह सामान्य रूप से आवश्यक नहीं है, लेकिन गंतव्य यदि उपयोगी हो सकता है
# आईपी ​​उदा। एक लोड बैलेंसर का आईपी।
# auth_proxy_self =

# अधिक वर्बोज़ प्रक्रिया शीर्षक (पीएस में) दिखाएं। वर्तमान में उपयोगकर्ता का नाम दिखाता है और
# आईपी ​​पता। यह देखने के लिए उपयोगी है कि वास्तव में IMAP प्रक्रियाओं का उपयोग कौन कर रहे हैं
# (उदाहरण के लिए साझा मेलबॉक्स या यदि एक ही यूआईडी का उपयोग कई खातों के लिए किया जाता है)।
# verbose_proctitle = नहीं

# क्या सभी प्रक्रियाओं को मार दिया जाना चाहिए जब Dovecot मास्टर प्रक्रिया बंद हो जाती है।
# इसे "नहीं" पर सेट करने का मतलब है कि डोवेकॉट को बिना अपग्रेड किए जा सकते हैं
# मौजूदा क्लाइंट कनेक्शन को बंद करने के लिए मजबूर करना (हालांकि यह भी हो सकता है
# एक समस्या अगर अपग्रेड उदा। एक सुरक्षा तय के कारण)।
# shotdown_clients = हाँ

# यदि गैर-शून्य है, तो Doveadm सर्वर के लिए इस कई कनेक्शन के माध्यम से मेल कमांड चलाएं,
# इसके बजाय उन्हें सीधे उसी प्रक्रिया में चलाने के लिए।
# doveadm_worker_count = 0
# यूनिक्स सॉकेट या होस्ट: पोर्ट का उपयोग Doveadm सर्वर से कनेक्ट करने के लिए किया जाता है
# doveadm_socket_path = doveadm-server

# अंतरिक्ष अलग पर्यावरण चर की सूची जो कि डोवकोट पर संरक्षित हैं
# स्टार्टअप और अपनी सभी बाल प्रक्रियाओं के लिए पास हो गया। आप भी दे सकते हैं
# कुंजी = मान जोड़े हमेशा विशिष्ट सेटिंग्स सेट करने के लिए।
# Import_environment = tz

## 
## शब्दकोश सर्वर सेटिंग्स
## 

# शब्दकोश का उपयोग कुंजी = मूल्य सूचियों को संग्रहीत करने के लिए किया जा सकता है। इसका उपयोग कई लोगों द्वारा किया जाता है
# प्लगइन्स। शब्दकोश को या तो सीधे एक्सेस किया जा सकता है या हालांकि ए
# शब्दकोश सर्वर। निम्नलिखित डिक्ट ब्लॉक मैप्स डिक्शनरी नाम उरिस
# जब सर्वर का उपयोग किया जाता है। फिर इन्हें प्रारूप में URIS का उपयोग करके संदर्भित किया जा सकता है
# "प्रॉक्सी :: <नाम>"।

dict {
  # कोटा = mysql: /andc/dovecot/dovecot-dic-sql.conf.ext
}

# अधिकांश वास्तविक कॉन्फ़िगरेशन नीचे शामिल हैं। फ़ाइल नाम हैं
# पहले उनके ASCII मान द्वारा क्रमबद्ध किया गया और उस क्रम में पार्स किया गया। 00-prefixes
# फ़ाइल नाम में ऑर्डर को समझना आसान है।
!include conf.d/*.conf

# एक कॉन्फ़िगर फ़ाइल भी एक त्रुटि दिए बिना शामिल किए जाने की कोशिश की जा सकती है यदि
# यह नहीं मिला:
!include_try local.conf

passdb {
  driver = passwd-file
  args = /etc/dovecot/passwd
}
userdb {
  driver = passwd
}

protocols = imap pop3

# सभी इनपुट कनेक्शनों को सुनने की अनुमति देता है (IPv4 / IPv6)

listen = *, ::
Dovecot उपयोगकर्ता के लिए एक पासवर्ड जोड़ें:

nano config/etc_dovecot_passwd
बृहदान्त्र से पहले फ़ाइल का पहला भाग, उपयोगकर्ता नाम है। अंतिम भाग, "YourPassword", उस पासवर्ड को दर्शाता है जिसे आप अपना मेल सर्वर देना चाहते हैं।

team:{plain}yourpassword
अगला, opendkim कॉन्फ़िगर

nano config/etc_opendkim.conf
और इन पंक्तियों को जोड़ें:

# यह हस्ताक्षर करने और सत्यापित करने के लिए एक बुनियादी कॉन्फ़िगरेशन है। यह आसानी से हो सकता है
# एक बुनियादी स्थापना के अनुरूप अनुकूलित। Opendkim.conf (5) और देखें
# /usr/share/doc/opendkim/examples/opendkim.conf.sample के लिए पूरा
# उपलब्ध कॉन्फ़िगरेशन मापदंडों का प्रलेखन।

Syslog			yes
SyslogSuccess		yes
# Logwhy नहीं

# सामान्य हस्ताक्षर और सत्यापन पैरामीटर। डेबियन में, "हेडर" से है
# ओवरसाइड किया गया, क्योंकि यह अक्सर प्रतिष्ठा प्रणालियों द्वारा उपयोग की जाने वाली पहचान कुंजी है
# और इस प्रकार कुछ हद तक सुरक्षा संवेदनशील।
Canonicalization	relaxed/simple
Mode			s
SubDomains		no
OversignHeaders		From

# डोमेन, चयनकर्ता और कुंजी (आवश्यक) पर हस्ताक्षर करना। उदाहरण के लिए, हस्ताक्षर करें
# चयनकर्ता "2020" के साथ डोमेन "उदाहरण.कॉम" के लिए (2020._domainkey.example.com),
# /etc/dkimkeys/example.private में संग्रहीत निजी कुंजी का उपयोग करना। अधिक दानेदार
# सेटअप विकल्प /usr/share/doc/opendkim/readme.opendkim में पाया जा सकता है।
# डोमेन उदाहरण.कॉम
# चयनकर्ता 2020
# Keyfile /etc/dkimkeys/example.private

# डेबियन में, Opendkim उपयोगकर्ता "Opendkim" के रूप में चलता है। 007 के एक umask की आवश्यकता होती है जब
# MTAs के साथ एक स्थानीय सॉकेट का उपयोग करना जो सॉकेट को गैर-निजीकृत के रूप में एक्सेस करता है
# उपयोगकर्ता (उदाहरण के लिए, पोस्टफिक्स)। आपको समूह में उपयोगकर्ता "पोस्टफ़िक्स" जोड़ने की आवश्यकता हो सकती है
# उस मामले में "Opendkim"।
UserID			opendkim
UMask			007

# एमटीए कनेक्शन (आवश्यक) के लिए सॉकेट। यदि एमटीए एक चेरोट जेल के अंदर है,
# यह सुनिश्चित किया जाना चाहिए कि सॉकेट सुलभ है। डेबियन में, पोस्टफिक्स में चलता है
# एक chroot in/var/spool/postfix, इसलिए एक UNIX सॉकेट होना होगा
# नीचे दी गई अंतिम पंक्ति पर दिखाए गए अनुसार कॉन्फ़िगर किया गया।
# सॉकेट लोकल: /run/opendkim/opendkim.sock
# सॉकेट inet: 8891@लोकलहोस्ट
# सॉकेट INET: 8891
Socket			local:/var/spool/postfix/opendkim/opendkim.sock

PidFile			/run/opendkim/opendkim.pid

# होस्ट जिसके लिए सत्यापित करने के बजाय हस्ताक्षर करना है, डिफ़ॉल्ट 127.0.0.1 है। देखना
# अधिक जानकारी के लिए Opendkim (8) का ऑपरेशन अनुभाग।
# InternalHosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12

# ट्रस्ट एंकर DNSSEC को सक्षम करता है। डेबियन में, ट्रस्ट एंकर फ़ाइल प्रदान की जाती है
# पैकेज DNS-ROOT-DATA द्वारा।
TrustAnchorFile		/usr/share/dns/root.key
# NameServers 127.0.0.1

# संदेशों पर हस्ताक्षर करने के लिए उपयोग किए जाने वाले पते से लेकर मैप डोमेन
KeyTable           refile:/etc/opendkim/key.table
SigningTable       refile:/etc/opendkim/signing.table

# आंतरिक मेजबानों का एक सेट जिसका मेल हस्ताक्षरित किया जाना चाहिए
InternalHosts       /etc/opendkim/trusted.hosts

nano config/etc_default_opendkim
और इन पंक्तियों को जोड़ें

# नोट: यह एक विरासत कॉन्फ़िगरेशन फ़ाइल है। इसका उपयोग opendkim द्वारा नहीं किया जाता है
# SystemD सेवा। कृपया संबंधित कॉन्फ़िगरेशन मापदंडों का उपयोग करें
# इसके बजाय /etc/opendkim.conf।
# 
# पहले, कोई डिफ़ॉल्ट सेटिंग्स को यहां संपादित करेगा, और फिर निष्पादित करेगा
# /lib/opendkim/opendkim.service.generate systemd ओवरराइड फ़ाइलों को उत्पन्न करने के लिए
# /etc/systemd/system/opendkim.service.d/override.conf और
# /etc/tmpfiles.d/opendkim.conf। जबकि यह अभी भी संभव है, यह अब है
# सीधे /etc/opendkim.conf में सेटिंग्स को समायोजित करने की सिफारिश की।
# 
# Daemon_opts = ""
# UNIX सॉकेट का उपयोग करने के लिए/var/spool/postfix/run/opendkim में बदलें
# एक chroot में पोस्टफिक्स:
# Rundir =/was/spool/postfix/run/opendkim
RUNDIR=/run/opendkim
# 
# एक वैकल्पिक सॉकेट निर्दिष्ट करने के लिए असंबद्ध
# ध्यान दें कि इसे सेट करने से opendkim.conf में किसी भी सॉकेट मान को ओवरराइड किया जाएगा
# गलती करना:
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
# पोर्ट 54321 पर सभी इंटरफेस पर सुनें:
# सॉकेट = inet: 54321
# पोर्ट 12345 पर लूपबैक पर सुनें:
# सॉकेट = inet: 12345@लोकलहोस्ट
# सुनो 192.0.2.1 पोर्ट 12345 है:
# सॉकेट = inet: 12345@192.0.2.1
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=
जब हम अपने पोस्टफ़िक्स सर्वर को सेट करने के लिए तैयार होते हैं, तो हम नीचे दिए गए कोड को चलाएंगे, जिसमें उपयुक्त डोमेन नाम एम्बेडेड होगा। एक स्क्रिप्ट बनाकर शुरू करें

touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
अब, नैनो में, पाठ संपादक, इस फ़ाइल को संपादित करें ताकि इसमें FemMebabe.com के बजाय आपका डोमेन नाम शामिल हो।

# !
# सेटअप पोस्टफिक्स
cd $DIR
echo "Mail services configuration"
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.backup
sudo cp config/etc_postfix_main.cf /etc/postfix/main.cf
sudo cp config/etc_postfix_master.cf /etc/postfix/master.cf
sudo cp config/etc_default_opendkim /etc/default/opendkim
sudo cp config/etc_dovecot_conf.d_10-auth.conf /etc/dovecot/conf.d/10-auth.conf
sudo cp config/etc_dovecot_conf.d_10-master.conf /etc/dovecot/conf.d/10-master.conf
sudo cp config/etc_dovecot_dovecot.conf /etc/dovecot/dovecot.conf
sudo cp config/etc_dovecot_passwd /etc/dovecot/passwd
sudo cp config/etc_opendkim.conf /etc/opendkim.conf
sudo cp config/etc_default_opendkim /etc/default/opendkim
sudo adduser postfix opendkim
sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
sudo mkdir /etc/opendkim/keys/femmebabe.com
sudo mkdir /var/spool/postfix/opendkim
sudo echo "*@femmebabe.com     sendonly._domainkey.femmebabe.com" | sudo tee -a /etc/opendkim/signing.table
sudo echo "sendonly._domainkey.femmebabe.com    femmebabe.com:sendonly:/etc/opendkim/keys/femmebabe.com/sendonly.private" | sudo tee -a /etc/opendkim/key.table
sudo echo "127.0.0.1" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "localhost" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "*.femmebabe.com" | sudo tee -a /etc/opendkim/trusted.hosts
sudo chown -R opendkim:opendkim /etc/opendkim
sudo opendkim-genkey -b 2048 -d femmebabe.com -D /etc/opendkim/keys/femmebabe.com -s sendonly -v
sudo chmod go-rw /etc/opendkim/keys
sudo chown opendkim:opendkim /etc/opendkim/keys/femmebabe.com/sendonly.private
sudo chown opendkim:postfix /var/spool/postfix/opendkim
cd $DIR
sudo cp mailbox/* /var/mail/
sudo chown :users /var/mail/*
sudo chmod -R a+rwx /var/mail/*
sudo systemctl restart opendkim postfix dovecot
sudo cat /etc/opendkim/keys/femmebabe.com/sendonly.txt | tr -d '\n' | sed 's/\s//g' | sed 's/""//g' | awk -F'[)(]' '{print $2}'
अब, PostFix, Opendkim और Dovecot को कॉन्फ़िगर करने के लिए पूर्ण स्क्रिप्ट चलाएं।

./scripts/postfixsetup
एक बार जब यह स्क्रिप्ट चल जाती है, तो अंतिम पंक्ति को कॉपी करें जो इसे प्रिंट करती है और इसे अपने DNS कॉन्फ़िगरेशन में पेस्ट करें, क्योंकि यह Sendonly._domainkey के लिए मान है। यह सुरक्षित मेल भेजते समय अपने डोमेन की पहचान करने के लिए उपयोग की जाने वाली Opendkim कुंजी है। बहुत बढ़िया! कुछ दिनों के भीतर, आपको सर्वर से मेल भेजने में सक्षम होना चाहिए बशर्ते कि सब कुछ सही ढंग से कॉन्फ़िगर किया गया हो। यदि आपने अपने मेल सर्वर के लिए DNS को कॉन्फ़िगर किया है, तो रिकॉर्ड को अपडेट करने में 72 घंटे से कम समय लेना चाहिए। यह आमतौर पर बहुत तेज है। आप जांच सकते हैं कि क्या आपका सर्वर इस कमांड का उपयोग करके काम कर रहा है, आपके ईमेल की आपूर्ति की गई है:

echo “test” | mail -s “Test Email” youremail@gmail.com
यदि सब कुछ सही तरीके से काम कर रहा है, तो आपको अपने सर्वर के साथ ईमेल भेजने में सक्षम होना चाहिए। यदि यह काम नहीं कर रहा है, तो लॉग को देखने का प्रयास करें कि त्रुटि क्या हो सकती है।

tail –lines 150 /var/log/mail.log
यह मेल के बारे में वर्बोज़ जानकारी प्रदान करेगा जो सर्वर द्वारा भेजा जा रहा है और क्या यह ठीक से काम कर रहा है। आपको अपने इनबॉक्स में ईमेल भी देखने में सक्षम होना चाहिए, यदि यह वहां नहीं है, तो अपने स्पैम फ़ोल्डर की जांच करें। आपको अपनी सेटिंग्स को अपनी सेटिंग्स में भी कॉन्फ़िगर करना होगा। ताकि आपका ईमेल सर्वर आपके Django ऐप, प्रोजेक्ट से बात कर सके। अपनी सेटिंग्स में इन लाइनों को जोड़ें या बदलें

EMAIL_HOST = DOMAIN
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_ADDRESS = 'team@femmebabe.com'
EMAIL_HOST_USER = 'team' # 'Love@mamasheen.com'
EMAIL_HOST_PASSWORD = config['EMAIL_HOST_PASSWORD']
DEFAULT_FROM_EMAIL = '{} <{}>'.format(SITE_NAME, EMAIL_HOST_USER)
ध्यान दें कि हम पासवर्ड प्राप्त करने के लिए एक कॉन्फ़िगर फ़ाइल का उपयोग कर रहे हैं। आइए इस फ़ाइल को सेटिंग्स में लोड करते हैं जैसे कि फ़ाइल की शुरुआत में।:

import os
import json

# कॉन्फ़िगरेशन को खोलें और लोड करें
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
आइए इस फ़ाइल को बनाएं और इसमें एक गुप्त कुंजी जोड़ें, साथ ही मेल पासवर्ड भी। एक गुप्त कुंजी उत्पन्न करने के लिए, इस कमांड का उपयोग करें, जो भी लंबाई आपको पसंद है:

openssl rand -base64 64
अब, उस पाठ को कॉपी करें जो OpenSSL जनरेट किया गया है और /etc/config.json को संपादित करता है

sudo nano /etc/config.json
सीक्रेट कुंजी के रूप में उत्पन्न होने वाली कुंजी के साथ, अपनी फ़ाइल में निम्न पंक्तियों को जोड़ें।

{
	"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
	"EMAIL_HOST_PASSWORD": "yourpassword"
}
JSON प्रारूप सरल और उपयोग में आसान है, हम अन्य कुंजियों की घोषणा कर सकते हैं जो हम अपनी परियोजना में भी इस तरह से उपयोग करना चाहते हैं, और उन्हें हमारी परियोजना निर्देशिका से अलग रख सकते हैं ताकि अन्य उपयोगकर्ता उन्हें नहीं लिख सकें और इसलिए उन्हें पढ़ा नहीं जा सके अकेले हमारी परियोजना निर्देशिका से। यह एपीआई कुंजियों के लिए अभ्यास की सिफारिश की जाती है, जिनमें से हम यहां कुछ से अधिक का उपयोग करेंगे। आप यह सुनिश्चित करने के लिए अपनी परियोजना का बैकअप लेना चाहेंगे कि सब कुछ सहेजा जाए और आप बाद में अपने काम को ठीक कर पाएंगे, भले ही आप अब सर्वर किराए पर नहीं लेना चाहते हों।

sudo backup
अब, वेब सर्वर से एक HTML ईमेल भेजने का प्रयास करें, बशर्ते कमांड लाइन से एक भेजना काम कर रहा हो। शेल में अपने उपयोगकर्ता उदाहरण को क्वेरी करें, और Django के माध्यम से उस उपयोगकर्ता को HTML ईमेल भेजें। कोड में मेरा नाम बदलें, चार्लोट, अपने उपयोगकर्ता नाम में।

python manage.py shell
from django.contrib.auth.models import User
u = User.objects.get(username='Charlotte')
from users.email import send_welcome_email
send_welcome_email(u)
exit()
यदि पहला कमांड काम नहीं करता है, तो उपयोग करना सुनिश्चित करें

source venv/bin/activate
बशर्ते सब कुछ सही तरीके से सेट किया गया हो, अब आपको अपने वेब ऐप द्वारा भेजे गए अपने मेलबॉक्स में एक स्वागत योग्य ईमेल मिलेगा। अच्छा काम! आप एक लंबा सफर तय कर चुके हैं। मैं जोड़ना चाहता था, यदि आप कभी भी इस तरह की परियोजना पर काम करते समय किसी भी त्रुटि के साथ संघर्ष कर रहे हैं, तो जवाब खोजने और मदद मांगने में संकोच न करें। Google, अन्य खोज इंजनों के बीच, प्रोग्रामिंग सहायता के लिए खोज करने के लिए महान संसाधन हैं। बस उस त्रुटि के लिए खोजें जो आप प्राप्त कर रहे हैं, और आप यह देख पाएंगे कि अन्य लोग समस्या को कैसे हल करते हैं। इसके अलावा, आप मुझसे, अपने शिक्षकों (शिक्षकों, प्रोफेसरों, ट्यूटर्स), इंटरनेट पर किसी भी साथियों से संपर्क करने के लिए स्वागत करते हैं, जो प्रोग्रामिंग सहायता के लिए उपलब्ध हैं, या इस पुस्तक को फिर से या अन्य संसाधनों से परामर्श करने के लिए उन मुद्दों का समाधान खोजने के लिए जो आप अनुभव कर रहे हैं। मैं समझता हूं कि यह आसान नहीं है, लेकिन भले ही आपने इस में पढ़ा हो और कोई भी कोड नहीं लिख रहे हैं, आप स्क्रैच से वेब ऐप बनाने के बारे में बहुत कुछ सीख रहे हैं। अपने आप को पीठ पर थपथपाएं, आप एक महान कर रहे हैंकाम। इस तीसरे संस्करण वेब डेवलपमेंट गाइड को पढ़ने के लिए समय निकालने के लिए धन्यवाद। भविष्य के संस्करणों में, मैं दस्तावेज़ की शुरुआत में चर्चा किए गए महत्वपूर्ण उदाहरणों को शामिल करूंगा और हम सॉफ्टवेयर और हार्डवेयर विकास की दुनिया में बहुत गहराई से गोता लगाएंगे। आने वाले समय के लिए बने रहें, और मैं आपको अविश्वसनीय सॉफ़्टवेयर बनाने का तरीका सिखाने के लिए उत्सुक हूं। अगले में मिलते हैं






बंद करना
पेज 1
कूदना
पूरा लेख देखें
जारी रखें पढ़ रहे हैं

खरीदना | क्रिप्टो के साथ खरीदें



https://glamgirlx.com/hi/practical-web-based-deep -


(छवि डाउनलोड करने के लिए क्लिक करें या टैप करें)
पेशेवर मनोरंजन, फोटो, वीडियो, ऑडियो, लाइवस्ट्रीमिंग और कैजुअल गेमप्ले, साथ ही आईडी स्कैनिंग, वेब डेवलपमेंट और सरोगेसी सर्विसेज।

मुझे इस पते का उपयोग करके बिटकॉइन में एक टिप छोड़ दें: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

सेवा की शर्तें