פּראַקטיש וועב באזירט טיף לערנען און זיכערהייט דורך בייַשפּיל

Daisy'ס פּראָפיל פאָטאָ

דורך Daisy

פּראַקטיש וועב באזירט טיף לערנען און זיכערהייט דורך בייַשפּיל דריט אַדישאַן שאַרלאַט האַרפּער 3 יולי, 2024 דערהייַנטיקט / קאָנווערטעד יוני 3, 2025 פאָרוואָרד: זיכערהייט קאַנסידעריישאַנז אין בנין ווייכווארג פֿאַר די וועב זענען אַ וויכטיק טייל פון קיין וועב דעוועלאָפּער ס פּלאַן און דורכפירונג בשעת ינזשעניעריע אַ פּראָוטאַטייפּ וואָס איז פאַרלאָזלעך, סטאַביל און נוצלעך צוועקן. די דאָם (דאָקומענט כייפעץ מאַרקאַפּ), מיט דעם ס ימפּלאַמענטיישאַן פון HTML, דזשאַוואַסקריפּט, פּאָרטריי, C / C ++, java און bash, געבן וועב דעוועלאָפּערס די פריי פון נוצן ווי געזונט ווי קאַנוויניאַנס און וויכטיק באַדינונגס וואָס זענען אַלע אַטראַקטיוו פֿאַר קאַנוויניאַנס. דזשאָו, דער סוף באַניצער קוקן צו טייטן צייט אָדער באַקומען עפּעס געטאן אויף דער אינטערנעץ, יוזשאַוואַלי אויף אַ טאָוטשסקרעען סמאַרטפאָנע מיטל. רובֿ מענטשן וואָלט ניט אפילו וויסן ווו צו אָנהייבן ווען זיי וועלן צו בויען אַ וועבזייטל פון קראַצן, זיי וועלן טענד צו אָנהייבן אויף אן אנדער מענטש 'ס וועבזייטל און בויען עפּעס וואָס איז געווען אַ ביסל שטאַרקייט אָן ווייסטינג געלט צו נוצן עס איז מעגלעך צו נוצן געלט צו נוצן געלט צו נוצן געלט צו נוצן די לימיטיישאַנז פון די לימיטיישאַנז אין יז פון נוצן און בייגיקייט. אויב איר האָט עטלעכע מינוט צו לייענען דעם בוך און לערנען וואָס איך ווילן צו לערנען איר, אָדער אפילו רעדן מיט מיר פּערסנאַלי וועגן דיין גאָולז און באַקומען עטלעכע גיידאַנס אין די רעכטע ריכטונג, און זענען מאָוטענטשאַל, און שרייַבן דיין אייגענע ווייכווארג, אַ וועבזייטל וואָס איר ווילט און טוט פּונקט וואָס איר ווילט. וועגן מיר: איך בין אַ ווייכווארג דעוועלאָפּער מיט אַ ברייט קייט פון דערפאַרונג אין C / C ++, Java, Python, HTML, CSS און דזשאַוואַסקריפּט. איך בויען וועבסיטעס מענטשן ווילן צו נוצן, ווילן צו באַזוכן, און אפילו באַקומען אַדיקטיד צו נוצן נאָר צו לערנען, ריקריייט און טייטן צייט, און רובֿ ימפּאָרטאַנטלי, איך פאַרקויפן ווייכווארג. אויב איר האָט געהאט אַ געדאַנק פּונקט ווי איר געוואלט אַ וועבזייטל צו קוקן און פונקציע, איר געווען גרייט צו שטיצן מיר אַזוי איך קענען טרעפן מיין אייגענע באדערפענישן בשעת איך טרעפן דייַן, Google, אָדער אפילו אַ הויך-טעק זיכערהייט אַפּ נאָר איר קענען צוטריט. אַנשטאָט טריינג צו פאַרקויפן איר מיין צייט, איך בין טריינג: איך ווילן צו רעדן איר צו בויען אַ אַפּ (וועבזייטל) זיך מיט די אינפֿאָרמאַציע וואָס שוין יגזיסץ, און לערנען איר וואָס איר דאַרפֿן צו זיין אַ פרייַ ווייכווארג דעוועלאָפּער, אַנטראַפּראַנער, וואָס איז אַ געראָטן קאַריערע אין וועלכער פעלד איר ווילט. און לאָזן מיר זיין קלאָר, דער בילדונג איך געבן איר וועט זיין ינפאָרמאַל. איר קען גיין צו שולע און לערנען אַלע דעם מיט אַ פאָרמאַל בילדונג, אָדער אפילו לייענען דעם בוך אין שולע, פאַרענדיקן דיין אַסיינמאַנץ, און נעמען אַוועק אַ פּלאַץ פון דיין בילדונג, אָבער איך וועל נישט פאָרמאַללי שטעלן איר אין די הייס אַוועקזעצן און פרעגן איר צו פאַרענדיקן אַסיינמאַנץ. איך בין נישט דיין פּראָפעסאָר, איר קענען טראַכטן פון מיר ווי אַ פרייַנד וואָס וויל צו פירן איר צו אַ קאַריערע געטריבן דורך דיין אייגענע פערזענלעכע הצלחה. און איך טאָן ניט פאַרקויפן איר הצלחה אָדער, איר וועט דאַרפֿן צו קויפן עס מיט דיין צייט. לערנען צו קאָד האט אַ אַראָפאַנג לערנען ויסבייג און קיינמאָל גרינג, אָדער אַפֿילו געמיינט צו זיין. איר דאַרפֿן צו אַרבעטן ווי שווער ווי איר קענען און פאָרזעצן צו פּרובירן צו פאַרלאָזן און פּרובירן ווידער אפילו ווען איר זענט פראַסטרייטאַד אין סדר צו לערנען און בויען אַפּפּס זיך. אַז ס אין די נאַטור פון קאָד זיך. קאָד איז לויפן דורך אַ קאַמפּיילער וואָס איז דיזיינד צו געבן די פּראָגראַמיסט טעות אַרטיקלען, און די וועט לערנען איר ווי צו קאָד, אפילו אויב איר פשוט קאַפּאַמינג די טעות אין דיין זוכן מאָטאָר און לייענען אנדערע מענטשן ס ביישפילן. און איך מוזן זאָגן, איר טאָן ניט דאַרפֿן צו זיין גאָר רייַך, קלוג, געראָטן, אָדער אפילו דעטאַל אָריענטיד אָדער אָרגאַניזירט צו בויען אַן אַפּ. דער קאָמפּיוטער נעמט זאָרג פון דער אָרגאַניזאַציע פֿאַר איר. איר נאָר דאַרפֿן צו אָנהאַלטן דורך דעם פּראָצעס און טעות, טייַנען פאָקוס און אַרבעט שווער אין וואָס איר טאָן, און איר וועט האָבן אַ זייער מצליח קאַריערע אין די ינטייערטי פון וואָס איר טאָן. ווער איך בין: איך פאַרשטיין אַז די לעצטע אָפּטיילונג איז געווען מער וועגן לערנען און דיין נעמען אַ וועגן פון דעם בוך. ווער בין איך פּונקט? אַז ס אַ קאָמפּליצירט קשיא. איך בין ומקלאָר אויף דעם זיך, ווייַל איך ליידן פון מעדיציניש טנאָים וואָס קענען מאַכן עס שווער פֿאַר מיר צו אפילו קאָד אָדער שרייַבן דעם בוך אין צייט, בשעת איר פאָרשטעלן טשאַלאַנדזשיז מיט סאָושאַליזיישאַן און אידענטיטעט ישוז וואָס מאַכן מיין לעבן מער שווער ווען עס קומט צו ינטראָודוסינג זיך. אין קורץ, אויב איר לייענען דעם בוך, איר האָט געבראכט עס היים ווייַל איר פליפּט דורך עס און געדאַנק עס איז געווען נוציק, אָדער אפילו אויב איר נאָר לייענען דעם ווייַט אין, צו איר איך בין אַ ווי מיינדאַד יחיד וואָס וויל צו זען איר הצלחה אין אַלץ וואָס איר טאָן. איך בין אןינזשעניר זיך, אַ ווייכווארג דעוועלאָפּער, און אַ תּלמיד, און איך שרייב דעם בוך פֿאַר אנדערע סטודענטן וואָס ווילן צו מאַכן זייער לעבן גרינגער דורך אַ האַנט ביכל פון די ווייכווארג ליניע וואָס זיי וועלן מאַכן ביישפילן צו צייכענען וואָס פּאַסיק צוזאַמען ווי אַ גרויס רעטעניש, גרויס רעטעניש. לאַרגעלי, דאָס איז וואָס איך טאָן: איך בויען אַפּפּס צו העלפֿן זיך און אנדערע מענטשן מצליח זיין. איך בין אויך אַ מחבר, כאָטש דאָס איז מיין ערשטער ויסגאַבע אַז איך בדעה צו פאַרענדיקן צו שטעלן מיין פּאָרטפעל צוזאַמען אין אַ נוציק דאָקומענט, און איך בין אַ קינסטלער. איך וועט אַרייַנלאָזן דעם צו איר, איך בין סאָרט פון אַ מאָדנע מענטש. איך בין נישט שליימעסדיק, איך'ווע האט שוין זיכער מיט די געזעץ אפילו לידינג מיר צו לאָזן קאַלידזשיז און אוניווערסיטעטן און לאָזן די שטאַטן צו פּרובירן צו מאַכן אַ נאָמען פֿאַר זיך מיט מער הצלחה. איך בין אַ פרוי דורך געבורט, איך טראָגן באַשטאַנד, נעמען פאָטאָס פון זיך, טראָגן דרעסיז און אנדערע וואָמענס קליידער, און איך בין באַוווסטזיניק פון זיך ווי אַ ווייַבלעך דורך נאַטור. איך האָב געהאט ישוז מיט אנדערע מענטשן אין דער פאַרגאַנגענהייט וואָס פירן צו ראנגלענישן מיט שרייבן און בויען וועבאַפּס, און איך אַנטשולדיקן אַז איך קען נישט האָבן דעם בוך אין דיין בשה באַלד: איר דארף. איר וועט וועלן צו לייענען און שרייַבן קאָד וואָס קוקט ווי מייַן און אַרבעט ווי מייַן און טוט די זעלבע זאַך, אָבער אפילו בעסער, ווייַל אויב איר קענען פאַרגינענ זיך דעם בוך אַנשטאָט פון מאַשינג דיין קלאַוויאַטור ווי איך טאָן נאָר צו מאַכן אַ בוך איר פרעגן געלט פֿאַר עס, איר דאַרפֿן צו זיין געראָטן אין דיין לעבן. איך האט אַלע סאָרץ פון ישוז מיט משפּחה גראָוינג אַרויף, געזונט טנאָים, דאקטוירים, די מידיאַ, און די געזעץ, און די געזעץ, און די געזעץ, און די געזעץ, און די געזעץ, און די געזעץ, און מיין קאָד דיפּלי ריפלעקס דעם געראַנגל וואָס איז פעמיניזם און ווייַבלעך נאַטור אין אַ צעטיילט און פראַסטרייטאַד וועלט. אָבער, דאָס בוך איז עפּעס וואָס איך דיפּלי זאָרגן וועגן, מיין בעיבי, מיין פּאָרטפעל, און מיין פרנסה, אַזוי איך אָפּשאַצן דיין באַטראַכטונג ווען איר נעמען דעם טעקסט היים און קערפאַלי פּעפּוי צו איר צו לערנען מיר. ביטע האַלטן אין מיינונג איך בין נישט שליימעסדיק, דאָס בוך וועט האָבן ערראָרס, ריווייזאַז און נייַע אויסגאבעס, און איר וועט דאַרפֿן צו טראַכטן מיט דיין לאַדזשיקאַל מאַרך ווי בעסטער איר קענען צו האָבן אַ מצליח דערפאַרונג מיט מיין שרייבן. פֿאַרשטיין אַז איך מיינען גוט פֿאַר איר אפילו ווען איר פּנים טשאַלאַנדזשיז ווען שרייבן. טראַכטן וועגן אים ווי דאָס: ווען איר קענען נאָר דינען אַ קאָמפּיוטער סיסטעם צו טאָן עפּעס איר קענען ימאַגינע אין די דיגיטאַל פּלאַץ, קראָם אַלע די אינפֿאָרמאַציע איר טרעפן, אַנאַלייז עס, איר וועט פֿאַרשטיין עס. איך זאָגן איר דאָס ווייַל איך טרעפן די זעלבע שוועריקייטן. ניצן דעם בוך אויף דיין אייגענע ריזיקירן, אַרבעט מיט דיין קהל און קהילות פאַראַנען צו איר צו בויען ווייכווארג אין אַ זיכער באַשטעטיקן, און טאָן ניט נעמען זאכן צו פּערסנאַלי ווען איר האָט דאָס צו באַקומען אַ גלאבאלע וואָג: אַז איך קען ברענגען איר דעם טעקסט און וואָס איך קען ברענגען איר דעם טעקסט און איר קענען ברענגען איר דעם טעקסט מיר וועלן אַרבעטן, דער אינטערנעץ. איר קען נישט זיין זייער באַקאַנט מיט וועמען איך בין מיט בלויז אַ ביסל ווערטער, אָבער איך מוטיקן איר צו לייענען אויף, איר וועט וויסן מיר ווי איר פאָרזעצן צו לייענען און פֿאַרשטיין מיר בשעת איר בויען דיין אייגענע פּראַדזשעקס צו פאַרענדיקן דיין אַרבעט. עס וועט זיין קיין לעקציעס מיט דעם בוך, אַזוי לאַנג ווי דיין פּראָפעססאָרס אָדער לערערס טאָן ניט באַשטימען איר, אָבער איך העכסט מוטיקן איר צו בויען אַ פּאָרטפעל פון פּראַדזשעקס זיך ווי איר לייענען און אַ קאַפּסטאָון פּרויעקט ווייַזן ווי איר קענען צולייגן וואָס איר האָט געלערנט. מייַן קאַפּטסטאָון פּרויעקט איז די יקער פֿאַר רובֿ פון וואָס איר וועט לייענען אין דעם בוך, ווייַל עס ינקאָרפּערייץ קאָד פון מיין פריערדיק פראיעקטן, קאָד, איך האָבן באשאפן און אנגענומען און ביכייווד און ביכייווז ווי אַ פאָלקס אַפּ, איר קען זען דיין פרייַנד אָדער משפּחה, אַדווערטייזד צו איר אָדער אין די נייַעס. וואָס דאָס בוך איז: דער בוך איז אַ טוטאָריאַל דורך בייַשפּיל. איר קענען געפֿינען קאָד דאָ, ינסטראַקשאַנז פֿאַר ווי צו לערנען אַ קאָד, אינפֿאָרמאַציע וועגן די אויבן קאָד און פיקסיר ערראָרס, טראָובלעעשאָאָטינג סטעפּס, און איר וועט באַקומען אַדיקטיוו, און איר וועט באַקומען אַדיקטיוו און אַדיקטיוו ווייכווארג איר בויען אין די אַבסאָלוט בעסטער ליכט צו זיין די מערסט אַטראַקטיוו ווי מעגלעך צו דיין סוף ניצערס, דיין וועבזייטל פון דעם וועבזייטל. אין דעם בוך, איך וועל באַווייַזן אַ נומער פון ביישפילן פון ווייכווארג פּלאַן מיט אַ פאָקוס אויף די וועב ווי אַ פּלאַטפאָרמע ווי געזונט ווי זיכערהייט. מיר וועלן אָנהייבן די לערנעןרייסט
Amaliy Internetga asoslangan chuqur o'rganish va xavfsizlikka binoan xavfsizlik

Amaliy Internetga asoslangan chuqur o'rganish va xavfsizlikka binoan xavfsizlik Uchinchi nashr Charlotte Harper 2024 yil 3 iyul Yangilangan / o'zgartirildi, 2025 yil 3 iyun

Mehmonlar:

Veb uchun dasturiy ta'minotni shakllantirish bo'yicha xavfsizlik nuqtai nazarlari har qanday veb-ishlab chiqaruvchining muhim qismidir va ishonchli, barqaror va amaliy maqsadlar uchun foydali bo'lgan prototipni muhandislik bilan bajaring. HTML, JavaScript va Xava va Bashni amalga oshirish, shuningdek, kamtarlik va xarakterni amalga oshiradigan va qulaylik va muhim xizmatlarni amalga oshiradigan va qulaylik va muhim xizmatlarni amalga oshiradigan va qulayliklarni ta'minlaydigan va qulayliklarni ta'minlaydigan va eng muhim xizmatlarni amalga oshiradigan va qulaylik bilan ta'minlangan. Vaqtni o'ldiring yoki Internetda biron bir narsani oling, odatda sensorli smartfon qurilmasida. Ko'pchilik noldan iborat veb-saytni qurmoqchi bo'lganida, ular boshqa birovning veb-saytidan boshlanishga moyil bo'lishlarini va ayniqsa pullik, ishonchlilik, ayniqsa, modernizatsiya qilish, ulardan foydalanish qulayligi, ulardan foydalanishni qulaylik va moslashuvchanligini bilish uchun qulay pulni qurishlari kerak. Agar siz ushbu kitob orqali o'qishni va hatto men bilan shaxsan o'zingiz bilan gaplashishni va o'zingizning dasturiy ta'minotingizni yozishni o'rganing va o'zingizning xabaringizni yozishni o'rganing va tinglovchilaringizning ehtiyojlarini qondirishni o'rganing.

Men haqimda: Men C / C ++, Java, Python, HTML, CSS va JavaScript-da keng tajribali dasturiy ta'minot ishlab chiqaruvchisiman. Men odamlar foydalanmoqchi bo'lgan veb-saytlarni quraman, tashrif buyurishni va hatto vaqtni o'rganish va o'ldirish uchun foydalanishga odatlanib qolgan va eng muhimi, men dasturiy ta'minotni sotaman. Agar siz o'zingiz bilan tanishganimda, veb-saytni ishga tushirishda men o'zingizning ehtiyojlarimni qondirishga tayyor bo'lganingizdek, siz o'zingizning ehtiyojlarimni qondirishga tayyor bo'lganingiz uchun, men sizga o'zingizning ehtiyojlarimni qondirishga tayyor edingiz. O'zimning vaqtimni sotishga harakat qilyapman, men siznikini sotib olishga harakat qilyapman: Men sizlarni allaqachon mavjud bo'lgan ma'lumotlar bilan tanishtirmoqchiman va siz o'zingiz xohlagan sohada muvaffaqiyatli martaba bilan shug'ullanishingiz kerak. Va aniq aytsam, men beradigan ta'lim norasmiy bo'ladi. Siz maktabga borishingiz va barchasini rasmiy ta'lim bilan o'rganishingiz yoki hatto ushbu kitobni maktabda o'qishingiz va ta'limingizdan juda ko'p narsalarni o'qishingiz va ta'lim berishdan juda ko'p narsalarni olib, sizdan topshiriqlarni bajarishni so'rayman. Men sizning professoringiz emasman, siz meni shaxsiy muvaffaqiyatingiz bilan boshqariladigan martaba tomon yo'nalishni istagan do'stingiz kabi tasavvur qila olasiz. Va men sizni ham sotmayapman, uni vaqtingiz bilan sotib olishingiz kerak bo'ladi. Kodni o'rganish uchun tik o'rganish egri va hech qachon oson bo'lmagan yoki hatto bo'lishi kerak emas. Siz o'zingiz o'rganish va qurish uchun sizni o'rganish va qurish uchun xafa bo'lganingizda ham harakat qilishingiz mumkin. Bu kodning o'zi. Kodeks Dasturchi xatolarni taqdim etish uchun mo'ljallangan kompilyator tomonidan boshqariladi va bu sizga xatoni qidiruv tizimiga nusxalash va boshqa odamlarning misollarini o'qiyotgan bo'lsangiz ham, kodni qanday qilib kodlashni o'rgatadi. Va aytishim kerakki, siz ilova qurish uchun juda boy, aqlli, muvaffaqiyatli yoki hatto batafsil ma'lumot olishingiz shart emas. Kompyuter ushbu tashkilot sizga g'amxo'rlik qiladi. Siz shunchaki sinov va xato orqali davom etishingiz, diqqatni saqlab qolishingiz va qilayotgan ishingiz bo'yicha ish olib borishingiz kerak va siz qilayotgan ishingiz to'liq martabali martaba bo'ladi.

Men kimman: Men oxirgi bo'lim o'rganish haqida ko'proq vaqt va siz ushbu kitobdan yo'l tutganligini tushunaman. Men kimman? Bu juda murakkab savol. Men o'zim uchun aniq emasman, chunki men tibbiy sharoitlardan aziyat chekaman, chunki men o'zimni tanishtirgan holda, ijtimoiylashuv va shaxsiyat muammolari bilan bog'liq muammolarni hal qilishda meni ham qiyinlashtiradi. Qisqasi, agar siz ushbu kitobni o'qiyotgan bo'lsangiz, uni uyga olib chiqdingiz, chunki siz uni juda foydali deb o'ylagansiz yoki hatto siz hozirgacha siz qilgan hamma narsani muvaffaqiyatga erishganingizni ko'rmoqchiman. Men o'zim, dasturiy ta'minotni ishlab chiquvchi va talabaman, men o'z hayotlarini engillashtiradigan va biznes chizig'iga ega bo'lishiga yordam beradigan boshqa talabalar uchun men o'z hayotlarini engillashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotni osonlashtiradigan dasturiy ta'minotga ega bo'lish orqali o'z hayotlarini osonlashtiradigan dasturiy ta'minotga ega bo'lish orqali o'z hayotlarini osonlashtiradigan dasturiy ta'minotga ega bo'lish orqali, biznes chizig'idan qat'i nazar. Ko'pincha men o'zimni va boshqa odamlarga yordam berish uchun ilovalar quraman. Men ham muallifman, garchi bu mening portfelimni birgalikda hujjatlashtirish uchun va men ham rassomman, men ham rassomman. Men buni sizga tan olaman, men g'alati odamman. Men mukammal emasman, men Qonun bilan shug'ullanaman, hatto meni kollejlar va universitetlarni tark etishga va shtatlarini ko'proq muvaffaqiyat bilan ta'minlashga harakat qilish uchun davlatlarni tark etishga olib keladi. Men tug'ma qizimman, men bo'yanish kiyaman, o'zimning suratlarimni, liboslar va boshqa ayollar kiyimlarini kiying va men o'zimni tabiatan ayol sifatida his qilaman. Men o'tmishdagi boshqa odamlar bilan kurashish va qurish bilan kurash olib boradigan muammolar bo'lgan va men ushbu kitobni tezroq qo'lingiz bilan olmaganimdan uzr so'rayman: Sizga kerak edi. Siz meniki kabi ishlaydi va xuddi shunday ishlarni amalga oshiradigan kodni o'qishni va yozishni xohlaysiz, chunki men o'zingiz uchun pul so'rab, siz o'zingizning hayotingizda muvaffaqiyatli bo'lishingiz kerak. Menda oilani o'sib-ulg'ayish, sog'liqni saqlash, shifokorlar, ommaviy axborot vositalari, ommaviy axborot vositalari va qonunchilik bilan ajralib turadigan va g'azablangan dunyodagi kurashni chuqur aks ettirgan. Biroq, bu kitob men juda qayg'uradigan narsam, mening chaqalog'im, mening portfelim va hayotim, shuning uchun men sizdan o'rganish uchun, sizdan o'rnak olishingiz uchun, siz matnni uyga olib, diqqat bilan ziddiyatingizni qadrlayman. Shuni yodda tutingki, men mukammal emasman, bu kitob xatolar, versiya va yangi nashrlarga ega bo'ladi va siz mening yozishim bilan muvaffaqiyatli tajribaga ega bo'lish uchun siz mantiqiy miya bilan o'ylashingiz kerak. Shuningdek, yozayotganda qiyinchiliklarga duch kelganda, men ham siz uchun yaxshi demoqchi ekanimni tushunaman. Bu haqda shunday deb o'ylang: agar siz raqamli makonda tasavvur qilishingiz mumkin bo'lgan har qanday narsani amalga oshirishingiz mumkin bo'lsa, uni tushunishingiz mumkin bo'lgan barcha ma'lumotlarni ijaraga olishingiz mumkin va uni tushunishingiz mumkin bo'lgan barcha ma'lumotlarni saqlashingiz mumkin, siz o'zingiz xohlagan va hatto nashriyot bilan muqarrar ravishda qiyinchiliklarga duch kelasiz. Sizga buni aytaman, chunki men bir xil qiyinchiliklarga duch keldim. Ushbu kitobdan o'zingizning xavfingiz bo'yicha foydalaning, jamoatingiz va jamoalar bilan ishlashingiz mumkin, men sizga noto'g'ri, yirtqichmlik va bezovtalana olmayotganimda, har kimning har birida, bu erda siz ushbu matnni buzib tashlaysiz va nega men sizga biron bir narsadan voz kechib, har kimning rusumlık global miqyosda netellelistik global miqyosda. Biz ishlaymiz, Internet. Siz men sizni bir necha so'z bilan men o'qishga undaydigan odam bilan tanishishingiz mumkin emas, lekin men o'zingizning ishingizni yakunlash uchun o'zingizning loyihangizni qurishda davom etayotganingizda meni o'qiyotganingizda va tushunishda davom ettiraman. Sizning professoringiz yoki o'qituvchilar sizni biron bir tarzda tayinlamas ekan, men sizlarni o'qiganingizdek, siz o'zingiz o'qiganingiz kabi, siz o'zingiz o'qiganingiz kabi, siz o'zingiz o'qiganingiz kabi loyihalar portfelini yaratishga undaydi. Mening Kaptone loyihasi siz ushbu kitobda o'qiganingiz uchun, men sizning oldingi loyihalaridan kodni kiritib, sizdan foydalanishga yordam beradigan va eng yaxshi fikrlarni kiritganligi sababli, men sizning do'stingiz yoki oilamda yoki yangiliklardan foydalanib, sizning do'stingiz yoki yangiliklardan foydalanishga yordam beradigan keng tarqalgan va o'zini tutishimga yordam bergan.

Ushbu kitob nima: Ushbu kitob misolda qo'llanma. Siz bu erda kod topishingiz mumkin, kodlash va xatolarni tuzatish, o'z kodingizni buzish va ularni saqlash, agar siz kimligimni, o'zingizning kodingizni buzish, shuningdek, o'zingizning ilovangizni, shuningdek, sizning ilovangizni, shuningdek kompaniyangizni tasvirlashingiz mumkin, shuningdek, sizning ilovangiz va kompaniyangiz tasvirini, shuningdek, sizning ilovangizni, shuningdek, kompaniyangiz tasvirini yaratishingiz mumkin. Siz mutlaq engil yorug'likda bo'lgan dasturiy ta'minot sifatida sizning oxirgi foydalanuvchilarga, veb-sayti tashrif buyuruvchilarga imkon qadar jozibali bo'lishi uchun. Ushbu kitobda men dasturiy ta'minot dizaynining bir qator namunalarini, shuningdek, Internetda platforma, shuningdek, xavfsizlik sifatida diqqat markazida namoyish qilaman. Biz Unix qobiq yordamida UNIC qobiq yordamida va skriptlash xususiyatlari bilan asosiy loyihani ishlab chiqish orqali o'rganish tajribasini boshlaymiz. Keyin, biz asosiy blog veb-saytini ko'rib chiqamiz, blogimizni fotosurat va video xususiyatlarga ega, shuningdek, ushbu funktsiyalarni bepul dasturiy ta'minot yordamida va serverni xavfsizligini ta'minlash uchun xavfsiz dasturiy ta'minot yordamida ishlatamiz. Keyinchalik fayllarni qayta ishlash, ovozli xayr-ehson, shtrix-kodni tekshirish va optik belgilarni aniqlash, boshqa tushunchalarni o'rganishni ko'rib chiqamiz. Yo'l davomida Apisni ko'rib chiqamiz, bu bizning dasturiy ta'minotimizni bepul va pullik parametrlar bilan ta'minlashga yordam beradi. Yo'l davomida biz jismoniy xavfsizlik va jangari vositalarni o'rganamiz, masalan, bochak va repetiterlar dizayni, minoramiz va boshqa direktorlar, bizning dasturiy ta'minotimizni himoya qilish va o'zini tutib olishni namoyish etish uchun bizning dasturiy ta'minot bilan dasturiy ta'minot bilan birlashtiramiz. Biz asosiy o'lchovli dvigatel o'yinlari, 2D va 3D-ning dvigatellarini qurish yo'lida tanaffuslar olib boramiz va asosiy o'lchovli texnik xizmat ko'rsatuvchi dasturiy ta'minot va silikon kauchukda kauchuk quyish bilan shug'ullanadi. Yo'l davomida biz dasturiy ta'minotni yaxshiroq ta'minlash uchun allaqachon mavjud bo'lgan mashinani o'rganish echimlarini ham qo'llaymiz. Jarayonni kengaytirish va xavfsizligini ta'minlash uchun biz Internet uchun mavjud bo'lgan aktsiyalar mavjud. Ushbu kitob veb-sayt va o'rnatilgan mexanik tizimlar tarmog'i bilan birlashtirish va u holda dasturiy bilim yoki oldingi tajribaga ega bo'lmagan dasturiy ta'minot va o'rnatilgan dasturiy qo'llanma bilan birlashishda muvaffaqiyatingiz uchun qo'llanma.

Bu kitob nima emas: Agar siz haqiqatan ham veb-saytingiz kerak bo'lsa, siz oddiy do'konni o'rnatishingiz va kerakli narsalarni sotishingiz, fotosuratlarni yoki videolarni yoki boshqa kodni yozmasdan boshqa raqamga yozishingiz mumkin. Bu kitob unday emas. Ushbu kitob sizga allaqachon topishingiz mumkin bo'lgan dasturiy ta'minotdan ko'ra ko'proq foyda keltiradigan dasturiy ta'minotni qanday qilib qurish kerak, chunki u hali ham ishlaydigan engil dasturiy ta'minotni joylashtirish va orqaga bog'liq bo'lmagan kompaniyalarga murojaat qilmaydi. Agar siz ushbu kitobga diqqat bilan murojaat qilsangiz, siz kodni, tadqiqot kodini yozishni, o'zingizning ilovalaringizni yaratishni xohlaysiz va siz qilayotgan ishingizdan pul ishlaysiz. Men ushbu kitobdan ham pul ishlayman, chunki unda u erda ma'lumot beradigan va o'qishni xohlaydigan va o'z ilovalarimni sotib olish yoki ishlatganda allaqachon sotib olish kerak. Ushbu kitob siz uchun dasturni qurmaydi, lekin u sizga kerakli dasturlar, mehmonlar, do'stlaringiz, do'stlaringiz, pudratchilar, pudratchilar, pudratchilar va Internetdagi dasturiy ta'minotga kirishingiz kerak.

Siz nimani o'rganasiz: Ushbu kitob sizga dasturiy ta'minot, funktsional, foydali dasturiy ta'minot, videolarni inobatga olish, videolarni aniqlash va sotish va "Bluetooth" va yaqin masofali aloqa kabi xabarlarni almashtirish va sotishni o'rgatadi. Ushbu kitob sizga Debian Linux-ga diqqatni jalb qilish uchun, "DinceStrap" bilan ishlaydigan uyalar va boshqa veb-saytlar bilan ishlaydigan tarmoqlar va interaktivlik bilan ishlaydigan tarmoq kodini qurish va zaxira nusxasini yaratish uchun qanday tarmoqli va interfalandiyaliklar bilan ishlashni yoqish uchun tarmoq kodini qurish va zaxira nusxasini berish uchun qanday tarmoqli va interfalandiyaliklar bilan ishlashni yoqish uchun siz sizga tarmoq kodini qurish va boshqa veb-saytlar bilan ishlashni rejalashtirish uchun siz sizga tarmoq kodini yaratish va zaxira nusxalarini yaratish. maqsadlar, identifikatsiya, rasm va video moderatsiya, dasturiy ta'minotni xavfsiz, to'lovni qayta ishlash, kriptocurentlik savdosi, asenkron vazifalar va boshqa narsalar. O'zingizning bluetooth moslamalarini qanday qurishni, batareyalar, zaryadlovchilar, mikrokontrollerlar, motorlar va sensycers, lehim, sim va 3D bosma materiallaridan foydalangan holda o'rganasiz. Qo'shimcha ishlab chiqarish va asboblar va o'lish uchun 3D dizayn direktorlarini namoyish qilaman, shuning uchun siz o'zingizning o'rnatilgan, zarbali qurilmalarini integratsiyalangan batareyalar, zaryadlovchi asboblari va funktsional chiqishga ega bo'lgan holda ishlab chiqarishga qodirsiz. va ularni Bluetooth va Internet bilan tarmoq orqali tarmoq. Xususan, biz ikkita misolni, tebranadigan massajni va uy quruvchi qurolni ko'rib chiqamiz, ikkalasi ham grafik interfeys yoki buyruq liniyali yordam dasturi sifatida dasturlashtirilgan va tezkor natijalar uchun Internetga qo'shilishi mumkin. Siz biron bir saytni qanday qurish va boshqa tajriba bilan birorta tajribaga ega bo'lmagan holda, uni funktsional, xavfsiz, chiroyli, foydali va eng muhimi amaliyotni o'rganishni o'rganasiz. Saytni xavfsiz va amaliy veb-saytlarni veb-saytdan olishingiz uchun, ovozingizni berish, ovozingizni taqdim etish va boshqa veb-saytlarni yaratish uchun siz o'zingizning barcha veb-saytlarni taqdim etishingiz va ularni o'zingiznikiga etkazish uchun boshqa veb-saytlarni yaratishingiz va uni yanada muhimroq qilish uchun siz o'zingiznikini taqdim etishingiz va hatto o'zingiznikini o'zgartirishingiz mumkin. Ushbu kitobda o'ng foydalanuvchilarni jalb qilish va noto'g'ri, shuningdek avtomatik va sturka bo'lgan holda, Internet uchun foydali dasturiy ta'minotni amalga oshirishga yordam beradigan yirik uchta komponent, bu kitob ommaviy axborot vositalarida, xavfsizlik va mashinasozlik ma'lumotlariga qaratiladi. Ushbu kitob UNIX, xususan Debian (Ubuntu), Python, HTML, CSS, JavaScript, shuningdek FFMPEG kabi bir qator foydali dasturiy ta'minotni o'rgatadi. Shuningdek, men sizga kriptokratüstürürürürürmentni avtomatik ravishda savdo qilishni va oddiy debet kartalaridan qanday qilib to'lovlarni amalga oshirishni va oddiy debet kartalaridan to'lovlarni amalga oshirishni ham o'rgataman. Men sizga o'zingizning ilovangizni qidirish orqali qanday qilib qidiruv dvigatellari uchun qanday qilib pul ishlashni o'rgataman va bu sizning mijozlaringiz sizni topishni va iloji boricha ko'proq sementarlarni qidirish uchun birinchi o'rinda turadi. Men sizga dasturiy ta'minotingizni qanday sotishni o'rgataman, reklama qiling, mijozlarga xizmatlaringizni qidirib, Internetda o'zingiz xohlagan narsangizga murojaat qiling va allaqachon mavjud bo'lgan xiyobonlar orqali o'zingiz uchun nom bering. I will teach you how to save your data on cloud computers that work for you and save your data cheaply, how to plan and build a website that does what your users want and what you want, and how to keep your users engaged by putting your site a tap away on their phones with notifications, email, text messages, phone calls, and more avenues to bring your users back to your website at your disposal behind the click of a button secured to you only. Ushbu kitob ko'p miqdorda, siz va faqat o'zingizning dasturiy ta'minotingiz va sizga vakili bo'lgan veb-saytni videolarga, sizdan ko'ra, siz o'zingizning dasturiy ta'minotingiz va sizning kompaniyangiz yaxshi ko'rinishga ega bo'lgan amaliyotga katta taassurot qoldiradi. Shuningdek, siz o'zingiz va fotografiya va ishlov berish kabi, siz uchun mavjud bo'lgan barcha vositalardan foydalanib, siz o'zingizning dasturiy ta'minotni olib tashlash, ishingiz, ish yoki pulni olib tashlash uchun eng yaxshi yorug'lik va zarur bo'lgan barcha vositalardan foydalanib, siz uchun zarur bo'lgan barcha vositalardan foydalangan holda, siz uchun mavjud bo'lgan barcha vositalardan foydalanib, o'zingizning dasturiy ta'minotni olib tashlash uchun eng yaxshi yorug'lik va pulni olib tashlash uchun eng yaxshi yorug'lik bilan tanishish uchun bir nechta maslahatlar va fokuslarni o'rganasiz. Ushbu kitob "amaliy" deb nomlanadiMasalan, veb-saytni o'rganish, shuningdek, Internetni o'rganish, rasmni bilish, rasmni oshirish, rezolysozlik, rasmni o'rganish bilan bog'liq. Rasmning asl nusxasi yoki optikal nusxasi (rasm yoki bosma rasm) kabi prognoz va optikal nusxalarga (rasmni yoki bosma rasm) kabi taxmin qilish va boshqa vazifalar kabi, agar u sizni yuzingiz bilan yozib qo'yishi mumkin. Ushbu xavfsiz kompyuter, odatda sizdan foydalanuvchi nomi va parolni so'rash va sizdan foydalanish uchun, ehtimol, har bir yangi login yoki SMS xabarlar xizmatiga, ehtimol, elektron pochta orqali yoki matnli dasturiy ta'minotni, masalan, elektron pochta orqali yoki matnli dasturiy ta'minotni, masalan, dasturiy ta'minotni yoki boshqa birovning dasturiy ta'minoti bilan bog'lash, ehtimol, dasturiy ta'minotingizni yoki boshqa birovning (har qanday saytdan foydalanayotganingiz). Bu implektiv bo'lgan dasturiy ta'minotni qurgan har bir kishi, bu nimani anglatishini anglaydi. Dasturiy ta'minot juda xavfsizdir, chunki biz unga kirish uchun foydalanadigan qurilmalar va hisoblar har doim ham bizning ixtiyorimizda emas, ular dasturiy ta'minot uchun yomon niyatli bo'lgan har kimning qo'lida bo'lishi mumkin va shuning uchun dasturiy ta'minotning o'zida xavf tug'dirishi mumkin. Bu bu kitobning diqqat markazida. Tarmoq kompyuteri, chaqirilgan uzun kalitli token bilan ta'minlangan, va SSH yoki Xavfsiz qobiq kaliti bilan ta'minlangan va boshqa usulda veb-server bilan ta'minlangan, chunki veb-serverda serverda ishlaydigan san'at xavfsizligi vositalarining holatini ta'minlaydi. Veb-server foydalanuvchining eng kuchli qismi bo'lgan foydalanuvchi veb-brauzeriga kirish huquqiga ega, chunki u foydalanuvchi tarmoq dasturiga kirishi mumkin bo'lgan joy. Ushbu vositani ko'rayotgan matnlarni, veb-saytlarni yozib olish va yozilishi mumkin bo'lgan rasmlar va yozish mumkin bo'lgan joylarni, shuningdek, Web Saytga bog'langan va yozish mumkin bo'lgan ma'lumotlarni o'qishi va yozishi mumkin. Siz o'zingizning ixtiyoringizda barcha vositalardan foydalanish Siz o'zingiz xavfsiz veb-sayt yaratishingiz va siz uchun ishlaydigan xavfsiz tarmoq kompyuter tizimi, sizning savdolaringiz va ko'rinishi

Qayerdan boshlash kerak: O'tmishdan o'ting, men ushbu kitobni siz kerakli aniq kodga yoki biron bir bo'lim bilan boshlang, ayniqsa ushbu kitobda yoki undan birortangiz bilan ushbu kitobni batafsil bayon qilaman, shuningdek uning amaliy misollarini keltirib chiqaraman. Agar sizda kodni yozish tajribangiz bo'lmasa, men ushbu kitobning barchasini o'qishni tavsiya qilaman va ushbu kitob sizga to'g'ri ekanligiga ishonch hosil qilish uchun oldingi bo'limlarni o'qishni tavsiya qilaman. Agar ushbu kitob siz uchun mos kelmasa, uni o'zlarini ushlab turishga qiziqishi va undan voz kechish va mendan mendan oldin muvaffaqiyatsiz bo'lgan bo'shliqlarni to'ldirish va boshqa o'qituvchilar sifatida to'ldirishni o'ylab ko'ring. Agar siz foydali ilova qurmoqchi bo'lsangiz, ushbu kitobning har bir qismi foydali bo'ladi va eng yaxshi dasturlar oxirgi foydalanuvchi bilan o'rnatilganligini hisobga olsangiz: Mijozingizni biling. Endi siz meni bilasiz, siz ushbu kitobni bilasiz va siz boshlashga tayyormiz. Boshlash, kompyuterni ushlab turish (hatto quti do'konidagi eng arzon noutbuk, hatto eski ish stolida ishlaydi va siz uchun ishlayotgan tarzda o'rnating.

Ushbu kitobni qanday o'qish kerak: Matn ta'kidlangan, oyat sizga buyruq berish taklifiga tegishli ekanligini bildiradi, u erda siz ishlaydigan kodni yozasiz. Buyruq sari juda klaviaturaning yo'naltirilganligini va sizning ishingizni tezlashtirish va sizga osonlikcha narsalarni qilish uchun unchalik talab qiladi.

Ishni boshlash: Keling, sho'ng'in qilaylik. Biz mahalliy mashinada qurilish kodi tomonidan boshlaymiz va Internetga ulanmasdan veb-sayt qurmasdan boshlaymiz. Bu boshlanishi xavfsizroq, hech narsa talab qiladi va siz uchun oson. Operatsion tizimingizga qarab, och qobiq ichiga kirish biroz boshqacha bo'ladi. Mac OS uchun men bu nuqtada virtual mashinani o'rnatishni maslahat beraman, chunki siz virtual mashinaga nisbatan eng moslikni olasiz. Virtualox va Paralelllar kabi turli xil provayderlar siz uchun virtual mashinani ishga tushirishi mumkin, ammo siz tezkor, sodda tajribani yaratish uchun tavsiya etilsangiz ham, tezkor, sodda muhitdan foydalansangiz. Agar siz tavsiya qilsangiz, Linux yoki Windows-dan foydalanayotgan bo'lsangiz, bu loyihani yaratish juda oson bo'lishi kerak. Terminalingizni oching, yotganingizni sozlang va 2-bosqichni boshlang. Agar siz Windows-dan foydalanayotgan bo'lsangiz, iltimos, 1-bosqichga amal qiling.

1-qadam: - Faqat Windows foydalanuvchilari Windows-da, Ochiq buyruqni boshqaruvchi va turdagi buyruq berish WSL -install

2-qadam: - Agar siz Windows-dan foydalanmasangiz, bu erda 1-qadamni davom eting Ochiq terminalda (OT-ni Windows-da, Windows-da, Linux terminalida yoki shunga o'xshash ism) yoki shunga o'xshash nomga qarab, loyiha yaratishdan boshlang. Biz buni MKDIR buyrug'i bilan bajaramiz, bu katalog yaratadi. Agar siz o'zingizning loyihangizni saqlash uchun katalog yaratishingiz kerak bo'lsa, katalogga o'zgartirish uchun CD buyrug'idan foydalaning va va

CD / yo'l / ga / katalog - bu sizning manzilingiz katalogingizni oldindan yoki / uy / foydalanuvchi nomi (foydalanuvchi nomi). Standart katalogga o'tish uchun CD yoki CD ~ Mkdir misol - katalog nomi bilan "Masalan" ni almashtiring

Endi sizning loyihangiz uchun ishchi katalogingiz bor. Agar siz yozadigan biron bir mashinaga o'tishingiz yoki yozgan kodni joylashtirsangiz, bu veb-saytga tayyor bo'lsa, biz veb-saytni keyingi bir necha bosqichda zaxiralash uchun skriptni yaratamiz. Ammo skriptni qurish biroz kodni oladi va kodni iloji boricha foydali bo'lishi kerak. Shunday qilib, avval skriptlarni qurish uchun skript quraylik. Keling, skriptni yaratib, uni yarating. Biz sudo, chmod va teginishdan foydalanamiz va skriptni "Oyundilik" deb nomlaymiz.

sudo teginish / usr / ibn / guytercript sudo chmod A + X / USR / ibn / ibn sudo nano / usr / ibn / ibn

Endi biz skriptni yaratdik, uni yaratdi va uni tahrirlashga tayyor. Nano - bu matnni bosmasdan matnni tahrirlashingizga imkon beradigan matn muharriri, bu grafik foydalanuvchi interfeysini ishlatishga qaraganda ancha oson. Nano bilan faylni tahrirlash uchun Nano va keyin faylga yo'ldan foydalaning. Skriptni tashkil etadigan skript qilish uchun, birinchi navbatda, skriptimizni qilish uchun juda o'xshash. Biz yuqorida bir xil koddan foydalanamiz, "Oyuna" nomini argument parametrlari bilan almashtiramiz, 1 $ 1. Bu bizga skriptni skript nomi bilan "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" nomli "Yangiliklar" ni "Yangiliklar" ni "Yangiliklar" nomli yangi skriptni yozib olishimiz mumkin. Nanodagi kod quyidagicha ko'rinishi kerak:

sudo teginish / usr / blok / $ 1 sudo chmod A + X / USR / BIN / $ 1 sudo nano / usr / BIN / $ 1

Va Nanoni yopish uchun biz boshqaruv kalitini ushlab turishimiz va Xni belgilashimiz mumkin, keyin y ni belgilash uchun biz faylni tejashimiz va qaytishni bosing. Endi ushbu uchta buyruqni yozishning o'rniga, biz skriptni yana bir marta tahrirlash uchun sulouzni kiritish imkoniyatiga ega bo'lamiz. Bu ishlaydi! Va har qanday yangi skript uni qobiqqa chaqirish orqali osonlikcha ishga tushirilishi mumkin. Hozirgi ishimizni tejaylik: yangi skriptni tejash uchun zaxira yozuvini yozamiz va keyin uni qo'llab-quvvatlang, shuningdek zaxira yozuvini qo'llab-quvvatlang.

sudo gugmpli zaxira nusxasi

Endi Nano-da:

sudo cp / usr / bin / zaxira / yo'l / ga / katalog / sudo cp / usr / ibn / ibn / ibn / iborti / / katalog /

Qayerda / yo'l / ga / katalog siz MKDIR bilan yaratgan loyiha uchun yo'l. Keyinchalik biz shunga o'xshash yo'llarni xuddi pastadir va ro'yxat bilan nusxalashni o'rganamiz, bu kamroq kodga ega, ammo hozirda buni sodda qilib, bir nechta satrlarni saqlaylik. Ushbu skriptni boshqarish va kodingizni zaxira qilish, Nano-dagi faylni boshqarish + x, y va qaytish va qobiqqa kiriting

zaxira nusxasi

Agar siz ushbu kitobni o'qiyotganda va qobiqda kuzatib borganingizda, siz parolni to'g'ri kiriting, iltimos, siz buyruqni qayta ishga tushirishingiz kerak. Siz yuqoriga va pastga o'qlarni Rerun buyruqlariga ishlatishingiz va tahrirlashingiz mumkin, agar siz hech narsa yugurishingiz kerak bo'lsa. Oddiy bosib, buyruqni o'ng tomonga, o'ng tomonga, chap qo'llar bilan o'chirishdan oldin, klaviaturani, klaviaturani o'chirib tashlang va uni qaytaring.

Tabriklaymiz! Siz ishchi katalogingizda ikkita muhim qobiq skriptlarini qo'llab-quvvatlaydigan ajoyib zaxira yozuvini yaratishga muvaffaq bo'ldingiz. Biz loyiha kattaroq bo'lganda, keyinroq narsalarni o'zgartirishimiz mumkin, ammo bu hozircha ishlaydi. Bulutni qo'llab-quvvatlashga harakat qilaylik, biz Github-ni (zaxiralash uchun boshqa ko'plab git echimlari mavjud bo'lsa ham, siz ularni serverga yoki kalitning orqasida barcha dasturiy ta'minotingizni yuklab olishingizni ta'minlaydigan verialase. Bu sizning dasturiy ta'minotingizni tejashda muhim, ayniqsa kod ishlamay qolganda, ba'zida qulflanmaganida, siz uni avtomatik ravishda qo'llab-quvvatlamaganingizda, siz o'zingiz qo'llab-quvvatlamaganingizda, siz o'zingizning kodingiz qo'llab-quvvatlamaganingizda, siz qulflangan bo'lsa, siz o'zingizning kodingiz qo'llab-quvvatlamagan bo'lsa, uni qulflab bo'lmaydi.

Agar siz bu vaqtda Ubuntu virtual mashinasidan foydalanmasangiz, men bu nuqtada kerak bo'lgan barcha paketlarni o'rnatishda davom etar ekanman, chunki ishlaydigan veb-saytni yaratish va kompyuteringizda chuqur o'quv operatsiyalarini oldindan o'rnatishda sizning hayotingizni osonlashtiradi. Biz kodni yaqin kelajakda veb-serverga o'tkazamiz, ammo biz fishingga chidamli bo'lgan veb-serverimizning bir necha qatlamlari mavjudligiga ishonch hosil qilmoqchimiz va buni amalga oshirish uchun bir qator Linux paketlarini ishlatamiz. Agar siz hali ham Mac OS-dan foydalanishni istasangiz, siz Internetda kerakli paketlarni qidirish va o'rnatish uchun xush kelibsiz, ammo har bir paket uchun muqobil bo'lmasligi mumkin. Ushbu kitob yoki seriyalar qoplanadi.

Keling, zaxira yozuvi bilan ishlashni qo'llab-quvvatlaydigan bir nechta buyruqlarni qo'shamiz.

# ... git qo'shing git kombinat - "zaxira nusxasi" Git Put -u Kelyulent ustasi

...

Yana bir bor tejash uchun x ni boshqaring.
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Endi biz ushbu loyiha uchun bir marta konfiguratsiyani amalga oshirishimiz kerak. Tez orada Git loyihasi bo'ladi, biz har safar Git omboridan joylashtirganimizda har safar har safar joylashtiramiz, lekin biz joylashtirish skriptlarimizni yozayotganda biz uni osib qo'yamiz. Boshlash uchun, keling, to'g'ri katalogda ekanligimizga ishonch hosil qilaylik va Git omborini boshlang va SSH tugmalarini yarating.

CD / yo'l / ga / katalog git tashabnomasi Git filigi - Master ssh-keygen

Biz SSH-RUGGEN ni kiritgandan so'ng, yangi kalitni uy papkasida saqlanishi kerak .Ssh. Bu ID_RSA.PUB deb nomlanadi. Keling, ushbu kalitni topamiz va uni nusxalashimiz mumkin. Uni ko'rish uchun,
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
CD ~ mushuk .Ssh / ID_RSA.Pub

Oxirgi buyruq tomonidan qaytarilgan matnni nusxalash va Git provayderingiz (ideal github) bilan hisob qaydnomangizni hisobingizga qo'shishdan oldin. Hisob qaydnomangizga ega bo'lgandan so'ng, menyuning kirishida SSH va GPG tugmachalarida SSH tugmachasini qo'shishdan oldin SSH tugmachasini qo'shishdan oldin SSH tugmachasini qo'shishdan oldin SSH tugmachasini qo'shishdan oldin. SSH tugmachasini qo'shish-ni tanlang va yangi omborni yaratish uchun Github-ni tejash va qaytarib berishdan oldin uni joylashtiring va unga sarlavhani taqdim eting. Bu boshqa git provayderlari kabi o'xshash, siz ularning hujjatlarini o'qishingiz kerak bo'ladi. Yangi ombor konfiguratsiyasida o'z omboringizni tavsiflovchi nom bering va siz uni nashr etishni xohlaysizmi va hal qilishingizni hal qiling va hali hech qanday faylni qo'shishga ishonch hosil qiling. Uy omborlari yaratilgandan so'ng, ssh URL bilan klonni nusxa oling va quyidagi buyruqqa joylashtiring.

Git masofadan o'lchash Git: // ... (Masofadagi URL)
sudo ascript backup
Endi siz o'zingizning omboringizga CD bilan orqaga qaytishingiz mumkin, siz bilan tanishasiz. Zaxira nusxasini zaxira nusxasini ko'ring

Ajoyib! Endi biz haqiqatan ham kodlashni olishimiz mumkin. Endi Django-ni o'rnatamiz, biz bosh va gitda yaxshi tushunamiz. Django bizning dasturiy ta'minotimizni avtomatik ravishda zaxiralashiga olib keladi, bu ishni ham qila oladi, lekin Django soddalashtirilgan bo'lishi kerak (u o'chirilishi mumkin va osonroq sozlanishi mumkin).

Ubuntu-da dasturiy ta'minotni o'rnatish uchun SUD APT-ACTUM-QAYTA QO'LLAB-QUVVATLAShINGIZ. Birinchidan, keling, bizda bo'lgan dasturiy ta'minotni yangilab yangilab turing. Buni sudo apt-get yangilanishi bilan amalga oshirish mumkin va sudo apt-ogize-ni yangilang. Keyingi, keling, python va virtual muhitimizni, bizning Kodeksning uyini o'rnatamiz, quyidagi buyruq bilan quyidagi buyruq bilan: python-python3 pligon3-venv
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Ubuntu instansiyasida dasturiy ta'minotni o'rnatishda Django bilan borishingiz kerak bo'lgan narsa bu siz Django bilan borishingiz kerak. Windows va Linux uchun bu juda to'g'ri bo'lishi kerak, ammo Mac uchun Virtualbox yoki Pionells stoli kabi bepul yoki pulli virtual muhitni o'rnatib, ubuntu muhitni sozlash uchun yuqoridagi plyonka va yuqoridagi qadamlarni o'rnatishni xohlashingiz mumkin. Bu holda Ubuntu bu holatda muhimdir, chunki bu dasturlar ishlaydigan veb-saytlar va u barcha yuqorida ko'rsatilgan dasturlarga ega veb-saytlarni joylashtirishga imkon beradi.

Djangoga qazib olaylik.

Yana katalogda, CD bilan:
backup
python -m venv venv # kod saqlanadigan virtual muhitni yaratadi Manba VuV / BIN / faollashtirish # Virtual muhitni faollashtiradi django quvuri Django-admin StarpRojectPrerge mysur. # Mening hozirgi katalogimda boshlanayotgan loyihadir.

Kod saqlanadigan virtual muhitni yaratadi

Virtual muhitni faollashtiradi

Mening hozirgi katalogimda boshlanayotgan loyihadir.

Django bizga boshlanmoqda, chunki Django veb-serverni o'tkazmoqda va asosiy mahalliy veb-saytni ishga tushirish va ishlashi uchun zarur bo'lgan hamma narsani qilyapti. Endi bizda o'rnatilgan Django o'rnatilgan bo'lsa, keling, sozlamalarni qanday qilib kerakligi uchun biroz kerakligini ko'rsataylik. Birinchidan, yangi ilova yaratamiz

Python Manage.py WatchApp-ni boqish

Siz birinchi ilovada em-limon deb ataladi. Ilova sizga yoqadigan narsalar deb nomlanishi kerak va biz yangi ilovalarni yaratamiz, ammo har bir ilovaning nomi har bir vaqtda ilova kodni ro'yxatdan o'tkazishda davom ettirilishi kerak. Yangi ilova qo'shish uchun biz doimo Sozlamalarni tahrirlaymiz. StartProjext-da yaratilgan ilova, boshqa ilovada yaratilgan boshqa katalogni tahrirlaymiz. Nano-dan foydalanish,

nano ilova / sozlamalari.py

Sozlamalarda o'rnatilgan_applarni toping va [] 3 qatorga ajrating. Bo'sh markaz liniyasida to'rtta bo'sh joyni ishlatish, yoki ilovangiz nomini qo'shing. Sozlamalarning ushbu qismi .Py ko'rinishi kerak:
# O'rnatilgan_apps = [
    "Ozuqa",
]
Unutamizdan oldin, Django ishlayotganini sinab ko'ramiz. Buyruqdan foydalanish Python boshqaruvchisi 0.0.0.0:0:8000, biz serverni http: // manziliga olib bora olamiz va veb-saytni http webracer-ni (u ishlaydi!) Nazorat-versiyasini boshqara olamiz.

Endi python kodini yozishimizda. Django uchta asosiy tarkibiy qismga ega, ularning barchasi kodi bilan to'liq ishlaydi. Komponentlar model, ko'rish va shablon deb ataladi va har biri veb-sahifaga etkazib berilishidan oldin mos ravishda yuqori va pastroq darajasida.

Model - bu qo'shimcha, saralash va taqdim etish uchun ma'lumotlar bazasida ma'lumotlarni saqlaydigan kod.

Ko'rish model qanday ko'rsatilgan, boshqariladigan va o'zgartirilgan, deyarli har qanday holat to'g'ridan-to'g'ri modeldan foydalanadi.

Andoza - HTML-kod - bu shablon til deb ataladigan qo'shimcha qo'ng'iroqlar va hushtak. Ushbu shablon piton kodi va kontekst bilan to'ldirilganligi sababli, ular nuqtai nazardan, masalan, modellar va ma'lumotlar va butun sonlar kabi) ko'rinadi.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Django boshqa tarkibiy qismlarga ega, shu jumladan:

Siz muhokama qilgandek ilovani sozlaydigan sozlamalar.

URLS veb-ilovaning muayyan qismlariga kirish huquqiga ega bo'lishi mumkin bo'lgan naqshlar mavjud.
cd ~
cat .ssh/id_rsa.pub
Serverga yuborilgan ma'lumotlar qanday qilib amalga oshiriladi va ma'lumotlar bazasiga, shuningdek foydalanuvchiga taqdim etiladi. Bular server tomoni to'g'risidagi ma'lumotlarni qayta ishlashning asosi bo'lib, har qanday ma'lumot turini, shuningdek, matnli satrlar, raqamlar, raqamlar va haqiqiy / soxta idishlar (odatda katakchalar).

Piton va HTML o'rtasidagi shablonlar, python va html o'rtasidagi bo'shliqni piton kodi bilan ta'minlash va boshqa maqsadlar bilan ta'minlanishi mumkin bo'lgan bo'shliqni va boshqa maqsadlar uchun server yonida bo'lishi kerak bo'lmagan joyda saqlanishi mumkin.

Odatda JavaScript va u kutubxonaga tegishli bo'lgan kutubxonalar bo'lgan statik fayllar va u shablon bilan bog'langan.
git remote add git://… (your remote URL)
Server xizmat ko'rsatadigan yoki boshqa serverga yozilmasdan, boshqa server (chelak) ga xosting uchun joylashtirilgan media fayllari.

Bir vaqtning o'zida har bir nuqtai nazar bilan ishlaydigan va "qo'shilgan" deb hisoblanadi.

Har bir nuqtai nazarning kontekstini ko'rib chiqadigan va qo'shimcha kontekstni qo'shish uchun kontekst protseduralari.

Foydalanuvchi yoki so'rovni hisobga olgan holda foydalanuvchi yoki talabga javob berishini tasdiqlovchi sinovlar.

Xoussetsets-ni qanday boshqarish va aloqa qilishga qanday munosabatda bo'lishini aytib beradigan iste'molchilar.

Modellarni ro'yxatga olish uchun foydalaniladigan admin, ular bazasi grafik interfeys orqali ma'lumotlar bazasi orqali amalga oshirilishi mumkin.

Django Kodeksning asenchron vazifalarining qismlarini belgilaydigan selderey, keyingi vazifa yoki Kodeksi qatoriga o'tishdan oldin darhol ishlashni boshlaydi.

Django boshqa ko'plab tarkibiy qismlarga ega bo'lishi mumkin, ular bu erda batafsil muhokama qilamiz. Django ko'proq funktsional qilishning juda ko'p usullari mavjud bo'lib, ular tezkor, soddalashtirilgan aloqa kanallari, bu zangori, ayniqsa, kodning ko'pi bajariladigan vazifalarni bajaradi. Funktsiyalarni ko'rish tugmacha hisoblanadi, chunki ular odatda ma'lum bir URL NAZORATI yoki Serverning bir qismi uchun mavjud bo'lgan har bir kodni e'lon qiladilar.

Birinchidan, ko'raylik. Funktsiyalarni ko'rish Import kodini bildirish bilan boshlanadigan va muntazam funktsiyalar yoki sinflar yordamida belgilanadi. Eng oddiy ko'rishlar funktsiyani aniqlashning belgisi bilan belgilanadi va asosiy shablon bilan HTTPrse-ni qaytaradi. "Salom Dunyo" matnini qaytarish uchun asosiy nuqtai nazarni aniqlashdan boshlaylik. Esda tutingki, har safar def of kabi bayonotni qo'shganingizda, agar, agar, bo'lsa, siz o'z funktsiyaingizga murojaat qilmoqchi bo'lgan har biringiz uchun 4 bo'sh joy qo'shishingiz kerakligini unutmang. Tez orada bularning har biri nimani anglatishini olamiz.

Bizning saytimiz katalogidan, Nano-dan foydalanib, Nano-dan foydalanib, Fayl / Views.py faylini tahrirlang va fayl oxiriga quyidagi satrlarni qo'shing.

Django.HTTP importida Import httpostonse Salom (so'rov): Deptprse ("Salom World" ni qaytaring)

Django-ning HTTPROSOBning ochilishi va yopilishi bilan ifodalangan matn satriga javob beradi. Har safar siz so'rov yoki satr kabi funktsiya yoki sinfga murojaat qilganingizda, siz qavsni (, ochish va yopish) ishlatishingiz kerak bo'ladi.

Bu biz hali ham bizning fikrimizni ko'rishimiz kerak emas. Albatta, biz serverga ko'rinadigan narsa aniq ekanligini aytmadikki, biz hali ham ko'rinadigan yo'lni aniqlashimiz kerak. Ilova / URLS.PY-da asosiy yo'lni belgilash orqali boshlaymiz va keyinroq yo'l guruhlariga kiramiz.
python -m venv venv # App / URLS.PY-da, biz yaratgan ko'rinishni boshlaganidan keyin import bayonotidan so'ng chiziq qo'shing.
source venv/bin/activate # Feed_View sifatida oziq-ovqat ko'rinishi ko'rinishi
django-admin startproject mysite . # Endi qarashli ko'rinishni aniqlaylik. Ko'rish holatida bo'lgani uchun, bu shablonda ishlayotganda, shunda, shuning uchun u URL manziliga ega bo'lgan, shuning uchun uni boshqa ko'rinishga ega bo'lish yoki undan ko'proq nomga kirish uchun yaratilishi kerak bo'lgan uchta komponent mavjud. Bu kabi narsalarni qilish va moslashuvchan bo'lishning mantiqiy, chunki sizning kodebaseingiz qimmatli va oson ishlash uchun moslashuvchanlik va improvizatsiya kerak bo'lgan har doim o'zgaruvchan muhit bo'ladi. Sizning nuqtai nazaringiz qanday ko'rinishga ega, siz buni urlpatterns = [Ilova / Url.py bo'limiga qo'shishingiz mumkin. Ko'rish tartibi yuqorida tavsiflangan uchta komponent bilan va yo'l deb nomlangan funktsiya bilan belgilanadi. Sizning URL naqshlaringiz ro'yxati, shuning uchun har bir elementni vergul bilan tugatishingizga ishonch hosil qiling, chunki bu har birini ajratadi. Har bir element, shuningdek, yana to'rtta bo'shliq bilan yana to'rtta bo'shliq bilan birga borishi kerak, xuddi Sozlamalardagi ilova kabi. Veb-serverning ildiz katalogida ishlaydigan nuqtai nazar yaratish uchun, biz Veb-serverning ildiz katalogida ishlaydigan nuqtai nazar yaratish uchun nuqtai nazarning birinchi tarkibiy qismini aniqlaymiz. Sizning url.py endi bu kabi ko'rinishi kerak:
Feed_View sifatida oziq-ovqat ko'rinishi ko'rinishi Urlpatterns = [ yo'l ('', Fake_View.hello, ism = 'Salom'), ]

Bu Django bilan veb-sayt yaratish uchun asosdir. Tasvirlar, videolar, audio va boshqa narsalar singari biz boshlanayotgan ma'lumotlarni qayta boshlashimiz uchun, biz keyingi modellardan foydalanishimiz kerak. Endi bizning kodimizni tekshirib, serverni boshqaraylik. Xatolar uchun kodni tekshirish uchun:

python boshqaruvchisi.py tekshirish
python manage.py startapp feed
Agar biron bir xato xabarlar bo'lsa, ilovangizga kiritilgan o'zgartirishlarni diqqat bilan ko'rib chiqishingiz kerak, qo'shimcha belgi, har qanday tazyiq, har qanday tazyiq, tasodifan tasodifan o'chirilgan belgi yoki boshqa narsalar kabi. Xato xabari orqali o'qish (agar sizda bo'lsa), siz yaratgan yoki chiziq raqami bilan birga tahrirlangan faylni ko'rishingiz yoki tahrirlashingiz kerak, shuning uchun ushbu fayl va chiziqni ko'ring. Agar siz muammoni hal qilgan bo'lsangiz, yuqoridagi buyruqni yana bajaring. Dasturingiz yugurishga va ishlashga tayyor bo'lganda, siz chiqishni ko'rasiz "Tizim tekshiruvi yo'q." Endi siz borishga tayyorsiz. Serverni quyidagicha ishga tushiring:

Python Manage.py RunServer 0.0.0.0:8000

Endi veb-brauzerni oching va http: // llogiste'd kitobiga o'ting: 8000. Ko'rishingiz kerakki, sizning nuqtai nazaringizda matnni qavsida va "HTTPresponse" funktsiyasining tirnoqlarini ko'rishingiz kerak. Bu shunchaki asosiy misol, ammo agar siz buni hozirgacha qilsangiz, Linux, Bash, Python va Django ishlarining asoslarini tushunasiz. Keling, ba'zi ma'lumotlar bazasini modellashtirishni yaxshilaylik va ma'lumotlarni saqlashda python sinfining kuchini o'rganaylik. Keyin, biz JavaScript va Mashinani o'rganish yordamida to'liq taniqli, moslashuvchan va xavfsiz foydalanishimizdan oldin HTML va CSS-ga tegishni boshlaymiz.
nano app/settings.py
Sinflar sizning ilovangizning modellarida saqlanadi. Nano-dan foydalanish, Ilova / Models.py va yangi sinf qo'shing. Sinf sinf ta'rifi bilan belgilanadi va u meros oladigan superklassdan o'tdi. Modellar .Model. Sinfning nomi sinf ta'rifidan keyin keladi va sinfni aniqlashdan keyin a ishlatiladi: (yo'g'on ichak), sinfga bog'langan atributlar va funktsiyalarni belgilash quyida keltirilgan. Bizning sinfimiz uni olish uchun ishlatishimiz va uni noyob saqlashimiz uchun ishlatishimiz mumkin va u ba'zi ma'lumotlarni saqlash uchun matn maydoniga muhtoj. Keyinchalik biz Valendpamp, fayllar, boaliliklarni qo'sha olamiz (model bilan nima qilishda yordam beradigan haqiqiy yoki noto'g'ri tushunchalar, masalan, uni kiritish uchun namunaga va boshqalarni kiritish uchun ishlatilishi mumkin). Keling, quyidagi kodni qutisiga olib keling:

Django.db import modellaridan # bizning sinfimizni aniqlash uchun ishlatiladigan import va bu sifatlar klass posti (modellar.model): # bizning sinfimizning ta'rifi ID = Models.autofild (boshlang'ich_key = rost), bizga modelni yoqish, uni noyob saqlashga imkon beradigan va model bilan aloqada bo'lishimiz kerak bo'lgan narsaning identifikatori. Matn = models.textfield (standart = '')

Bizning sinfimizni aniqlash uchun ishlatiladigan import va bu xususiyatlar
INSTALLED_APPS = [
    'feed',
]
Bizning sinfimizning ta'rifi

Modelni talab qiladigan avtomatik ravishda yaratilgan, uni noyob saqlang va model bilan tuzilgandan so'ng, biz model bilan aloqada bo'lishimiz kerak.

Bizning sinf do'konlarimizning atributlari, bu holda, bo'sh satrga aylanadi.

Faylni tugatish va tugatish uchun faylni yoping.

Boshqa ko'plab maydonlar mavjud va variantlar mavjud, chunki biz ushbu sinfni yangilaganimizda biz kashf etamiz, ammo bu biron bir matnni joylashtirish uchun ilova yaratishning asosiy ehtiyojlari. Biroq, bu model yolg'iz ishlamaydi. Ilgari aytilganidek, biz ushbu model ishini amalga oshirish uchun bizda maxsus ko'rish va shaxsiy URL-ning shaxsiy namunasi kerak bo'ladi va bizda shablon bilan bir qatorda forma kerak bo'ladi. Avval shaklni o'rganaylik.

Nano bilan ariza / shakllarni tahrirlash va quyidagi satrlarni qo'shing. Bizda ikkita import, bizning shakllarimiz, shuningdek, yaratgan modelga, shuningdek, maydonchaga o'xshash to'plamga o'xshash sinfga o'xshash sinfga o'xshash. Shakl, shuningdek, dastlabki ma'lumotlarga asoslanib, uni so'rovda, model yoki boshqa tomondan o'rganib chiqadigan ishga tushirish funktsiyasi bo'lishi mumkin.

Model shakllari juda foydali, chunki ular modelni yaratishi yoki modelni tahrirlashlari mumkin, shuning uchun biz ularni ikkalasi uchun ishlatamiz. Keling, shaklni shakllantiraylik. Quyida.

Django import shakllaridan Feed.Models-ni import xabari sinf postformi (shakllar.modusterform): Matn = shakllar.arfield (vidjet = shakllari.textsue) Metra Meta: model = post Maykalar = ('matn',)

Bu qanday shakl va modelga o'xshash narsalarning asoslari. Ushbu model shaklida u o'z ichiga olgan matnni o'zgartirish yoki tahrirlash uchun ishlatilishi mumkin. Ushbu shaklni keyingi nuqtai nazarga kiritamiz. Birinchidan, keling migratsiyalarni yarataylik va ma'lumotlar bazasini ko'chirib, bizning kodi u ishlaydigan paytda model bilan o'zaro ta'sir qilishi mumkin. Buning uchun quyidagi buyruqlarni bajaring:

Python boshqaruvchisi.py maemigratsiyalar python boshqaruvchisi.py migratsiya

Bu bir daqiqaga bajarilishi kerak, ammo bir marta, bu sizga ko'rinishda ko'rinadigan, o'rta jihozlarda yoki boshqa joylarda namunalarga kirishga imkon beradi. Keling, bizning modelimizni ko'rishimiz mumkin bo'lgan narsani ko'rish orqali davom etaylik. Yo'l / Views.PY-ni tahrirlash va qayd etilganidek, quyidagi kod qo'shing. Siz # belgidan keyin hech narsa qo'shishingiz shart emas, bu kod - bu kod haqidagi ma'lumotlarni bildirish uchun ishlatiladigan izoh. Biz o'z modelimizni o'z nuqtai nazarlarida olib kirib, uni shablonda displey uchun ro'yxat sifatida ko'rsatishimiz mumkin bo'lgan kontekstga qo'shamiz. Keyinchalik biz namuna va modelni serverga joylashtiradigan yangi ob'ektni yaratish uchun forma va modelni qo'shadigan shablon qo'shamiz. Bu murakkab tovushlar murakkab, shuning uchun uni bosqichma-bosqich qabul qilaylik. Ko'rishni tugatishdan oldin, keling, modelni tashkil etadigan va qobiqda yangi postni yaratib, uni ko'rishimiz mumkin bo'lgan shablon yaratamiz. Bu qanday ko'rinishga ega bo'lishi kerak:

Feed.Models-ni import xabari Django.shortcuts-dan import retsepti, yo'naltirish DJango.urls import teskari def ozuqa (so'rov): Posts = Post.OBevce.all () # ma'lumotlar bazasidagi barcha xabarlar hozirgacha Qaytishning qaytishi (so'rov, 'Feed / Fake.html', "Xabarlar": Xabarlar, })

Hozirgacha hozirgacha ma'lumotlar bazasidagi barcha xabarlarni so'rash

Bularning barchasi biz pastki qismga etib borgunimizcha juda oddiy ko'rinadi. Oldingi misolga o'xshash HTTP javobi o'rniga, funktsiya tomonidan qaytarilgan qiymat har doim so'rovni qabul qiladi (bu holatda ma'lumotlar bazasidagi xabarlar) funktsiyada belgilangan shablonni qaytaradi. Shablon html-ga python ma'lumotlarini beradigan Jinja2 deb nomlangan deb nomlangan HTML hujjat bo'ladi.

Shablonlarni yaratishni boshlash uchun ozuqada ikkita katalog yasash.

Mkdir Ozuqa / shablonlar mkdir taomlari / shablonlari / yemi

Keyinchalik, yuqoridagi katalogdagi shablonni tahrirlash, Oziq-ovqat / shablonlar / ozuqa va ushbu misol uchun kod qo'shing. Ushbu misol uchun shablonni ko'rib chiqaylik.

Yem % postlarda%} {{post.Text}} {% endtar%}

Bu juda oddiy shablon. U ochilish va yopilish HTML yorliqlarini, advokatlar turi, durang nomi bilan tanaffus yorlig'i, bu shablondagi paragraf sifatida har bir xabarni kiritadigan aniq yorliqni belgilaydi. Bularning barchasi postlarni ko'rsatish uchun kerak, ammo ma'lumotlar bazasida hali hech biri yo'q. Keling, qobiq bilan bir oz yaratamiz. Biz qobiqni boshqarish bilan ishlashimiz mumkin .py.py

python boshqaruvchisi.py qobig'i

Endi bizning pochta modelimizni olib kelaylik

Feed.Models-ni import xabari

Keyinchalik biz satr bilan oddiy xabar yaratamiz va qobiqdan chiqamiz. Satr - bu haqiqiy matn kabi har qanday narsa bo'lishi mumkin.

Post.Batectscatice (matn = 'Salom Dunyo') Chiqish ()

Va nihoyat, biz ozuqaimizga URL namunasini qo'shishimiz kerak. Bizning ozuqa ilovasi bir nechta URL manzillaridan foydalanadi va biz fayl o'lchamlarini kichik hajmda saqlamoqchimiz, keling, bizning tasmadagi mahalliy url.py-ni yaratamiz:

Django.urls import yo'lidan dan. Import ko'rinishi Urlpatterns = [ yo'l ('', hisobi, ism = 'yemi'), ]

Shuningdek, biz Baza ilovasida URLS.PY-ni tahrirlashimiz kerak, biz uni chaqirishga qaror qilganimizdan qat'i nazar, biz yaratgan birinchi katalog edi. Ilova / App.py-ni tahrirlash va URL-fayllarga quyidagilarni qo'shing

DJango.urls-dan # yuqori qismida keltiring Urlpatterns = [ # ... Bu erda oldingi kod yo'l ("Ozuqa /", qo'shing ]

Yuqorida

... oldingi kod bu erda

Endi biz serverni python boshqaruvchisi bilan boshqarganimizda, biz yaratgan sahifani ko'ramiz, chunki bizda namunaviy, ko'rish va shablon mavjud, shuningdek URL-ning namunalari ma'lumotlar bazasidagi narsalar bilan birga. Keyin, keling, yaratgan shaklni amalga oshiramiz va o'z postlarimizni yaratishni boshlaymiz. Ammo biz juda ko'p kodni yozishdan oldin, avvalgi yozgan skript yordamida zaxira nusxasini yarataylik. Ushbu skriptni qobiqda choping, bir necha daqiqa kutib turing va barcha kod bizning Git omborimizga zaxiralanadi.

zaxira nusxasi

Shaklni amalga oshirish nisbatan sodda. Biz formamizni import qilamiz, ishlov beruvchini ko'rish uchun post so'rovini qo'shish va shu nuqtai nazardan qayta yo'naltirishdan oldin xabarlarni ma'lumotlar bazasida saqlash. Biz qayta kiritilgan yo'naltirish funktsiyasidan foydalanishimiz mumkin, va ko'rish naqshini olish uchun URL manzilini olish uchun teskari deb nomlangan boshqa funktsiya. Biz buni "ozuqa" yordamida so'raymiz. Bitirilgan naqshning nomlari ozuqa va ko'rinishi ham ozuqa deb ataladi.

Feed.FormsForms import postformini import qiladi def ozuqa (so'rov): Posts = Post.OBevce.all () # ma'lumotlar bazasidagi barcha xabarlar hozirgacha Agar so'ralsa.metod == 'post': # post so'rovini bajaring forma = postform (so'rov.post) # shakl namunasini yarating va unga ma'lumotlarni saqlang Agar forma.is_valid (): # shaklni tasdiqlang Forma.Save () # yangi ob'ektni saqlang Qaytishni qayta yo'naltirish (teskari ('Ozuqa:' tasmasi: ')) # so'ralish bilan bir xil URL manziliga yo'naltirish Qaytishning qaytishi (so'rov, 'Feed / Fake.html', "Forma": Postform (), # biz uni ko'rsatib, kontekstga o'tishingizga ishonch hosil qiling. "Xabarlar": Xabarlar, })

Hozirgacha hozirgacha ma'lumotlar bazasidagi barcha xabarlarni so'rash

Pochta so'rovini bajaring

Shakl namunasini yarating va ma'lumotlarni saqlang

Shaklni tasdiqlang

Yangi ob'ektni saqlang

So'rovni olish uchun bir xil urlga yo'naltirish

Ushbu shaklni kontekstga o'tishingizga ishonch hosil qiling, shunda biz uni berishimiz mumkin.

HTML-dagi yorliq va respublikasiz shablondagi shaklni yuborish tugmasi bilan. Shuningdek, biz tashqi saytlarni birinchi sahifani yuklamasdan, tashqi saytlarni joylashtirishni oldini oladi, bu esa tashqi saytlarni shakllantirishni oldini oladi.

Yem {% CSRF_TENEN%} {{form}} Yangi post % postlarda%} {{post.Text}} {% endtar%}
from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world')
Buni buzaylik. Yangi shakl sinf, token, shaklning o'zi va yuborish tugmasi mavjud. Juda oddiy, ammo biz uni ko'rib chiqsak, uni yaxshiroq ko'rinishni xohlashimiz mumkin. Bu ishlaydi, biz yangi xabarlarni shaklda joylashtiramiz va ular endi ma'lumotlar bazasida saqlanmoqda. Bu erda bir nechta narsalar bor. HTML yorliqlaridan foydalanamiz, deya ta'kidlash uchun biz HTML hujjati (% ...%}) shaklni berish uchun shablon tegini (% ...%}) ishlatamiz. Shuningdek, bizda blok teglari va shablon teglari yordamida matnni ko'rsatadigan pastadir. Blok teglari juda muhim, chunki biz shablonning qanday bo'limlari ular bilan qanday bo'limlar paydo bo'lishini aniqlashimiz mumkin, va shablon teglari bizning kodimizga qanday qilib o'zgaruvchilarni qo'yishimiz asosidir.

Endi biz o'z ilovasini yanada yaxshilashimiz kerak, chunki hozir uchun u haqiqatan ham asosiy ko'rinadi. Biz buni CSS-dan yoki hujjatdagi har bir ob'ektga bog'langan sinflarda qilish orqali buni amalga oshirishimiz mumkin. CSS juda yaxshi, chunki u sahifada hamma narsani qanday ko'rinishi kerakligini va uni juda yaxshi ko'rinishi mumkinligini aytadi. Buni amalga oshirishi mumkin bo'lgan bir nechta kutubxonalar mavjud, ammo mening shaxsiy GoOSTrap.

getbootstrap.com/

Mkdir shablonlari bilan yangi katalog yasang, so'ngra shablonlarni tahrirlash / Base.html tahrirlash.

Bu shunday ko'rinishi kerak:

{% korpus%} {% entblock%}

CSS va JavaScript, JavaScript va .Js fayllarini nusxalashingizga ishonch hosil qiling, chunki kelajakda bizning saytimizni yanada funktsional qilish uchun JavaScript-ga muhtojmiz.
from feed import views as feed_views
Endi, keling, novda qobig'iga qaytay va tezkor buyruqni ishga tushiramiz. Yodingizda bo'lsin, agar siz hech qachon virtual muhitga kirishingiz kerak bo'lsa, venv / bin / faollashtirish. Bu sizga piton paketlarini mahalliy ravishda Django ularga kirishga imkon beradigan tarzda o'rnatishga imkon beradi. Django boottrap sinflari tomonidan yaratilgan shakllarimizni berish uchun, biz piton paketidan qisman hosil bo'ladi. Buni quyidagi buyruq bilan yuklab olishimiz mumkin

django-qisqi shakllarini in liya o'rnating

Bu o'rnatilgandan so'ng, uni sozlash.py-ga qo'shing
from feed import views as feed_views

urlpatterns = [
    path('', feed_views.hello, name='hello'),
]
O'rnatilgan_apps = [ # ... Bu erda oldingi kod 'crispy_forms', ]

... oldingi kod bu erda

Endi biz ozuqa shablonimizda, biz ba'zi narsalarni olib tashlashimiz mumkin. Hujjatning boshlanishi va oxirida olib tashlaymiz va uni asosiy shablonimizdan meros qilib oling, ulardan uzaytiriladi va blokirovka qilinadi. Shuningdek, biz shakli va shablon filtr bilan shablon filtr importini qo'shamiz. Va nihoyat, keling, tugmachani bosish uchun tugmachani bosing. Bu shunga o'xshash ko'rinishi kerak:
python manage.py check
{% 'baza.html'%} {% korpus%} {% yuk crisy_forms_tags%} {% CSRF_TENEN%} {{shakl | Crispy}} Yangi post % postlarda%} {{post.Text}} {% endtar%} {% entblock%}

Chiroyli! Bu allaqachon allaqachon kod. Keyinchalik biz buni sinab ko'rishimiz va hamma narsa yoqimli ko'rinishi va hamma narsa to'g'ri ishlayotganiga ishonch hosil qilishimiz kerak. Serverni avvalgi ko'rsatmalarga muvofiq boshqaring va sayt ko'rinishi va yaxshi ishlashiga ishonch hosil qiling. Ajoyib ish! Siz keyingi bosqichga o'tishga tayyormiz, unda shunga o'xshash URL manzillari, shakllari, ko'rinishi va shablonlari yordamida foydalanuvchiga kirish funktsiyasini qo'shamiz. Asosiy shablon juda muhim va biz uni o'zgartirishni davom ettiramiz va kerak bo'lganda bizning saytingiz xavfsizligini ta'minlashga va o'zingizning hisobingizni faqat siz bilan ta'minlashga yordam beradigan yanada xavfsizroq ma'lumotni va o'zingizning hisobingizni faqat siz bilan ta'minlashga yordam beramiz.

Buning uchun biz Django shahriga qurilgan foydalanuvchi modelidan foydalanishimiz kerak. Foydalanuvchi modeli - bu bizning postimizga o'xshaydi, bu sizning xabarimizga o'xshaydi, bu foydalanuvchini veb-saytga kiritish mumkin. Kelajakda biz saytni Internetga joylashtiramiz, biz ushbu modelni unga tegishli boshqa modellar bilan uzaytiramiz va fishingga chidamli kirish uchun qo'shimcha xavfsizlik choralarini quramiz. Biz Django taqdim etgan ba'zi kirish shakllarida qurilgan ba'zi narsalarni ishlatishdan boshlaymiz. Birinchidan, keling, asosiy kirish sahifasi uchun shablon va ko'rinishini ko'rsatish uchun biz foydalanadigan yangi dastur yaratamiz. Quyidagi dasturlarni, shuningdek, pinode, yuzni aniqlash, dala aloqalari, tashqi qurilmalari, ko'p fazilatli autentifikatsiya qilish va barmoq izlarini aniqlash uchun bizda davom etayotgan muammolarni ifodalash uchun boshqa dasturlarni ham yaratamiz.
python manage.py runserver 0.0.0.0:8000
Biz allaqachon ilovani boshlash haqida gaplashdik. Virtual muhitning birligi, dovoning katalogidan, bu dalillar

Python Manage.py WesterApp foydalanuvchilari

Endi bizda yangi ilova uchun katalog bo'lishi kerak. Keling, foydalanuvchi tizimga kiradigan ushbu katalogda ko'rinishni yaratamiz. Django foydalanuvchi loginlari uchun yaratilgan, ammo bu biz uchun mos kelmaydi, chunki bizda aniq ta'rif bilan bog'liq bo'lgan maxsus ko'rinish kerak.

Shu nuqtai nazardan, biz Post so'rovini tekshirish, Djangodan olib kirilgan login ma'lumotlarini tekshirish, foydalanuvchi hisobini tasdiqlaydi va ularni ozuqa ilovasiga yo'naltirishdan oldin foydalanuvchiga kiring.

Foydalanuvchi / Views.py-da, quyidagi kod qo'shing
from django.db import models # Django.shortcuts-dan import retsepti, yo'naltirish
DJango.urls import teskari
Django.contribh.auth.Formes-ni autentifikatsionform, sentpassworforForforme import qiladi
django.contribh.aute import, chiqish
DJango.contribh.Aute Imple Cire_login sifatida kirish
DJango.Contribe import xabarlaridan

Kirish (so'rov):
    Agar so'ralsa.metod == "post":
        Foydalanuvchi nomi = so'rov. "Foydalanuvchi nomi"] # pochta xabaridan foydalanuvchi nomi va parolni oling
        Parol = so'rov. "Parol"] # foydalanuvchini autentifikatsiya qilish
        Foydalanuvchi = haqiqiyligini tekshirish (Foydalanuvchi nomi = Foydalanuvchi ismi, parol = parol)
        Agar foydalanuvchi bo'lsa:
            auth_login (so'rov, foydalanuvchi, backend = 'Django.ctrtribh.backend.Modelbababackend')
            Xabarlar .Success (so'rov, 'Parolingiz qabul qilindi. Iltimos, davom eting')
            Qaytishni qayta yo'naltirish (teskari ('Ozuqa: yemi')))
        el: Xabarlar.Warning (so'rov, 'foydalanuvchi nomi yoki parol noto'g'ri. Qayta urinib ko'ring)
    Qaytishni qaytarish (so'rov, 'foydalanuvchilar / login.html', {shakl ': autentifikatsionform ()})
class Post(models.Model): # Post so'rovidan foydalanuvchi nomi va parolni oling
    id = models.AutoField(primary_key=True) # Foydalanuvchini autentifikatsiya qilish
    text = models.TextField(default='') # Bu siz asosiy kirish ko'rinishi uchun kerak bo'lgan narsadir. Endi asosiy shablonni kengaytirish orqali ushbu shakl yaratamiz. Foydalanuvchi papkasida shablonlar uchun yangi katalog yaratishni boshlaymiz.
mkdir foydalanuvchilari / shablonlari Mkdir foydalanuvchilari / Andoza / foydalanuvchilar

Endi biz foydalanuvchilarni / Andoza / foydalanuvchilar / login.html-ni tahrirlashimiz kerak. Biz u erda bo'lganimizda, foydalanuvchi ro'yxatdan o'tishiga imkon beradigan shablon yaratamiz.

NANO foydalanuvchilari / Andoza / foydalanuvchilar / Login.html

Endi shablonda,

{% 'baza.html'%} {% yuk crisy_forms_tags%} {% Qoplangan tarkib%} {% CSRF_TENEN%} Tizimga kirish {{shakl | Crispy}} Tizimga kirish {% entblock%}

Bu kirish shablonining asoslari. Bu haqiqatan ham tuzilishdagi boshqa shablon kabi, ammo u chiqarilganda biroz farq qiladi. Ushbu kodni nusxalash uchun biz Ro'yxatdan o'tishi mumkin bo'lgan yana bir o'xshash shablonni yaratishda biz ro'yxatdan o'tishingiz va biz quradigan yangi shakldan foydalaning. Avval shablonni yarataylik. Foydalanuvchilarga / Andoza / foydalanuvchilarni tahrirlash / Ro'yxatdan o'tish.html va quyidagi kodni qo'shing:

{% 'baza.html'%} {% yuk crisy_forms_tags%} {% Qoplangan tarkib%} {% CSRF_TENEN%} Hisob ochish {{shakl | Crispy}} Ro'yxatga olmoq {% entblock%}

Endi, keling, foydalanuvchilarni ro'yxatdan o'tkazish uchun forma yaratamiz va biz foydalanuvchi tizimini model bilan yangilashdan oldin. Biz ushbu shaklni boshlaymiz, ammo kelajakda bitimlar va CAPTCHA kabi ko'proq ma'lumot va xavfsizlik xususiyatlarini o'z ichiga olamiz. Nano foydalanuvchilari / shakllari bilan shakllarni tahrirlang va quyidagi kodni qo'shing.

Django import shakllaridan DJango.contribh.mods import foydalanuvchisini import qiladi Django.contribh.Ath.forms import menserainatsiyasini import qiladi Sinf UserereGerForm (UserCreartform): Elektron pochta = shakllar.emailfild () Metra Meta: model = foydalanuvchi Maykalar = ['Foydalanuvchi nomi', 'elektron pochta', 'parol1', 'parol2')
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',)
Shunday qilib, bizda boshqa bir shakl bor, bu shunchaki adolatli ishlaydi. Bu foydalanuvchi nomi, elektron pochta va parol bilan foydalanuvchi nomi, elektron pochta va parol bilan ro'yxatdan o'tish shakli. E'tibor bering, ushbu shakl muntazam shakllarni kengaytirmaydi Bir maydon shunchaki aniqlanadi va medaqet shaklda shaklda yozilishi mumkin bo'lgan ma'lumotlarning qolgan qismiga mos keladigan modelga mos keladi. Bularning aksariyati Django shahrida foydalanuvchi tomonidan yaratilgan, shuning uchun biz ushbu sinf uchun asos sifatida foydalanamiz (qavzisda chiqarilgan).

Keyin, biz foydalanuvchi va shablon borligi haqidagi ko'rinishni ro'yxatdan o'tkazish uchun biz ko'rib chiqamiz. Bu yangi post ko'rinishda bo'lgani kabi, bu o'zgaruvchan. Foydalanuvchilarni tahrirlash / Views.Py-ni tahrirlang va quyidagi kodni qo'shing:

# ... Import .FRESFRES importizatsiyasi def Reys (so'rov): Agar so'ralsa.metod == "post": forma = usereregerform (so'rov.post) Agar forma.is_valid (): Foydalanuvchi = Forma.Save () Xabarlar .Success (so'rov, 'Ilovaga xush kelibsiz,.' format (user.Username)) Qaytishni qaytarish (so'rov, 'foydalanuvchilar / Ro'yxatdan o'tish.html', {forma ': useireverform})
python manage.py makemigrations
python manage.py migrate
... Import

Bu foydalanuvchiga ro'yxatdan o'tgan foydalanuvchi olishimiz kerak, ammo bizda qo'shimcha ma'lumot olishimiz kerak. Biz foydalanuvchi ro'yxatdan o'tgan vaqtni bilishni istaymiz, ular saytda oxirgi marta, ba'zi ma'lumotlar, shuningdek har bir foydalanuvchiga foydalanuvchi modeli va atribut postlarini hisobga olishimiz kerak. Buning uchun biz ikkala ilovada ham modellarni yangilaymiz. Masalani modelini tahrirlash bilan boshlaymiz. Bu hozir ham shunday ko'rinishi kerak:

Django.db import modellaridan # ... Import DJango.contribh.mods import foydalanuvchisini import qiladi Sinf yuborish (modellar.model): ID = modellar.autofild (boshlang'ich_key = haqiqat) Muallif = modellar.fightey (foydalanuvchi, on_delete = modellar.caskad, null = To'g'ri, To'g'ri, tegishli_name = 'posts') # ushbu satrda qo'shing matn = modellar.textfield (standart = '')
    posts = Post.objects.all() # ... Import
Ushbu satrda qo'shing

Faylga qo'shilgan ikkinchi qatorga e'tibor bering. Bu har bir xabarni bitta post uchun yagona foydalanuvchiga bog'laydigan tashqi kalit, shuning uchun biz foydalanuvchiga foydalanuvchiga foydalanuvchiga saqlab qolishimizga ishonch hosil qilishimiz mumkin. Biz ushbu tashqi kalitni ifodalovchi sinf bilan aniqlaymiz, agar kerak bo'lsa, foydalanuvchilarning yo'qligini tekshirish uchun, foydalanuvchilarning yo'qligi, foydalanuvchilarning etishmasligi uchun foydalanib, foydalanuvchi yaratgan joylarga murojaat qilishimiz uchun foydalanadigan narsadan foydalanamiz. Ushbu bog'liq nom, Post.AUTdan farqli o'laroq, post muallifi, postning o'zi ko'rsatilgan foydalanuvchi foydalanuvchiga beradi. Endi biz foydalanuvchi.post.all () yoki muallif.post.all ().

Endi bizning kiruvchilarimizni yanada tezroq qilaylik. Saytga kirishga ruxsat berayotgan vaqtni cheklash uchun biz allaqachon saytimizdan ancha kamroq bizning saytimizni kamroq zaiflashtiramiz, bu biz saytga kirishga ruxsat beramiz, bu juda oson. Bizning ilovamizni rivojlantirishda davom etayotganda har bir foydalanuvchi haqida ba'zi ma'lumotlarni saqlay boshlaylik. Foydalanuvchilar / modellarni tahrirlash.py, quyidagi kod qo'shing.

Django.db import modellari DJango.contribh.mods import foydalanuvchisini import qiladi Django.Unils import vaqtzon Class profili (modellar.model): Foydalanuvchi = Modellar.oneToundefild (foydalanuvchi, on_delete = modellar.caskad, null = haqiqiy, blank = 'profil') hisob_created = modellar.dateetimefild (standart = vaqtzone.Now) oxirgi_seen = modellar.dateetimafild (standart = vaqtzone.Now) can_login = modellar.dateetimafild (standart = vaqtzone.Now) afzal ko'rgan_name = modelfild (maksimal_length = 20, sentult = '' Bio = modellar.textfield (bo'sh = TREDIT, SFADD = '')

E'tibor bering, ushbu model pochta modeliga o'xshash. Bizda qo'shimcha import, vaqt zonasi mavjud, bu bizga ma'lumotlar uchun standart maydonlar o'rnatishga imkon beradi va bizda post kabi xarakterli va matn maydonchasiga egamiz. Ushbu vaqt jadvalidan foydalanish biz saytni xavfsizligini ta'minlash va uning foydalanishini tushunishga yordam beradi va matn maydonchalari veb-saytda yoki muallif haqida ma'lumot berishga yordam beradi. OnetuneFildeld faqat ahamiyatsiz ko'rib chiqilishi kerak, u avvalgilar bilan bir xil, ammo keyingi model uchun faqat bittasi bilan. Shu tarzda, foydalanuvchi faqat bitta profilga ega, ularda ko'plab xabarlar bo'lishi mumkin.
mkdir feed/templates
mkdir feed/templates/feed
Endi bizning kirishimizni yaxshilaylik va profil uchun hisob qaydnomasini ro'yxatdan o'tkazing. Birinchidan, foydalanuvchilarga / Views.py-ni tahrirlash va ro'yxatdan o'tish haqida o'ylash:

# ... Import .FRESFRES importizatsiyasi def Reys (so'rov): Agar so'ralsa.metod == "post": forma = usereregerform (so'rov.post) Agar forma.is_valid (): Foydalanuvchi = Forma.Save () Profil.Batce.Create (foydalanuvchi = foydalanuvchi) # foydalanuvchining profilini yaratish uchun ushbu liniyani qo'shganingizga ishonch hosil qiling Xabarlar .Success (so'rov, 'Ilovaga xush kelibsiz,.' format (user.Username)) Qaytishni qaytarish (so'rov, 'foydalanuvchilar / Ro'yxatdan o'tish.html', {forma ': useireverform})

... Import
Foydalanuvchi uchun profil yaratish uchun ushbu liniyani qo'shganingizga ishonch hosil qiling

Bu shunchaki foydalanuvchi uchun profilni yaratadi, hech qanday ma'lumotni to'ldirmasdan. Endi biz foydalanuvchi hisobi tez-tez tizimga kirib bo'lmasligi yoki hech bo'lmaganda parollarni tez-tez sinab ko'rish mumkinligiga ishonch hosil qilmoqchimiz, shuning uchun kirish ko'rinishini yangilaylik.

# ... Import .Models import profilidan Django.Unils import vaqtzon Import ma'lumotlar muddati Kirish (so'rov): Agar so'ralsa.metod == "post": Foydalanuvchi nomi = so'rov. "Foydalanuvchi nomi"] Parol = so'rov. "parol"] Foydalanuvchi = haqiqiyligini tekshirish (Foydalanuvchi nomi = Foydalanuvchi ismi, parol = parol) Agar foydalanuvchi va foydalanuvchi.profile.cro_login <vaqtzon <wnzone.Now (): Men hozir foydalanuvchini tizimga kira oladigan tekshirib turamiz auth_login (so'rov, foydalanuvchi, backend = 'Django.ctrtribh.backend.Modelbababackend') Xabarlar .Success (so'rov, 'Sizning parolingiz qabul qilindi. Iltimos, davom eting.'). ' Qaytishni qayta yo'naltirish (teskari ('Ozuqa: yemi'))) HOT: # agar kirish muvaffaqiyatli emas bo'lsa, Xabarlar.Warning (so'rov, 'foydalanuvchi nomi yoki parol noto'g'ri. Iltimos, yana urinib ko'ring.') Foydalanuvchi = User.Obevts.filter (foydalanuvchi nomi = Foydalanuvchi) .Birst () # bu biz foydalanuvchilar profilini yangilagan qism Agar foydalanuvchi bo'lsa: Profil = User.profile profil.can_login = vaqtzone.Now () + DateTime.Timedelta (soniya = 15) # ular bir necha soniya davomida yana kira olmaydilar profil.Savsi () Qaytishni qaytarish (so'rov, 'foydalanuvchilar / login.html', {shakl ': autentifikatsionform ()})
python manage.py shell
... Import

E'tibor bering, biz foydalanuvchi tizimga kira oladiganligini tekshiramiz

Agar tizim muvaffaqiyatli bo'lmasa,
from feed.models import Post
Bu biz foydalanuvchilar profilini yangilagan qism

Shuning uchun ular yana bir necha soniya davomida tizimga kira olmaydilar

Bu xavfsizlikning asosiy fundamentalidir. Sayt, har qanday mumkin bo'lgan parol kombinatsiyasini yoki bir vaqtning o'zida ulardan bir nechtasini sinab ko'rishga ishonch hosil qiling. Bu ularning parollarini biladigan va shunchaki bir nechta qurilmalarda jurnallarni biladigan oddiy foydalanuvchiga asabiylashtirmaydi, ammo u juda ko'p fangi robotlarini ilovadan tashqarida saqlaydi. E'tibor bering, biz o'zgaruvchini qo'shgan bo'lsak, u o'tmishda vaqt bo'lishi kerak va bir xil foydalanuvchi nomi yordamida uni har bir muvaffaqiyatsiz kirish bilan yangilang. Shu tarzda, zararli foydalanuvchi tezda yaqin joyda parolni taxmin qila olmaydi. Datadagi soniyalar soni .Timeedelta () yangilanishi mumkin va veb-sayt ko'proq soniyadan biroz kamroq foydalanilishi mumkin. Men boshlash uchun 15 ni tavsiya qilaman.
Post.objects.create(text='hello world')
exit()
Yodingizda bo'lsin, biz o'z ishimizni tejash uchun zaxira yozuvini qurdik, shuning uchun hamma narsa saqlanib qolganligimizga amin bo'lishimiz uchun oldinga va zaxira qilinamiz. Buyruqni bajaring:

sudo zaxiralash

Yana bir bor, bu sizning ishingizni hozirgacha saqlab qoladi. Ishingizni tejash uchun tez-tez zaxira nusxalarini tavsiya qilaman va siz hatto avtomatik ravishda zaxira ishini bajarishni xohlashingiz mumkin. Siz buni Kron deb nomlangan UNICT yordam dasturidan foydalanishingiz mumkin. Ushbu yordam dasturini faollashtirish uchun quyidagi buyruqni bajaring va parolingizni kiriting:
from django.urls import path
from . import views

urlpatterns = [
    path('', views.feed, name='feed'),
]
sudo contonb -

Agar siz Nano uchun 1-variantni tanlamagan bo'lsangiz, siz allaqachon tanish bo'lishingiz kerak va o'q tugmachalaridan foydalanib faylning pastki qismiga o'ting. Quyidagi qatorni qo'shing:

0 * * * Su kamno
from django.urls import include # Cron Form Form, Soat, Oy, Oy, Oy, Haftabr kunida, A * yoki raqam qachon buyruqni bajaradigan vaqtni anglatadi. Bir daqiqada 0 dan foydalanish va qolgan variantlar uchun biz daqiqaning boshida har soatning birinchi daqiqasida buyruqni ishlatishimiz mumkin. Bu bizga kodni avtomatik ravishda zaxiralashga imkon beradi. Sudo bilan birga qatl etilganda, butun kronning ishi ildiz sifatida ishlaydi, shuning uchun har soatda parolni kiritishimiz shart emas.
    # Parolni ishlatmasdan bizning kodimizni zaxira qilish osonroq bo'lish uchun, bizning zaxira buyrug'i uchun parolni o'chirib qo'yaylik. Biz buni quyidagi buyruqni bajarish va parol kiritish orqali qilamiz:
sudo vizusa

Endi, keling faylning pastki qismiga o'ting va boshqa qatorni qo'shamiz:

Hammasi = Nopasswd: / Bin / zaxira nusxasi
backup
Bu bizga parolsiz "zaxira nusxasi" buyrug'ini ishga tushirishga imkon beradi. Bu uchun format oson, shunchaki "barcha = Neopasswd: / Bin /" ga ega va buyruq bilan tugaydi / masalan / USR / ibn

Endi elektron pochta bilan ishlay boshlaylik. Elektron pochta saytlar uchun haqiqatan ham muhim, chunki bu veb-saytni xavfsiz saqlash usuli, foydalanuvchilarning haqiqiy odamlar, hatto mijozlarga ham bozor mahsulotlari yoki xizmatlarini tekshirish usuli. Internetda har kuni elektron pochta xabarlarini tekshiradigan va ular qiziqtirgan mahsulotlar va xizmatlarga ega bo'lgan turli xil elektron pochta xabarlarini tez-tez tekshirib turishadi va siz uchun eng yaxshi ishlarni bajarish uchun xush kelibsiz.

Birinchidan, siz domeningizdan elektron pochta xabarlarini yuborishingiz va minimal kodni talab qiladigan elektron pochta xizmati uchun to'lovni to'lashingiz mumkin. Google ish maydonchasi, yuboruvchi, pochtagun va boshqalar kabi xizmat mavjud.
    posts = Post.objects.all() # Aks holda, siz o'zingizning serveringizda sizning serveringizda noldan qur etasiz. Men bu variantni tavsiya qilaman, garchi u ko'proq kod bo'lsa va maxsus xostingni talab qilishi mumkin. Siz uy kompyuteringizdan pochta serverini ishga tushira olmaysiz, shuning uchun keling, biz Serverni yuborish uchun serverni ishga tushirish va ichkarida o'z pochta serverini yaratish uchun elektron pochta xabarini yuborish uchun.
    if request.method == 'POST': # Birinchidan, quyidagi buyruq bilan sozlamalar.py-ni tahrirlash:
        form = PostForm(request.POST) # nano ilova / sozlamalari.py
        if form.is_valid(): # Bu erda siz StartApp-da yaratgan ilovaning nomi bo'lgan joyda.
            form.save() # Quyidagi satrlarni qo'shing:
        return redirect(reverse('feed:feed')) # Sayt_name = 'Django App'

Elektron pochta_ackend = 'django.core.mail.smp.emailbapend'
Elektron pochta_host = 'llogist'
Elektron pochta_port = 587
Elektron pochta_use_tls = haqiqat
Elektron pochta_adDress = username@server.com ''
Elektron pochta_host_user = 'Foydalanuvchi nomi'
Elektron pochta_host_password = konfiguratsiya ['elektron pochta_host_postword']
Decault_fro_email = '{{{{{{{{{{{{{}>'. Format (sayt_name, emad_host_user)
        'form': PostForm(), # Ilovangizni joylashtirishga tayyor bo'lganingizda, ularni qayta ko'rib chiqishga tayyor ekanligingizga ishonch hosil qiling, biz keyinroq qayta ko'rib chiqamiz. Elektron pochta_ADDDRESS sozlamasi siz yubormoqchi bo'lgan elektron pochta va parol (elektron pochta_host_prassword) Server uchun yaratilgan parolga o'rnatilishi kerak. Men parolni konfiguratsiya faylidan yuklash uchun uni quyidagi mantiqdan foydalanib, quyidagi chiziqlar Sozlamalar.py-dagi katalogdan foydalanib yuklayman
Import OS Import JSON Config_file sifatida ochiq ('/ h.ks / config.json') bilan): Config = JSON.OL (Config_file)

Keyin, men Nano-dan foydalanib Nano-dan foydalanib, men /etc/config.json bilan JSON faylini o'rnatdim.

Faylni tahrirlash uchun:

sudo nano /etc/onfig.json
Quyidagi satrlarni qo'shing:

{ "Elektron pochta_host_prassword": "" }

Biz konfigur faylini tahrirlashni davom ettiramiz va ilovada foydalanadigan barcha parol va tugmachalarni qo'shamiz. Endi piton yordamida elektron pochta xabarini qanday yuborishni tezda ko'rib chiqaylik. Birinchidan, tekshirish elektron pochtasini biz foydalanuvchilarimizga yuborishimiz va uni foydalanuvchi shablonlar katalogiga qo'yishimiz mumkin. Ushbu shablon HTML-da yoziladi.

NANO foydalanuvchilari / Andoza / foydalanuvchilar / Tekshirish_eil.html

Django App - elektron pochtangizni tasdiqlang Hurmatli {{User.Username}}, Elektron pochtangizni tekshirish uchun bu erni bosing. Shu bilan bir qatorda, siz brauzeringizning manzillar panelidagi quyidagi havolani joylashtirishingiz mumkin: {{BAD_URL}} {% URL URL 'Foydalanuvchilar:' Uidb64 = UID token = tokenni faollashtirish Havola 30 daqiqada tugaydi. Agar siz tasdiqlash elektron pochtasini so'ramagan bo'lsangiz, shunchaki ushbu elektron pochta xabarini e'tiborsiz qoldirishingiz mumkin. U erda ko'rishguncha, Peshana

Ushbu elektron pochta juda oddiy. Foydalanuvchi, saytning asosiy URL manzili va foydalanuvchi elektron pochtasini tekshirish uchun ishlatiladigan foydalanuvchi identifikatori va tokenni oladi. Sozlamalardagi asosiy URL-ni belgilashingizga ishonch hosil qiling. Shablonni berish uchun piton kodini yozishdan oldin. Oldinga boring va App / Sozlamalar.PY-ga quyidagi satrlarni qo'shing, boshida.Sayt_name = 'Django App' Protocol = 'https' Domen = 'Misol.com' Bas_url = protokoli + ': //' + domenOxir-oqibat, saytingiz Internetga tayyor bo'lganda va uni joylashtirganingizda, siz saytni taqdim etish uchun sotib olgan domen nomini aniqlashni xohlaysiz. Bu sizning saytingizga kirish uchun Navbarda yozadigan ism. Endi siz domenni bo'sh qoldirishingiz yoki to'ldiruvchidan foydalanishingiz mumkin. Shuningdek, siz saytingizni tanlagan nomingizga Saytingizni o'zgartirishni xohlagan ismingizni o'zgartirishni xohlaysiz.

Elektron pochtani yuborishdan oldin, keling, hisobni faollashtirish uchun hisobni ochishimiz mumkin. Biz buni amalga oshirish va olib kirish orqali biz quyidagilarga o'xshaydi. Faylni tahrirlash:

nano foydalanuvchilari / tokens.py

Quyidagi kodni qo'shing:

django.contribh.tokens.tokrennenerator importini import qiladi olti import Class Tokengerator (parolseetteritobsuener): Def _Make_hash_valuu (O'z-o'zini, foydalanuvchi, Vaqtomp): qaytish ( oltit.text_type (user.pk) + olti.text_type (vaqt jadval) ) Hisob_Taktive_tokicen = tokengenator () obuna_tokok = tokengenerator ()

Ushbu asosiy token generator belgisini yaratadi, u foydalanuvchiga URL manziliga yuboramiz va foydalanuvchi o'z elektron pochtasini tekshirish va ularning hisobini faollashtirish uchun foydalanishi mumkin.
Keyingi, keling, elektron pochta xabarini qanday yuborish kerakligini ko'rib chiqaylik. Nano-dan foydalanib, foydalanuvchilarga / Email.py-ni tahrirlang.

Nano foydalanuvchilari / Email.py

HTML elektron pochtasini yuborish quyidagicha ko'rinadi:

Django.contribh.Aute Imple_user_model Django.Unils.hTtP import Urlife_base64_ennode, urlsafe_base64_decode django.contribh.Sits.shortcuts import get_current_site Django.Core.mail import Send_mail Django.Talece.Onloader import riter_to_string Django.Ulils. Import Crek_byts Django.Core.maileme import elektron pochta xabarlari Django.shortcuts import javob beradi .Tokiens-ning importi hisob qaydnomasi_Aciviation_: Django.Talece.Onloader import riter_to_string Django.ULils.html import strip_tags Django-dan import shablon, kontekst DJango.Conf import sozlamalaridan Import pritsepti Defni yuborish_email (foydalanuvchi): Foydalanuvchi = Con_user_model () Mail_SUnevt = '[{}] hisobingizni faollashtiring.' Format (sozlamalar.Site_name) html_messge = render_to_string ('Foydalanuvchilar / Tekshirish_email.html', 'Foydalanuvchi': Foydalanuvchi, "Domen": Sozlamalar, "Protokol": "https", 'UID': UrLSAFe_base64_ense-kod (Maktub_bites (User.pk)), "token": hisob qaydnoma_Tacookativate_tokoke_token_TOPEN_TOPEN_TOPOINE (foydalanuvchi), }) Yubor_html_email (foydalanuvchi, mail_suff, HTML_MSAGE)

Bu juda oddiy. Biz elektron pochtani yuborishimiz uchun biz elektron pochta xabarlarini yuborishimiz, shablonlar va sozlamalarimiz bilan elektron pochta xabarini taqdim etishimiz va uni funktsiya yordamida foydalanuvchiga yuborishimiz kerak. Pochta xabarini yuborish uchun biz funktsiyani aniqlay olmaymiz, iltimos, yuborish_html_email, lekin keling, biz foydalanadigan kodni yozamiz / Email.py-ni kiriting
pip install django-crispy-forms
def yuborish_html_email (foydalanuvchi, Mail_SUnevt, HTML_MESAGE): to_email = foydalanuvchi.email Foydalanuvchi nomi = user.username Agar_email == '' Agar: Qaytishni qaytarmang FountUn_link = Sozlamalar.Bas_url + user.profile.crofile.Create_unsubs'Crece_unsubs'ce_link () html_messge = html_message + "Obunani bekor qilish" msg = elektron pochta manzillari, priptr_tags (HTML_MSAGE), Sozlamalar.Dul_FROMEELELE, sarlavha = {{{compheunce ':' <'+ omadsiz_link +'>},) msg.ThatT_alterativ (HTML_MESAGE, "Matn / HTML") Profil = User.profile Bir marta sinab ko'ring: msg.Send (muvaffaqiyatsiz_silli = yolg'on) Agar profil.email_valid bo'lmasa: profil.email_valid = haqiqat profil.Savsi () Madan tashqari: profil.email_valid = yolg'on profil.Savsi ()

Bu biroz murakkab va biz hali ushbu kodni boshqarishga tayyor emasmiz. E'tibor bering, biz omadsiz_linkni aniqlaymiz, foydalanuvchi elektron pochta orqali obunani bekor qilish uchun foydalanishi mumkin. Bu juda muhim, chunki ular istagan paytda ularni ko'rishni istamasalar, elektron pochtamizdan voz kechishlari kerak. Shuningdek, biz HTML teglari bilan to'ldirilgan HTML xabarlari haqidagi xabarimizga matn qo'shamiz. Nihoyat, biz elektron pochta xabarini yuborganligini tekshiramiz va agar u bo'lmasa, biz ularning elektron pochtasi haqiqiy emasligini tekshiramiz.

Keling, foydalanuvchi modellariga qaytib boraylik, shunda biz bu ishni amalga oshirishimiz mumkin. Obunani bekor qilish uchun havolani yaratish uchun funktsiyani aniqlashimiz kerak va foydalanuvchi elektron pochtasi haqiqiy emasligini belgilash uchun Boolean maydonini aniqlang.
    # Birinchidan, foydalanuvchi / modellarning yuqori qismiga quyidagi import qo'shing
nano foydalanuvchilari / modellari.py

# ... Django.Core-dan TimespampSign, badyazlar, imzo DJango.urls import teskari

...
Keyingi, keling, foydalanuvchi modelini qo'shish va elektron pochta xabarini faollashtirish uchun, shuningdek, foydalanuvchi o'zlarining pochta xabarlarini muvaffaqiyatli qabul qilmaganligini saqlash uchun foydalanuvchi modeliga amal qiladi. Foydalanuvchi / modellarda.py yana model oxirida quyidagi kodni qo'shing

# ... Elektron pochta_Valid = modellar.bolaningfild (standart = haqiqat) def letter_tooken (o'zini): vaqt jadvalini qaytaring (). Belgilangan (o'z-o'zidan) def tekshiruvi_tooken (o'zini, token): Bir marta sinab ko'ring: Kalit = '% s:% s% (o'z-o'zidan sel.usser.username, token) Vaqt vaqti (). Ishonch (kalit, max_agge = 60 * 60 * 30 * 30 * 30 *) # 30 kun davomida amal qiladi bundan mustasno (yomonlik, imzo, imzo): Qaytish noto'g'ri TRUE ni qaytaring Defni yaratish_unsubs_link (o'zini): Foydalanuvchi nomi, token = o'zini o'zi boshqarish.Mooken_TOPEN (). Split (":", 1) Qaytish teskari ('Foydalanuvchilar: Obunani bekor qilish', kwargs = {'Foydalanuvchi nomi: foydalanuvchi nomi, "token": token,})

...

30 kun davomida amal qiladi

Bu juda oddiy, biz asosiy kriptografiya vositasidan foydalanamiz, bu ma'lum bir vaqtdan keyin tugaydigan tokenni yaratish uchun va biz boshqa funktsiyani ishlatish uchun boshqa funktsiyadan foydalanamiz. Biz ushbu tokenlardan ikki marta, bir marta elektron pochta xabarini tekshirish uchun va birlashtirilgan havola uchun bir marta ishlatamiz.

Endi bizda bor, biz qilishimiz kerak bo'lgan ishning oxiri - bu qarashlarda. Foydalanuvchilar / Views.Py, keling, elektron pochta manzilini tekshirish va obunani bekor qilish uchun qarashlarni qo'shamiz.

Nano foydalanuvchilari / Views.py
python manage.py startapp users
Birinchidan, quyidagi importni qo'shing. Bir necha qo'shimcha bir necha marta tashladim, shuning uchun keyinroq yana narsalarni olib kirishimiz shart emas.

Django.contribh.Aute Impeut log Django.shortcuts-dan import riter, qayta yo'naltirish, get_obje_or_or_404 DJango.contribh.mods import foydalanuvchisini import qiladi Django.Ulils.str import kuchlari_stridan Django.Unils.hTtP import Urlife_base64_ennode, urlsafe_base64_decode Import JSON Import so'rovlari Importim, Trakback DJango.Contribe import xabarlaridan .Models import profilidan Django.Unils import vaqtzon Django.View.decoror.cecoror.cache import hech qachon importi_cache .Email import Send_versifikatsiya_email # Tasdiqlash elektron pochta orqali yuborish funktsiyasini import qilishiga ishonch hosil qiling Django.contrrib.Aute.decorors import login loginligi Django.contribh.Ath.mxins import loginreinminminmixin, foydalanuvchisassestestmixin import Django.Ul.decorator import usuli_dekorator Django.HTTP importida import qilish DJango.Conf import sozlamalaridan Django.Unils import vaqtzon Import ma'lumotlar muddati Import pitz Django.VIIj.Dekorators.dcororator.csRF import CSRF_ECTISE import Django.HTTP importida Import httpostonse Django.contribh.tokens import_tokoken_generator Django.ULils.HTTP import Urliffe_base64_Code .Tokiens-ning importi hisob qaydnomasi_Aciviation_:

Elektron pochta orqali yuborish funktsiyasini import qilishga ishonch hosil qiling

Sizda ushbu immidlarning ba'zilari bo'lishi mumkin, ammo ularni takrorlash uchun zarar etkazmaydi. Siz boshqa importdan foydalanuvchilar tomonidan tasdiqlangan elektron pochta xabarlarini yuborish, shuningdek hisob qaydnomasi_Actione_tlinene-ni import qilishingiz kerak.

Endi, faylning pastki qismida quyidagi kod qo'shing:

Obunani bekor qilish (so'rov, foydalanuvchi nomi, token): Foydalanuvchi = get_obje_or_404 (foydalanuvchi, foydalanuvchi nomi = Foydalanuvchi ismi) Agar ((so'rov.user.is_is_is_user == foydalanuvchi) yoki foydalanuvchi.profile.check_tooken (token))): # ularni bekor qiling Profil = User.profile profil.Subsoned = noto'g'ri profil.Savsi () Qaytishni qaytaring (so'rov, 'foydalanuvchi / Obunani bekor qilish.html') # Kirish sahifasiga boshqacha yo'naltirish Xabarlar .Warning (so'rov, f'yure nurini bekor qilish havolasi muddati tugadi. Iltimos, obunani bekor qilish uchun tizimga kiring. ') Keyingi_url = teskari = 'Foydalanuvchi: Obunani bekor qilish', kwargs = {'Foydalanuvchi nomi: Foydalanuvchi nomi: token,}) Deptrofect ('% s? Keyingi =% s% ni qaytaring (' login ''), Keyingi_url)) Dis faolligi (so'rov, Uidb64, token): Bir marta sinab ko'ring: UID = Forc_str (UrLSAFe_base64_Decode (Uidb64)) Foydalanuvchi = User.Obevts.getsets.getset (pk = uid) bundan mustasno (tipik tipik, erilayotgan, haddan tashqari yuqori, foydalanuvchi.doesnotegist): Foydalanuvchi = None IP = Clec_Cient_IP (so'rov) Agar foydalanuvchi hech kim bo'lmasa va hisob qaydnomasi_TACOCtion_check_TOPEN_TENGE (foydalanuvchi token): foydalanuvchi.profile.email_verifed = haqiqat Foydalanuvchi.Profile.Savsi () Foydalanuvchi.Save () # Yanlovni yuborish (so'rov, foydalanuvchi) Xabarlar .Success (so'rov, fohkanlar, elektron pochtangizni tasdiqlash uchun! Siz endi sizning hisobingizga kira olasiz va sizga xush kelibsiz elektron pochta xabarlari yuborildi. ').' Qaytishni qayta yo'naltirish (user.profile.crofile_face_url ()) boshqa: Xabarlar .Success (so'rov, foviy faollashtirish havolasi muddati tugadi. Iltimos, yangi ulanish havolasini so'rang. ').' Qayta yo'naltirish ('tekshiring: tekshiring') Refend_aktive (so'rov): Agar so'ralsa.metod == 'post': Forma = ReseendActionemailform (so'rov.post) Elektron pochta = so'rov. "Elektron pochta"] Bir marta sinab ko'ring: Foydalanuvchi = User.Obevts.getsets.get (elektron pochta = elektron pochta) Send_versifikatsiya_email (foydalanuvchi) Xabarlar .Success (so'rov, 'versiya elektron pochtangizni yubordi. Iltimos, hisobingizni tekshirish uchun elektron pochtangizdagi havolani bosing.') Qayta yo'naltirish (teskari ('ni tekshiring: tekshiring'))) Madan tashqari: Xabarlar .Warning (so'rov, f'yur elektron pochtasi to'g'ri emas. Iltimos, yana urinib ko'ring. ') boshqa: forma = Resentavatsiyemailform () Qaytishni qaytarish (so'rov, 'foydalanuvchilar / rezy.aktion.html', {form: 'Sartiblanish', 'Kichkina')

ularni bekor qiling
        username = request.POST['username'] # Aks holda kirish sahifasiga yo'naltirish
        password = request.POST['password'] # Yanlovni yuborish (so'rov, foydalanuvchi)
Bu juda ko'p kod. Keling, uni buzaylik. Birinchi funktsiya, toza va sodda, foydalanuvchi tomonidan pochta ro'yxatidan bekor qilinadi. Ikkinchi funktsiya ularning elektron pochtasini faollashtiradi va siz sharhlangan funktsiyani qo'shganimni sezasiz, yuboraman. Sizga elektron pochta xabarlari va funktsiyalarni kutib olish uchun elektron pochta xabarini va Funktsiyalarni qabul qilish uchun siz shunchaki hali yo'q. Men tashlagan oxirgi funktsiya muhimdir, chunki faollashtirish muddati tugaydi. Shuning uchun biz bir necha vaqt davomida faollikni qayta yuborishimiz kerak. Biz buning uchun asosiy shakldan foydalanishimiz va tasdiqlash elektron pochtasini yuborish uchun funktsiyani chaqiramiz. Buni amalga oshirishdan oldin, birinchi navbatda, rejissyon ko'rinishini qo'shib, birinchi navbatda yuborilishiga ishonch hosil qilaylik. Ushbu liniyani ro'yxatdan o'tganlik, Def Reestrda, foydalanuvchi / Views.py-da qayta yo'naltirishdan oldin qo'shing.

Nano foydalanuvchilari / Views.py

# ... (keyin) def Reysent (so'rov): Send_versifikatsiya_email (foydalanuvchi) # ... (oldin) yo'naltirish (
mkdir users/templates
mkdir users/templates/users
... (keyin) def Reysent (so'rov):

... (oldin) yo'naltirish (

Siz ushbu Kodoriy parchalanishda birinchi va oxirgi satrlarni qo'shishingiz shart emas, shunchaki ro'yxatdan o'tish elektron pochtasini foydalanuvchiga yuboradiligiga ishonch hosil qiling. Bu shunday ko'rinishi kerak:
nano users/templates/users/login.html
# ... Import .FRESFRES importizatsiyasi def Reys (so'rov): Agar so'ralsa.metod == "post": forma = usereregerform (so'rov.post) Agar forma.is_valid (): Foydalanuvchi = Forma.Save () Send_versifikatsiya_email (foydalanuvchi) # ushbu chiziqni qo'shganingizga ishonch hosil qiling! Xabarlar .Success (so'rov, 'Ilovaga xush kelibsiz,.' format (user.Username)) Qaytishni qaytarish (so'rov, 'foydalanuvchilar / Ro'yxatdan o'tish.html', {forma ': useireverform})

... Import

Ushbu chiziqni qo'shganingizga ishonch hosil qiling!
Endi faollashtirish elektron pochtasini qayta yuborish uchun formani qo'shishimiz kerak. Foydalanuvchi / shakllarda.py, quyidagi shaklni qo'shing:

# ... (import) Sinf rezenciviviationForform (forcents.form): Elektron pochta = shakllari.emailfield (talab qilinadi = to'g'ri)

... (import)
Shuningdek, biz ushbu rezervlar faollashtirish shakliga mos shablon kerak bo'ladi. Keling, ushbu shablonni qo'shamiz. Faylni tahrirlash:

NANO foydalanuvchilari / Andoza / Foydalanuvchilar / Resend_akation.html

Keyin faylga quyidagi kod qo'shing.
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']
{% 'baza.html'%} {% Qoplangan tarkib%} {% yuk crisy_forms_tags%} {% CSRF_TENEN%} Qayta ishlash elektron pochtasi {{shakl | Crispy}} Qayta ishlash elektron pochtasi {% entblock%}

Veb, bu juda ko'p! Endi, biz kodni bizning serverimizga joylashtirganimizda HTML elektron pochtasini yuborish va foydalanuvchi hisoblarini elektron pochtada bosish bilan faollashtirishimiz mumkin. Shuningdek, biz oddiy kutib olish elektron pochtasini yuborishni xohlashimiz mumkin, shuning uchun buni qanday qilishni ko'rib chiqaylik. Foydalanuvchilarga / Email.py-ga qaytib, quyidagi kodni qo'shing:

YuborishOweLeemail (foydalanuvchi): Foydalanuvchi = Con_user_model () HTML = Ochiq ('{{} / foydalanuvchilar / xush kelibsiz.html'.format (sozlamalar.Bas_DIR)). O'qish () Mavzu = '' + Sozlamalar.Site_name + ', {Ismi}}! Andoza = shablon (HTML) SubJhayby = shablon (mavzu) Kontekst = kontekst ({{'{{' Foydalanuvchi nomi): Sozlamalar.Bas_Ulame ',' Model_name ':' Sayt_name ': Sozlama.Site_name}) RendpediteSting = shablon.render (kontekst) subjcontext = kontekst ({'Foydalanuvchi nomi': foydalanuvchi.username}) subjrendeThemate = subujaybe.render (subjcontext) Yubor_html_email (foydalanuvchi, subjrendfede, ko'rsatma

Bundan tashqari, biz ushbu ma'lumotlarning barchasini ko'rsatish uchun shablon kerak bo'ladi. Veb-saytimda shablon quyidagiga o'xshaydi, ammo siz uni yoqtirasiz, siz uni yoqtirasiz.

{{Sayt_name}} ga xush kelibsiz Salom {{Foydalanuvchi nomi}}, Sizni bu erda ko'rganingizdan xursandmiz! {{Sayt_name}} qo'shilganingiz va o'yin-kulgining bir qismi bo'lganingiz uchun tashakkur. Boshlash uchun, bu sizning shaxsingizni tasdiqlaganingizdan so'ng, siz qila oladigan bir nechta narsalar. Ilovadan foydalaning. Bu {{sayt_name}} ning asosiy sahifasi Mening shaxsiy {{sayt_name}} profilimga tashrif buyuring. Bu men bilan tanishishni istagan har bir sahifaning sahifasi. Ko'proq profillar. Siz bu odamlarni saytda topishingiz va ularning tarkibini ko'rishingiz mumkin. Bu erda barcha xabarlarni ko'ring. Bu {{sayt_name}} ning shaxsiy old sahifasidir. Saytda yanada ko'proq narsa bor, shuning uchun o'zingiz tashrif buyurib, nima topganingizni ko'ring. Siz saytni har bir sahifada ijtimoiy tugmachalar bilan baham ko'rishingiz mumkin. Umid qilamanki, siz {{sayt_name}} bilan vaqtingiz sizga yoqadi! Bu erda bo'lganingiz uchun rahmat. Ko'p muhabbat bilan, {{model_name}} {{baza_url}}
# E'tibor bering, bizda tana yoki html teglari yo'q, chunki biz HTMLni bekor qilish havolasini qo'shganimizda qo'shamiz. Bular juda muhim, ammo biz ularni ikki marta aniqlamoqchi emasmiz.
Keyin nima? Biz uzoq yo'lni bosib o'tdik. Darhaqiqat, biz saytni serverga joylashtiramiz. @Login_requequired dekorativini qo'shamiz va bizning qarashlarimizni xavfsiz qilib qo'yamiz, foydalanuvchi ro'yxatdan o'ting, elektron pochta xabarlarini yuboring, bu veb-saytga tegishli bo'lish uchun nima qilish kerakligi kerak bo'lgan joyning asosidir. Biz yana bir nechta foydali xususiyatlarni qo'shamiz va o'z kodini uzoq serverga joylashtirish uchun, pochta serveri, domen konfiguratsiyasi va filtrlarni saytimizni xavfsiz va mos keltirish uchun asos yaratamiz.

Shuningdek, biz parolni tiklash ko'rinishi kerak bo'ladi, shuning uchun buni tezda qo'shamiz. Django parolni tiklash ko'rinishi ba'zi funktsiyalarda buzilgan, ammo biz o'z nuqtai nazarimizni, elektron pochta shablonini, shakllarini va url shakllarini qanday yozishni ko'rib chiqamiz. Mana, foydalanuvchi / tomoshalarda ko'rinishi nimaga o'xshaydi

# ... Import Django.contribh.tokens import_tokoken_generator Django.contribh.AwRforms import Conpasswordform Django.ULils.HTTP import Urliffe_base64_Code parol parol_retet (so'rov, Uidb64, token): Foydalanuvchi = get_obje_or_404 (foydalanuvchi, ID = UrlSAFe_base64_Decode (UIDB64))) Agar so'ralsa.metod == 'post': Forma = Seatpasswordform (foydalanuvchi, so'rov) Agar forma.is_valid () va decault_tlow_genorator.check_tenoken (foydalanuvchi token): Forma.Savsi () Xabarlar .Success (so'rov, 'parolingizni qayta o'rnatilgan.') Elif emas, balki forma.is_valid (): Xabarlar.warning (so'rov, 'Sizning parollaringiz mos kelmaydi yoki talablarga javob bermaydi. Iltimos, qayta urinib ko'ring.') Qaytishni qayta yo'naltirish (so'rov .Path) boshqa: Xabarlar.warning (so'rov, 'parolingizni tiklash havolasi tugadi. Iltimos, yangisini yarating.') Qaytishni qayta yo'naltirish (teskari ('Foydalanuvchilar: login'))) Qaytish (so'rov, 'foydalanuvchilar / parol_rreet_onfatur.html', 'Sarlavha': 'Parolingizni asl holatiga qaytaring', "Forma": Setpasswordform (foydalanuvchi)
from django.db import models # ... Import
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Ushbu shakl Django-ga o'rnatilgan, ammo parolni tiklash, foydalanuvchilar / Andoza / foydalanuvchi / parol_retet_confurer.html
{% 'baza.html'%} {% yuk crisy_forms_tags%} {% Qoplangan tarkib%} {% CSRF_TENEN%} Parolni tiklash {{shakl | Crispy}} Parolni tiklash {% entblock tarkibi%}

Shuningdek, bizda parolni tiklash elektron pochta xabarini, oddiy shaklda, foydalanuvchilar / shablonlar / foydalanuvchilar / parol_rreet.html

{% 'baza.html'%} {% yuk crisy_forms_tags%} {% Qoplangan tarkib%} {% CSRF_TENEN%} Parolni tiklash {{shakl | Crispy}} Parolni qayta tiklash so'rovi {% entblock tarkibi%}

Elektron pochtaning o'zi uchun shablon oddiy, bu parolni tiklash uchun, foydalanuvchilar / shablonlar / foydalanuvchilar / parol / parol_rreet_eil.html. Django ushbu faylni avtomatik ravishda sharhlaydi.

ULGK - Parolingizni tiklash Salom, Parolingizni tiklash uchun, iltimos, shu erni bosing. Shu bilan bir qatorda, siz brauzeringizga quyidagi havolani joylashtirishingiz mumkin: https://uglek.com {% URL 'Wick_RET_CONFRME' Uidb64 = UID token = tokeni%} Agar siz parolni tiklashni so'ramagan bo'lsangiz, shunchaki ushbu elektron pochta xabarini e'tiborsiz qoldirishingiz mumkin. Bizga qo'shilganingiz uchun tashakkur, Peshana
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='')
Bundan tashqari, biz yana ikkita shablonlar kerak. Birinchisi, elektron pochta xabari yuborilganligini tasdiqlash. Bular uchun qarashlar allaqachon Django shahrida, shuning uchun biz ularni faqat URLSPY-da hal qilishimiz kerak. Ushbu shablon foydalanuvchilar / shablonlar / foydalanuvchilar / parol_rreet_done.html

{% 'baza.html'%} {% Qoplangan tarkib%} Parolingizni tiklash uchun elektron pochta xabarlari yuborildi. {% entblock tarkibi%}

Va nihoyat, parolni tiklash tugallanganligini tasdiqlash uchun foydalanuvchilar / Andoza / foydalanuvchilar / parol_rreet_complete.html

{% 'baza.html'%} {% Qoplangan tarkib%} Sizning parolingiz o'rnatildi. Bu erda tizimga kiring {% entblock tarkibi%}

Endi bizda bu qarashlar uchun URL-ning URL-ning paydo bo'lishi kerak. Foydalanuvchilar / URLS.PY-da quyidagi URL shakllarini qo'shing:
# Urlpatterns = [
    # ... Bu erda oldingi URL manzillar
    yo'l ('parolni tiklash /',
         auth_vew.passwresetvew.as_view (
             temle_name = 'Foydalanuvchilar / parol_rreet.html',
             HTML_EMAIL_TACEME_NAME = 'Foydalanuvchilar / parol_reet_email.html'
         ),
         Ism = 'parol_rreet'),
    yo'l ('parolni tiklash / tugatish /',
         auth_views.ppasseTrhoneView.as_view (
             temle_name = 'Foydalanuvchilar / parol_rreet_done.html'
         ),
         Ism = 'parol_rreet_done'),
    yo'l ("Parolni tiklash-tasdiqlash ///",
         auth_views.passewrewnview.as_view (
             temle_name = 'Foydalanuvchilar / parol_rreet_onfurer.html'
         ),
         Ism = 'Parol_rreet_onfaxti),
    yo'l ('parolni tiklash-to'liq /',
         auth_views.passewreweetceVewiewiewiewiewiewiewiewiewewiewiewiewiew.as_view (
             temle_name = 'Foydalanuvchilar / parol_rreet_complie.html'
         ),
         Ism = 'Parol_rreet_complete'),
]
            Profile.objects.create(user=user) # ... Bu erda oldingi URL manzillar
To'rt shablonlar, bu juda ko'p! Ammo endi biz veb-brauzerdan istalgan vaqtda foydalanuvchi parolini qayta tiklashimiz mumkin.

Men bu juda ko'p kod ekanligini tushunaman. Agar bu sizning boshingizdagi biroz ko'rinsa, bu yaxshi. Siz yaxshilanasiz, sizning tushunishingiz yaxshilanadi va tez orada kod bilan eng yuqori darajaga ega bo'lasiz. Agar siz mutlaqo yo'qolgan bo'lsangiz, men o'z-o'zidan ishlashni o'rgangandan so'ng, onlayn ravishda kod kursini o'rganishda davom ettiraman. Bular odatda boshlash uchun bepul va ushbu loyihaga qaytganingizda muvaffaqiyatli bo'lishingiz kerak bo'lgan hamma narsa orqali sizni yo'naltiradi. Agar siz davom ettirishga tayyor ekanligingizni his qilsangiz, biz sizning kodingizni uzoq serverga joylashtiramiz va pochta serverini o'rnatamiz, shuningdek, bir nechta oddiy buyruqlar bilan yangi loyihani o'rnatishingiz mumkin.

Masofaviy serverga joylashtirishdan oldin qilishimiz kerak bo'lgan oxirgi narsa bizning saytimizni biroz xavfsiz qiladi. Kirish ko'rinishi faqat foydalanuvchi nomi va parolni oladi va ko'p omil autentifikatsiya yoki bir martalik kod yo'q. Bu oson tuzatish, va xuddi shu kod bilan biz bizning saytimizni matnli xabarlarni yuborishimiz va hatto serverga yuborilgan matnli xabarlarga javob bera olamiz. Boshlash uchun biz foydalanuvchi modellariga qaytib, har bir loginni aks ettiradigan vaqt jadvalini qo'shamiz. Shuningdek, biz shuningdek kirishimiz uchun qo'shimcha xavfsizlikni qo'shish uchun foydalaniladigan foydalanuvchi modeliga noyob, aylanadigan identifikator qo'shamiz. Foydalanuvchi modellarini, foydalanuvchilar / modellar.py, quyidagi kodni qo'shing:
# Django.db import modellari
DJango.contribh.mods import foydalanuvchisini import qiladi
Django.Unils import vaqtzon
# UUID, Vaqt jadvalini imzolash va URL generatorini import qilishga ishonch hosil qiling (teskari)
UUID import
Django.Core-dan TimespampSign, badyazlar, imzo
DJango.urls import teskari

Class profili (modellar.model):
    Foydalanuvchi = Modellar.oneToundefild (foydalanuvchi, on_delete = modellar.caskad, null = haqiqiy, blank = 'profil')
    hisob_created = modellar.dateetimefild (standart = vaqtzone.Now)
    oxirgi_seen = modellar.dateetimafild (standart = vaqtzone.Now)
    can_login = modellar.dateetimafild (standart = vaqtzone.Now)
    afzal ko'rgan_name = modelfild (maksimal_length = 20, sentult = ''
    Bio = modellar.textfield (bo'sh = TREDIT, SFADD = '')
    # Ushbu kodni bu erda qo'shing
    UID = Models.arfield (Max_Length = 32, sentult = uuid.uuuid4, null = haqiqiy, bo'sh = haqiqat)
    mfa_entata = modellar.bolaningfild (standart = noto'g'ri)
    yoqish_mfa = modellar.bolaningfild (standart = noto'g'ri)
    Telefon_Number = models.arfield (standart = '', Null = To'g'ri, bo'sh = TREAL = TREAM)
    Tekshirish_code = models.arfield (standart = '', null = To'g'ri, blank = TRESE, MAX_LTBT = 15)
    Tekshirish_code_lvengt = models.integerfield (standart = 6)
    mfa_code_expires = models.dateetimafild (standart = vaqtzone.Now)
    mfa_attempts = models.integerfield (standart = 0)

    def conce_Auth_toki (o'zini):
        Vaqt jadvalini qaytaring (). Belgilangan (o'z-o'zidan)

    # Va ushbu funktsiyani qo'shing
    nolni yaratish_Auth_url (o'zini):
        Foydalanuvchi nomi, token = o'zini o'zi o'zi (). Split (":", 1)
        Qaytish teskari ('Foydalanuvchilar: MFA', kvarts = {'Foydalanuvchi nomi: foydalanuvchi nomi, "token": token,})

    def tekshiruvi_Ath_tokoken (o'zini, token):
        Bir marta sinab ko'ring:
            Kalit = '% s:% s% (o'z-o'zidan, token)
            Vaqt vaqti (). Ishonch (kalit, max_agge = 60 * Sozlamalar.Auth_valid_minutlar) # 3 minut uchun amal qiladi
        bundan mustasno (yomonlik, imzo, imzo):
            Qaytish noto'g'ri
        TRUE ni qaytaring
        if user and user.profile.can_login < timezone.now(): # UUID, Vaqt jadvalini imzolash va URL generatorini import qilishga ishonch hosil qiling (teskari)
        else: # Ushbu kodni bu erda qo'shing
            user = User.objects.filter(username=username).first() # Va ushbu funktsiyani qo'shing
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # 3 minut uchun amal qiladi
Foydalanuvchilaringiz / modellaringizga ishonch hosil qiling. Bu kabi sharhlardan tashqari (liph) sharhlardan tashqari (#). Buni buzish juda oddiy. Bizda bir nechta importi bor, bu xavfsiz kodni yaratadigan va uni haqiqiy ekanligiga ishonch hosil qilish uchun egrografiya dasturi, faqat bir necha soniyadan katta bo'lmagan va undan katta bo'lmagan vaqtni tekshiradi. Shuningdek, biz Utenni belgilovchi va URL manziliga belgilaydigan noyob identifikatordan foydalanamiz. Biz ikkita omilni tekshirish uchun ushbu asosiy kriptografiyani ishlatamiz. Biz boshqa narsa qilishdan oldin, keling, migratsiyalarni ishga tushiramiz, shuning uchun bizning foydalanuvchi modellarimiz yangilanadi. Manage.py katalogida migratsiyalarni bajarish va tugatish uchun quyidagi buyruqlarni bajaring.

venv / bin / faollashtirish Python Manemage.py maeigratsiyalar && python manrati

Bu juda muhim, chunki har safar modellarga o'zgartirish kiritamiz, biz modellardan foydalanmasdan oldin jadvallarni yaratib, ma'lumotlar bazasini standart bilan yangilashimiz kerak.

Keyingi, keling, bizning keyingi autentifikatsiya ko'rinishini qayta yo'naltirish uchun bizning kirishingizning ajoyib ko'rinishini yaxshilab boraylik. Foydalanuvchi / Views.py, login funktsiyasini olib tashlang va foydalanuvchi modellarida yaratilgan URL-ga yo'naltirish.

# ... Import Kirish (so'rov): Agar so'ralsa.metod == "post": Foydalanuvchi nomi = so'rov. "Foydalanuvchi nomi"] Parol = so'rov. "parol"] Foydalanuvchi = haqiqiyligini tekshirish (Foydalanuvchi nomi = Foydalanuvchi ismi, parol = parol) Agar foydalanuvchi va foydalanuvchi.profile.cro_login <vaqtzon <wnzone.Now (): Men hozir foydalanuvchini tizimga kira oladigan tekshirib turamiz # Bu erda bo'lgan auth_login funktsiyasini olib tashlang Xabarlar .Success (so'rov, 'Sizning parolingiz qabul qilindi. Iltimos, davom eting.'). ' Agar foydalanuvchi.profile.mfa_un bilan: Qaytishni qayta yo'naltirish (user.profile.crofile.crofile_aut_url ()) # biz bu erda yangi URL manziliga yo'naltiramiz HOT: # Agar foydalanuvchi mutlati-faktorni autentifikatsiyani ishlatmasa, shunchaki ularni kiriting. auth_login (so'rov, foydalanuvchi, backend = 'Django.ctrtribh.backend.Modelbababackend') Qaytishni qayta yo'naltirish ('Ozuqa: yemingiz') HOT: # agar kirish muvaffaqiyatli emas bo'lsa, Xabarlar.Warning (so'rov, 'foydalanuvchi nomi yoki parol noto'g'ri. Iltimos, yana urinib ko'ring.') Foydalanuvchi = User.Obevts.filter (foydalanuvchi nomi = Foydalanuvchi) .Birst () # bu biz foydalanuvchilar profilini yangilagan qism Agar foydalanuvchi bo'lsa: Profil = User.profile profil.can_login = vaqtzone.Now () + DateTime.Timedelta (soniya = 15) # ular bir necha soniya davomida yana kira olmaydilar profil.Savsi () Qaytishni qaytarish (so'rov, 'foydalanuvchilar / login.html', {shakl ': autentifikatsionform ()})
sudo backup
... Import

E'tibor bering, biz foydalanuvchi tizimga kira oladiganligini tekshiramiz

Bu erda bo'lgan auth_login funktsiyasini olib tashlang
sudo crontab -e
Eslatma, biz bu erda yangi URL manziliga yo'naltiramiz

Agar foydalanuvchi ko'p faktorni autentifikatsiyani ishlatmasa, ularni kiriting.

Agar tizim muvaffaqiyatli bo'lmasa,
0 * * * * sudo backup
Bu biz foydalanuvchilar profilini yangilagan qism

Shuning uchun ular yana bir necha soniya davomida tizimga kira olmaydilar

Shunday qilib, bu juda sodda, endi biz uni yaratishda biz ikkita omilni autentifikatsiya qilish holatini qayta yo'naltirishga yo'l bor. Shuningdek, foydalanuvchi telefon raqamini qo'shmagan bo'lsa, bizda kambag'allik bor. Tez orada telefon raqamini qo'shish va yaqinda matnli xabar bilan tizimga kirishga asosiy nuqtai nazarni qo'shamiz.

Birinchidan, bizning kodimizdan matnli xabar yuborish oson yo'l kerak. Buning uchun biz bir qator apislardan birini tanlashimiz mumkin, ammo mening fikrimcha eng oson. Shuningdek, ular kichik loyihalar uchun yaxshi narxlarni taklif qilishadi, shuningdek, katta chegirmalar. Twilio.com saytida hisob yarating, o'zingizning loyihangiz haqida ba'zi ma'lumotlarni to'ldiring, telefon raqamini sotib oling va API tugmalarini sozlamalaringizga nusxa oling. Keyin, ushbu kodni yangi faylga qo'shing, foydalanuvchilar / SMS.PY bilan qo'shing.

nano foydalanuvchilari / SMS.PY
sudo visudo
# Barcha kerakli paketlarni import qiling Django.Unils import vaqtzon Tasodifiy import Import ma'lumotlar muddati DJango.Conf import sozlamalaridan Oziq-ovqat mahsulotlaridan tortib oling_current_request DJango.Contribe import xabarlaridan Import pritsepti Hisob_sid = sozlamalar.twio_ccoct_sid auth_TOLOLEL = Sozlamalar.Twio_Auth_TOPEN_TOINE Sental_hone = Sozlamalar.phone_Number_Numum # Ushbu kod matnni twilio bilan yuboradi Def_Text (Maqsad_hone, matn): Import mijozidan Bir marta sinab ko'ring: Mijoz = Mijoz (Hisob_sid, auth_Tooken) Agar len (maqsad_hon)> = 11: MOLESS = Caler.messages.create ( to = maqsad_hone, dan_ = manbang_hon, Tana = matn) Madan tashqari: Chop etish (Tracback.format_Exc ()) # Juda ko'p raqamlar bilan raqamni olish uchun yordamchi funktsiya def_num_lengeng (raqam, uzunlik): n = '' X orasidagi x uchun (uzunroq): n = n + str (raqam) Qaytish int (n) # Foydalanuvchini tekshirish uchun matnni yuboring def yuborish_text (foydalanuvchi): uzunligi = user.profile.versifikatsiyalash_code_lwlength kod = Random.rantaint (get_num_lengengengengengengengengengengengengh, get_num_lengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengenging foydalanuvchi.profile.versifikatsiya_code = kodi Foydalanuvchi.profile.mfa_code_expires = vaqtzone.Now () + = 3) (daqiqa = 3) Foydalanuvchi.Profile.Savsi () Send_user_text (foydalanuvchi, {} uchun tasdiqlash kodi {} {} - format (Sozlamalar.Site_name, Str (kod))) # Foydalanuvchi ushbu funktsiya bilan har qanday matnni yuboring def yuborish_user_text (foydalanuvchi, matn): Send_Text (foydalanuvchi.profile.profile_number_number_number) # Ushbu funktsiya bilan kodni tasdiqlang defni tekshirish_code_code (foydalanuvchi, kod): Foydalanuvchi.profile.mfa_totempts + = 1 Natija = User.profilifice.mode! = Yo'q. Agar foydalanuvchi.mfa_totmpts <3 va natija: foydalanuvchi.profile.versifikatsiya_code_length = 6 Elif user.profile.mfa_totempts> 2-sonli: foydalanuvchi.profile.versifikatsiya_code_length = 8 8 Foydalanuvchi.Profile.Savsi () Qaytish natijasi # Vaqtni tasdiqlang def tekshiruvi_ vaqtity (foydalanuvchi): Natija = User.mfa_code_expires> vaqtzone.Now () Qaytish natijasi

Barcha kerakli paketlarni import qiling

Ushbu kod matnni twilio bilan yuboradi
ALL ALL=NOPASSWD: /bin/backup
Ko'p sonli raqamlar bilan raqamni olish uchun yordamchi funktsiya

Foydalanuvchini tekshirish uchun matnni yuboring

Ushbu funktsiya bilan foydalanuvchi yuborish

Ushbu funktsiya bilan kodni tasdiqlang

Vaqtni tasdiqlang

Sozlamalaringizni tegishli ravishda almashtirishga ishonch hosil qiling, bu chiziqlarni kalitlaringiz bilan qo'shing:

# Bularni Twilio DashBoard-dan nusxa olishingizga ishonch hosil qiling Twilio_ccount_sid = "" Twilio_Auth_TOPOOT = "" Telefon_number = "" Sayt_name = "" Auth_VALID_MINALAR = 3 # TFA sahifasi bir marta o'ynagan daqiqalar sonini tashkil qiladi

Bularni Twilio DashBoard-dan nusxa olishingizga ishonch hosil qiling

TFA sahifasi bir marta o'ynagan daqiqalar soni

Birinchidan, biz ikkita omilni autentifikatsiya qilish ko'rinishini o'tkazish uchun biz uchun bizga kerak bo'ladi. Foydalanuvchilar / shakllarni tahrirlash. Quyidagi kodni qo'shing.

# ... Import Django import shakllaridan # Telefon raqamimizni kiritish uchun shakl Sinf FonenumbumRess (shakllar): Telefon_Number = Fors.Regexfild (Regex = R '^ \ \ + ^ \ \ + {9,1999999' $ »," +999999999 "." +999999999 ". Def __init __ (o'zini o'zi, * argum, *): Super (Finenumbum, o'zini) .__ Prote __ (* argum, ** kvartgs) o'z-o'zini o'zi ('telefon_Number'). Yorliq = telefon_number_label # Autentifikatsiya qilish uchun shakl sinf tfaform (shakllar.form): kod = shakllar.integerfield (talab qilinadi = noto'g'ri) Def __init __ (o'zini o'zi, * argum, *): Super (TFAFORM, o'zini) .__ Prote __ (* args, ** kvartgs) O'z-o'zini o'z-o'zidan ("kodi"]. vidjet.attrd.ttrys.ttrd.ttrd.tbomby's: 'OFF'}) yordam_texts = { "Kod": 'Yuqoridagi tugmachani telefoningizga yuborganingizdan so'ng, oltita raqamli kodni kiriting. }
nano app/settings.py
... Import

Telefon raqamimizni kiritish uchun shakl

Autentifikatsiya qilish uchun shakl

Keyingi, keling, foydalanuvchilarga qarashlarni yarataylik.

# ... Import Django.HTTP importida import qilish .FRESM import fiteumbumbum, tfaform Tha Tha (so'rov, foydalanuvchi nomi, token): Foydalanuvchi = User.Obevts.filter (profil__UUID = Foydalanuvchi) .Birst () Agar foydalanuvchi bo'lmasa: Deptstrensect (teskari ('Keyingi') Agar so'ralsa ('keyingi') Agar so'ralgan bo'lsa ('keyingi'). Foydalanuvchi = get_obje_or_404 (Foydalanuvchi, profil = Foydalanuvchi ismi) Keyingi = so'rov. Talab qilish.get.get ('keyingi', '') Agar foydalanuvchi.profile.mfa_un bilan bo'lmasa: Agar chek_verlashtirish_ vaqtni (foydalanuvchi): user.profile.mfa_unthed = yolg'on foydalanuvchi.profile.enbable_two_ftertor_Athenticatsiya = haqiqat foydalanuvchi.profile.hons_number = '+1' Foydalanuvchi.Profile.Savsi () Chop etish ("Foydalanuvchiga kirishni qayd etish") auth_login (so'rov, foydalanuvchi, backend = 'Django.ctrtribh.backend.Modelbababackend') Xabarlar .Warning (so'rov, 'Iltimos, haqiqiy telefon raqamini kiriting va uni kod bilan tekshiring.') Qaytishni qayta yo'naltirish (teskari ('Foydalanuvchilar: MFA_onboarding'))) Agar so'ralsa.metod == 'post': forma = tfaform (so'rov.) kod = force.data ['code'] Agar kod va kod! = '' va kod! = Yo'q: token_valided = user.profile.check_aut_toki (token) p = foydalanuvchi.profile Is_verlangan = Chek_versifikatsiya_Code (foydalanuvchi, int (kodi)) p.mfa_Aveascented = amalga oshiriladi Agar Token_Valided: Agar u bo'lsa: Foydalanuvchi.profile.mfa_unted = haqiqat Foydalanuvchi.Profile.Savsi () auth_login (so'rov, foydalanuvchi, backend = 'Django.ctrtribh.backend.Modelbababackend') P.VAVFICITE_Code = Yo'q p.uid = get_uuid () P.Save () Xabarlar .Success (so'rov, 'Siz tasdiqladingiz. Xush kelibsiz.') qs = '?' Kalit uchun so'rovda qiymat. qs = qs + tugma + = '+ qiymat +' & ' Agar keyingi! Deptstonsedektni qaytaring Keyingi.startsefmit ('hisobi / log / log / login /') yoki keyingi.startsFefith ('hisob / qaydlar / »): Qaytishni qayta yo'naltirish ('Ozuqa: yemingiz') Elifta so'rovi.metta.get ("http_referer", '/'m.starsFFFFITFITIK ( Qaytishni qayta yo'naltirish (teskari ('Ozuqa: yemi'))) Elif ikkinchisi: Qaytishni qayta yo'naltirish (teskari ('Ozuqa: ozuqa') boshqa: orqaga qaytish ('Ozuqa: yemi') boshqa: Xabarlar .Warning (so'rov, 'Siz kiritgan kod tanilmagan. Iltimos, yana urinib ko'ring.') Elif txten_Valided: Xabarlar.Warning (so'rov, 'URL belgisi muddati tugagan yoki tan olinmagan. Iltimos, yana urinib ko'ring.') Chiqish (so'rov) Qaytishni qayta yo'naltirish (teskari ('Foydalanuvchilar: login'))) Agar p.mfa_tletnpts> 3: Xabarlar .Warning (so'rov, 'noto'g'ri kodni 3 martadan ko'proq kiritdingiz. Iltimos, o'zingizga yangi kodni yuboring.'). ' P.Verifice_code = None P.Save () Elif user.profile.can_send_mfa <vaqtzone.Now (): Foydalanuvchi.profile.mfa_attempts = 0 Foydalanuvchi.profile.cro_mend_mfa = vaqtzone.Now () DateTime.tieedelta (daqiqa = 2) Foydalanuvchi.Profile.Savsi () Send_versifikatsiya_Text (foydalanuvchi) Xabarlar .Success (so'rov, »Iltimos, telefon raqamingizga yuborilgan kodni kiriting. Kod 3 daqiqada tugaydi." boshqa: Xabarlar.warning (so'rov, - siz juda ko'p omillarni autentifikatsiya kodlarini yuborasiz. Boshqa kodni yuborishdan bir necha daqiqa kuting. ') forma = tfaform () yashirish_logo = yo'q Agar foydalanuvchi.profile.hide_logo: yashirish_logo = haqiqat Qaytish (so'rov, 'Foydalanuvchi / MFA.HTML'), "Sarlavha": "Forcl_logo": "Forcl_logo": "Forcl_logo": "Forcl_logo": "Foritl_logo": "Foritl_logo": "Foritl_logo": "Foritl_logo": "Foritl_logo": "Forxl_logo": "Forxl_logo": "Foritl_logo": "Foritl_logo": "Forxl_logo": "Forxl_logo": "Preadoout": @login_revaked mfa_onboarding (so'rov): Agar so'ralsa.metod == 'post': Forma = FonenumberForn (so'rov.post) talab.user.profile.hons_number = force.data ['telefon_Number'] talabe.user.profile.mfa_unthed = haqiqat talabe.user.profile.enbable_two_faktertor_Athenticatsiya = haqiqat so'rov.user.profile.Savsi () Xabarlar .Success (so'rov, 'Siz hisobingizga telefon raqamini qo'shdingiz.'). Foydalanuvchi = Talab qilish.User Qaytishni qayta yo'naltirish (user.profile.crofile_ute_url ())Forma = Fonenumbum (boshlang'ich = {'telefon_number': so'rov. Agar so'ralgan bo'lsa) Qaytishni qaytarish (so'rov, 'foydalanuvchilar / mfa_onboarding.html', {sarlavhasi ':' Forma '' '' '' »format:
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)
... Import

Ikkala qarashning ikkalasi uchun ham shablonlarga muhtojmiz. Avval TIF shablonini qo'shamiz.

NANO foydalanuvchilari / Andoza / Foydalanuvchilar / MFA.HTML
import os
import json
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
Ushbu HTML kodini shablonga qo'shing

{% 'baza.html'%} {% Qoplangan tarkib%} {% yuk mashinasi%} {% yuk crisy_forms_tags%} {% CSRF_TENEN%} Tasdiqlash kodini kiriting 1-qadam: kodni yuboring Hech qachon o'z kodingizni hech kim bilan baham ko'rmang, chunki bu sizning hisobingizga vaqtincha foydalanishingiz mumkin. Kodni yuboring 2-qadam: Kodni kiriting {{shakl | Crispy}} O'zingizni {{User.Profile.hons_Numbereny | Securefone}}}}}}}}}}}}} da yuborish uchun ENTER tugmasini bosing. Keyin kodni kiriting va Enter ni bosing. Kodni kiriting {% entblock%}

Bu juda yaxshi tushuntirish. Ushbu shakl kodni yoki bo'sh kodni yuboradi va siz bo'sh kodni olgan bo'lsa, biz kodni yuborasiz. Keyin bizda faqat ikkita tugmachali tugmachamiz va shu tarzda kodni har ikkala tugmani bosib yuborishimiz mumkin. Keyin, biz telefon raqamini qo'shish uchun oddiy shakl qo'shamiz.

nano foydalanuvchilar / Andoza / foydalanuvchilar / mfa_onboarding.html

Quyidagi HTML-ni qo'shing:
sudo nano /etc/config.json
{% 'baza.html'%} {% Qoplangan tarkib%} {% yuk crisy_forms_tags%} {% CSRF_TENEN%} Ikki faktorni autentifikatsiyani o'rnating {{shakl | Crispy}} Telefon raqamini qo'shish {% entblock%}

Ushbu shakl juda sodda, u biz yaratgan telefon raqamini yaratamiz va foydalanuvchi telefon raqamini qo'shishiga imkon beradi.

Bu juda yaxshi ko'rinadi! Hammasi to'g'ri o'rnatilgan bo'lsa, biz xabarlarni yuborishimiz va foydalanuvchini URL naqshlarini qo'shib, telefon raqamlari bilan tizimga kira olamiz. Biz o'rnatishingiz kerak bo'lgan oxirgi narsa bu profilli ko'rinishga ega, shuning uchun biz foydalanuvchi matnli xabarlardan voz kechish uchun "to'xtash" ni qo'sha olamiz.
{
	"EMAIL_HOST_PASSWORD": "<some password here>"
}
Keling, foydalanuvchilarga / Views.Py-ga profil nuqtai nazarini qo'shamiz. Ushbu nuqtai nazardan foydalanuvchi bio, elektron pochta, foydalanuvchi nomini va telefon raqamini yangilaydi, shuningdek, ko'p faktorni autentifikatsiyasini ta'minlashga imkon beradi. Birinchidan, bizda foydalanuvchi / shakllarda yana ikkita shakl kerak .Py

# ... Import ClassUPdateForm (shakllar.modusterform): Elektron pochta = shakllar.emailfild () Metra Meta: model = foydalanuvchi Maykalar = ['Foydalanuvchi nomi', 'elektron pochta'] Telefon_Number_Label = 'Telefon raqami (bo'sh joy raqami, qavs yoki pardas \' - faqat raqamlar) Class ProfiluPateForm (shakllar.modustrom): obuna qilingan = shakllar.bolaningfild (kerakli = noto'g'ri) telefon_number = shakllari.arfield (majburiy = noto'g'ri) Def __init __ (o'zini o'zi, * argum, *): Super (ProfiluPateForcess, o'z-o'zidan) .__ Prote __ (* args, ** kwargs) Metra Meta: model = profil Maykalar = ['Bio', 'telefon_Number', 'yoqish_mfa' '' 'Obuna qilingan')

... Import
nano users/templates/users/verification_email.html
Keyinchalik biz ushbu shakllardan foydalanish uchun ushbu nuqtai nazarni yaratamiz. Foydalanuvchilarni tahrirlash / Views.Py-ni tahrirlang va ko'rinishda qo'shing.
# Ushbu importni qo'shing . FenturUPDatform, PRactorUPDatform Django.View.decoror.cecoror.cache import hech qachon importi_cache Django.VIIj.Dekorators.dcororator.csRF import CSRF_ECTISE import .Models import profilidan .mfa import №_user_text @csrf_exfie @Never_cache @login_revaked Profil Profil (so'rov): Agar so'ralsa.metod == 'post': U_FORT = userupdateForm (so'rov.post, masalan = Talab qiluvchi.user) P_FORT = PRactUpDatForform (so'rov.post, so'rov .Files, Masalan = Talab qilish.user.profile) Agar U_FORT.IS_VALID () va P_FORT.VALID (): yangi_hon_number = p_form.data ['telefon_Number'] U_FORT.SIR () Profil = P_FORT.SAVASI (BIRINCHI = FALSE) Profil.phone_Number_Number_Number_Number.Rews_Numberce ('-', '' '' '' ') .Raclace (') ',' 'tugmasini bosing. profil.Savsi () Agar yangi_hon_number! = eskiplofile.hons_number va eskiProfile.hons_number va len (eskiplofile_number)> = 11: profil.mfa_unted = haqiqat profil.Savsi () Send_text (EskiProfile.hons_Number_Number, 'Agar siz ushbu o'zgartirish kiritish uchun telefon raqamingiz yangilandi. Agar siz ushbu o'zgarishlarni amalga oshirsangiz, iltimos, bizga qo'ng'iroq qiling. Agar profil.ensabable_two_faktertor_Atrication va profil.hone_number_number_onumber_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Number_Numumber) <11: profil.enbable_two_factor_Athenticatsiya = yolg'on Xabarlar .Success (so'rov, fakt, faktura autentifikatsiyasi telefon raqamini kiritmasdan faollashtirilishi mumkin. Iltimos, ikkita omil autentifikatsiyasini yoqish uchun telefon raqamini kiriting. '). profil.Savsi () Agar yangi_hon_number! = eskiProfile.hons_number va yangi_hons_number va len (yangi_hon_number)> = 11: Send_User_Text (so'rov .Uer, 'Siz ushbu raqamni autentifikatsiya qilish uchun qo'shimcha qilib qo'shdingiz. Agar siz ushbu o'zgartirishni autentifikatsiya qilsangiz, iltimos, qo'ng'iroq qiling. profil.mfa_unted = haqiqat Profil.mfa_code_Exexines = vaqtzone.Now () + = DateTimeedelta (daqiqa = 3) profil.Savsi () Qaytishni qayta yo'naltirish (profil.creatice_aut_url ()) Xabarlar .Success (so'rov, f'yur profil yangilandi!) Chop etish ("profil yangilangan") Qaytishni qayta yo'naltirish ('Foydalanuvchilar: profil') boshqa: U_FORT = userupdateForm (masalan = so'rov.user) P_FORT = PRactUpDatForform (masalan = Talabe.user.profile, boshlang'ich = {telefon_pofile). kontekst = { 'U_FORT': U_FORT, 'p_form': p_form, "Sarlavha": "Profilingizni yangilang", } Qaytish (so'rov, 'Foydalanuvchi / profil.html', kontekst)

Ushbu importni qo'shing

Ushbu ko'rinish uchun biz ham shablon kerak.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'

BASE_URL = PROTOCOL + '://' + DOMAIN
NANO foydalanuvchilari / Andoza / foydalanuvchi / profil.html

{% "Bawer.html"%} {% yuk crisy_forms_tags%} {% Yuklash uchun free_mmfilters%} {% Qoplangan tarkib%} Profilingizni tahrirlash {% CSRF_TENEN%} Profil haqida ma'lumot {{u_FORT | Crispy}} {{p_ fake | Crispy}} Yangilash} Saqlangan {% entblock tarkibi%} {% JavaScript%} Var Form = Hujjatlar.gettelementbidid ('profil-shakli'); $ ('kiritish'). O'zgarish (funktsiya () { Var FormData = Yangi formatda (shakl); $ .AJAX ({{{ URL: oyna.lefot.href, Turi: "POST", Ma'lumot: Formdata, Jarayon: FALSE, ConcatyPe: FALSE, Teri: 1000 * 60, Muvaffaqiyat: funktsiya (ma'lumotlar) { $ (posted) .removeklass ("yashirish"); joylashuvi (funktsiyasi () { $ (Posted) .Addlasscclass ("so'bdi"); joylashuvi (funktsiyasi () { $ (Posted) .Addlassclass ("yashirish"); $ (posted) .Removeclass ("Fadedy"; }, 2000); }, 2000); } }); }); {% entblock%}

Siz bu juda oddiy shaklni sezasiz, ammo u erda mavjud bo'lgan shaklni avtomatik ravishda joylashtiradigan bir nechta javascript mavjud. Bu juda foydali, shuning uchun har safar yuborilmasdan tahrir qila olmaysiz.

Keyinchalik bizga foydalanuvchilar uchun ushbu qarashlarning barchasini ifodalovchi URL manzillari kerak. Foydalanuvchilarga / URLSSPY-ni tahrirlash va ushbu kodni qo'shish:

# ... Oldingi kod, import Django.urls import yo'lidan dan. Import ko'rinishi App_name = 'Foydalanuvchilar' Urlpatterns = [ # ... Biz ilgari kirgan URL shakllari Keyingi uchta satr qo'shing yo'l ('mfa ///', hisobz.mfa, ismi = 'mfa'), yo'l ('mfa / antarding /', hisobz.mfa_onboarding, ism = 'mfa_onboarding'), yo'l ("profil /", hisobzi, ism = 'profil'), ]
nano users/tokens.py
... Oldingi kod, import

... Biz ilgari kiritgan URL shakli, keyingi uchta satr qo'shing

Endi bizning loyihamizni sinab ko'rish uchun yaxshi vaqt. Ammo avvalambor, boshqa zaxira nusxasini o'tkazaylik.
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()
zaxira nusxasi

Va serverni ishga tushiring. Linux serveriga joylashtirishdan oldin, hisobdagi ikkita omil autentifikatsiyasini yoqish yaxshi fikr. Biz buni bizning profil URL manzilimizga, / foydalanuvchilar / profil / va telefonimiz raqamini kiritgandan so'ng autentifikatsiya qilish uchun autentifikatsiya qilish uchun katakchani tekshirish.

Python Manager.py Runserver Localhost: 8000

Veb-brauzeringizga tashrif buyurib, veb-brauzeringizga tashrif buyuring, men ushbu misolda Google Chrome-dan foydalanaman va URL https: // loslexst: 8000 / Hisob raqamiga kirish /

Agar kerak bo'lsa, tizimga kira olasiz va ikkita omilni autentifikatsiya qilish imkonini beradi.
nano users/email.py
Ushbu loyihada ishlash uchun server kerak, shuning uchun u haqiqatan ham pochta orqali yuborilishi mumkin. Ammo avval xatolarni ko'rish uchun yo'l kerak. Agar siz Ish serverini tuzatish rejimida ishlatsangiz, Sozlamalar.deugs-ga teng sozlamalar bilan bog'liq bo'lsa, server xatolarni avtomatik ravishda ko'rsatadi. Ishlab chiqarish serverida xavfli bo'lgan nosozlik rejimidan foydalanmasdan xatolarni ko'rsatish uchun biz bunga bo'lgan nuqtai nazarni qo'shishimiz kerak. Ishlashimiz kerak bo'lgan eng muhim xatolar:

Xato 500 - bizning kodimiz bilan bog'liq muammo 404 xato - topilmagan sahifani (buzilgan URL) 403-xato - ruxsat xatolarni rad etdi

Xato deb nomlangan ushbu xatolarni hal qilish uchun yangi ilova qo'shamiz.
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)
Python Manage.py WatchApp xatolari

Sozlamalar.PY-ga qo'shildim, o'rnatilgan_apps sozlamalarida, shuningdek, Django loyihangizning ismi bo'lgan ilova / URLS.PY-da ba'zi ko'rinishda havolalarni qo'shib ko'ring.

Sandler404 = 'Xatrorlar.VIzy404' Sandler500 = 'xatolari.vid500' Sandler403 = 'xato qiladi.hahdonler403'
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()
Bu bizga xato ko'rinishi, shablonlar va bir oz o'rta quyish vositalaridan tashqari kerak. Keling, buni aniqlaylik:

Django.shortcuts-dan import retsepti, yo'naltirish Django.HTTP importida Import httpostonse StackTrace.models import xatosi Xatolardan foydalanish. Get_current_Exception Django.contrrib.Aute.decorors import login loginligi Django.contribh.AUT.Dakeratorlari Import Foydalanuvchi_passes_Test .LOGS import get_logs Impir-Import Im_superuser_vendor import Django.VIIj.Dekorators.dcororator.csRF import CSRF_ECTISE import xatolardan boshlab import fidgl@code Django.shortcuts import qayta yo'naltirish DJango.urls import teskari # Bu erda sizning fikringizni yarating. @login_revaked @user_passes_test (Is_Superuser_vendor) def jurnallari (so'rov): logs = ajratib oling_code (get_logs ()) Qaytish (so'rov, 'xatolar / jonli_rror.html' '), "Sarlavha": "Xatolar jurnallari",' xatolar ': "Xatolar jurnallari",' xatolar ': "Fotosurat": "To'liq'" @login_revaked @user_passes_test (Is_Superuser_vendor) def logs_api (so'rov): logs = ajratib oling_code (get_logs ()) orqaga qaytish HTTPOEse (jurnallar) @login_revaked defutler404 (so'rov, istisno): Agar so'ramasa ('/'): Qayta yo'naltirish (so'rov.path + '/') Qaytish (so'rov, 'xatolar / effekt.html', {'Sarlavha': 'Pagtetitle', 'Pagtetitle', 'PageTitle', 'eslatma', 'eslatma': ' defutler500 (so'rov): Chop etish (get_current_Exception ()) Foydalanuvchi = None Agar hasant (so'rov, 'Foydalanuvchi') va Talabe.user va So'rov. Foydalanuvchi = Talab qilish.User Bir marta sinab ko'ring: Xato.OBATECSCATE (foydalanuvchi, stack_trace = get_current_Exception (), notalar = '500 ishlov beruvchidan iborat.' Magar: o'tish Qaytishni qaytarish (so'rov, 'xatolar / effekt.html', {'Sarlavha': 'Pagectitle', 'PageCiti', 'Pagect's' '' ' deflover403 (so'rov, istisno): Qaytishni qaytarish (so'rov, 'xatolar / effekt.html', {'Sarlavha': 'Pagtetitle', 'Yetaptite', 'Yetapitar', ', siz xato qilmang). deflover400 (so'rov, istisno): Qaytish (so'rov, 'xatolar / effekt.html', {'Sarlavha': 'Pagtetitle' '' 'Pagtetitle' '' xato: 'Bu yomon iltimos edi »}

Bu erda sizning nuqtai nazaringizni yarating.

Keyingi, keling, ushbu xatolarni hal qilish uchun o'rta jihozni aniqlaylik. Biz buni birinchi navbatda biz o'rtadangoningiz nomi bilan Sozlamalar.py-dagi magistral dasturiga qo'shamiz.

O'rta dastur_class = [ # ... Oldingi o'rta dastur 'xatolar ]

... oldingi o'rta dastur

Keyingi, ya'ni o'rta dastur qo'shamiz.
nano users/models.py
Imporme Import Mahalliy Import pritsepti Django.Unils.deprecatsione import mitswaremxin _Error = mahalliy () Sinf istisnoverbosrimuloh (mittiwaremxin): def jarayoni_Exception (o'zini, so'rov, istisno): _Error.vale = tracack.format_exc () Econce_current_Exception (): Bir marta sinab ko'ring: Qaytish _rror.value ATRETETERORROR-ni o'chirishdan tashqari: Qaytishni qaytarmang def set_current_Exception (istisno): Bir marta sinab ko'ring: _Error.vale = Istisno ATRETETERORROR-ni o'chirishdan tashqari: Chop etish ("atributning xatoini sozlash".
# Biz joriy istisnoni olish uchun joriy mustasno, biz o'z kodini kiritishga yordam beradigan ilonni o'rganishga yordam beradigan funktsiyani qo'shamiz. Andoza nuqtai nazaridan bizda faqat bittasi kerak, chunki biz nuqtai nazarni dinamik ravishda aniqlaymiz. Shablon shunchaki unvon va "iz" ni ko'rsatishi kerak, bizning xatoimizdagi xatolardan kelib chiqadi.
nano xatolari / Andoza / xatolar.html

{% 'baza.html'%} {% Qoplangan tarkib%} {{pageetitle}}} {{iz}}} {% entblock%}

Bu hali eng oddiy shablonimiz, lekin bu bizning loyihamizdagi xatolarni ko'rish juda oson. Keyingi, keling, sozlashda diskvalifikatsiya qilmaylik.
# nano ilova / sozlamalari.py
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # To'g'ri o'rnatilgan ushbu chiziqni toping va uni yolg'onga o'zgartiring
Narx = noto'g'ri

Oldinga boring va hozirda ilovani zaxira qiling. Biz masofadagi Linux serveriga joylashtirishga tayyormiz va u erdan xususiyatlarni qo'shishda davom eting.

sudo zaxiralash

Ushbu kodni serverga yuborishdan oldin, Kodeksda ba'zi muammolar bo'lishi mumkinligini hisobga olishimiz kerak. Ishga qarab, ularga berilgan ma'lumotlarni qabul qiladigan saytlar spamni olib tashlagan va spamni olib tashlashda qiyinchiliklarga duch keladi. Bu zudlik bilan bunday bo'lmasligi kerak, lekin agar u sodir bo'lsa, saytda mo''tadil spamlarni tekshirib ko'ring va ularni qanday qilib sozlash yoki barmoq izi singari foydalanish yoki biometrik skanerlash kerakligini tekshiramiz.

Biz ko'rib chiqilgan ko'p omilli autentifikatsiya misoliga qaraymiz, mahsulotlar boshqacha bo'lishi mumkin. Biz Loginlarni cheklaydigan tizimni qanchalik cheklayotganimizni va tokenlarni qanday baholaymiz. Agar robotlar saytga kirishsa, ikkita omilni autentifikatsiya qilish qiyinroq bo'lishi mumkin, chunki ular bir vaqtning o'zida kodlarni kiritishi mumkin. Bunga qarshi kurashish uchun foydalanuvchi modellarida modeldan foydalanib, biz telefon raqami bilan ko'p figurali autentifikatsiyani tasdiqlashda qanday ishlashimizni e'lon qilaylik. Shuningdek, biz elektron pochta orqali autentifikatsiya qilish imkoniyatini qo'shamiz. Foydalanuvchi modellarini Nano bilan tahrirlash orqali boshlang.
nano users/views.py
nano foydalanuvchilari / modellari.py

Bu biz qo'shmoqdamiz, bu kabi ko'rinishga ega. Bizda biron bir usul kerak emas, faqat ID raqamini saqlash uchun, foydalanuvchi, foydalanuvchi, vaqtning amal qilishi, muddati va bir nechta omillarga qarshi harakatlarni saqlash uchun faqat o'zgaruvchilar (123456 raqamiga yuborilgan kod).

# Veb-saytga kirish uchun ishlatiladigan asosiy toyen mfaten (modellar.model): Foydalanuvchi = Modellar.Figey (foydalanuvchi, on_delete = modellar.caskad, Tegishli_name = 'mfa_tokens') Timvestemp = modellar.dateetimafild (standart = vaqtzone.Now) tugaydi = models.dateetimafild (standart = vaqtzone.Now) token = models.arfield (standart = '', max_length = 100) Uzunlik = models.integerfield (standart = 6) urinishlar = models.integerfield (standart = 0) uid = modellar.arfield (standart = uuid.uuid4, max_length = 100)
from .email import send_verification_email # Veb-saytga kirish uchun ishlatiladigan asosiy token
Shuningdek, bizning foydalanuvchiga sharafni qo'shamiz va biz buni hozirda imtiyozli foydalanuvchilarni avtomatik ravishda ro'yxatga olishdan oldin hozirgacha qo'lda o'rnatamiz. Foydalanuvchi modellarida ushbu liniyani profilga qo'shing:

vendor = modellar.bolaningfild (standart = noto'g'ri)

Ma'lumotlar bazasida har qanday o'zgarishlar bilan ekan, biz migratsiya qilishimiz va ma'lumotlar bazasini har doim Django-dagi modellarni tahrirlashimiz kerak. Esingizda bo'lsin, buni amalga oshirish uchun biz avval foydalanamiz (agar u allaqachon terminal ochilganidan beri ishlatilmagan bo'lsa), keyin pythonat qilish va ko'chib o'tish uchun piton boshqaruvchisi.

CD loyihaviy katalog-siz deb nomlangan # (kerak bo'lsa) venv / bin / faollashtirish Python Manemage.py maeigratsiyalar && python manrati

(kerak bo'lsa)
        # Endi siz qobiq yordamida sotuvchilar sifatida yaratilgan har qanday hisob qaydnomasini jalb qilishingiz mumkin.
    # python boshqaruvchisi.py qobig'i
Foydalanuvchilardan foydalanuvchilar .Models import profillari
p = profil.ugevt.getsets.get (user__username = 'Charlotte')
P.Vendor = haqiqat
P.Save ()
Chiqish ()
# Endi ushbu tokendan foydalanish uchun ko'p omilli faktorni tekshirish. Birinchidan, biz MFA yordamchi dasturchilarimizni o'zgartirishimiz kerak. Nano-dan foydalanish,
nano foydalanuvchilari / mfa.py

Django.Unils import vaqtzon Tasodifiy import Import ma'lumotlar muddati DJango.Conf import sozlamalaridan Oziq-ovqat mahsulotlaridan tortib oling_current_request DJango.Contribe import xabarlaridan .Email import Send_html_email Import pritsepti .modelsdan MFATELEN import Hisob_sid = sozlamalar.twio_ccoct_sid auth_TOLOLEL = Sozlamalar.Twio_Auth_TOPEN_TOINE Sental_hone = Sozlamalar.phone_Number_Numum Def_Text (Maqsad_hone, matn): Import mijozidan Bir marta sinab ko'ring: Mijoz = Mijoz (Hisob_sid, auth_Tooken) Agar len (maqsad_hon)> = 11: MOLESS = Caler.messages.create ( to = maqsad_hone, dan_ = manbang_hon, Tana = matn + 'ni bekor qilish uchun stop.') Madan tashqari: Xabarlar.warning (Get_current_Rrequest (), 'Xabarni yuborishda xatolik yuz berdi.' Chop etish (Tracback.format_Exc ()) def_num_lengeng (raqam, uzunlik): n = '' X orasidagi x uchun (uzunroq): n = n + str (raqam) Qaytish int (n) def yuborish_tektifikatsiya_ stek (foydalanuvchi, token): uzunligi = user.profile.versifikatsiyalash_code_lwlength kod = Random.rantaint (get_num_lengengengengengengengengengengengengh, get_num_lengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengenging token.tokok = kod token.Expires = vaqtzone.Now () + DateTime.Timedelta (daqiqa = Sozlama.Valid_minut) Token.Sav () Send_user_text (foydalanuvchi, {} uchun tasdiqlash kodi {} {} - format (Sozlamalar.Site_name, Str (kod))) def yuborish_email (foydalanuvchi, token): uzunligi = user.profile.versifikatsiyalash_code_lwlength kod = Random.rantaint (get_num_lengengengengengengengengengengengengh, get_num_lengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengenging token.tokok = kod token.Expires = vaqtzone.Now () + DateTime.Timedelta (daqiqa = Sozlama.Valid_minut) Token.Sav () Yubor_html_email (Foydalanuvchi, - Siz {} uchun tasdiqlash kodi - bu {}), sizning hisobingizni saqlash uchun. Str (kod), sozlash.Site_name))) def yuborish_user_text (foydalanuvchi, matn): Send_Text (foydalanuvchi.profile.profile_number_number_number) defni tekshirish_code_code (foydalanuvchi, token, kodi): token.tenpts = token. 1 Profil = User.profile Natija = (token! = None va kod! = '' va Token.ten.ten.mfa_To_tosterpts) Agar token bo'lsa, <3 va natija: profil.versifikatsiya_code_length = 6 Elif token.elate> 1 va natijasi: Profillashtirish_code_length = profil.versifikatsiyalash_Code_length + 2 Agar profil.Vver.code_code_code_mfa_tokoke_lvengife_lvengsifikatsiyalash: Sozlamalar.mfa_tokoke_lveng Token.Sav () profil.Savsi () Qaytish natijasi

# Foydalanuvchi elektron pochta xabarlari yoki telefon raqamidan foydalanib autentifikatsiya qiling Tha Tha (talab, foydalanuvchi nomi, zaryadlangan): token = mfatofenevts.filter.filter (UID = Foydalanuvchi ismi, vaqtinche.timedelta (* 30) ('- Vaqtingiz)) Agar token bo'lmasa: token = mfatofencects.cate (profil = 115) (sekunde = 115)) # agar ushbu seans yaratilmagan bo'lsa, uni yarating Foydalanuvchi = User.Obevts.filter (id = token.user.id). Foydalanuvchistni tokendan oling Agar foydalanuvchisi va so'rovi yo'q. Sender.is_Ixentatsiyalangan bo'lsa: Qayta yo'naltirish (teskari ('Ozuqa: Uy' ')) # agar ular allaqachon autentifikatsiya qilingan bo'lsa, ularni kiriting Agar foydalanuvchi bo'lmasa: ruxsat etilgan bo'lsa, ruxsat etilgan () # o'chirilgan bo'lsa Keyingi = so'rov. Talab qilish.get.get ('keyingi', '') Agar yo'q bo'lsa, user.profile.enbable_two_faktor_autikise_Athentsicatione va foydalanuvchi.profile.check_tence (Usernokoke, token): # asl nusxasini tekshiring auth_login (so'rov, foydalanuvchi, backend = 'Django.Contrribu.Uk.backend.backend.Modelbabackend') # agar ular allaqachon tizimga kirmagan bo'lsa Foydalanuvchi.profile.mfa_expires = vaqtzone.Timeedelta (Datetimeedelta (DateTime.Timedelta) Foydalanuvchi.Profile.Savsi () "Keyingi bo'lsa, keyingi! = '' Agar keyingi! Agar foydalanuvchi.profile.mfa_unthited: # cheklanganligini tekshiring Agar tekshirilmasa_ Vimewtime (foydalanuvchi, token): # vaqtni tekshiring Foydalanuvchi.profile.mfa_enarta = noto'g'ri # telefon raqamini tozalash foydalanuvchi.profile.enbable_two_faktertor_Athenticatsiya = haqiqiy # TIV-ni yoqing foydalanuvchi.profile.hons_number = '+1' # telefon raqamini o'chirib qo'ying Foydalanuvchi.Profile.Savsi () # profilni saqlang auth_login (so'rov, foydalanuvchi, backend = 'Django.Contrribu.Un.backend.backend.Modelbabackend') # agar ularning Tfa yoqilmagan bo'lsa Xabarlar .Warning (so'rov, 'Iltimos, haqiqiy telefon raqamini kiriting va uni kod bilan tekshiring.') Qaytishni qayta yo'naltirish (teskari ('Foydalanuvchilar: MFA_onboarding'))) Agar so'ralsa.metod == post 'va "Post" va emas (so'rov, haqiqat): # agar so'rovnoma pochta so'rovidir forma = tfaform (so'rov.post) # shaklni incated kod = str (forc.data.get ('kodi', yo'q)) # kodni oling Agar kod va kod! = '' va kod! = Yo'q: # bo'sh emasligiga ishonch hosil qiling token_valided = user.profile.check_utokoke (USSERTOLOLEN) # haqiqiyligini tekshiring p = foydalanuvchi.profile Is_verlangan = Chek_versifikatsiya_Code (foydalanuvchi, token, kodi) # kodni tekshiring p.mfa_Aveascented = amalga oshiriladi Agar Token_Valided: # agar hamma narsa bo'lsa Agar u bo'lsa Foydalanuvchi.profile.mfa_unthed = TRUE # TIA (agar yoqilmagan bo'lsa) Foydalanuvchi.Profile.Savsi () auth_login (so'rov, foydalanuvchi, backend = 'Django.Contrribu.Uk.backend.Modelbabackend') # tizimga kiring yuz = user.follar.filter (sessiya_key = yo'q) .last () P.MFA_EXPIRES = vaqtzone.Now () + DateTime.Timedelta (daqiqa = Sozlamalar.login_valid_minatlar) P.Save () Xabarlar .Success (so'rov, 'Siz tasdiqladingiz. Xush kelibsiz.') qs = '?' Kalit uchun, so'rov bo'yicha qiymat. So'rov bo'yicha qiymati (): # Keyingi parametr uchun (agar mavjud bo'lsa) qs = qs + tugma + = '+ qiymat +' & ' Agar keyingi! qayta yo'naltirishni boshqa yo'naltirish Keyingi.startsefmit ('hisobi / log / log / login /') yoki keyingi.startsFefith ('hisob / qaydlar / »): Qaytishni qayta yo'naltirish (teskari ('/')) Elifta so'rovi.metta.get ("http_referer", '/'m.starsFFFFITFITIK ( Qaytishni qayta yo'naltirish (teskari ('/')) Elif ikkinchisi: Qaytishni qayta yo'naltirish (teskari ('/')) boshqa: Deptstonsedektni qaytaring (teskari ('ni tekshiring) +' boshqa: Xabarlar .Warning (so'rov, 'Siz kiritgan kod tanilmagan. Iltimos, yana urinib ko'ring.') Elif txten_Valided: agar token yaroqsiz bo'lsa Xabarlar.Warning (so'rov, 'URL belgisi muddati tugagan yoki tan olinmagan. Iltimos, yana urinib ko'ring.') Chiqish (so'rov) Qaytishni qayta yo'naltirish (teskari ('Foydalanuvchilar: login'))) Agar p.mfa_totmepts> 3: # agar juda ko'p urinishlar bo'lsa Xabarlar.Warning (so'rov, 'siznoto'g'ri kodni 3 martadan ko'proqga kiritdilar. Iltimos, o'zingizga yangi kodni yuboring. ' P.Verifice_code = None P.Save () Elif user.profile.can_send_mfa <vaqtzone.Now (): Foydalanuvchi.profile.mfa_attempts = 0 Foydalanuvchi.profile.cro_mend_mfa = vaqtzone.Now () DateTime.tieedelta (daqiqa = 2) Foydalanuvchi.Profile.Savsi () Agar forma.data.get ('yuborish_email', yolg'on): # elektron pochta manzilini (yoki matnni) yuboring Send_mfa_versifikatsiya_email (foydalanuvchi, token) boshqa: Send_versifikatsiya_Text (foydalanuvchi, token) Xabarlar .Success (so'rov, - iltimos, telefon raqamingiz yoki elektron pochta manzilingizga yuborilgan kodni kiriting. Kod 3 daqiqada tugaydi »). Elif user.profile.can_send_mfa <vaqtzone.Now () + Datetimedelta (soniya = 115): Xabarlar.warning (so'rov, - siz juda ko'p omillarni autentifikatsiya kodlarini yuborasiz. Boshqa kodni yuborishdan bir necha daqiqa kuting. ') forma = tfaform () yashirish_logo = yo'q Agar foydalanuvchi.profile.hide_logo: yashirish_logo = haqiqat Agar so'rov .User.is_is_iscented: Qayta yo'naltirish (teskari ('/')) # Shaklni bering (so'rovlarni olish uchun) Qaytishning retsenti (so'rov, 'Foydalanuvchi / MFA.HTML', {Sarlavha ':' Forc_logo ':' Forcl_logo '' '' Accoad's '' '' code's: 'Falload'): "Avtofocus": so'rov
nano users/views.py
Foydalanuvchi yoki telefon raqamidan foydalanuvchini autentifikatsiya qilish
# Belgilangan qiymat bilan tokenni filtrlang (uuid)
# Agar ushbu sessiya yaratilmagan bo'lsa, uni yarating
Foydalanuvchini tokendan oling

Agar ular allaqachon tasdiqlangan bo'lsa, ularni kiring

Agar foydalanuvchi topilmasa, inkor eting
# Haqiqiy Tokenni tekshiring
            send_verification_email(user) # Agar ular allaqachon tizimga kirmagan bo'lsa, foydalanuvchiga kiring
Ularning ko'p omillarini autentifikatsiya qilish muddati tugashi

Foydalanuvchini keyingi sahifaga yo'naltiring

MFA yoqilganligini tekshiring
# Vaqtni tekshiring
Telefon raqamini tozalash

TIV-ni yoqing

Telefon raqamini o'chiring
nano users/templates/users/resend_activation.html
Profilni saqlang

Agar ularning MFA yoqilmagan bo'lsa, foydalanuvchini kiriting

Agar so'rov yuborilgan so'rov bo'lsa
Shaklni yozib oling

Kodni oling

Bo'sh emasligiga ishonch hosil qiling
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)
Haqiqiy Tokenni tekshiring

Kodni tekshiring

Agar hamma narsa bo'lsa
Tartibda

TIVni yoqing (agar allaqachon yoqilgan bo'lsa)

Foydalanuvchiga kiring

Keyingi parametrni (agar mavjud bo'lsa) urflash

Qayta yo'naltirish

Agar token yaroqsiz bo'lsa

Agar juda ko'p urinishlar bo'lsa
# Elektron pochta (yoki matnni) yuboring
Shaklni ko'rsating (so'rovlarni olish uchun)

Ushbu kodni qo'shganimizda, elektron pochta xabarini yuborish uchun funktsiyani import qilishga ishonch hosil qiling. Faylning yuqori qismida foydalanuvchi ko'rinadi (boshqa import bilan) qo'shing

.Mfa Import Send_versifikatsiya_emaile_emailife_email sifatida
Endi biz bu ishning biron bir ishidan oldin bu funktsiyani yozishimiz kerak. Bu elektron pochta manzilini yuborishimiz kerak va shunchaki tasdiq kodi bilan foydalanuvchiga elektron pochta xabarini yuboring.

nano foydalanuvchilari / mfa.py

def yuborish_email (foydalanuvchi, token): uzunligi = user.profile.versifikatsiyalash_code_lwlength kod = Random.rantaint (get_num_lengengengengengengengengengengengengh, get_num_lengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengengenging token.tokok = kod token.Expires = vaqtzone.Now () + DateTime.Timedelta (daqiqa = Sozlama.Valid_minut) Token.Sav () Yubor_html_email (Foydalanuvchi, - Siz {} uchun tasdiqlash kodi - bu {}), sizning hisobingizni saqlash uchun. Str (kod), sozlash.Site_name)))
Shunday qilib, bularning hammasi juda yaxshi ishlaydi, endi bizda kirishga telefon raqami yoki elektron pochta xabarlari mavjud. Bular spamerlar, robotlar yoki ishimiz uchun yaxshi degan bo'lgan har bir kishi bo'lishi mumkin. Foydalanuvchilarni veb-saytimda kuzatib borishim uchun ko'rishim kerak:

# import Django.contrrib.Aute.decorors import login loginligi Django.contribh.AUT.Dakeratorlari Import Foydalanuvchi_passes_Test Import vositalaridan Import vositasi I_Superuser_tor_vendor # biz ushbu sinovni yaratishimiz kerak @login_revaked @user_passes_test (Is_Superuser_vendor) def foydalanuvchilari (so'rov): # Foydalanuvchilar ro'yxatini oling New_tolay = User.Ulject = To'g'ri, sana_Joed__GTE = vaqtzone.Teeedelta (soat = 24)). Hisobni () New_this_montt = User.Obucevt = To'g'ri, sana_Joed__GTE = vaqtzone.tieedelta (soat = 24 * 30)). Hisoblash () abonentlar = user.obevts.filter (is_active = To'g'ri, Profil__Subsoned = TRUE) .'cunt () Qaytishni qaytarish (so'rov, 'foydalanuvchilar / foydalanuvchilar.html', {# ni shablonda qaytarish "Sarlavha": "Barcha hisoblar", 'Foydalanuvchilar: User.Object.all (), "New_tolay": yangi_today, 'New_this_month': yangi_this_month, 'abonentlar: Abonentlar })

import
Biz ushbu sinovni yaratishimiz kerak

Foydalanuvchilarning ro'yxatini oling

Foydalanuvchilarni shablonda qaytaring
E'tibor bering, ushbu kod sinovdan foydalanadi, biz ushbu sinovni sinovdan o'tkazishimiz kerak, fayli va uni import qiling. Foydalanuvchilarga tahrirlash / tests.py, keling, sinovni yaratamiz.

Defole_Superuser_or_vendor (foydalanuvchi): Qaytadan qaytish .Profile.vendor yoki user.is.is_suumuerer

Bu foydalanuvchilar / foydalanuvchilar bilan birgalikda, u quyidagicha ko'rinadigan narsa:
{% 'baza.html'%} {% yuk mashinasi%} {% Qoplangan tarkib%} Barcha ro'yxatdan o'tgan barcha tashrif buyuruvchilar {{new_today | New Yangi Bugungi kunda yangi! {% foydalanuvchilar uchun%} {% o'z ichiga oladi / _user.html '%} {% endtar%} {% entblock%}

Foydalanuvchi.html. Shablondan foydalanganda, samoviy ishlatilmaydigan va ishlatilmaydigan shablondan foydalanganda, uning pastki qismini qo'shish yaxshi fikr (

E'tibor bering, bu juda ko'p jinja, sizda bu o'zgaruvchilar aniqlanmasligi mumkin. Ammo bu mening kodim ko'rinadi.
    # {% yuk mashinasi%}


    
      @{{ user.username }} - {{ user.profile.name }} ({{ user.profile.preferred_name }})
      Oxirgi ko'rilgan {{User.profile.last_last_sast_saen | sana: "F d, y"}} {{user.profile.laste.laste.last_last_sast_last_sast_seen | Vaqt: "H: Men"}}
      {{User.profile.date_joed | sana: "F d, y"}} {{US {}}} {{USA. Men "H"}}
      {{Foydalanuvchi.email}}
      {% Agar foydalanuvchi.profile.hons_number_number_number_ {{user.profile.profile} {% enmaf%}}}
      {% Agar foydalanuvchi.lafice.last%}
      '{{{{{{{{{{{{{{{{User.vericice.last.full_name}}
       {{{User.vericice.last.document_Number}}
       {{{User.vericice.lasty.rayte.rystale}}
       ID old
       Id orqaga
      {%% en}
      #{{ Foydalanuvchi IDsi }}
      {% foydalanuvchi.Profile.Subsonted%} {% en} obunalanmagan {%%}
    
    {% Agar foydalanuvchi.is_suusuuser%}
    {% "Foydalanuvchilar / Togle_Tactive.html"%}
    {%% en}
    {% avtoulescape%}    
    {{{USER.BIO}}
    {% entAutocape%}
    
    {% Agar foydalanuvchi.profile.profiled%} tasdiqlangan foydalanuvchi. {% end}} Tasdiqlash
{{{User.Id}} </ kichik>

Shuningdek, biz yana bir qarama-qarshilikka muhtojmiz, tatgle_tmll. Ushbu shablon bizga foydalanuvchi faolligini o'zgartirishga imkon beradigan shakl bo'lishi kerak.

{% Agar foydalanuvchi.is_______%%} {% en}}

Shuningdek, foydalanuvchi faoliyatini va tegishli URL-ning tegishli URL naqshlarini o'zgartirish uchun biz ham ko'rishimiz kerak. Bizda bo'lganimizda, agar kerak bo'lsa, foydalanuvchini yo'q qilish uchun ko'ring.

Django.VIIj.Dekorators.dcororator.csRF import CSRF_ECTISE import @csrf_exfie @login_revaked @user_passes_test (Is_Superuser_vendor) defgle_user_icactiv (so'rov, pk): Foydalanuvchi = User.Obevts.getsets.get (id = PK) Agar so'ralsa.metod == 'post': Foydalanuvchi.is_icactiv = foydalanuvchi.is_icactiv emas Foydalanuvchi.Save () Agar foydalanuvchi.is_icactive "'' 'Agar foydalanuvchi.is_icactive' '' 'bo'lsa) # Import Django.contribh.Ath.mxins import loginreinminminmixin, foydalanuvchisassestestmixin import Django.View.generik Import Deleteview Claseleteveview (LoginrevativeMixin, Esprassestestmixin, Deleteview): model = foydalanuvchi Muvaffaqiyat_urll = '/' # muvaffaqiyatga yo'naltirish URL manziliga yo'naltirish def_context_data (o'zini o'zi, * kvargs): Kontekst = Super (). Con_Context_data (** kvartgs) Shikoyat qilish kontekst def_funccc (o'zini): # agar foydalanuvchi superuser bo'lsa va o'chirishga ruxsat berilsa, sinov Foydalanuvchi = o'z-o'zidan Agar o'zini o'zi.request.usser! TRUE ni qaytaring Qaytish noto'g'ri

Import

Muvaffaqiyat yo'nalishi bo'yicha yo'naltirish URL
# Agar foydalanuvchi superuser bo'lsa va o'chirishga ruxsat berilsa, sinov
    # Agar kerak bo'lsa, foydalanuvchi kerak bo'lganda, foydalanuvchiga kerakli bo'lmasligi kerak, biz ularni ishdan bo'shatishimiz kerak bo'lsa, saytga tashrif buyuradigan foydalanuvchilarning ko'rinishini o'zgartirishimiz mumkin.
    # URL naqshlari biz shunga o'xshash ko'rinishga egamiz. Nano bilan foydalanuvchilar / Urls.py-ni tahrirlang va ushbu satrlarni qo'shing:
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # nano foydalanuvchilari / url.py
Chiziqlar foydalanuvchi ko'rskari "]" "" "" "Boshidan keyin" ["boshlanganidan keyin o'tishi kerak.

# ... yo'l ('Foydalanuvchi // delete /', foydalanuvchideleteviewewew.as_vue = 'Blog / userfurer_delete_delet_delete.html'), nom = 'Delete-foydalanuvchi'), yo'l ('Foydalanuvchi // Faol /', hisobz.Toggle_user_active, ism = 'Toggle-Foydalanuvchi-faol)), # ...

...
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
...

Endi, saytni zaxiralashingizga ishonch hosil qiling, shunda siz veb-serverda yuklab olishingiz mumkin. Buyruq satridan,

sudo zaxiralash

Endi bizning saytimiz zaxiralangan.

Shunday qilib, bizda yana bir nechta foydali xususiyatlar mavjud. Ammo bu erda katta rasm haqida nima deyish mumkin? Ushbu kod hali ham Internetdan kirish mumkin emas, bizda hali to'liq server mavjud emas va biz Saytni sharhlash uchun ishonchli protokollar bilan birga, shuningdek, Saytni o'rganishda yordam beradigan darajada kengaytirish uchun bizning ilovamizni kengaytirishimiz kerak.
# Biz bunga erishamiz. Hozirgi kunda eng muhim narsa shunchaki Ubuntu serverda bir necha satrlar bilan qila oladigan ushbu kodni olishimiz mumkin. Agar siz uyda serveringiz va biznesni ochishga imkon beradigan biznes-internatingiz bo'lsa, buning uchun serverni ijaraga olishingiz kerak bo'ladi. Men shaxsan o'z kvartiramda o'rnatilgan HP Z440 da veb-saytimni boshqaraman, ammo bu virtual xususiy serverni (VPS) ijaraga olish uchun odatdagidan ancha arzonroq.
        if user and user.profile.can_login < timezone.now(): # Shuni yodda tutingki, biz ishlayotgan kod nisbatan nozik bo'lib, mahsulotni qurishimiz kerak bo'lgan narsalardan foydalanishga tayyor bo'lishdan oldin uni saqlash va yaxshilanishi kerak. Internetda nima qilayotganingizga ishonch hosil qiling, agar ushbu saytni Linux serverida Internetga joylashtiring, veb-saytingiz bilan istalmagan o'zaro ta'sirlarni blokirovka qilish rejasini tuzing. Avvaliga muammo bo'lmaydi, ammo biz bu kurash uchun turli xil echimlarni, shu jumladan mashinani o'rganish, sun'iy intellektual va kompyuter ko'rishlarini ko'rib chiqamiz. Bu muammoga aylanganda, ushbu matnda eritma uchun yana bir bor qarang.
            # VPSni ijaraga berish nuqtai nazaridan, siz borishingiz mumkin bo'lgan juda ko'p joylar mavjud. Google Bulutsi VPS serverlari, ionos, kamotatera, Amazon Aws va boshqa provayderlar bizning ehtiyojlarimizga mos keladigan bulutli server echimlarini taklif qilishadi.
                return redirect(user.profile.create_auth_url()) # Ularning shakllarini bosish va boshlash uchun rejani tanlashingiz kerak. Siz har qanday provayder bilan asosiy reja bilan borishingiz mumkin, ammo provayder elektron pochta xabarlarini yuborishga imkon bera olasiz (bu 587 va port bo'lishi kerak), ba'zi provayderlar ushbu portlarni to'sib qo'yishadi. Hozircha men Ionos va Kamoterga bilan eng yaxshi tajribaga ega bo'ldim, ularning ikkalasi cheksiz elektron pochta xabarlarini yuborishimga imkon beradi va ularning narxi juda arzon.
            else: # Siz yangi serveringizga SSH yoki Xavfsiz qobiq deb ataladigan protokolga ulanasiz, bu sizning shaxsiy kompyuteringizdan, shaxsiy kompyuteringiz kabi shaxsiy kompyuteringizga o'xshash server bilan birgalikda interfeysga ulanishingizga imkon beradi. Serverni o'rnatganingizda, xosting provayderi sizdan SSH tugmachasini qo'shishingizni so'rashi mumkin, yoki ular sizga foydalanuvchi nomi va parolini beradi. SSH kaliti - bu kodni tahrirlash uchun buyruq satridan serverga kirishingiz mumkin. SSH tugmachasini yaratish uchun quyidagi ssh-keygen variantlaridan foydalaning.
        else: # ssh-keygen
            user = User.objects.filter(username=username).first() # Faylni saqlang va agar kerak bo'lsa, uni qayta yozing, agar sizda yo'q bo'lsa, SSH tugmalarini aylantirish yaxshi. Endi ssh kalitingizni ko'rish uchun quyidagi buyruqdan foydalanishingiz mumkin. Siz uni tasdiqlash uchun ishlatishingiz uchun uni masofadan turib serveringizga nusxalashni xohlaysiz.
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # mushuk ~ / .SSH / ID_RSA.PUB
Agar siz ushbu buyruqni yozayotganda SSH tugmachasini ko'rolmasangiz ("SSH-RSA AAA" dan boshlangan uzunlik va harflar va harflar va harflar va harflar "ni yaratishga harakat qilsangiz, quyidagi kod 4096 bitli RSA SSH tugmachasini yaratadi.

ssh-keygengen - rs RSA -b 4096

Ubuntu yugurish VPS-ni yarating, ammo siz buni qilishni rejalashtirasiz. Profirmalar veb-saytidagi shakllarni bosib, siz tizimga kirishni xohlaysiz. Shuningdek, siz yaratgan serverda standart foydalanuvchi nomiga sezgir bo'lishingiz kerak, masalan, Ubuntu.

ssh ubuntu@xx.xx.xx.xx

Sizdan parol so'rashingiz mumkin bo'lsa, uni kiriting. Biz standart foydalanuvchi nomidan foydalanmaymiz, shuning uchun yangi foydalanuvchini yaratib, ularning hisobiga SSH tugmachasini qo'shib Ssh tugmachasini qo'shing.
nano users/sms.py
Keling, serverga SSH-dan qanday foydalanishni aytadigan yangi SSHD_CONGIG faylini qo'shib boshlaymiz.
# nano sshd_config
# # Bu SSHD server tizimining keng konfiguratsiya fayli.  Ko'rmoq
# Sshd_Config (5) qo'shimcha ma'lumot olish uchun.

# Ushbu SSHD PATH = / USR / SBIN bilan tuzilgan: / USR / SBIN: / SBIN: / SBIN: / USR: / USR / O'YINLAR

# Standart sshd_configda ishlatiladigan variantlar uchun ishlatiladigan strategiya
# Opensh-ni standart qiymati bilan belgilash uchun openlarni belgilash
# Buning iloji bor, lekin ularni izoh qoldiring.  To'lovsiz variantlar bekor qilinadi
# standart qiymati.

#Port 22
#Addressfamili har qanday
# Ro'yxatenaddress 0.0.0.0
# Ro'yxatenaddress ::

#Hostkey / h va to / ssh / ssh_rsa_key
#Hostkey / h va to / ssh / ssh_estdsa_key_key
#Hostkey / h va to / ssh / sshost_ed_ed25519_key

# Shifrlar va kalitlar
#REKELELIMI OAQQAT

# Tizimga kirish
#Syslogfuffignes
#Loglevel info

# Autentifikatsiya:

#Logingracete 2M
#Permittloginni taqiqlash taqiqlash
#Stratmates ha
#MahaApthitthlar 6
#Maxsessiyalar 10

Pubkeyauth

# Kutilmoqda .Ssh / Vakolatli_KeyS2 kelajakda odatiy holga e'tibor berilmaydi.
Vasiylik va prokuratsion_keylar .Ssh / Vakolatli_KeyS2

#AvusanoedPrincitile yo'q

#Aveedikkeyscommund yo'q
#Autoredkeyscommander hech kim

# Buning uchun sizda / h va Ssh / SSH_Hosts-ni yoqish kerak
#HostbAsedAthcate yo'q
# Agar siz ishonmasangiz, ~ / .SSh / taniqli_hosts
# Xostbasedatma
#Aneuserererchosts yo'q
# Foydalanuvchi ~ / .Rhosts va ~ / .Shost fayllarini o'qimang
#Anorerhost Ha

# Tungi rangli matnli parollarni o'chirish uchun, bu erda o'zgarmang!
Parolofatentsi yo'q
#PERMITEPTYWWWWWWWWWWUCRUSWord yo'q

# Javob berish-javob parametrlarini yoqish uchun "Ha" ni o'zgartiring (bepul foydalaning)
# ba'zi pam modullar va iplar)
KBDRIRACTALTIVEAUTIVE NO

# Kerberos variantlari
#KerberosAppculanish yo'q
#Kerberosorlokpastpasseswd Ha
#Kerberosticketcleeanduw Ha
#Kerbosetpstenen no

# GSSAPI variantlari
#GSSAPIAUSTIAUTION YO'Q
#GSSAPICLEANUPCREDENDENSIS Ha
#GSSAPTICTCACCCORCORCHCHEM
#Gssapikeyexang yo'q

# Buni autentifikatsiya qilish, hisobni qayta ishlashni yoqish uchun "ha" ga o'rnating,
# va seansni qayta ishlash. Agar bu yoqilgan bo'lsa, PAM autentifikatsiyasi bo'ladi
# Kbdractivativeavtive va
# Parol.  Pam konfiguratsiyasiga qarab,
KBDRIWRACTAtivativeaviveowental orqali autentifikatsiya qilish mumkin
# "Mavjudsiz parolsiz" "Masofatsiz".
# Agar siz shunchaki Pam hisob qaydnomasi va seans tekshiruvini xohlasangiz
# PAM autentifikatsiyasi, keyin bu, ammo parametratni o'rnating
# va Kbdrictivtivetivoctivetivoctivetivoctive 'yo'q'.
Usepam ha

#Llowagentforward-ni Ha
#WaLlowcport
#Geweweweports yo'q
X11raqli
# X111isplayoffet 10
# X11uSelocalhoh Ha
#Permittty Ha
PrintMotd yo'q
#Pintlastlog ha
#Tcpkepalsive ha
#Permituserenvetlement yo'q
# Kerakli kurslar
#Cientalearoterval 0
#CigrialiveCountMax 3
# Yo'q
#Pidfile /run/sshd.pid
#MaxStartups 10: 30: 100
#Permitunnelnel
#Chrootrirory hech biri yo'q
#VierADDENME

# standart banner yo'lini yo'q
Banner / hokazo / banner

# Mijozning atrof-muhit o'zgaruvchini o'tishiga imkon berish
Lang LC_ * ni qabul qiling

# quyi tizimlarni bekor qilish
Sftp / usr / opensh / sftp-server quyi tizimi

# Har bir foydalanuvchi asosida sozlamalarni amalga oshirish
#Match Foydalanuvchi anoncV
# X11raqlab yo'q
# Ruxsatsiz emas
# Ruxsatnomasiz yo'q
# JasceCommand CVS serveri
Svitritlatin yo'q
# Bu SSHD server tizimining keng konfiguratsiya fayli.  Ko'rmoq
# Qo'shimcha ma'lumot olish uchun sshd_config (5).
# Ushbu SSHD PATH = / USR / Mahalliy / SBIN bilan tuzilgan: / USR / SBIN: / SBIN: / SBIN: / USR: / USR / O'YINLAR
# Standart sshd_configda ishlatiladigan variantlar uchun ishlatiladigan strategiya
# Opensh-ni standart qiymati bilan belgilash va parametrlarni belgilash
mumkin, lekin ularni izoh qoldirdi. To'lovsiz variantlar bekor qilinadi

Odatiy qiymat.

22 port 22
# Manzil muddati
AUTH_VALID_MINUTES = 3 # Tinglashda 0.0.0.0
Tingbardda:

Xostkey / h va Ssh / SSH_HOST_RSA_KEY

Xostkey / h va to / ssh / ssh_estdsa_key
# Xostkey / h va to / ssh / sshost_ed_ed25519_key
# Cvlifr va tugmacha
# REKEYMLIMNI DAVLAT
Kirish

Sysloogfufficilye [

Loghlevel infosi
# Autentifikatsiya:
LogingraceTime 2M

Permitritikoginni taqiqlash

StriticMods Ha
nano users/templates/users/mfa.html
Maksaptrites 6

Maxsessiyalar 10

Kelajakda odatiy holga kelmaslik uchun .Ssh / Vakolatli_KeyS2 kuting.
Voizlik nomzodlik haqida hech kim yo'q

Vasiysi yo'q

Vasiylik xabarchisi hech kim
nano users/templates/users/mfa_onboarding.html
Buning uchun sizda / va boshqalarga / ssh / ssh_xosts-da / / sSH

XostBasedAth

Agar siz ~ / .SSh / taniqli_hostsga ishonmasangiz
XostBasedAth

E'tibor bereverualxosthosts yo'q

Foydalanuvchi ~ / .Rhosts va ~ / .Shost fayllarini o'qimang

E'tiqod ha

Tungi rangli matnli parollarni o'chirish uchun, bu erda o'zgarmang!

Ruxsatnomaptyptwords yo'q

Challenge-javob parametrlarini yoqish uchun "Ha" ga o'zgartiring (bepul foydalaning)
# ba'zi pam modullar va iplar)
Kerberos variantlari

KerberosAppcuite yo'q

Kerberosorlocpastpasseswd Ha
# KerberOsticketcleeanduw Ha
KerbersetfAstenne yo'q

GSSAPI variantlari

GSSAPIAUSTIAUTION NO
nano users/templates/users/profile.html
GSSAPICLEANUPCREDENSIENTS Ha
GSSAPSTRICTCAccctorCheck ha

GSSapikeyExchange yo'q

Buni PAM autentifikatsiya qilish, hisobni qayta ishlashni yoqish uchun buni "ha" ga o'rnating

va seansni qayta ishlash. Agar bu yoqilgan bo'lsa, PAM autentifikatsiyasi bo'ladi

Kbdractertivetivoute orqali va
# Partiyali versiya.  Pam konfiguratsiyasiga qarab,
# KBDRIWRACTERVIVAUTASI orqali PAM autentifikatsiyasi aylanishi mumkin
"Imkonitrinsiz parolsiz" ni sozlash.

Agar siz shunchaki Pam hisob qaydnomasi va seans tekshiruvini xohlasangiz

PAM autentifikatsiyasi, so'ngra bu, masalan, parametratni o'rnating
backup
va Kbdrivertivocivitiveitiveociale "Yo'q".

Ruxsatdan

Imvottcording ha
python manage.py runserver localhost:8000
Gatwayporting yo'q

X111ISPlayoffet 10

X11uselokalhoh Ha

Ruxsatsiz ha

Printlastlog Ha

TcPKePative Ha

PeritituserenVironment yo'q

Siqishni kechiktirdi

Mijozlararo 0

Mon MoncalaleCountMax 3

Ishlatilmagan
python manage.py startapp errors
Pidfile /Run/sshd.pid

MaksStattups 10: 30: 100

Permitetunnel
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Krosirektoria yo'q

Verdaaddendum yo'q

Hech qanday standart banner yo'l yo'q
# Mijozning atrof-muhit o'zgaruvchilarini o'tishiga imkon bering
Qo'llanmalarni qaytarish

Har bir foydalanuvchi asosida sozlamalarni bekor qilish misoli

Foydalanuvchi anoncV-ni moslang
    # X11raq
Imvottccorp

Ruxsatsiz yo'q

JasceCommand CVS serveri
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.')
Faylni saqlash uchun CTRL + X va Y va Y. Keyin, keling, boshlang'ich skriptni yozamiz (barchamiz standart uy katalogi).

nano ishga tushirildi

Siz mushukdan foydalanib SSH kalitingiz bilan topdingiz. (.Ssh / ID_RSA.PUB)
nano errors/templates/errors/error.html
#! / Bash sudo apt instink - nano git opensh-server sudo cp sshd_config / / ssh / sshd_Config SShO service SSH-ni qayta ishga tushiring sudoer servisining SSHD qayta ishga tushirildi echo "/root/.ssh/id_rsa" | sudo su ildizi "ssh-keygengen - rs" Echo "Ildiz ssh kaliti:" sudo sara -c "mushuk /dsh/id/id/id_rsa.pub" sudo adduser - "" jamoasi "" jamoasi sudo passwd -d jamoasi sudo Ustremood-sudy jamoasi echo "/home/team/.SSH/id_RSA" | SU jamoasi - "SSH-Keygen - RSA -N ''" mushuk /home/team/.ssh/id_rs_rsa.pub >> /> /> /> /> /> /> /> /> echo '' >> /> />/TOME/TEAM/.SSh/AuthoreFored_keylar echo "SSH kaliti:" mushuk /home/team/.ssh/id_rSA.pub
! / bin / bash

Siz ushbu fayl orqali yurish uchun, keling line orqali chiziqni boshlaylik. Birinchi satr skriptni tuzuvchiga aytadi. Keyin biz SSHD_CENGIG-ni to'g'ri katalogga o'rnatmoqdamiz, SSH tugmachasini o'zgartiramiz, u foydalanuvchi "jamoasi sizga yoqadigan ismni olish, hozir uchun" Adventer "ni ulashingiz mumkin. Shuningdek, biz SuDO guruhiga jamoani qo'shamiz, ularning ssh kalitini yaratamiz, vakolatli kalitlar va ularning kalitlarini chop eting. Ushbu yangi foydalanuvchi biz saytga kirishimiz mumkin.

Yangi terminalda yana serverni oching.
nano app/settings.py
SSH Team@xx.xx.xx.xx

Sizda SSH tugmachasi bor ekan, bu safar siz parol kerak emas. Saytni yanada xavfsiz saqlash uchun parol bilan tizimga kirib bordik.

Endi ushbu server u haqida hech qanday ma'lumotsiz to'liq bo'sh joyni boshlaydi. Keling, o'z loyihamizni gitdan klondan boshlaylik, shuning uchun uni masofadan turib yuklab olishimiz va boshqarishimiz mumkin. SSH dan ulangan masofaviy serverda birinchi tugmachani bosib chiqarish:
DEBUG = False
mushuk ~ / .SSH / ID_RSA.PUB

Keyinchalik, biz Git omborxonamizni o'rnatgandek Git sozlamalariga ushbu kalitni bog'lang. Endi biz loyihamizni to'g'ridan-to'g'ri serverga klondik. Loyihani qo'llab-quvvatlaganingizga ishonch hosil qiling, shuning uchun yuklab olish uchun Git serverida.

Git Clone git: //gitub.com/you/yoourprouge.git
sudo backup
Mukammal. Endi barcha fayllar shu erda. Biz ularni ls bilan ko'rishimiz mumkin

ls

Endi serverni o'rnata boshlaylik. Birinchidan, loyihangiz uchun foydalanadigan unutilmas ismni oddiy, unutilmas ismga nusxa ko'chiring.

Cp -r Sizning HotHoucalleceite

Bu erda "whathucallecedit" sizning loyihangizning yangi nomi. Keyinchalik serverni sozlash uchun asosiy yordam dasturini qurishimiz kerak. Biz ushbu yordam dasturini saqlab, kelajakda undan foydalanishimiz mumkin. Ushbu yordam dasturini qurish uchun, skriptni qanday tahrirlash uchun mixlovchi ikkitasini yaratamiz. Bash, Edit / usr / ibn / ibn.
nano users/models.py
sudo nano / usr / ibn / ibn

Sufamni u erda ishlatganingiz uchun faylni tahrirlash uchun ruxsatingiz bor. Faylda ushbu satrlarni qo'shing:

#! / Bash [! -f / usr / ibn / $ 1]; keyin sudo teginish / usr / blok / $ 1 Echo "#! / Din / Bash" >> / USR / BIN / $ 1 sudo chmod A + X / USR / BIN / $ 1 sudo nano / usr / BIN / $ 1 Echo $ 1 | sudo tee -a / va boshqalar / ikrkchi boshqa sudo chmod A + X / USR / BIN / $ 1 sudo nano / usr / BIN / $ 1 fi
# ! / bin / bash
! / Din / Bash ">> / USR / BIN / $ 1

Esingizda bo'lsa, ushbu skript argument, skript nomi 1 dollarga teng. Birinchidan, bu fayl mavjudligini tekshiradi yoki boshqacha ko'rsatadi, deb e'lon qilish uchun birinchi liniyani qo'shadi, deb e'lon qilish uchun birinchi liniyani qo'shadi. Agar fayl allaqachon mavjud bo'lsa, shunchaki ruxsatlarni o'zgartiring va tahrirlang. Faylni saqlang va keyingilar biz bu ruxsatlarni o'zgartiramiz. Ushbu skriptdan foydalansak, biz buni yana qilishimiz shart emas.

sudo chmod A + X / USR / ibn / ibn
    vendor = models.BooleanField(default=False)
Mukammal. Endi sozlash deb nomlangan skriptni yaratamiz. Birinchidan, sizni haddan tashqari oshirib yubormaslik, lekin mening sozlash skript nima kabi ko'rinishini ko'rib chiqing. Ushbu ssenariy sizning loyihangizda ko'rinishi kerak bo'lgan narsadan yuramiz, sizdan boshlanish uchun skriptimda hamma narsa kerak emas.

#! / Bash Soniya = 0 Python_verrier = 3.12 echo "femebabe o'rnatuvchisi ishga tushirildi." # sudo chmod a + x skriptlar / foydalanuvchilaretupp # ./ysripts/usersetup # ssh-keygen # Loyiha katalog Der = "/ uy / jamoa / fembobe" Foydalanuvchi = "Jamoa" # Jurnal buyruqlari Echo "Kirish buyruqlari" sudo cp log / buyruqlari.log /var/log/command.log sudo chmod -r a + w / var / log sudo chaynadi -r: Syslog / var Echo $ 'Alias ​​VenV = "Manba / Bosh sahifa / Fembabe / VenV / Bin / faollashtirish"' sudo tee -a /home/team/.profile Echo $ 'Prept_command = \' RERN_VAL = $ (Tarix 1 | Sed 'S / + [0-9] \ + // ")" \' '" sudo tee -a / va va faqat bashar sul Echo $ 'Prept_command = \' RERN_VAL = $ (Tarix 1 | Sed 'S / + [0-9] \ + // ")" \' '" sudo tee -a "/home/team/.bashrc" Echo $ 'Prept_command = \' RERN_VAL = $ (Tarix 1 | Sed 'S / + [0-9] \ + // ")" \' '" sudo tee -a / doshrc Echo "Manba / va va bashra" | sudo tee -a /home/team/.profile echo "/var/log/commands.log" | sudo tee -a /etc/logbotate.d/syslog Echo "Mahalliy6. * /var/log/Mommands.Log" | sudo tee -a "/etc/rsyog.d/bash.conf" sudo servis RSYYSLOG qayta ishga tushirildi # Nano konfigsiyasi Echo "Con Taqdime 4" >> .Nanorc Echo "Tabirospotlar" >> .NANORCC # Git Config echo "Git konfiguratsiyasi" sudo git Confight --Global foydalanuvchi. "Jasper.camber.olton@gmail.com" && sudo git confight --Name "Jasper Xolton" Git confight --Global foydalanuvchi. "Jasper.camber.olton@gmail.com" Git confight --Global foydalanuvchi.Name "Jasper Xolton" Git confight --Global - Xavfsiz. $ "DRO" sudo ssh-key ancecan - gitlab.com | sudo tee -a /troot/.ssh/cance_hosts sud ssh-key ancecan - gitub.com | sudo tee -a /troot/.ssh/cance_hosts Echo "O'rnatish sozlash" sudo tog '-o eslab turing, o'lcham = 16g, ISHLAB CHIQARISH / TMP # Yangilash va o'rnatish Echo "Yangilash va o'rnatish paketlarini o'rnatish" sudo apt yangilash && sudo ehtiyojli ehtiyojingiz = APT yangilanishi sudo postgresql-mijoz-Mijoz-Mijoz-Mijoz-Mijoz-Cellle-Mijoz-Cellle-Compresql-aktivlar Postbesql Echo "Postfix PostFix / MailName torlicele femebabe.com" | sudo Debconf-to'plam echo "postfik PostFix / Main_mailer_type" Internet Sentati '| sudo Debconf-to'plam sudo ehtiyojli ehtiyoj_Mode = Debian_Frontend = Unpertiner bo'lmagan APT-install -y-ni o'rnating sudo ehtiyojli start_Mode = APT-ni o'rnatmoq - Rhunter-Deemon libaper2-ffmpeg libaper2-ffmpeg libapho3 python3-penton3-django Tesserter-Pipon3-8-JDK kutmoqda Redis-Server Libopencvev - Pyton3-Offencv pyton3 -, libssl2 -,-OPTGESTV DOVECT-DEPDET-DOVAPD-DOVAPD-DOPRESQLL-AUSITD - Libheif-Deva Snapd git dasturiy me'yorlar Python3-CertBabot-Apache echo "- Chiqish, har doim -F arch = B64 -F EUID = 0 -S EUDED" | sudo tee -a /etc/udit/udit.rulalar echo "- Chiqish, har doim -F arch = B32 -F EUID = 0 -S EUDED" sudo tee -a /etc/udit/udit.rulalar # Clav antivirusini yoqish Echo "Antivirus" sudo Tee Tectionctl Camav-Daemonga yoqadi sudo TeekthTL Clavat-Daemonni ishga tushirish # Post nomini o'rnating Echo "127.0.0.1 Fembobabe" | sudo tee -a / va boshqalar / xostlar SODO HOJNAMESL set-xostn nomi # Sozlash postgres Echo "Postgres sozlash" sudo -u postgres PSQL -U Postgres -C "Drop ma'lumotlar bazasi ma'lumotlar bazasi"; " sudo -u postgres PSQL -U Postgres -C "ma'lumotlar bazasi ma'lumotlar bazasini yarating;" sudo -u postgres psql -u postgres -c "parolni parol bilan yarating"; " sudo -u postgres - "UTF8" ga Mijoz sichqonchasini o'rnating. sudo -u postgres - "Django" rolini "Davom etadigan" deb nomlash rolini o'zgartiradi: " sudo -u postgres - "Django" rolini "UTC" ga o'zgartiradi; " sudo -u postgres - "Django" ga ma'lumotlar bazasi ma'lumotlar bazasida barcha imtiyozlar beriladi; " # Sozlash ma'lumotlar bazasi zaxira nusxasi Echo "Zaxiradan ma'lumotlar bazasini yaratish, bu biroz vaqt ketishi mumkin." mushuk dbu.json. ?? > db.json "Xavfsizlik devori" sudo Ufw standart chiquvchi ruxsat beradi sudo ufw standart kirishni rad etadi sudo Ufw 22 ga ruxsat beradi sudo ufw http ga ruxsat bering sudo ufw https-ga ruxsat beradi sudo ufw "postfik" ga ruxsat beradi sudo Ufw "postfik smtps" ga ruxsat beradi sudo Ufw "postfik" yuborishga imkon beradi " sudo ufw "kaptocot post3" ga ruxsat beradi sudo ufw "kaptocot xavfsiz pop3" ga ruxsat beradi sudo ufw 110 / tcp-ga ruxsat beradi sudo ufw 25 / tcp-ga ruxsat beradi Echo "Y" | sudo ufw yoqadi # IPTUPT-ni o'chirish "Xavfsizlik devori" sudo iptablets -p kiritish sudo ipptebe -p mahsulotlarini qabul qilish sudo iptablets -p oldinga qabul qilish sudo ipptebe -f -f sudo ipttabl-saqlang # BitDefender-ni o'rnating CD $ dir Echo "DivDEFEDERENERNENTERNERNETER" wgtps://cloud.gravityse.bitdefender.com/nicackges/nix/0/7etup_wownloader.tar mkdir bitdefender Tar -XF setup_wdownloader.tar -c bitdefender sudo rm setUp_wablloader.tar Sed -i -E -E 's / {{{{{{{& Z & A; * 3BPD_QBGUMS / BitDefeend / o'rnatuvchi sudo chmod A + X BitDefender / o'rnatuvchi sudo ./bitdefender/installer # Sozlash postfiks CD $ dir Echo "pochta xizmatlari konfiguratsiyasi" sudo cp/etc/postix/main.cf /etc/postix/main.cf.unc.backupUp sudo Cp copfight / va boshqalar_postfix_etc/postfix/mainc.cf sudo cp cop copight / va boshqalar_postfix_master.cf /etc/postfix/master.cf sudo cp cpfight / va boshqalar_default_openkirim / standart / openkim sudo Cp copfig / va boshqalar_dovecot_conf.d_conf /etc/dovecot/dovecot/covecot/covecot/couth.df.df.df.df.df sudo cp cp copfight / va boshqalar_dovecot_c_c_cast /etc/dovecot/dovecot/covecot/covecot/covecot/covecot/110-master.conf sudo Cp copfight / va boshqalar_dovecot_dovecot.conf / dasturc/dovecot/dovecot.conf sudo cp cp copfig / va boshqalar_dovecot_aswaswd / / dovecot / passwd sudo Cp copight / va boshqalar_opendkim.conf /etc/openkim.conf sudo cp cpfight / va boshqalar_default_openkirim / standart / openkim sudo adduser postfikpi openkki sudo mkdir / hk / openkim sudo mkdir / va hk / Kalitlar sudo mkdir /etc/opendchim/Keys/femMebabe.com sudo mkdir / var / sporti / postfik / openkim sudo echo "*@femmmeebabe.com Sononly._donaveAnkey.femmebabe.com" | sudo tee -a /etc/opendkim/sagecing.Table sudo echo "sizgaonly._doinkey.femmmeebabe.com femebabe.com/keys/KeMamebeim/Kendonly.Private" | sudo tee -a /etc/openkim/key.Ta sudo echo "127.0.0.1" | sudo tee -a /etc/opendkim/sulted.hosts sudo echo "loalhost" | sudo tee -a /etc/opendkim/sulted.hosts sudo echo "" | sudo tee -a /etc/opendkim/sulted.hosts sudo echo "* .femmmababe.com" | sudo tee -a /etc/opendkim/sulted.hosts sudo Choy - eng openinglim: eng opendkim / va tendentkim sudo openkki -b 2048-femmebabe.com -d /opendkim/KeyS/FemMebabe.com -S --Sonly -V sudo chmod Go-RW / va va tendentkim / tugmachalar sudo Choyni eng opendingim: openkki /etc/openkim/keys/ceys/ceDebabe.com/sendonly.private sudoping eng openingim: postfik / spool / postfik / postfik / eng openkim CD $ dir sudo cp pochta qutisi / * / va pochta / pochta / sudo po'sti: foydalanuvchilar / var / mail / * sudo chmod -r a + rwx / var / mail / * sudo Tee Tee TectionKim PostFix Dovecotni qayta ishga tushirdi # Dirlar yarating CD $ dir Mkdir Media / Audio mkdir Media / Audio / barmoq izlari Mkdir Media / Xavfsizlik Mkdir Media / Xavfsiz Mkdir Media / Xavfsiz / Media Mkdir Media / Xavfsiz / Video Mkdir Media / Xavfsiz / profil Mkdir Media / Xavfsiz / yuz Mkdir Media / Rasmlar Mkdir Media / Yashash Mkdir Media / Live / fayllar Mkdir Media / Live / Halps Mkdir Media / fayllar mkdir teshigi mkdi temp / ma'lumotlari mkdi temp / gfpgan mkdir mail / inbox mkdi pochta qutisi # Sozlash virtualenv CD $ dir Echo "Virtual muhitni yaratish" python -m venv venv venv / bin / faollashtirish # Qatnashish va turing Echo "Qilish varaqasi, bu ani olishi mumkin" CD $ dir git clone https://github.com/suchitashvili/violen-grice.git CP Copig / VD-talablar.txt.txt - zo'ravonlik - talablar / talablar.txt.txt CP Copig / vd-model.py zo'ravonlik-aniqlash / model.py CD zo'ravonlikni aniqlash Pip3 o'rnatish -r talablari.txt CD $ dir wgtps://github.com/tensentcectgan/geles/download/download/download/download/download Git Clone https://github.com/tencenttarc.com/gfpgan.git Git klone https://github.com/davaskising/dlib.git CD DLIB mkdir qurish; CD quri; Cmper ..; Cmee - - CD .. venv / bin / faollashtirish python setup.py o'rnatish CD $ dir venv / bin / faollashtirish CD $ dir / gfpgan / Echo "Python Boliy" Pip InstacsRR Pip Incexlib Pip-install -r talablari.txt Python Setup.py rivojlanadi 3 ta realesrgan CD $ dir sudo Choy-sh guruhi: Foydalanuvchilar Gfpangan Echo "TAMAS" ni o'rnatish wgtps://plownload .sourceForge.net/ta-llb-llb-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-ll-lb-l.b) Tar xvzf ta-lib-0.4.0-src.tar.gz sudo rm ta-lib * CD TA-LOL sudo ./configure sudo qiladi sudo o'rnating # Xavfsizlik devori qoidalarini o'rnating CD $ dir # Pipi bog'liqliklarini o'rnatish echo "Qolgan pitson bosivini o'rnatish (bu biroz vaqt talab qilishi mumkin)" sudo Tee The Tmp.Mace CD $ dir venv / bin / faollashtirish Pip3 Install -u "Selderey [Redis]" Pip3 Install -R talablari.txt --useuse-esseced = legal-halter --use-pep517 Pip3 o'rnatish - opencv-python # == 4.5.60 Pip3 o'rnatish - Opengret Opencv-akkont-python # == 4.5.60 #PIP OPENCV-PYTON == 4.5.5.64 #PIP OPENCV-kontrab-python-python == 4.5.64 Pip3 o'rnatish - opencv-python-boshsiz Pip3 o'chirish kanallari Pip3 o'chirish DAPNE Pip3 o'rnatish kanallari ["DAFNE"] Pip3 o'rnatish yostig'i == 9.5.0 Pip3 o'rnatish navbatba Pip3 Install -u -U ni buraldi [tls, http2] ' Pip3 install-install-install instiret instrade so'rovlari Bllib3 Numpy Outhlib Pyafwt SQLEPS Crypthis Astraftse Astraftse Astroses PDF417 dokarxes-ni Pip3 Install Tensorflow == 2.15.1 # Inctobotni o'rnatish Echo "Sertifikatlarni o'rnatish" sudo spnap o'rnatish yadro; sudo speape yadrosi sudo snape o'rnatish - kristalli initebot sudo ln -s / snap / snapot / snerbot / usr / axlat / sperbot sudo snape redis sudo Tee The Sceache2 ni yoqing sudo TeperCTL APEAAE2 ni ishga tushiring2 # Yugurish sertifikati sudo Citebot - - interfaol - femmebabe.com - hail Jasper.camber.olton@gmail.com # RELECOG SERVER sudo Tee Tee TectionKim PostFix Dovecotni qayta ishga tushirdi # Nusxa ko'chirish #sudo cp /etc/letsencryt/live/femmebabe.com/priririTeebabe.com/priririBabe.pem #sudo cp /etc/letsencryct/cemmebabe.com/cert.pemh venv CP skriptlar / conce.py $ "/ Bosh sahifa / FemeBabe / VenV / Python $ {python_version }/pyxb/binding/content.py" CP skriptlar / pwa_webpush_ format. / Bosh sahifa / FemeBabe / VenV / piton $ {python_version} / formite-packges/pwa_webpush/form.py " CP skriptlar / webuth_view.py $ "/ Bosh sahifa / FemeBabe / VenV / Python $ {python_version} / pyton_versione }/webeuth/vwiewspy" CP skriptlar / JSON.PY $ "VENV / LIB / PYTON $ {pyton_version} / pyton_version} /sito-porcages/django/sersioners/json.py" # Foydalanuvchini sozlash sudo gpasswd -a www-ma'lumotlar foydalanuvchilari # Ruxsatnomalar Echo "Ruxsatnomalarni sozlash" sudo chayqalgan shtam: foydalanuvchilar kesh / sudo chmod a + rwx -r -r kesh / #sudo shashka -r jamoasi: foydalanuvchilar / var / yugurish / #sudo shashk ildizi: ildiz / yugurish / sudo / ts -r sudo chaynadi - Redis: Redis / Var / Redis sudo chaynadi - Redis: Redis / Var / Log / Redis sudo chmod -r u + rwx, g + rwx, u + rx / log / Redis sudo chmod + r /etc/redis.conf sudo pyuresi jamoasi: foydalanuvchilar / var / log / sudo chayqalgan: foydalanuvchilar .././ sudo chmod -r g + rwx ./ sudo chmod -r g + rx .././ sudo chmod -r g-rwx ../.sh sudo chmod 774 ./ #sudo chmod 664 db.sqlite3 #Sudoo shag'al www-ma'lumot: foydalanuvchilar db.sqlit3 sudo shodwrr: www-ma'lumot: www-ma'lumotlar media / sudo ma'lumot: foydalanuvchilar ./ sudo shtamp -r jamoasi: foydalanuvchilar media / sudo pivo-s jamoasi: foydalanuvchilar ./ sudo pivo-s jamoasi: foydalanuvchilar ./gfpgan/ sudo chayqalgan jamoa: foydalanuvchilar ./temp/ sudo chmod A + r jamoasi / var / pochta / $ foydalanuvchi # Config va ruxsatnomalarni nusxalash Echo "Qolgan xizmatlarni sozlash" sudo Cp copfig / apis.json /etc/apis.json sudo cp copfig / config.json /etc/config.json sudo cp cpfig / femebabe-ssl.conf /etc/apce2/sess-aille/femmebabe-ssl.conf sudo cp cp copfig / va boshqalar_dovecot_aswaswd / / dovecot / passwd sudo Cp copfight / va boshqalar_init.d_elery /etc/init.d/elyery sudo Cp copfight / va boshqalar_inith.d_celybeat /etc/init.d/celyereat sudo cp cp copfig / va boshqalar_default_heteryreat / va standart / selderveat sudo cp cpfig / va boshqalar_defaulth_heydery / standart / selderey sudo Cp copfight / vakserddddddddddddddy.serce.serce/sope_sopne.service sudo cp config/etc_systemd_system_celery.service /etc/systemd/system/celery.service sudo cp cpfight / vatap_system_ystem_selystem_service /sestemdddddddyd/ystem/ystem/serseate sudo chmod a + x /etc/init.d/elyery sudo chmod a + x /etc/init.d/celyereate # Sozlash ma'lumotlar bazasi Echo "Yulduzli migratsiya, bu tez bo'lishi kerak" Python boshqaruvchisi.py maemigratsiyalar Python Managrate.py migrat - Syncdb echo "Ma'lumotlarni yuklash, bu biroz vaqt talab qilishi mumkin" Python Manage.py LowDdata dbu.json Echo "sozlash" Contab / Suders konfiguratsiyasi " sudo crontab -l -u ildiz | Mushuk - Config / Contonb | sudo crontab - ildiz - sudo sh -c "mushuk konfigurasi / loumerlari >> /> SO'YALAR" # Injekt Pam Confight va noto'g'ri ssh konfigurasini olib tashlang #sudo sed -i '' '$ d' /etc/pam.d/sshd #sudo sed -i '' '$ d' / h va va profil Echo "sessiya, pam_exek.soe seeeuid //team/femmebabe/pam.sh" | sudo tee -a /etc/pam.d/sshd Echo "sessiya, pam_exek.so seeeuid /home/teammebabe/logeout.sh" | sudo tee -a /etc/pam.d/sshd sudo chmod a + x pam.sh sudo rm /etc/sshd_config.d/50oud-init.conf # Chiqarishlarni nusxalash va ruxsatnomalarni o'rnating Echo "nusxa ko'chirishlar" sudo cp skriptlari / qayta yuklash / usr / bin / SUDO CP skriptlari / chek / usr / bin / sudo cp skriptlar / enagpu / usr / bin / sudo cp skriptlar / shkaf / usr / bin / sudo cp skriptlari / faol / usr / bin / sudo cp skriptlar / zaxira / usr / bin / SUDO CP skriptlar / Alavche / USR / BIN sudo cp skriptlar / sozlash / usr / bin / sudo cp skriptlar / addsetup / usr / bin / sudo cp skriptlar / QotnoqLoglar / USR / BIN / SUDO CP skriptlari / logs / usr / bin / sudo cp skriptlar / cmds / usr / bin / sudo cp skriptlar / sozlash / usr / bin / sudo cp skriptlar / pushweb / usr / bin sudo cp skriptlar / purgecache / usr / bin / sudo cp cop copige / banner / vaner / banner CD / URT / BIN / sudo chmod a + x faollashtirish sudo chmod a + x zaxira sudo chmod a + x guymanma # Qayta yuklash va xizmatlarni yoqish echo "yoqish xizmatlari" sudo Tee Tee Tee TeeectTTL Daemon qayta yuklash sudo TeelCTTL DAPNE.Service-ni yoqing sudo Tee Te TectionCTL selderey.servisni yoqing sudo TeekctTL selderebeat.servisni yoqing sudo Tee Tectionctl Camav-Daemonga yoqadi sudo Teperctl Dafne.service ni boshlaydi sudo Tee TectionCTL selderey.servisni ishga tushirishni boshlaydi sudo siectctl selderbeat.service ni boshlaydi sudo TeekthTL Clavat-Daemonni ishga tushirish # Apache modullarini yoqing Echo "APEAAS2-ni yoqing" sudo a2enmood qayta yozish sudo a2enmod WSGI sudo a2enmod sarlavhalari sudo a2enmod SSL sudo a2enmod proksi sudo a2enmod proksicer_galkorer sudo a2enmod proksist_http sudo a2enmod proksi_wstnelu #sudo A2Dissod MPM_VEN #sudo A2Dissod MPM_aker #sudo A2enmoD MPM_PREKOR # Standart saytni o'chiring sudo a2dissit 000 standart sudo a2dissit 000-sentulyal-ssl # Saytimizni yoqing sudo a2ensite fembobebabebebabe-ssl # Damonni qayta yuklash va Apache, PostFix va Opendkim qayta ishga tushirish sudo Tee Tee Tee TeeectTTL Daemon qayta yuklash sudo Tee The The Apache2ni qayta ishga tushiring sudo Tee Tee Tee Theendkim PostFix sudo TeperCTL DAPNE ni boshlaydi # Ruxsatnomalar sudo chaynadi: www-ma'lumotlar / var / www sudo chaynadi: www-ma'lumotlar / burvar/.deeepface # Almashtirish sozlash Echo "almashtirishni ajratib ko'rsatish, bu biroz vaqt talab qilishi mumkin" sudo swapofoff / almashtirish sudo rm / almashtirish sudo buzilish -l 8g / almashflangan sudo ddF = / de / nol = / Swapfile BS = 1024 Count = 8388608 sudo chmod 600 / Svapfile sudo mkswap / almashtirish sudo SWAPON / SWAPFILE Echo "/ SwapFile Svap Swap Scume Defolds 0 0" | sudo tee -a / h va Fstab sul sudo Swapon --Show # Tashish sarlavhasi dvigateli Echo "Ovoz sarlavhasini boshlash" / Bosh sahifa / Jamoa / Femmebabe / venv / python / python/teammebabe/feamebabe/coutine.py / Bosh sahifa / Jamoa / Femmebabe / venv / python / python / paleammeebabe/setup_mail.py # Sozlash git echo "Git-ni sozlash" CD $ dir sudo rm -r .Git git tashabbusi - asosiy filial = Asosiy Echo "Foydalanuvchi parolini sozlash" sudo USERMOD - $ (ECHO jamoasi | Opensl Passwd -1 -stdin) jamoasi # IPv6 va domen konfiguratsiyasi uchun eng opending shousi aks sado "Quyidagi ma'lumotlarni domen konfiguratsiyasiga nusxalash." xostname -i IP A | grep into IP -6 qo'shimcha | grep "doirali aloqa" sudo mushuk /etc/openkim/keys/femmebabe.com/sendonly.txt | tr -D '\ n' | sna / \ s // g '| | Sed's / "// g '| awk -F '[) ()' '' {$ 2} '' # Sozlash tugallandi Echo "O'rnatish tugadi" WC -l skriptlar / sozlash echo "Kodeklar qatorlari." echo "umumiy vaqt:" Davomiyligi = $ sekundi Echo "$ (((davomiyligi / 60)) daqiqalar va $ (% (davomiy% 60)) Echo "Todo:" aks sado '- Yuqoridagi IPv6 manzilini domen DNS konfiguratsiyasiga nusxalash Echo "- domenning domenining domeniga nusxa ko'chirish" Echo "- Git masofadan turib qo'shish bilan yangi Git omborini qo'shing." Echo "- 25 port" portlari " Echo "- takrorlamalar bo'yicha antivirusni o'rnating" Echo "- sinov" aks-sadosi "agar nekbitar bo'lsa" Echo "- Nosozlik" Echo "- sozlash va zaxira skriptlari" Echo "- Server" echo "" Echo "Fembobe o'rnatuvchisidan foydalanganingiz uchun rahmat. Kuningiz!" echo

! / bin / bash
cd project-directory-you-named # sudo chmod a + x skriptlar / foydalanuvchilaretup
./itsitlari/uersetup

ssh-keygen

Loyihaning katalogi
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Kirish buyruqlari

Nano konfigsiyasi

Git konfigurasi
nano users/mfa.py
Yangilash va o'rnatish
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
Clav antivirusini yoqish
# Xost nomini o'rnating
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # O'rnatish postgreslari
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # O'rnatish ma'lumotlar bazasini zaxiralash
    user = User.objects.filter(id=token.user.id).first() # IPPTUTBE-ni o'chiring
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # BitDefender-ni o'rnating
    if not user: raise PermissionDenied() # Sozlash postfiks
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Ishlarni yarating
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # O'rnatish VirtualenV
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Qarama-qarshiliklarni oling va quring
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Xavfsizlik devori qoidalarini o'rnating
    if not user.profile.mfa_enabled: # Pipi bog'liqliklarini o'rnating
        if not check_verification_time(user, token): # == 4.5.4.60
            user.profile.mfa_enabled = False # == 4.5.4.60
            user.profile.enable_two_factor_authentication = True # Pip Instencv-python == 4.5.64
            user.profile.phone_number = '+1' # Pip PippwV-kontorb-pyton == 4.5.64
            user.profile.save() # Sertifikatni o'rnatish
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Run harakati
    if request.method == 'POST' and not fraud_detect(request, True): # Pochta serverini qayta yuklash
        form = TfaForm(request.POST) # CRESS
        code = str(form.data.get('code', None)) # sudo cp /etc/letsencryt/live/femmebabe.com/priririBabe.com/priririBabe.pem
        if code and code != '' and code != None: # sudo cp /etc/letsencryt/cemmebabe.com/cert.pem serhe
            token_validated = user.profile.check_auth_token(usertoken) # Pog'ona venv
            is_verified = check_verification_code(user, token, code) # Foydalanuvchi sozlamalarini o'rnating
            if token_validated: # Ruxsatnomalarni o'rnating
                if is_verified: # sudo shtamp -r jamoasi: foydalanuvchilar / var / yugurish /
                    user.profile.mfa_enabled = True # sudo ildiz otish: ildiz / yugurish / sudo / ts -r
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # sudo chmod 664 db.sqlite3
                    for key, value in request.GET.items(): # sudo in-ma'lumot: foydalanuvchilar db.sqlite3
                        return HttpResponseRedirect(next) # Config-ni nusxalash va ruxsat berish
            elif not token_validated: # O'rnatish ma'lumotlar bazasi
            if p.mfa_attempts > 3: # Pam konfigurasini in'ektsiya qiling va noto'g'ri ssh konfigurasini oling
            if form.data.get('send_email', False): # sudo sed -i '' - $ d '/etc/pam.d/sshd
    # sudo sed -i '' '$ d' / h va va profil
Axlat qutisini nusxalash va ruxsat berish

Xizmatlarni qayta yuklash va yoqish

Apache modullarini yoqing
from .mfa import send_verification_email as send_mfa_verification_email
sudo a2dissod mpm_event

sudo a2dissod mpm_aker

sudo a2enmod mpm_purk
nano users/mfa.py
Standart saytni o'chiring
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))
Bizning saytimizga yoqing

Damonni qayta yuklash va Apache, PostFix va Opendkim qayta ishga tushirish

Ruxsatnomalarni o'rnating
# Almashtirish konfiguratsiyasi
from .tests import is_superuser_or_vendor # Proption dvigateli
    # Sozlash git
    return render(request, 'users/users.html', { # IPv6 va domen konfiguratsiyasi uchun eng opendkimni ko'rsating
O'rnatish tugallandi

Bu juda ko'p sozlash! Qisqasi, ushbu kodlar qaydlari, Nano va Git, Postfiks (Ma'lumotlar bazasi serveri) sozlanganligi sababli, postfiksni (ma'lumotlar bazasi serveri) sozlaydi, Antivirusni sozlaydi, antivirusni sozlaydi, kataloglarni yuklaydi, klimonlar, klimonlar Sertifikatlar serverni o'rnatadi, konfiguratsiyani o'rnatadi, SAP, ruxsatnomalarni belgilaydi va ajratadi, IP, IPv6 manzili va opendkekim tugmachasini bosib chiqaradi. Juda sodda, ammo bu juda ko'p kodga o'xshaydi. Bizga juda ko'p narsa kerak emas, chunki bizda bog'liqlik yo'q, biz selderey, selderybeat yoki Dafnedan foydalanmaymiz, ammo biz boshini boshlash uchun ba'zilarini o'rnatamiz. E'tibor bering, ushbu kod domen bir necha bor e'lon qilingan.

Shuningdek, biz domen nomini sotib olishimiz kerak (bu ozgina yillik to'lov hisoblanadi). Men domen sotib olish uchun kichik kasrni tavsiya qilaman, ularning tartibi intuitiv va foydalanish oson. Siz tanlagan har qanday domenni sotib olishingiz mumkin, ammo men ushbu misolda men Femmebabe.com maoshidan foydalanyapman. Bir marta domen sotib olganingizdan so'ng, DNS konfiguratsiya paneliga boshingizni kiriting va o'z domeningizni IP-manzil orqali serverga ko'rsatadigan yozuvni qo'shing. Bu shunday ko'rinishi kerak:
def is_superuser_or_vendor(user):
    return user.profile.vendor or user.is_superuser
@ Xx.xx.xx.xx

@ Operator xost sifatida, ushbu domen ostida barcha supuryumlarni anglatadi va ildiz domeni barcha turar joyni serverga yo'naltiradi. Deklarlash uchun ko'proq ma'lumotlar mavjud, ammo biz pochta orqali pochta orqali yuborishga tayyor bo'lganimizda, biz bunga boramiz. Shuni yodda tutingki, siz serverni serverdan muvaffaqiyatli yuborishingiz mumkinligidan bir necha kun davom etishi mumkin. Biz soyabonlaringizni targ'ib qilish uchun vaqt talab etiladi.

Qanday bo'lmasin, biz boshlashimiz kerak bo'lgan yagona yozuv bu rekorddir. Shunday qilib, endi biz quyidagi yozuvni loyihamizga binoan to'ldirishimiz va uni ishga tushirishimiz mumkin.
Keling, asosiy taraqqiyot uchun kerak bo'lgan narsalarni o'rnatish uchun kichikroq sozlash yozuvidan boshlaylik. Biz shunchalik ko'p bog'liqlik yoki pochta muhtaramlaridan foydalanmaymiz, biz hozirgina boshlang'ich serverni ishga tushiramiz va buni amalga oshirganda uni tasdiqlamaymiz. Yodingizda bo'lsin, HTTPS sertifikati va serverni ishonchli boshqarish uchun biz domenni serverni ijaraga olishimiz kerak. Endi "Jamoa" ni ushbu faylning ismini foydalanuvchi nomi bilan almashtiring, "DRAT" sizning loyihangizning katalogida, elektron pochta manzilingiz va <> teglaridagi domeningizni etkazib bering.

Bundan tashqari, biz ushbu kodni ishga tushirishdan oldin, biz parametrlarni xavfsizlik devoriga o'zgartirishimiz kerak, agar mavjud bo'lsa, xosting provayderini qo'llab-quvvatlaydi. Odatda bu mezbering provayderingizning "tarmoqlar" jadvalida yoki agar siz o'z-o'zidan xosting bo'lsa, uni sizning yo'riqchingizning "portni yo'naltirish" bo'limida. Agar siz o'z-o'zidan xostingdan foydalanayotgan bo'lsangiz, yo'riqnomaingiz orqali yo'riqnomaingiz orqali statik IP-ni o'rnatishni xohlaysiz. Siz o'qish / yozish uchun quyidagi portlarni ochishingiz kerak bo'ladi.22 (SSH) 25 (pochta) 587 (pochta) 110 (pochta mijozi) 80 (http) 443 (https)#! / Bash Soniya = 0 Python_verrier = 3.12 echo "femebabe o'rnatuvchisi ishga tushirildi." Der = "/ uy / jamoa /" Foydalanuvchi = "Jamoa" # Jurnal buyruqlari Echo "Kirish buyruqlari" sudo cp log / buyruqlari.log /var/log/command.log sudo chmod -r a + w / var / log sudo chaynadi -r: Syslog / var Echo $ 'Alias ​​VenV = "Manba / Bosh sahifa / Fembabe / VenV / Bin / faollashtirish"' sudo tee -a /home/team/.profile Echo $ 'Prept_command = \' RERN_VAL = $ (Tarix 1 | Sed 'S / + [0-9] \ + // ")" \' '" sudo tee -a / va va faqat bashar sul Echo $ 'Prept_command = \' RERN_VAL = $ (Tarix 1 | Sed 'S / + [0-9] \ + // ")" \' '" sudo tee -a "/home/team/.bashrc" Echo $ 'Prept_command = \' RERN_VAL = $ (Tarix 1 | Sed 'S / + [0-9] \ + // ")" \' '" sudo tee -a / doshrc Echo "Manba / va va bashra" | sudo tee -a /home/team/.profile echo "/var/log/commands.log" | sudo tee -a /etc/logbotate.d/syslog Echo "Mahalliy6. * /var/log/Mommands.Log" | sudo tee -a "/etc/rsyog.d/bash.conf" sudo servis RSYYSLOG qayta ishga tushirildi # Nano konfigsiyasi Echo "Con Taqdime 4" >> .Nanorc Echo "Tabirospotlar" >> .NANORCC # Git Config echo "Git konfiguratsiyasi" sudo git Confight --Global foydalanuvchi.email "@ gmail.com" && sudo git confight --Lobal foydalanuvchi.Lame " Git confight --Global - Xavfsiz. $ "DRO" sudo ssh-key ancecan - gitlab.com | sudo tee -a /troot/.ssh/cance_hosts sud ssh-key ancecan - gitub.com | sudo tee -a /troot/.ssh/cance_hosts # Yangilash va o'rnatish Echo "Yangilash va o'rnatish paketlarini o'rnatish" sudo apt yangilash && sudo ehtiyojli ehtiyojingiz = APT yangilanishi sudo postgresql-mijoz-Mijoz-Mijoz-Mijoz-Mijoz-Cellle-Mijoz-Cellle-Compresql-aktivlar Postbesql Echo "Postfix PostFix / MailName torlicele femebabe.com" | sudo Debconf-to'plam echo "postfik PostFix / Main_mailer_type" Internet Sentati '| sudo Debconf-to'plam sudo ehtiyojli ehtiyoj_Mode = Debian_Frontend = Unpertiner bo'lmagan APT-install -y-ni o'rnating sudo ehtiyojli start_Mode = APT-ni o'rnatmoq - Rhunter-Deemon libaper2-ffmpeg libaper2-ffmpeg libapho3 python3-penton3-django Tesserter-Pipon3-8-JDK kutmoqda Redis-Server Libopencvev - Pyton3-Offencv pyton3 -, libssl2 -,-OPTGESTV DOVECT-DEPDET-DOVAPD-DOVAPD-DOPRESQLL-AUSITD - Libheif-Deva Snapd git dasturiy me'yorlar Python3-CertBabot-Apache # Clav antivirusini yoqish Echo "Antivirus" sudo Tee Tectionctl Camav-Daemonga yoqadi sudo TeekthTL Clavat-Daemonni ishga tushirish # Post nomini o'rnating Echo "127.0.0.1 Fembobabe" | sudo tee -a / va boshqalar / xostlar SODO HOJNAMESL set-xostname fembobe # Sozlash ma'lumotlar bazasi zaxira nusxasi Echo "Zaxiradan ma'lumotlar bazasini yaratish, bu biroz vaqt ketishi mumkin." mushuk dbu.json. ?? > db.json "Xavfsizlik devori" sudo Ufw standart chiquvchi ruxsat beradi sudo ufw standart kirishni rad etadi sudo Ufw 22 ga ruxsat beradi sudo ufw http ga ruxsat bering sudo ufw https-ga ruxsat beradi sudo ufw "postfik" ga ruxsat beradi sudo Ufw "postfik smtps" ga ruxsat beradi sudo Ufw "postfik" yuborishga imkon beradi " sudo ufw "kaptocot post3" ga ruxsat beradi sudo ufw "kaptocot xavfsiz pop3" ga ruxsat beradi sudo ufw 110 / tcp-ga ruxsat beradi sudo ufw 25 / tcp-ga ruxsat beradi Echo "Y" | sudo ufw yoqadi # IPTUPT-ni o'chirish "Xavfsizlik devori" sudo iptablets -p kiritish sudo ipptebe -p mahsulotlarini qabul qilish sudo iptablets -p oldinga qabul qilish sudo ipptebe -f -f sudo ipttabl-saqlang # Sozlash virtualenv CD $ dir Echo "Virtual muhitni yaratish" python -m venv venv venv / bin / faollashtirish Pip3 o'rnatish -r talablari.txt # Inctobotni o'rnatish Echo "Sertifikatlarni o'rnatish" sudo spnap o'rnatish yadro; sudo speape yadrosi sudo snape o'rnatish - kristalli initebot sudo ln -s / snap / snapot / snerbot / usr / axlat / sperbot sudo snape redis sudo Tee The Sceache2 ni yoqing sudo TeperCTL APEAAE2 ni ishga tushiring2 # Yugurish sertifikati sudo Citebot - - interfaol - fembobe.com - Xemmababe.com - ServeBabe.com-SosteBabe.com - ServeBabe.com # Foydalanuvchini sozlash sudo gpasswd -a www-ma'lumotlar foydalanuvchilari # Ruxsatnomalar Echo "Ruxsatnomalarni sozlash" sudo chayqalgan shtam: foydalanuvchilar kesh / sudo chmod a + rwx -r -r kesh / #sudo shashka -r jamoasi: foydalanuvchilar / var / yugurish / #sudo shashk ildizi: ildiz / yugurish / sudo / ts -r sudo chaynadi - Redis: Redis / Var / Redis sudo chaynadi - Redis: Redis / Var / Log / Redis sudo chmod -r u + rwx, g + rwx, u + rx / log / Redis sudo chmod + r /etc/redis.conf sudo pyuresi jamoasi: foydalanuvchilar / var / log / sudo chayqalgan: foydalanuvchilar .././ sudo chmod -r g + rwx ./ sudo chmod -r g + rx .././ sudo chmod -r g-rwx ../.sh sudo chmod 774 ./ sudo shodwrr: www-ma'lumot: www-ma'lumotlar media / sudo ma'lumot: foydalanuvchilar ./ sudo shtamp -r jamoasi: foydalanuvchilar media / sudo pivo-s jamoasi: foydalanuvchilar ./ # Qayta yuklash va xizmatlarni yoqish echo "yoqish xizmatlari" sudo Tee Tee Tee TeeectTTL Daemon qayta yuklash sudo Tee Tectionctl Camav-Daemonga yoqadi sudo TeekthTL Clavat-Daemonni ishga tushirish # Apache modullarini yoqing Echo "APEAAS2-ni yoqing" sudo a2enmood qayta yozish sudo a2enmod WSGI sudo a2enmod sarlavhalari sudo a2enmod SSL sudo a2enmod proksi sudo a2enmod proksicer_galkorer sudo a2enmod proksist_http sudo a2enmodProxy_wstnelnel # Damonni qayta yuklash va Apache, PostFix va Opendkim qayta ishga tushirish sudo Tee Tee Tee TeeectTTL Daemon qayta yuklash sudo Tee The The Apache2ni qayta ishga tushiring sudo Tee Tee Tee Theendkim PostFix # IPv6 va domen konfiguratsiyasi uchun eng opending shousi aks sado "Quyidagi ma'lumotlarni domen konfiguratsiyasiga nusxalash." xostname -i IP A | grep into IP -6 qo'shimcha | grep "doirasi

! / bin / bash

Kirish buyruqlari

Nano konfigsiyasi
      <small># Git konfigurasi
Yangilash va o'rnatish

Clav antivirusini yoqish

Xost nomini o'rnating
O'rnatish ma'lumotlar bazasini zaxiralash

IPPTUTBE-ni o'chiring

O'rnatish VirtualenV
# Sertifikatni o'rnatish
    success_url = '/' # Run harakati
    def test_func(self): # Foydalanuvchi sozlamalarini o'rnating
Ruxsatnomalarni o'rnating

sudo shtamp -r jamoasi: foydalanuvchilar / var / yugurish /

sudo ildiz otish: ildiz / yugurish / sudo / ts -r

Xizmatlarni qayta yuklash va yoqish

Apache modullarini yoqing
nano users/urls.py
Damonni qayta yuklash va Apache, PostFix va Opendkim qayta ishga tushirish

IPv6 va domen konfiguratsiyasi uchun eng opendkimni ko'rsating

Ushbu kodni ishga tushirishdan oldin, siz sotib olgan domen serverga ulanganligiga ishonch hosil qiling. Buning uchun mahalliy mashinangizda terminalni oching va ushbu buyruqni domeningiz bilan bajaring:
# ping feambabe.com # domeningizni pingdan keyin joylashtiring
# Pingdan keyin domeningizni joylashtiring
Agar hammasi yaxshi ko'rinsa va server javoblar yuborsa, biz skriptni o'tkazishga va paketlarni o'rnatishga, shuningdek, Apache serverimizni yoqish va sertifikatlash uchun tayyormiz.

Postfiksni sozlash uchun zarur bo'lgan barcha sozlamalar, keyinroq ushbu sozlashni ko'rib chiqamiz. Hozirda ushbu sozlash kodini ishga tushiring va serveringizni o'rnatishga va sertifikatlash uchun bir necha daqiqa vaqt olishi kerak. Yana bir bor ismingiz, elektron pochta va domen nomini sotib olgan ismingiz bo'yicha ismingizni almashtirishingizga ishonch hosil qiling.

Endi serverni taqdim etgani, siz har qanday veb-brauzerda URL manziliga borishingiz va server HTTPS boshqarayotganligiga ishonch hosil qiling. Agar yo'q bo'lsa, uni ushlash uchun DNS yozuvlari uchun biroz kutishga harakat qiling va keyin sertifikatni himoya qilish uchun quyidagi buyruqni bajaring:
sudo backup
sudo Citebot - - interfaol duraktiv duranglar - "statsionar-tos-toslar .com -Email @ Gmail.com

Modomiki, siz hamma narsani to'g'ri sozlaganingizda, agar sizning kodingiz ishlaydigan va jonli veb-sahifalarni namoyish etish uchun Apache standart sahifasiga kirishingiz kerak. Keyingi, keling, standart tuzatish rejimini ishlab chiqarishga o'zgartirish uchun sozlamalarni tahrirlaymiz. Shuningdek, biz sozlamalarda, shuningdek ichki IPS domenini sozlaymiz.

nano sizningprojece / sozlamalar.py

Sozlamalarda ushbu liniyalarni o'zgartiring / qo'shing.

Narx = noto'g'ri # Sayt Config Sayt_name = 'feme chaqalog'ingiz' Protocol = 'https' Domen = 'fembabe.com' Sayt_ID = 1 Bas_url = protokoli + ': //' + domen Ruxsat berilgan_hosts = [domen] Ichki_ips = [ "Xx.xx.xx.xx", ]

Saytda konfiguratsiya

Endi biz Apache2-ni sozlashimiz kerak. Konfiguratsiya faylini tahrirlaymiz, biz ushbu chiziq bilan joylashtiramiz:

sudo nano /etc/apach2/ses-aaaail locle-ssl.conf

Ushbu konfiguratsiya fayli unda domen nomimiz va foydalanuvchi va loyiha nomini olishi kerak. Men fembobabe.com, foydalanuvchi ismi jamoasi va Fembobabe Loyiha domen nomidan foydalanyapman.

Serverlar bilan Serveroksens Prod Doimiy / https://femmebabe.com/ qayta yo'naltirish Server hemobabe.com Serveradmin Team@femmebabe.com Hujjatlar / var / www / HTML XatoLog $ {apache_log_dir} / /log $ {Apache_log_dir_dir} /Appcess.log birlashtirilgan Taxallus / statik / uy / jamoa / fembobe / statik Barcha berilgan narsalarni talab qiladi Taxalluslar / media / piktogrammalar / Bosh sahifa / Jamoa / FemeBabe / Media / Barcha berilgan narsalarni talab qiladi Barcha berilgan narsalarni talab qiladi Wsgiscricalsias / /home/teammmeebabe/wemmebabe/wsgi.py WSGIDAMONPOCSS Femmebabe python-punt = / Uy / fembobe / python-uy = / Fevababe / VenV bosher-bufer-bufer-bufer = 100000000000 foydalanuvchi = jamoa Wsgiprootsgroup fembobe WSGIAPPROWGE% {global} Variantlar indekslari haqida Hammasiga yordam berish Qayta yozish Rewritund% {so'rov_usi} \ \ \ \ \ webp | webm | weby | wheg | jpg | svg | webp) $ [NC] Rewritund% {http_referer}! ^ Https: //femmebabe.com/media/.*$ [nc] Qayta yozildi ^ (. +?) / $ / Media / $ 1 [F, L] /Etc/letsencry/options/ssl-apache.conf SSLCERTOLEFILE /TC/letsencrypt/Live/femmebabe.com/fulxain.pem SSLCerteFieFileFile /etc/letsencryct/live/femmebabe.com/pririRey.pem Sarlavhali x-freym-ramkalarni o'rnatdi: "BUMORIGIN" Sarlavha Kirish boshqarmasiga ruxsatnomani "https://femmebabe.com" ni o'rnatadi Vaqt 60000 Cheksiz 0 Sarlavha kesh-boshqaruvni o'rnating "max-asr = 30, jamoat" Server hemobabe.com Serveradmin Team@femmebabe.com Hujjatlar / var / www / HTML XatoLog $ {apache_log_dir} / /log $ {Apache_log_dir_dir} /Appcess.log birlashtirilgan Qayta yozish Rewritecond% {server_name} = fembobebe.com Qayta yozildi ^ https: //% {Server_name}% {so'rov_uti} [end_uti} [end_uti} [end_uti} [end_uti} [end_uti} [end_uti} [end_uti} [end_uti} [end_uti} [end, ne, r = doimiy]

Serveringizni sozlashda ushbu misolda ushbu misolda loyiha, kataloglar va domen nomini almashtirishga ishonch hosil qiling. Endi biz standart saytni o'chirib qo'yishimiz kerak. Bu bashakdan foydalanish mumkin.

sudo a2dissit 000-sentulyal-ssl sudo a2dissit 000 standart sudo a2dissitning asl ssl

Keyin, biz odatiy saytni ta'minlay olamiz va Apache2-ni ham qayta yuklashimiz mumkin. Siz e'lon qilgan Femebabe-ni siz e'lon qilgan faylning nomi bilan almashtirishni unutmang / AP / Saytlar mavjud /.

sudo a2ensite fembobebabebebabe-ssl sudo swectcTL Apache2-ni qayta yuklang

Navbardagi domeningizga qayting. Siz veb-brauzeringizda sozlangan saytni ko'rishingiz kerak. Tabriklaymiz! Agar siz uni ko'rmasangiz, ba'zi o'zgarishlar qilishingiz kerak bo'lishi mumkin. O'zingizning loyihangizdagi sozlamalarni diqqat bilan ko'rib chiqing va xatolar uchun loyihani tekshirish uchun quyidagi buyruqlarni bajaring va quyidagi buyruqlarni bajaring.
ssh-keygen
CD prashinasi venv / bin / faollashtirish python boshqaruvchisi.py tekshirish

Agar sizda Python loyihangizda xatolar bo'lsa, ularni ular qaerda bo'lsa, ularni tuzating. Ularning qayerda ekanligiga qarab, siz xato qilganingizda, xatolaringizni ko'rishingiz mumkin emas.

NANO VANV / LIB / PYTON3.12 / Sayt-paket / Django / Apps / Registry.py
cat ~/.ssh/id_rsa.pub
83-qatorga o'ting, u erda xatolik yuz berganda ("ReweTimeError" ("populyatsiya qilinishi (» populyatsiyani (»to'ldirish), so'ngra xuddi shu chiziqdan oldin sharh qo'shing, so'ngra bir xil indentatsiya, o'z-o'zidan ekranga qo'shing = {}. Bu quyidagicha ko'rinadi:

Agar o'z-o'zidan: # AppconFig-ni ishga tushirish uchun qayta qo'ng'iroq qilishning oldini olish () # Ikki marta. # RunTimeError ("populyatsiya () qayta tug'ilmagan») o'zini o'zi o'z-o'zini boshqarish = haqiqat

AppconFig-ni ishlamaslik uchun qayta qo'ng'iroq qilishning oldini olish ()
ssh-keygen -t rsa -b 4096
Ikki marta.

ReweeTimeError ("populyatsiya () qayta tug'ilmagan»)

Keyin siz Loyihani yana tekshirishingiz va xatoni ochishingiz mumkin.
ssh ubuntu@XX.XX.XX.XX
python boshqaruvchisi.py tekshirish

Keyin siz xatoni ko'rishingiz va uni tuzatishingiz mumkin. Agar sizda o'rnatilganda va kod xatolarsiz kompilyatsiya qilinsa, faylni orqaga o'zgartirganingizga ishonch hosil qiling:

Agar o'z-o'zidan: # AppconFig-ni ishga tushirish uchun qayta qo'ng'iroq qilishning oldini olish () # Ikki marta. ReweeTimeError ("populyatsiya () qayta tug'ilmagan») # o'z-o'zidan, {} o'z-o'zini boshqarish = haqiqat

AppconFig-ni ishlamaslik uchun qayta qo'ng'iroq qilishning oldini olish ()

Ikki marta.
nano sshd_config
o'zini o'zi
# Server onlayn bo'lsa, unda bizda boshqa har qanday o'zgarishlarni amalga oshirsak, serverni qayta yuklash uchun quyidagi buyruqdan foydalanishimiz kerak:
# sudo swectcTL Apache2-ni qayta yuklang
# Ajoyib! Ammo pochta orqali yuborish haqida nima deyish mumkin? Elektron pochtani yuborishni boshlash uchun biz avval domen konfiguratsiyasini yangilashimiz kerak. Bu sizning DNs panelingizda siqilgan yoki qaysi domen nomini ro'yxatdan o'tkazuvchisiz bo'lishi kerak. Shuningdek, biz konfiguratsiyani o'rnatish va qo'shish va bir nechta buyruqlarni ishga tushirishimiz kerak.
# Birinchidan, keling, serverning IPv6 manzilini olamiz. Keyin sizning DNS-ni ochib, yozuvlarni qo'shamiz.
# Serverning IPv6 manzilini olish uchun ushbu buyruqdan foydalaning:
# IP -6 addr
# Endi biz DNS sozlamalariga quyidagi yozuvlarni qo'shamiz. Mening yozuvlarim shunga o'xshaydi. Biroq, yozuvlaringiz uchun siz IP manzilingizni IP bilan almashtirishingiz kerak (75.147.182.214 emas, meniki). Shuningdek, fembobabe.com saytida domeningizni avvalgi buyruq bilan toping (Siz menikimdan foydalana olmaysiz, 725a: FFF: FFF: FFF: 3e02). Endi Domainkey haqida qayg'urmang, bu postfiks, pochta serveri, eng opencim va kalitni chop etishda yaratilgan. Biz buni oxirgi marta sozlaymiz.
# @
A
N / a
75.147.182.214
# @
Mx
10
fembabe.com
# @
Prtasi
N / a
fembabe.com
# @
XABAR
N / a
TXT @ v = SPF1 MX IP75.147.182.214I1: Fe80 :: 725A: FFF: 3e02 ~ barchasi
# default._bimi
XABAR
N / a
v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
# _dmarc
XABAR
N / a
v = dmar1; p = yo'q
# Endi biz postfiks uchun ba'zi konfiguratsiyani qo'shishimiz kerak. Biz qilishimiz kerak bo'lgan narsa - bu siz foydalanayotgan domen nomini, Fembobabe.com-ni almashtirishimiz kerak. Keling, barcha konfiguralarni birma-bir ko'rib chiqaylik va ularni o'zingizning OS-ga o'rnatish uchun ularni loyihamizda konfiguratsiyaga kiritish uchun o'rnatamiz.
# nano config / va boshqalar_postfix_main.cf
# Ushbu matnni faylga qo'shing
# # Sharh /usr/shear/postix/main.cf.DISisti sharhlangan, yanada to'liq versiya


# Debianning o'ziga xos: Fayl nomini ko'rsatish birinchi navbatda amalga oshiriladi
# bu fayl nomi sifatida ishlatilishi kerak.  Debianning odatiy qismi
# / va boshqalar / pochtaName.
#myorigin = / va boshqalar / pochtaName

Smtpd_banner = $ Myhstname ESMTP $ mail_name (ubuntu)
Biff = Yo'q

# Qabul qilish. Gap - bu Mua ishidir.
Append_dot_mydomain = yo'q

# "Kechiktirilgan pochta" ogohlantirishlarini yaratish uchun keyingi qatorni rad etadi
#DeLay_waring_Time = 4h

ReadMe_dairectory = yo'q

# Http://www.postix.org/creadme.html - 3,6 gacha bo'lgan holda
# yangi o'rnatilgan.
muvofiqlik_level = 3.6



# Tls parametrlari
smtpd_tls_cert_file = / va boshqalar / letsencryt / fembobe.com / vsubAn.pem
Smtpd_tls_key_file = / va hk / locesscryt / fembobe.com / fasmi
smtpd_tls_secast_level = may

smtp_tls_capath = / va hbmatiya / serverlar
smtp_tls_session_cache_dacabase = btree: $ {ma'lumot_dayctory} / smtp_cache

SMTPD_RELEY_RASTRICTRILIShIKLARI = SMTIT_SASL_AUTALED, defer_unutut_destering
MyHostname = Femmebabe.com
Alias_maps = XHH: / hat / taxalluslar
Alias_database = XHH: / va hatular
Myorigin = / va boshqalar / MailName
MyDesterinat = fembabe.com, loalhost, $ mhstostname
smtp_helo_name = fembabe.com
mynetworks = 127.0.0/0/8 [: DffFFFing:110.0.0.0.0.0.0.0.0.0.04 [:: 1] / 128
pochta qutisi_seize_limit = 0
qabul qiluvchi_delimiter = +
InT_interfas = barchasi
InT_protokols = Hammasi

# Milter konfiguratsiyasi
Milter_default_ation = qabul
Milter_protokol = 6
SMTPD_MILTILTERS = Mahalliy: /opendkim/openkim.Sock
Notmpd_milters = $ SMTPD_MILTERTERS

smtp_tls_secast_level = shifrlash
smtp_tls_loglevel = 1

Virtual_transport = LMTP: Unix: Xususiy / Dovecot-LMTP

smtpd_sal_path = shaxsiy / haqiqiy
# Sharhlangan, yanada to'liq versiya uchun qarang
# Debianning o'ziga xosligi: Fayl nomini ko'rsatish birinchi navbatda
# Ushbu faylning nomi sifatida ishlatiladigan fayl chizig'i.  Debianning odatiy qismi
# / va boshqalar / pochtaName.
# Myorigin = / va boshqalar / MailName
# Bu kabi.
# "Kechiktirilgan pochta" ogohlantirishlarini yaratish uchun navbatdagi chiziq
# kechikish_vard_time = 4h
# Http://www.postix.org/creadme.html - 3,6 ga standart holda ko'ring
# yangi o'rnatilgan.
# TLS parametrlari
# Masofadan konfiguratsiya
# Keyingi konfig!
# nano config / va boshqalar_postfix_master.cf
# Ushbu satrlarni qo'shing:
# #
# PostFix ustasi-da konfiguratsiya fayli.  Format haqida batafsil ma'lumot uchun
# faylning # masteriga (5) qo'l sahifasiga qarang (buyruq: "5 master" yoki
# on-layn: http://www.postix.org/master.5.html).
#
Ushbu faylni tahrirlagandan so'ng "PostFix Qayta yuklashni unutmang".
#
# ==========================================================================
# Xizmat turi XUSUSIY FRPROUP MRPROP buyrug'i + FAQAT
# (Ha) (Ha) (Yo'q) (hech qachon) (100)
# ==========================================================================
SMTP Intet N - Y - - SMTPD
#smtp inet n - y - 1 Postcreen
#smpd pass - - y - - - SMTPD
#dnsblog Unix - - Y - 0 dnsblog
#Tlspoxy Unix - - Y - Y - Tlspoksi
# Birini tanlang: Faqat loopdan tashqari mijozlar uchun yoki biron bir mijoz uchun topshirish.
# 127.0.0.1: INET N - Y - - SMTPD
INET N - Y - - SMTPD
  -Omtpd_relay_restrictsiyalar = ruxsat_sal_Avecented, rad qilish
  -Omtpd_recriprient_Restrictsiya = Permit_SASL_Avecented, rad qiling
  - syslog_name = postfix / yuborish
  -Omtpd_tls_secast_level = shifrlash
  -Omtpd_tls_wrappermode = yo'q
  -Omtpd_sal_ute_enable = ha
  - smtpd_sa_ty_type = dovecot
  - smtpd_sasl_path = shaxsiy / haqiqiy
# -O syslog_name = postfix / yuborish
# -O SMTPD_TLS_SECARE_LEVEL = shifrlash
# -O SMTPD_SASL_AUTHOUTBE = Ha
# -O SMTPD_TLS_AUTH_ONLY = Ha
# -O SMTTPD_REJORE_RALSELICTENTE = Yo'q
# -O SMTPD_CARE_RASTRICTRILIKLARI
# -O SMTPD_HELO_RASTRICTRILIKLARI = $ MuA_HELO_RARASTISH
# -O SMTPD_Sender_Restrictsiya = $ MuA_Sender_Restrictsiya
# -O SMTPD_RECIPIENT_RASTICTIONLAR =
# -O SMTPD_RELEY_RASTRICTILIKLARI
# -o milter_macro_daemon_name = dastlabki
# Birini tanlang: Faqat bo'shliq mijozlari uchun yoki har qanday mijoz uchun SMTPS-ni yoqing.
# 127.0.0.1: SMTPS Inte N - Y - - SMTPD
#smtps inet n - y - - SMTPD
# - syslog_name = postfik / smtps
# -O SMTPD_TLS_WAPPREMODE = Ha
# -O SMTPD_SASL_AUTHOUTBE = Ha
# -O SMTTPD_REJORE_RALSELICTENTE = Yo'q
# -O SMTPD_CARE_RASTRICTRILIKLARI
# -O SMTPD_HELO_RASTRICTRILIKLARI = $ MuA_HELO_RARASTISH
# -O SMTPD_Sender_Restrictsiya = $ MuA_Sender_Restrictsiya
# -O SMTPD_RECIPIENT_RASTICTIONLAR =
# -O SMTPD_RELEY_RASTRICTILIKLARI
# -o milter_macro_daemon_name = dastlabki
# 628 inet n - y - - - - - - - -
Unix n - y 60 1 pikap
Unix N - Y - 0 tozalash
QMRR Unix N - N 300 1 qmgr
#qmgr Unix n - n 300 1 Oqmggr
TLSMRRAX - - Y 1000?   1 tlsmrgr
Unix - Y - Y - - Tristianial-qayta yozish
Unix - - y - 0 sakrash
defernix defer - - y - 0 sakrash
URACS UXIX - - Y - 0 sakrash
Unix - Y - Y - Y - Yowase
Flush Unix N - Y 1000?   0 Flush
Proksimap Unix - - N - - Proxyap
ProxyWrite Unix - - N - 1 Proksimlap
SMTP Unix - - Y - Smtp
Relay Unix - - Y - - SMTP
        - syslog_name = postfix / $ xizmatingiz_name
# -O smtp_heLo_ingizout = 5-kmtp_connect_ingizout = 5
shellq Unix n - y - - - Shum
xato UNIX - - Y - - Xato
Unix-ni qayta urinish - - Y - - Xato
Unix-ni bekor qiling - y - - bekor qiling
Mahalliy Unix - n n - - Mahalliy
Virtual Unix - n n - - virtual
LMTP Unix - - Y - - LMTP
Anvil Unix - - Y - Anvil
SmOcAc Unix - - y - 1 xalat
Postlog Unix-DGram n - N - 1 Postlogd
#
# ====================================================================
# Postfik dasturiga # interfeyslar. Qo'llanmani tekshirishga ishonch hosil qiling
# PostFix-ning qaysi variantlarini xohlagan variantlarini bilish uchun.
#
# Quyidagi xizmatlarning ko'pi postfiks trubasini (8) etkazib berishdan foydalanadilar
# agent.  Quvurga qarang (8) erkak sahifasi $ {oluvchining}
# va boshqa xabarlar konvertlari variantlari.
# ====================================================================
#
# maildrop. Tafsilotlar uchun PostFix MailDrop_readMe faylini ko'ring.
# Main.cf: maildrop_destinine_reciprient_limit = 1
#
MailDrop Unix - nn - quvur
  Flags = Drxthu foydalanuvchi = Vmail Argv = / USR / USR / COLDROP - $ {oluvchining}
#
# ====================================================================
#
# Yaqinda Cyrus versiyalari mavjud "LMTP" Master.cFning kirishiga kirish mumkin.
#
# Cyrus.conf-da belgilang:
# lmtp cmd = "lmtpd -a" localhost: lMTP "Proto = TCP4
#
# Main.cf-da quyidagilardan yoki bir nechtasini belgilang:
# pochta qutisi_transport = LMTP: Into: loadhost
# virtual_transport = LMTP: Into: lokalhost
#
# ====================================================================
#
# Cyrus 2.1.5 (Amos Gouaauj)
# Main.cf: cyrus_destine_reciprient_limit = 1
#
#cyrus Unix - n n - quvur
# Fracs = DRX foydalanuvchi = Cyrus Argv = / Cyrus / Bin / Bro-Bin / Expencation -M $ {SRATENT} $} $} $} $}
#
# ====================================================================
# Cyrus orqali etkazib berishning eski namunasi.
#
# eski cyrus Unix - n n - quvur
# bayroqs = r user = cyrus argv = / cyrus / blok / etkazib berish -m $ {User}
#
# ====================================================================
#
# Konfiguratsiya tafsilotlari uchun otp_readme faylini ko'ring.
#
UUCP Unix - n n - - quvur
  Flags = FQHU User = UUCP Argv = UUX -R -R -Z - $ Senderer - $ NEXTOP! Rmail ($ qabul qiluvchi)
#
# Tashqi etkazib berish usullari.
#
ifmail Unix - n n - quvur
  Flags = F User = FTN Argv = / USR / LIB / IFIGM -R $ NEXTHOP ($ qabul qiluvchi)
BSMTP Unix - n n - - quvur
  Flags = FQ. Foydalanuvchi = BSMTP ArgV = / USR / BSMTP / BSMTP -T $ NEXTHOP $ SAYTER $ Qabul qiluvchisi
scalemail-orqa fond UNIX - n n - 2 quvur
  Flags = R user = scalemail argv = / usr / scalemail / scalemail-blok $ {User} $ {uzatma}
MailMen Unix - n n - - quvur
  Flags = Frx User = ArgV = / Lib / PostFix-OtFix-Otfix-Omaht-mahlman.py $ {nexthop}
# 
# PostFix usta jarayoni konfiguratsiya fayli.  Format haqida batafsil ma'lumot uchun
# Fayl, magistr (5) Qo'l sahifasiga qarang (buyruq: "erkak 5 master" yoki
# On-layn: http://www.postfix.org/master.5.html).
# 
# Ushbu faylni tahrirlagandan so'ng "PostFix Qayta yuklamoq" ni amalga oshirishni unutmang.
# 
# ==========================================================================
# Xizmat turi XUSUSIY FRPROUP MAXPROUP buyrug'i + args
# (Ha) (Ha) (Yo'q) (hech qachon) (100)
# ==========================================================================
# SMTP Intet N - Y - 1 Postcreen
# SMTPD Pass - - Y - - SMTPD
# DNSBLG UNIX - - Y - 0 dnsblog
# TLSPOXY UNIX - - Y - Tlspoksi
# Birini tanlang: Faqat loopjama mijozlari uchun yoki har qanday mijoz uchun topshirish uchun.
# 127.0.0.1! Intet N - Y - - - SMTPD
# - syslog_name = postfix / yuborish
# -Omtpd_tls_secast_level = shifrlash
# -Omtpd_sal_ute_enable = ha
# -Omtpd_tls_uce_only = ha
# - smpd_reek_un ro'yxatli = yo'q
# -Omtpd_crient_Restrictsiya = $ MuA_Cient_Restriya
# -Omtpd_helo_Restrictsiya = $ Mua_helo_Restriya
# -Omtpder_sender_restrics = $ Mua_sitender_Restriya
# - smtpd_reciection_Restrictsiya =
# -Omtpd_relay_restrictsiyalar = ruxsat_sal_Avecented, rad qilish
# - Mitter_macro_daemon_name = Dastlabki
# Birini tanlang: Faqat bo'shliq mijozlari uchun yoki har qanday mijoz uchun SMTPS-ni yoqing.
# 127.0.0.1 :SMTPS Intet N - Y - - SMTPD
# SMTPS N - Y - - SMTPD
# - syslog_name = postfix / smtps
# -Omtpd_tls_wrappermode = ha
# -Omtpd_sal_ute_enable = ha
# - smpd_reek_un ro'yxatli = yo'q
# -Omtpd_crient_Restrictsiya = $ MuA_Cient_Restriya
# -Omtpd_helo_Restrictsiya = $ Mua_helo_Restriya
# -Omtpder_sender_restrics = $ Mua_sitender_Restriya
# - smtpd_reciection_Restrictsiya =
# -Omtpd_relay_restrictsiyalar = ruxsat_sal_Avecented, rad qilish
# - Mitter_macro_daemon_name = Dastlabki
# 628 InTet N - Y - - - QMQPD
# QMRR Unix N - N 300 1 Oqmggggggr
# -Omtp_heLo_ingizout = 5 -o smtp_connect_ingizout = 5
# 
# ====================================================================
# Postfik bo'lmagan dasturiy ta'minotga interfeyslar. Qo'llanmani tekshirishga ishonch hosil qiling
# Postfik bo'lmagan dasturiy ta'minot sahifalari qanday variantlarini bilish uchun.
# 
# Quyidagi xizmatlarning ko'pi postfiks trubasini (8) etkazib berishdan foydalanadilar
# Agent.  Quvurga qarang (8) erkak sahifasi $ {oluvchining}
# va boshqa xabarlar konvertingiz variantlari.
# ====================================================================

MailDrop. Tafsilotlar uchun PostFix MailDrop_readMe faylini ko'ring.

Main.cf: maildrop_destine_reciprient_limit = 1
nano initialize

====================================================================

# Yaqinda Cyrus versiyalari mavjud "LMTP" Master.cF kirishidan foydalanishi mumkin.

Cyrus.conf-da belgilang:

LMTP CMD = "LMTPD -A" localhost: lMTP "Proto = TCP4

Asosiy.cf-da quyidagilardan biridir yoki bir nechtasini belgilang:
ssh team@XX.XX.XX.XX
pochta qutisi_transport = LMTP: Into: loadhost

Virtual_transport = LMTP: Into: loalhost

====================================================================

cat ~/.ssh/id_rsa.pub
Cyrus 2.1.5 (Amos Gouaaa)

Main.cf: cyrus_destine_reciprient_limit = 1

git clone git://github.com/you/yourproject.git
Cyrus Unix - n n - quvur

Flags = DRX foydalanuvchi = Cyrus Argv = / Cyrus / Bin / Expence -M $ {SRATER} $} $} $ {User}

ls
====================================================================

Cyrus orqali etkazib berishning eski namunasi.

cp -r yourproject whatyoucalledit
eski cyrus Unix - n n - quvur

Flags = R foydalanuvchi = Cyrus Argv = / Cyrus / Bin / Expence -M $} $ {User}

sudo nano /usr/bin/ascript
====================================================================

Konfiguratsiya tafsilotlari uchun UUCP_RERREAE faylini ko'ring.
# 
    echo "# 
Boshqa tashqi etkazib berish usullari.

Va eng openkim konfiguratsiyasi. OpendKim, domen kalitlari bo'lgan elektron pochta serverlarini, ularni yanada xavfsizroq qilish uchun aniqlaydi. Usiz pochta imzosi imzolanmaydi va uni kirish qutisiga kiritmasligi mumkin.
sudo chmod a+x /usr/bin/ascript
nano config / va boshqalar_default_opendkim

Ushbu satrlarni qo'shing:

# Izoh: Bu eski konfiguratsiya fayli. Bu openkim tomonidan ishlatilmaydi # tizimd xizmati. Iltimos, tegishli konfiguratsiya parametrlaridan foydalaning # /etc/opendkim.conf o'rniga. # # Ilgari, bu erda standart sozlamalarni tahrirlash va keyin bajarishi mumkin # /lib/openkim/opendskim.service.se-ni yaratish uchun fayllarni bekor qilish # /etc/systemd/System/Onenkim.Service.D/override.conf va # /etc/tmpfilfer.d/openkim.conf. Bu hali ham mumkin bo'lsa-da, endi u # Sozlamalarni to'g'ridan-to'g'ri /etc/openkim.conf-da sozlash tavsiya etiladi. # # Deemon_opts = "" # Var / Spool / PostFix / PostFix / Oph / Openkim-ni ugix rozetkadan foydalanish uchun № postfix: # Rundir = / vab / postfik / yugurish / openkim Rundir = / yugurish / openkim # # Muqobil rozetkani belgilash uchun krastka # Shuni ko'rsatadiki, bu sozlamani sozlash har qanday sokendim.conf-dagi har qanday soket qiymatini bekor qiladi # Standart: Soket = "Mahalliy: /var/pool/postix/opendkim/openkim.Sock" # 54321 portidagi barcha interfeyslarni tinglang: # Soket = inet: 54321 # 12345 portidagi loopni tinglang: # Soket = inet: 12345 @ localhost # 192.0.2.1-ni tinglash 12345 portda: # Soket = inet: 12345@192.2.1.1 Foydalanuvchi = eng opendkim Guruh = eng opendkim Pidfile = $ rundir / $ ismli ismi.pid Serofte =
# Eslatma: Bu eski konfiguratsiya fayli. Bu openkim tomonidan ishlatilmaydi
# Tizimd xizmati. Iltimos, tegishli konfiguratsiya parametrlaridan foydalaning
# /etc/openkim.conf o'rniga.
# 
# Ilgari, standart sozlamalarni bu erda tahrirlash va keyin bajarishi mumkin
# /lib/openkim/opendskim.service.serce-ni yaratish uchun fayllarni bekor qilish
# /etc/systemd/ystem/openkim.service.d/override.conf va
# /etc/tmpfiles.d/openkim.conf. Bu hali ham mumkin bo'lsa-da, endi u
# Belgilarni to'g'ridan-to'g'ri /etc/openkim.conf-da moslashtirish tavsiya etiladi.
# 
# Demon_opts = ""
# UNIX rozetkasidan foydalanish uchun / vab / spool / postfik / PostFix / PostFix / PostFix / Ophxkim o'zgaradi
# postfix surdrxix:
# Rundir = / var / spora / postfik / yugurish / openkim
# 
# Alternativ rozetkani belgilash uchun kvulsatsiya
# Shuni esda tutingki, bu sozlash har qanday sokim qiymatini openkim.conf-da bekor qiladi
# Odatiy:
# 54321 portidagi barcha interfeyslarni tinglang:
# Soket = inet: 54321
# 12345 portdagi loopni tinglang:
pip3 install --upgrade opencv-python # Soket = inet: 12345 @ localhost
pip3 install --upgrade opencv-contrib-python # 192.0.2.1-ni tinglang 12345 portida:
# Soket = inet: 12345@192.2.1.1
# nano config / va boshqalar_dovecot_conf.d_10-master.conf
# Ushbu satrlarni qo'shing:
# 0-master.conf 
#default_pocess_limit = 100
#Default_client_limit = 1000

# Standart VSZ (virtual xotira hajmi) Xizmat jarayonlari uchun cheklovlar. Bu asosan
# ular ovqatlanishdan oldin xotirjamlikni olib tashlash va o'ldirish uchun mo'ljallangan
# hamma narsa.
#Default_vsz_limit = 256M

# Kirish foydalanuvchi kirish jarayonlari tomonidan ichki ravishda foydalaniladi. Bu eng ishonchsiz
# Dovecot tizimida foydalanuvchi. Hech narsaga erishmasligi kerak.
#Default_login_user = dovenull

# Ichki foydalanuvchi kam uchraydigan jarayonlardan foydalaniladi. Bundan tashqari ajralib turishi kerak
# Login foydalanuvchi, shunda kirish jarayonlari boshqa jarayonlarni bezovta qila olmaydi.
#Default_interalog_user = Dovecot

Xizmat IMAP-login {
  InT_listerener IMAP {
    #port = 143
  }
  inet_liisterer imkumplar {
    #port = 993
    #ssl = ha
  }

  # Yangi jarayonni boshlashdan oldin ishlov berish uchun ulanishlar soni. Har xil
  # Faqat foydali qiymatlar 0 (cheksiz) yoki 1. 1 ko'proq xavfsiz, ammo 0
  # tezroq. 
  #Serce_count = 1

  # Har doim ko'proq ulanishlarni kutishni davom ettirish uchun jarayonlar soni.
  #pocess_min_avea = 0

  # Agar siz xizmat_count = 0 o'rnatsangiz, ehtimol siz buni etishtirishingiz kerak.
  #VSZ_LILIMIT = $ to'lov_vsz_limit
}

Xizmat post3-login {
  inet_listener pop3 {
    #port = 110
  }
  inet_listener pop3s {
    #port = 995
    #ssl = ha
  }
}

Xizmatni yuborish-login {
  Int_listerni yuborish {
    #port = 587
  }
}

LMTP {
  Unix_lister se / spoo / postfik / shaxsiy / Dovecot-LMTP {
    Guruh = Postfix
    rejimi = 0666
    Foydalanuvchi = Postfix
  }

  # Yuqoridagi UNIX rozetkasidan foydalana olmasangiz, ineet tinglovchisini yarating
  #inet_listener lmp {
    # Butun Internet uchun LMTP-ni ko'rinmasligidan qoching
    #AdDress =
    #port = 
  #}
}

Xizmat IMAP {
  # Xotiralarning aksariyati MMAP () fayllarini olish uchun ketadi. Siz buni ko'paytirishingiz kerak bo'lishi mumkin
  Agar sizda katta pochta qutilari bo'lsa, cheklash.
  #VSZ_LILIMIT = $ to'lov_vsz_limit

  # Maksimal. IMAP jarayonlar soni (ulanishlar)
  #pocess_limit = 1024
}

Xizmat pop3 {
  # Maksimal. Pop3 jarayonlar soni (ulanishlar)
  #pocess_limit = 1024
}

Xizmatni yuborish {
  # Maksimal. SMTP taqdim etish jarayonlar soni (ulanishlar)
  #pocess_limit = 1024
}

Xizmat [
  # aut_socket_pate ushbu Userb rozetkaga ishora qiladi. Bu odatda
  # Dovecot-LDA, DovadeM, ehtimol iMAP jarayoni va boshqalar tomonidan ishlatilgan
  # Ushbu rozetkaga to'liq ruxsatnomalar barcha foydalanuvchi nomlari ro'yxatini olish imkoniyatiga ega va
  # har kimning foydalanuvchisining izuplari natijalarini oling.
  #
  # Standart 0666 rejim har kimga rozetkaga ulanishga imkon beradi, ammo
  # SandDB qidiruvlar faqat Foydalanuvchi "UID" maydonini qaytargan bo'lsa, muvaffaqiyatga erishadi
  # qo'ng'iroq qiluvchi jarayonining UID-ga mos keladi. Agar qo'ng'iroq qiluvchining UID yoki GID ga mos bo'lsa
  # rozetkaning UID yoki ko'rinishi mumkin. Boshqa hech narsa muvaffaqiyatsizlikka olib keladi.
  #
  # Barcha foydalanuvchilar qidirish uchun qo'ng'iroq qiluvchiga to'liq ruxsat berish uchun rejimni tuzing
  # 0666 dan boshqa narsa va Dovecot yadroga olib borishga imkon beradi
  # Ruxsatnomalar (E.G. 0777 barchaga to'liq ruxsat berilgan).
  Unix_listencher / var / spool / postfik / shaxsiy / haqiqiy {
    rejimi = 0660
    Foydalanuvchi = Postfix
    Guruh = Postfix
  }
}

Xizmatning aud-ishchisi {
  # Haqiqiy ishchi jarayoni foydalanish mumkin, shunda u kirish mumkin
  # / va boshqalar / soya. Agar bu kerak bo'lmasa, foydalanuvchi o'zgartirilishi kerak
  # $ sental_interalog_user.
  #user = ildiz
}

Xizmat diktenti {
  # Agar DIKT proksi ishlatilsa, pochta jarayonlari uning rozetkasidan kirish huquqiga ega bo'lishi kerak.
  # Masalan: Mode = 0660, Guruh = Ajma va global mail_macess_groups = amail
  Unix_listener diktept {
    #Mode = 0600
    #user = 
    #Group = 
  }
}
# decault_pocess_limit = 100
# decault_client_limit = 1000
# Odatiy VSZ (virtual xotira hajmi) Xizmat jarayonlari uchun cheklovlar. Bu asosan
# ular ovqatlanishdan oldin bo'shashmasdan jarayonlar va o'ldirish uchun mo'ljallangan
# hamma narsa.
# decault_vsz_limit = 256 m
# Kirish foydalanuvchisi kirish jarayonlar orqali ichki qo'llaniladi. Bu eng ishonchsiz
# Dovecot tizimidagi foydalanuvchi. Hech narsaga erishmasligi kerak.
# decault_login_user = divanull
# Ichki foydalanuvchi kam uchraydigan jarayonlardan foydalaniladi. Bundan tashqari ajralib turishi kerak
# Kirish Foydalanuvchi, shunda kirish jarayonlari boshqa jarayonlarni bezovta qila olmaydi.
# decault_enteral_user = dovecot
# port = 143
# port = 993
# SSL = Ha
# Yangi jarayonni boshlashdan oldin ishlov berish uchun ulanishlar soni. Har xil
# Faqat foydali qiymatlar 0 (cheksiz) yoki 1. 1 ko'proq xavfsiz, ammo 0
# tezroq. <doc / Wiki / Loginpocess.txt>
# Xizmat_count = 1
# Har doim ko'proq ulanishlarni kutishni davom ettirish uchun jarayonlar soni.
# Jarayon_min_avea = 0
# Agar siz xizmat_count = 0 o'rnatsangiz, ehtimol siz buni etishtirishingiz kerak.
# VSZ_LILIMIT = $ to'lov_vsz_limit
# port = 110
# port = 995
# SSL = Ha
# port = 587
# Agar siz yuqoridagi UNIC rozetkasidan foydalana olmasangiz, ineet tinglovchisini yarating
# InT_listener LMPP {
# Butun Internet uchun LMTP ko'rinishni oldini oling
# Manzil =
port =

}

Xotiralarning aksariyati MMAP () fayllarini olish uchun ketadi. Siz buni ko'paytirishingiz kerak bo'lishi mumkin

Agar sizda katta pochta qutilari bo'lsa, cheklang.

VSZ_LILIMIT = $ to'lov_vsz_limit

Maks. IMAP jarayonlar soni (ulanishlar)

Jarayon_limit = 1024

Maks. Pop3 jarayonlar soni (ulanishlar)

Jarayon_limit = 1024

Maks. SMTP taqdim etish jarayonlar soni (ulanishlar)

Jarayon_limit = 1024

auth_socket_pate ushbu Userb rozetkaga ishora qiladi. Bu odatda

Dovecot-LDA, DavadeM, ehtimol iPap jarayoni va boshqalar tomonidan ishlatilgan foydalanuvchilar

Ushbu rozetkaga to'liq ruxsatnomalar barcha foydalanuvchi nomlari ro'yxatini olishi mumkin va

Hammaning foydalanuvchisining izohlari natijalarini oling.

Standart 0666 rejimi har kimga rozetkaga ulanishga imkon beradi, ammo
# Foydalanuvchi "UID" maydonini qaytargan taqdirdagina Userdb izohlari muvaffaqiyatli bo'ladi
# qo'ng'iroq qiluvchi jarayonining UIDga mos keladi. Agar qo'ng'iroq qiluvchining UID yoki GID ga mos bo'lsa
# rozetkaning UID yoki ko'rinishi muvaffaqiyatli amalga oshiriladi. Boshqa hech narsa muvaffaqiyatsizlikka olib keladi.
# 
# Barcha foydalanuvchilar qidirish uchun qo'ng'iroq qiluvchiga to'liq ruxsat berish uchun rejimni tuzing
# 0666 dan boshqa narsa va Dovecot yadroga rioya qilishga imkon beradi
# Ruxsatnomalar (E.G. 0777 barchaga to'liq ruxsat berilgan).
# Aticer ishchi jarayoni kirish mumkin, shunda u kirish mumkin
# / va boshqalar / soya. Agar bu kerak bo'lmasa, foydalanuvchi o'zgartirilishi kerak
# $ sental_interalog_user.
# Foydalanuvchi = ildiz
# Agar DIKT proksi ishlatilsa, pochta jarayonlari uning rozetkasidan kirish huquqiga ega bo'lishi kerak.
# Masalan: Mode = 0660, Guruh = Fmail va global mail_acess_groups = amail
# rejimi = 0600
# Foydalanuvchi =
# Guruh =
# Yana bir bor ushbu fayllarning barchasini, Fembabe.com, siz tanlagan domen bilan almashtiramiz. Keyingi faylni tahrirlash, Dovecotning konfigurasi,
# nano config / va boshqalar_dovecot_dovecot
# Va bu chiziqlarni qo'shing
# ## Dovecot konfiguratsiya fayli

# Agar shoshilsangiz, http://wiki2.dovecot.org/quitconfiguratsiyasiga qarang

# "Doveconf -N" buyrug'i o'zgargan sozlamalar uchun toza mahsulotni beradi. Undan foydalaning
# nusxa ko'chirish va joylashtirish; Dovecot yuborish ro'yxatiga joylashtirganda fayllar.

# '#' Xarakter va undan keyin hamma narsa sharh sifatida munosabatda bo'lishadi. Qo'shimcha joylar
# va yorliqlar e'tiborsiz qoldiriladi. Agar siz ikkalalardan birini aniq ishlatishni xohlasangiz, qo'ying
# Ichki narxlar, masalan.

# Ko'p (lekin barchasi emas) Sozlamalarni turli protokollar va / yoki yoki yoki
# Sozlamalardagi sozlashlarni joylashtirish orqali # Manba / manzil
# protokol imap {}, mahalliy 127.0.0.1 {}, masofadan 10.0.0/8 {}

# Standart qiymatlar har bir sozlama uchun ko'rsatiladi, bu talab qilinmaydi
# bular. Bular bundan mustasno: ba'zi bo'limlar yo'q (masalan, nomlar
# yoki plagin sozlamalari sukut bo'yicha qo'shiladi, ular faqatgina namuna sifatida ro'yxatlashadi.
# Yo'llar, shuningdek, sozlash asosida haqiqiy standartlar mavjud
# variantlar. Bu erda keltirilgan yo'llar konfiguratsiya qilish uchun --Prefrix = / usr
# - --sysconFDIR = / va hokazo - / va va xil

# O'rnatilgan protokollarni yoqing
! Qo'shin varesponcot/protokot.d/*.proprokol

# U ulanishlar uchun tinglash uchun IPS yoki Xostlarning vergulini ajratish. 
# "*" Barcha IPV4 interfeyslarida "::" Barcha IPV6 interfeyslarini tinglaydi.
# Agar siz hech bo'lmaganda bo'lmagan portlarni yoki boshqa kompleks narsani ko'rsatmoqchi bo'lsangiz,
# conce.d / master.conf.
# ro'yxaten = *, ::

# BAW katalogida ishlaydigan ma'lumotlarni saqlash kerak.
#base_da = / var / yugurish / Dovecot

# Ushbu misol nomi. Ko'p instantsiya divadeM va boshqa buyruqlarda
# qaysi misoldan foydalanilganligini tanlashingiz mumkin (alternativa
# to -c). Masalan nomli Dovecot jarayonlariga ham qo'shildi
# PS chiqishi bo'yicha.
#instance_name = dovecot

# Mijozlar uchun tabriklash xabari.
#login_grewting = dovecot tayyor.

# Kosmik joy ajratilgan tarmoq punktlari ro'yxati. Ulanishlar
# IPS o'z IP manzillari va portlarini bekor qilishga ruxsat beriladi (kirish uchun va
autentifikatsiya tekshiruvlari uchun # o'chirish_PRElantht_Aute ham e'tiborga olinmaydi
# ushbu tarmoqlar. Odatda, siz bu erda iMAP proksi-serveringizni ko'rsatasiz.
#login_Treted_networks =

# Kirish Kirish Kirishni tekshirish rockets (E.G. TCPRAP)
#login_ccess_Sockets = 

# Proksi_maybe = Ha, agar proksi manzil ushbu IPSning birortasiga mos kelmasa, qilmang
# prognozlash. Bu normal holat, ammo agar maqsad bo'lsa foydali bo'lishi mumkin
# IP - bu E.G. yuklash balansining IP.
#Auth_poxy_ O'zingiz =

# Ko'proq og'zaki jarayon sarlavhalari (PS). Hozirda foydalanuvchi ismini ko'rsatadi va
# IP manzili. IMAP jarayonlaridan foydalanayotganini ko'rish uchun foydali
# (masalan, umumiy pochta qutilari yoki bir xil turdagi hisoblar uchun ishlatiladigan bo'lsa).
#verbose_proctitle = yo'q

# Dovecot ustasi jarayoni o'chirilganda barcha jarayonlar o'ldirilishi kerak.
# Buni "yo'q" ga belgilash Dovecotsiz modernizatsiya qilinishi mumkinligini anglatadi
# Mavjud mijoz ulanishlarini yopish (ham bo'lishi mumkin bo'lsa ham)
# Agar yangilanish E.G bo'lsa, muammo. xavfsizlik fixi tufayli).
#shutdown_clents = ha

# Agar nolga teng bo'lmagan bo'lsa, pochta buyurgan holda DavadeM Serverga bu ko'p ulanish orqali pochta buyuradi.
# ularni to'g'ridan-to'g'ri xuddi shu jarayonda yugurish o'rniga.
#Dovardm_worker_count = 0
# Unix rozetkasi yoki xost: DevadeM serveriga ulanish uchun ishlatiladigan port
#Dovardm_socket_Path = DovadeM-Server

# Kosmik ajratilgan Dovecotda saqlanadigan atrof-muhit o'zgaruvchilarining ro'yxati
# Ishga tushirish va barcha bolalarning barcha jarayonlariga o'tdi. Siz ham berishingiz mumkin
# tugma = har doim aniq sozlamalarni o'rnatadigan qiymat juftlari.
#import_environment = tz

##
## Dictionary server sozlamalari
##

# Lug'atni saqlash uchun ishlatilishi mumkin = qiymat ro'yxatlari. Bu bir necha qo'llaniladi
# plaginlar. Lug'at to'g'ridan-to'g'ri yoki garchiga kirish mumkin
# lug'at serveri. Quyidagi Dike blok blokirovkalari xaritalarining xristian nomlari
# Server ishlatilganda. Keyin ular Uris yordamida formatda ishlatilishi mumkin
# "Proksi ::".

dikty {
  #quota = mysql: /etc/dovecot/dovecot-doct-skl.confcemat
}

# Haqiqiy konfiguratsiya quyida keltirilgan. Filen nomlari
birinchi marta ASCII qiymati bo'yicha tartiblangan va shu tartibda tahlil qilingan. 00 prefikslari
# Fayl nomlarida buyurtmani tushunishni osonlashtirish uchun mo'ljallangan.
! Konf.D / *. Balki

# Konfiguratsiya faylini ham xato qilmasdan kiritishga harakat qilishi mumkin
# Bu topilmadi:
! Qo'shin-javob

Passdb {
  haydovch = passwd-fayl
  args = / va hokazo / dovecot / passwd
}
Foydalanuvchi dasturi {
  haydovch = passwd
}

Protokollar = imap pop3

# Barcha kiritishlarni tinglash uchun dovecot (IPV4 / IPV6)

Ting = *, ::
Dovecot konfiguratsiya fayli

Agar siz shoshayotgan bo'lsangiz, http://wiki2.dovecot.org/quitconfiguratsiyasiga qarang

"Doveconf -N" buyrug'i o'zgargan sozlamalar uchun toza mahsulotni beradi. Undan foydalaning
ping femmebabe.com # Dovecot pochta ro'yxatiga joylashtirilganda fayllarni nusxalash va joylashtirish o'rniga.
'Xarakter va undan keyin hamma narsa sharh sifatida munosabatda bo'lishadi. Qo'shimcha joylar

va yorliqlar e'tiborsiz qoldiriladi. Agar siz ikkalalardan birini aniq ishlatishni xohlasangiz, qo'ying

char va orqa bo'sh joy "

Ko'pincha (lekin barchasi emas) Sozlamalarni turli protokollar va / yoki

Sozlamalar qatoriga sozlashlarni joylashtirish orqali IPSning manbai / yo'nalishi, masalan:

Protokol IMAP {}, mahalliy 127.0.0.1 {}, masofadan 10.0.0/8 {}

Standart qiymatlar har bir sozlama uchun ko'rsatiladi, bu talab qilinmaydi
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
ular. Bular bundan mustasno: ba'zi bo'limlar yo'q (masalan, nomlar

yoki plagin sozlamalari sukut bo'yicha qo'shiladi, ular faqat misollar sifatida ro'yxatlanadilar.

Yo'llar, shuningdek, sozlash asosida haqiqiy standartlar mavjud
nano yourproject/settings.py
Variantlar. Bu erda keltirilgan yo'llar konfiguratsiya qilish uchun --Prefrix = / usr

--sysconfDir = / va hokazo

O'rnatilgan protokollarni yoqing
# Ulanish uchun tinglash uchun JPlar yoki xostlarning vergulini ajratish.
"*" Barcha IPV4 interfeyslarini tinglaydi, "::" Barcha IPV6 interfeyslarini tinglaydi.

Agar siz hech bo'lmaganda bo'lmagan portlarni yoki boshqa kompleks narsani ko'rsatmoqchi bo'lsangiz,

Konf.D / Master.conf tahrirlash.
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Ting = *, ::

BAW katalogida ishlaydigan ma'lumotlarni saqlash kerak.

Base_da = / Var / Run / Dovecot /
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>
Ushbu misol nomi. Ko'p instantsiya divadeM va boshqa buyruqlarda

qaysi misoldan foydalanilishini tanlash uchun -i <inster_name> tugmachadan foydalanishingiz mumkin (alternativa

to -c <config_patat>). Masalan nomli Dovecot jarayonlariga ham qo'shildi
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
PS chiqishi bo'yicha.

masalan_name = dovecot

Mijozlar uchun salomlashish.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Login_Greaking = Dovecot tayyor.

Kosmik ishonchli tarmoq punktlari ro'yxati. Ulanishlar

IPS o'z IP-manzillari va portlarini bekor qilishga ruxsat beriladi (kirish uchun va
cd projectname
source venv/bin/activate
python manage.py check
autentifikatsiya tekshiruvlari uchun). o'chirish_PRElantht_Aute ham e'tiborga olinmaydi

Ushbu tarmoqlar. Odatda, siz bu erda iMAP proksi-serveringizni ko'rsatasiz.

Login_TReFed_netWors =
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Kosmik ajratilgan login-logollik tekshiruvi (E.G. TCPRAP)

Kirish_Access_Sockets =

Proksi_maybe bilan: Agar proksi-noboni ushbu IPSning birortasiga mos kelmasa, qilmang
                # proksistik. Bu normal holat, ammo agar maqsad bo'lsa foydali bo'lishi mumkin
                # IP - E.G. yuklash balansining IP.
# aut_poxy_ o'z-o'zidan =
Ko'proq jarayonlarni ko'rsating (PS). Hozirda foydalanuvchi ismini ko'rsatadi va

IP manzili. IMAP jarayonlaridan foydalanayotganini ko'rish uchun foydali

(masalan, bir nechta pochta qutilari yoki bir xil hisoblar uchun ishlatiladigan bo'lsa).
python manage.py check
Verve_prctitel = Yo'q

Dovecot ustasi jarayoni o'chirilganda barcha jarayonlar o'ldirilishi kerak.

Buni "yo'q" ga belgilash Dovecototsiz modernizatsiya qilinishi mumkinligini anglatadi
                # Mavjud mijozlar ulanishlarini yopish (ham bo'lishi mumkin bo'lsa ham)
                # Agar yangilanish E.G bo'lsa, muammo. xavfsizlik fixi tufayli).
# o'chirish_clents = ha
Agar nolga teng bo'lmagan bo'lsa, pochta buyruqlari DevadeMM serveriga bu ko'p ulanish orqali.

ularni to'g'ridan-to'g'ri xuddi shu jarayonda yugurish o'rniga.

DovaseM_worker_count = 0
sudo systemctl reload apache2
Unix rozetkasi yoki xost: DavadeM serveriga ulanish uchun ishlatiladigan port

DovaseM_Socket_Path = DovadeadM-server

Kosmik ajratilgan, Dovecotda saqlanadigan atrof-muhit o'zgaruvchilarining ro'yxatini ajratib ko'rsatdi

ishga tushirildi va uning barcha bolalar jarayoni oldidan o'tdi. Siz ham berishingiz mumkin

Kalit = har doim aniq sozlamalarni belgilash uchun qiymat juftlari.

Import_enVironment = Tz

ip -6 addr
Lug'at server sozlamalari

Lug'atni saqlash uchun ishlatish mumkin = qiymat ro'yxatlari. Bu bir necha qo'llaniladi

plaginlar. Lug'at to'g'ridan-to'g'ri yoki garchiga kirish mumkin

lug'at serveri. Quyidagi Dike blok blokirovkalari xaritalarining xristian nomlari

Server ishlatilganda. Keyin ular Uris yordamida formatda ishlatilishi mumkin

"Proksi :: <ism>".

kvota = mysql: /etc/dovecot/dovecot-doct-skl.confcemat

Haqiqiy konfiguratsiya quyida keltirilgan. Filen nomlari

Avval ularning ASCII qiymati bo'yicha tartiblanadi va shu tartibda tahlil qilinadi. 00 prefikslari

Filen nomlarida buyurtmani tushunishni osonlashtirish uchun mo'ljallangan.

Konfiguratsiya faylini ham xato qilmasdan qo'shilishi mumkin

Bu topilmadi:

Dovecotni barcha kiritishlarni tinglashga imkon beradi (IPV4 / IPV6)

Dovecot foydalanuvchisi uchun parol qo'shing:

nano config / va boshqalar_dovecot_aswdwd

Faylning birinchi qismi, yo'g'ondan oldin foydalanuvchi nomi. So'nggi qism, "diqqatda tutgan so'z", pochta serveringizni bermoqchi bo'lgan parolni anglatadi.

Jamoa: {ONCEPRUC so'zi

Keyingi, eng openkki konfigsiyasi
nano config/etc_postfix_main.cf
nano config / va boshqalar_opendkim.conf

Va ushbu satrlarni qo'shing:

# Bu imzo va tekshirish uchun asosiy konfiguratsiya. Bu oson bo'lishi mumkin # asosiy o'rnatish moslamasiga moslashtirilgan. Openkki.conf (5) va # /usr/share/doc/opendkim/examels/opendskim.conf.SUSIT uchun # Mavjud konfiguratsiya parametrlarini hujjatlashtirish. Syslog ha Syslogsuccess Ha #Logwhy yo'q # Umumiy imzo va tekshirish parametrlari. Debianda, "" boshchidan " # A'zlatlar, chunki ko'pincha obro'si tizimlari tomonidan ishlatiladigan shaxsiyat kaliti # va shu bilan bir oz xavfsizlik sezgir. Kanonikalizatsiya yengil / sodda S Subdompaniyalar yo'q Qatiqchilar # Domenni, selektor va kalitni (zarur) imzolash (zarur). Masalan, imzo cheking # "namunaviy.com" domeni uchun "2020" (2020._Doinkey.exame.com), # Shaxsiy kalitdan foydalanib, /etc/dkimkeyS/example.pelprivate. Ko'proq granula # Setup Variantlarini /usr/shear/doc/openkim/RadeMe.Onendkimga topish mumkin. #Omama-misol.com # -Eloctor 2020 #Keyfile /etc/dkimkeyS/ex uptle.phe # Debianda, eng openkim foydalanuvchi "eng openkim" sifatida ishlaydi. 007-sonli Umas talab qilinadi # rozetkaga ega bo'lmagan mahalliy rozetkadan foydalanish # foydalanuvchi (masalan, postfik). Guruhga "Postfix" foydalanuvchi qo'shishingiz kerak bo'lishi mumkin # bu holda # "eng openkim". Userid openkim Umac 007 # MTA ulanishiga rozetka (talab qilinadi). Agar MTA Jaro qamoqxonasida bo'lsa, # rozetkaga kirish mumkinligini ta'minlash kerak. Debianda, postfix yuguradi # Jount / Spool / postfiks, shuning uchun u Unix rozetka bo'lishi kerak edi # Quyidagi oxirgi qatorda ko'rsatilganidek sozlangan. #Socket Light: /Run/opendkim/opendkim.Sock #Setket inet: 8891 @ localhost #Socket Inet: 8891 Socket Light: /VAR/Spool/postix/opendkim/openkim.Sock Pidfile /Run/opendkim/opendskim.pid Tekshirish o'rniga belgilanadigan # mezbonlar standart 127.0.0.1. Qarang # Qo'shimcha ma'lumot olish uchun Operending (8) ning operatsiya bo'limi. #Axalnalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0/2 # Ishonchli lashkar DNSSECga yoqadi. Debianda, ishonchli langar fayli taqdim etiladi # dns-root-ma'lumotlar to'plamida. Trenchorfile /usr/share/dns/root.key # Start 127.0.0.1 # Xabarlarni imzolash uchun ishlatiladigan kalitlardan foydalanilgan harflardagi domenlar Asosiy rad javob: /etc/openkim/key.tey Imr bilan Rad etish: /etc/openkim/sagecing.Table # Pochtasini imzolash kerak bo'lgan ichki xostlar to'plami INTHHOSTS/OPC/OPENTKIM/TRETTON.HASTS
# Bu imzo va tekshirish uchun asosiy konfiguratsiya. Bu oson bo'lishi mumkin
# asosiy o'rnatish moslamasiga moslashtirilgan. Openkki.conf (5) va
# /uSR/shear/openkim/examellar/opendskim.conf.SUSIT uchun
# Mavjud konfiguratsiya parametrlari hujjatlari.
# Loghhy-ni yo'q
# Umumiy imzo va tekshirish parametrlari. Debianda, "" boshchidan "
# Dehnatlangan, chunki ko'pincha obro'li tizim tomonidan ishlatiladigan shaxsiyat kaliti
# va shuning uchun biroz xavfsizlik sezgir.
# Domenni, selektor va kalitni imzolash (zarur). Masalan, imzo cheking
# "namunaviy.com" domeni uchun "2020" (2020._Doinkey.Exame.com),
# Xususiy kalitdan foydalanish /etc/dkimkeyS/example.pelphict. Ko'proq granula
# O'rnatish variantlarini /usr/share/OCKim/Readme.Onendkim-dan topish mumkin.
Domen misol.com

Selektor 2020

Klaviatch /etc/dkimkeyS/example.phe
nano config/etc_postfix_master.cf
Debianda eng openkim foydalanuvchi "eng openkim" sifatida ishlaydi. 007-sonli Umas talab qilinadi

rozetkaga ega bo'lmagan mahalliy rozetkadan foydalanadigan mahalliy rozetkadan foydalanish

foydalanuvchi (masalan, postfik). Guruhga "Postfix" foydalanuvchi qo'shishingiz kerak bo'lishi mumkin
# Bunday holda "eng opendkim".
# MTA ulanishiga rozetka (talab qilinadi). Agar MTA Jaro qamoqxonasida bo'lsa,
# rozetkaga kirish imkoniyati mavjudligini ta'minlash kerak. Debianda, postfix yuguradi
# chastota / var / spool / postfiks, shuning uchun u Unix rozetkasi bo'lishi kerak edi
# Quyidagi oxirgi qatorda ko'rsatilganidek sozlangan.
# Soketal: /Run/opendkim/opendkim.Sock
# Soket inet: 8891 @ localhost
# Soket inet: 8891
# Tekshirish o'rniga belgilanadigan mezbonlar, standart 127.0.0.1. Qarang
# Eng ko'p ma'lumot olish uchun OPENENCIM (8) ning operatsiyasi.
# 192.1668.0.0/16, 10.0.0/8, 172.16.0/12
# Ishonchli langar DNSSECga imkon beradi. Debianda, ishonchli langar fayli taqdim etiladi
# dns-ildiz ma'lumotlari bilan.
# Notererlar 127.00.1
# Xabarlarni imzolash uchun ishlatiladigan tugmachalarga manzillardagi domenlar
# Pochta orqali imzolanishi kerak bo'lgan ichki xostlar to'plami
# nano config / va boshqalar_default_opendkim
# Va bu chiziqlarni qo'shing
# # Izoh: Bu eski konfiguratsiya fayli. Bu openkim tomonidan ishlatilmaydi
# tizimd xizmati. Iltimos, tegishli konfiguratsiya parametrlaridan foydalaning
# /etc/opendkim.conf o'rniga.
#
# Ilgari, bu erda standart sozlamalarni tahrirlash va keyin bajarishi mumkin
# /lib/openkim/opendskim.service.se-ni yaratish uchun fayllarni bekor qilish
# /etc/systemd/System/Onenkim.Service.D/override.conf va
# /etc/tmpfilfer.d/openkim.conf. Bu hali ham mumkin bo'lsa-da, endi u
# Sozlamalarni to'g'ridan-to'g'ri /etc/openkim.conf-da sozlash tavsiya etiladi.
#
# Deemon_opts = ""
# Var / Spool / PostFix / PostFix / Oph / Openkim-ni ugix rozetkadan foydalanish uchun
№ postfix:
# Rundir = / vab / postfik / yugurish / openkim
Rundir = / yugurish / openkim
#
# Muqobil rozetkani belgilash uchun krastka
# Shuni ko'rsatadiki, bu sozlamani sozlash har qanday sokendim.conf-dagi har qanday soket qiymatini bekor qiladi
# Standart:
Soket = "Mahalliy: /var/pool/postix/opendkim/openkim.Sock"
# 54321 portidagi barcha interfeyslarni tinglang:
# Soket = inet: 54321
# 12345 portidagi loopni tinglang:
# Soket = inet: 12345 @ localhost
# 192.0.2.1-ni tinglash 12345 portda:
# Soket = inet: 12345@192.2.1.1
Foydalanuvchi = eng opendkim
Guruh = eng opendkim
Pidfile = $ rundir / $ ismli ismi.pid
Serofte =
# Eslatma: Bu eski konfiguratsiya fayli. Bu openkim tomonidan ishlatilmaydi
# Tizimd xizmati. Iltimos, tegishli konfiguratsiya parametrlaridan foydalaning
# /etc/openkim.conf o'rniga.
# 
# Ilgari, standart sozlamalarni bu erda tahrirlash va keyin bajarishi mumkin
# /lib/openkim/opendskim.service.serce-ni yaratish uchun fayllarni bekor qilish
# /etc/systemd/ystem/openkim.service.d/override.conf va
# /etc/tmpfiles.d/openkim.conf. Bu hali ham mumkin bo'lsa-da, endi u
# Belgilarni to'g'ridan-to'g'ri /etc/openkim.conf-da moslashtirish tavsiya etiladi.
# 
# Demon_opts = ""
# UNIX rozetkasidan foydalanish uchun / vab / spool / postfik / PostFix / PostFix / PostFix / Ophxkim o'zgaradi
# postfix surdrxix:
# Rundir = / var / spora / postfik / yugurish / openkim
# 
# Alternativ rozetkani belgilash uchun kvulsatsiya
# Shuni esda tutingki, bu sozlash har qanday sokim qiymatini openkim.conf-da bekor qiladi
# Odatiy:
# 54321 portidagi barcha interfeyslarni tinglang:
# Soket = inet: 54321
# 12345 portdagi loopni tinglang:
# Soket = inet: 12345 @ localhost
# 192.0.2.1-ni tinglang 12345 portida:
# Soket = inet: 12345@192.2.1.1
# Biz postfiksiyamiz serverimizni o'rnatishga tayyor bo'lganimizda, biz tegishli domen nomini o'rnatilgan holda quyidagi kodni ishga tushiramiz. Skriptni yaratish orqali boshlang
# Skrips / PostFixsetup-ni bosing
sudo chmod a + x skriptlar / postfikp
nano skriptlar / postfikp
# Endi, Nano shahrida matn muharriri, bu faylni Fembobabe.com o'rniga o'z ichiga olgan domen nomingizni o'z ichiga oladi.
# #! / Bash
# Sozlash postfiks
CD $ dir
Echo "pochta xizmatlari konfiguratsiyasi"
sudo cp /etc/postix/main.cf /etc/postix/main.cf.cf.backupUp
sudo Cp copfight / va boshqalar_postfix_etc/postfix/mainc.cf
sudo cp cop copight / va boshqalar_postfix_master.cf /etc/postfix/master.cf
sudo cp cpfight / va boshqalar_default_openkirim / standart / openkim
sudo Cp copfig / va boshqalar_dovecot_conf.d_conf /etc/dovecot/dovecot/covecot/covecot/couth.df.df.df.df.df
sudo cp cp copfight / va boshqalar_dovecot_c_c_cast /etc/dovecot/dovecot/covecot/covecot/covecot/covecot/110-master.conf
sudo Cp copfight / va boshqalar_dovecot_dovecot.conf / dasturc/dovecot/dovecot.conf
sudo cp cp copfig / va boshqalar_dovecot_aswaswd / / dovecot / passwd
sudo Cp copight / va boshqalar_opendkim.conf /etc/openkim.conf
sudo cp cpfight / va boshqalar_default_openkirim / standart / openkim
sudo adduser postfikpi openkki
sudo mkdir / hk / openkim
sudo mkdir / va hk / Kalitlar
sudo mkdir /etc/opendchim/Keys/femMebabe.com
sudo mkdir / var / sporti / postfik / openkim
sudo echo "*@femmmeebabe.com Sononly._donaveAnkey.femmebabe.com" | sudo tee -a /etc/opendkim/sagecing.Table
sudo echo "sizgaonly._doinkey.femmmeebabe.com femebabe.com/keys/KeMamebeim/Kendonly.Private" | sudo tee -a /etc/openkim/key.Ta
sudo echo "127.0.0.1" | sudo tee -a /etc/opendkim/sulted.hosts
sudo echo "loalhost" | sudo tee -a /etc/opendkim/sulted.hosts
sudo echo "" | sudo tee -a /etc/opendkim/sulted.hosts
sudo echo "* .femmmababe.com" | sudo tee -a /etc/opendkim/sulted.hosts
sudo Choy - eng openinglim: eng opendkim / va tendentkim
sudo openkki -b 2048-femmebabe.com -d /opendkim/KeyS/FemMebabe.com -S --Sonly -V
sudo chmod Go-RW / va va tendentkim / tugmachalar
sudo Choyni eng opendingim: openkki /etc/openkim/keys/ceys/ceDebabe.com/sendonly.private
sudoping eng openingim: postfik / spool / postfik / postfik / eng openkim
CD $ dir
sudo cp pochta qutisi / * / va pochta / pochta /
sudo po'sti: foydalanuvchilar / var / mail / *
sudo chmod -r a + rwx / var / mail / *
sudo Tee Tee TectionKim PostFix Dovecotni qayta ishga tushirdi
sudo mushuk /etc/openkim/keys/femmebabe.com/sendonly.txt | tr -D '\ n' | sna / \ s // g '| | Sed's / "// g '| awk -F '[) ()' '' {$ 2} ''
# ! / bin / bash
# Sozlash postfiks
# Endi postfik va Dovecotni sozlash uchun to'ldirilgan skriptni boshqaring.
# ./ssenziyalar/postifikf
# Ushbu skript ishlayotgandan so'ng, oxirgi qatorni chop etadi va uni DNS konfiguratsiyasiga yuboradi. Xavfsiz xat yuborishda domeningizni aniqlash uchun ishlatiladigan eng opendkim tugmachasi.
# Ajoyib! Bir necha kun ichida siz hamma narsa to'g'ri sozlangan bo'lsa, siz serverdan xat yuborishingiz kerak.
# Agar siz pochta serveringiz uchun DNS-ni sozlagan bo'lsangiz, u yangilanish uchun yozuvlar uchun 72 soatdan kam vaqtni olishi kerak. Odatda juda tez. Sizning serveringiz ushbu buyruqdan foydalanib ishlayotganligini tekshirishingiz mumkin, elektron pochtangizga:
# Echo "Test" | Mail -S "Test elektron pochta manzilingiz" Odemail@gmail.com
# Agar hamma narsa to'g'ri ishlayotgan bo'lsa, siz serveringiz bilan elektron pochta xabarini yuborishingiz kerak. Agar ishlamasa, xato nima bo'lishi mumkinligini ko'rish uchun jurnallarga qarab ko'ring.
# quyruq - 150 /var/log/maog.log
# Bu server tomonidan yuborilgan va u to'g'ri ishlayotgan bo'lsa, bu pochta haqidagi versiya haqida ma'lumot beradi. Siz pochta qutingizdagi elektron pochtangizni ham ko'rishingiz kerak, agar u yo'q bo'lsa, spam papkangizni tekshiring.
# Shuningdek, sozlamalaringizni sozlash paytida sozlamalaringizni sozlashingiz kerak. Shunday qilib, elektron pochta serveringiz django ilovasi bilan, loyiha. Sozlamalaringizda ushbu chiziqlarni qo'shish yoki almashtirish
# Elektron pochta_host = domen
Elektron pochta_port = 587
Elektron pochta_use_tls = haqiqat
Elektron pochta_address = 'TEAM@FEMMABABABE.com'
Elektron pochta_host_user = 'jamoa' #maove@mamamashein.com ''
Elektron pochta_host_password = konfiguratsiya ['elektron pochta_host_postword']
Decault_fro_email = '{{{{{{{{{{{{{}>'. Format (sayt_name, emad_host_user)
# 'Sevgi@mamashein.com' '
# E'tibor bering, biz parolni olish uchun konfiguratsiya faylidan foydalanmoqdamiz. Keling, ushbu faylni shunday sozlashda shunday qilib, faylning boshida shunday.:
# Import OS
Import JSON

# Confige va yuklash
Config_file sifatida ochiq ('/ h.ks / config.json') bilan):
    Config = JSON.OL (Config_file)
# Ochiq konfigurani oching va yuklang
# Keling, ushbu faylni yaratamiz va unga maxfiy kalit qo'shing, shuningdek pochta parolini qo'shing. Yashirin kalitni yaratish uchun ushbu buyruqdan foydalaning, oxirida xohlaganingiz bilan:
# opensl rand -base64 64
# Endi, matnni yaratadigan va tahrirlangan /etc/config.jsonni ochadigan matnni nusxalash
# sudo nano /etc/onfig.json
# Maxfiy kalit sifatida ochilgan kalitlar bilan faylingizga quyidagi satrlarni qo'shing.
# {
	"Mehr_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxl)"
	"Elektron pochta_host_prassword": "sizning maxfiy so'z"
}
# JSS formatida sodda va ishlatish oson, biz loyiha bo'yicha biz ham foydalanishni istagan boshqa kalitlarni, biz ularga yozolmaydigan boshqa kalitlarni e'lon qilishimiz mumkin, shuning uchun boshqa foydalanuvchilar faqat ularga yoza olmaydilar va shu sababli ular bizning loyiha katalogidan faqat ularni o'qib bo'lmaydi. Bu API kalitlari uchun amaliyot tavsiya etiladi, ular bu erda bir ozdan ko'proq foydalanamiz.
# Hamma narsa saqlanib qolganligiga ishonch hosil qilish uchun siz o'z loyihangizni zaxira qilishni xohlaysiz va keyinchalik serverni ijaraga olmoqchi bo'lsangiz ham, keyinroq ishingizni qaytarib olishingiz mumkin.
# sudo zaxiralash
# Endi buyruq satridan birini yuborib, veb-serverdan HTML elektron pochtasini yuborib ko'ring. Django orqali foydalanuvchi misolingizni so'rang va HTML-ga HTML elektron pochtasini yuboring. Mening ismimni kodga o'zgartiring, Charlotte, foydalanuvchi nomingizga.
# python boshqaruvchisi.py qobig'i
DJango.contribh.mods import foydalanuvchisini import qiladi
u = user.ulacece's.getsets.getset (Foydalanuvchi ismi = 'Charlotte')
Foydalanuvchilardan foydalanuvchilar. Import Send_weLead_email
Send_WeLeAn_email (U)
Chiqish ()
# Agar birinchi buyruq ishlamasa, foydalanishga ishonch hosil qiling
# venv / bin / faollashtirish
# Agar hamma narsa to'g'ri o'rnatilgan bo'lsa, veb-ilovangiz tomonidan yuborilgan pochta qutingizdagi pochta qutisiga yangi elektron pochta xabarini olasiz. Yaxshi bajarilgan ish! Siz uzoq yo'lni oldingiz.
# Agar siz bunday loyihada ishlayotganda biron bir xato bilan kurashayotgan bo'lsangiz, javoblarni qidirishdan tortinmang va yordam so'rashdan tortindim. Boshqa qidiruv tizimlarida Google, dasturlash yordamini qidirish uchun ajoyib resurslardir. Siz shunchaki omadingizni qidiring va boshqa odamlar qanday qilib muammoni hal qilishlarini ko'rishingiz mumkin. Shuningdek, men bilan bog'lanishingiz mumkin, o'qituvchilaringiz (o'qituvchilar, professorlar, o'qituvchilar), siz boshdan kechirayotgan muammolarga echim topishga yoki boshqa kitoblarga murojaat qilishingiz yoki boshqa kitoblarga murojaat qiling. Men bu oson emasligini tushunaman, lekin agar siz shu darajada o'qib chiqmagan bo'lsangiz ham, siz Web ilovasini noldan qurish haqida ko'p narsalarni o'rganmaysiz. O'zingizni orqa tomonga pat, siz juda yaxshi ish qilyapsiz.
# Ushbu uchinchi nashr veb-chiqish bo'yicha qo'llanmasini o'qishga vaqt ajratganingiz uchun tashakkur. Kelgusi nashrlarda men hujjatning boshida muhokama qilingan ko'plab muhim misollarni o'z ichiga olaman va biz dasturiy ta'minot va apparatni rivojlantirish dunyosiga juda chuqurroq sho'ng'iymiz. Kelish uchun nima uchun turing va men sizga ajoyib dasturiy ta'minotni qanday yaratishni o'rgatishni kutyapman. Keyingi nashrda ko'rishguncha!
# Ushbu havolaga tashrif buyuring (bu sizni lotte Harperdan tashqarida olib boradi)








nano config/etc_default_opendkim
























nano config/etc_dovecot_conf.d_10-master.conf
































































nano config/etc_dovecot_dovecot











































































nano config/etc_dovecot_passwd

team:{plain}yourpassword

nano config/etc_opendkim.conf


































nano config/etc_default_opendkim
























touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup


./scripts/postfixsetup

echo "test" | mail -s "Test Email" youremail@gmail.com

tail –lines 150 /var/log/mail.log

openssl rand -base64 64

sudo nano /etc/config.json

{
	"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
	"EMAIL_HOST_PASSWORD": "yourpassword"
}

sudo backup

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






נאָענט
זייַט 1
שפּרונג
זען פול אַרטיקל
פאָרזעצן לייענען

קויפן מיט קריפּטאָ



https://glamgirlx.com/yi/practical-web-based-deep-learning-and -


פאַכמאַן פאַרווייַלונג, פאָטאָס, ווידיאס, אַודיאָ, ליוועסטרעאַמינג און גלייַכגילטיק שפּיל, ווי געזונט ווי שייַן סקאַנינג, וועב אַנטוויקלונג און סערראָגאַסי באַדינונגס.

לאָזן מיר אַ שפּיץ אין ביטקאָין מיט דעם אַדרעס: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

תּנאָים פון סערוויס