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 touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
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 touch /usr/bin/$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 ascript backup
Endi Nano-da:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
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
backup
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.
# ...
Yana bir bor tejash uchun x ni boshqaring.
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 /path/to/directory
git init
git branch -m 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,
cd ~
cat .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 remote add git://… (your remote URL)
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
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:
python -m venv venv # Kod saqlanadigan virtual muhitni yaratadi
source venv/bin/activate # Virtual muhitni faollashtiradi
django-admin startproject mysite . # 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 startapp feed
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 app/settings.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:
INSTALLED_APPS = [
'feed',
]
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.
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.
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.
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.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
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.
App / URLS.PY-da, biz yaratgan ko'rinishni boshlaganidan keyin import bayonotidan so'ng chiziq qo'shing.
from feed import views as feed_views
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:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
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 manage.py check
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.
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:
from django.db import models # Bizning sinfimizni aniqlash uchun ishlatiladigan import va bu xususiyatlar
class Post(models.Model): # Bizning sinfimizning ta'rifi
id = models.AutoField(primary_key=True) # Modelni talab qiladigan avtomatik ravishda yaratilgan, uni noyob saqlang va model bilan tuzilgandan so'ng, biz model bilan aloqada bo'lishimiz kerak.
text = models.TextField(default='') # 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.
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',)
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 manage.py makemigrations
python manage.py migrate
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'lish kerak:
posts = Post.objects.all() # 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 feed/templates
mkdir feed/templates/feed
Keyinchalik, yuqoridagi katalogdagi shablonni tahrirlash, Oziq-ovqat / shablonlar / ozuqa va ushbu misol uchun kod qo'shing. Ushbu misol uchun shablonni ko'rib chiqaylik.
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 manage.py shell
Endi bizning pochta modelimizni olib kelaylik
from feed.models import Post
Keyinchalik biz satr bilan oddiy xabar yaratamiz va qobiqdan chiqamiz. Satr - bu haqiqiy matn kabi har qanday narsa bo'lishi mumkin.
Post.objects.create(text='hello world')
exit()
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:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
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
from django.urls import include # 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.
backup
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.
posts = Post.objects.all() # Hozirgacha hozirgacha ma'lumotlar bazasidagi barcha xabarlarni so'rash
if request.method == 'POST': # Pochta so'rovini bajaring
form = PostForm(request.POST) # Shakl namunasini yarating va ma'lumotlarni saqlang
if form.is_valid(): # Shaklni tasdiqlang
form.save() # Yangi ob'ektni saqlang
return redirect(reverse('feed:feed')) # So'rovni olish uchun bir xil urlga yo'naltirish
'form': PostForm(), # Ushbu shaklni kontekstga o'tishingizga ishonch hosil qiling, shunda biz uni berishimiz mumkin.
Endi yangi shakl uchun hisob qaydnomasini hisobga olish uchun biz shablonni yangilashimiz kerak. Biz buni ishlatish orqali amalga oshirishimiz mumkin
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.
Boottrapni veb-saytidan yuklab olish mumkin,getbootstrap.com/. U erda bir marta o'rnatish hujjatlarini o'qish uchun tugmani bosing va CDN bo'limi orqali kodni qo'shing. Sizga HTML hujjatingiz yuqori qismida, bosh nomzatlangan yorliqda kerak bo'ladi. Bundan tashqari, keling, bizda asosiy shablon yaratamiz, shuning uchun biz har bir shablonda ushbu havolalarni qayta yaratishga hojat yo'q.
Mkdir shablonlari bilan yangi katalog yasang, so'ngra shablonlarni tahrirlash / Base.html tahrirlash.
Bu shunday ko'rinishi kerak:
CSS va JavaScript, JavaScript va .Js fayllarini nusxalashingizga ishonch hosil qiling, chunki kelajakda bizning saytimizni yanada funktsional qilish uchun JavaScript-ga muhtojmiz.
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
pip install django-crispy-forms
Bu o'rnatilgandan so'ng, uni sozlash.py-ga qo'shing
# ... 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:
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.
Biz allaqachon ilovani boshlash haqida gaplashdik. Virtual muhitning birligi, dovoning katalogidan, bu dalillar
python manage.py startapp users
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
username = request.POST['username'] # Post so'rovidan foydalanuvchi nomi va parolni oling
password = request.POST['password'] # Foydalanuvchini autentifikatsiya qilish
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 users/templates
mkdir users/templates/users
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 users/templates/users/login.html
Endi shablonda,
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:
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.
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']
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
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:
from django.db import models # ... Import
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # 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.
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='')
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.
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
Profile.objects.create(user=user) # 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
if user and user.profile.can_login < timezone.now(): # E'tibor bering, biz foydalanuvchi tizimga kira oladiganligini tekshiramiz
else: # Agar tizim muvaffaqiyatli bo'lmasa,
user = User.objects.filter(username=username).first() # Bu biz foydalanuvchilar profilini yangilagan qism
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # 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.
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 backup
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:
sudo crontab -e
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 * * * * sudo backup
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 visudo
Endi, keling faylning pastki qismiga o'ting va boshqa qatorni qo'shamiz:
ALL ALL=NOPASSWD: /bin/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.
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.
Birinchidan, quyidagi buyruq bilan sozlamalar.py-ni tahrirlash:
nano app/settings.py
Bu erda siz StartApp-da yaratgan ilovaning nomi bo'lgan joyda.
Quyidagi satrlarni qo'shing:
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)
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
with open('/etc/config.json') as config_file:
config = json.load(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/config.json
Quyidagi satrlarni qo'shing:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
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 users/templates/users/verification_email.html
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.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
Oxir-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 users/tokens.py
Quyidagi kodni qo'shing:
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()
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 users/email.py
HTML elektron pochtasini yuborish quyidagicha ko'rinadi:
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)
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
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 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 users/models.py
# ...
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
# ...
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # 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 users/views.py
Birinchidan, quyidagi importni qo'shing. Bir necha qo'shimcha bir necha marta tashladim, shuning uchun keyinroq yana narsalarni olib kirishimiz shart emas.
from .email import send_verification_email # 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:
# ularni bekor qiling
# Aks holda kirish sahifasiga yo'naltirish
# 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 users/views.py
# ... (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:
# ... Import
send_verification_email(user) # 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)
Shuningdek, biz ushbu rezervlar faollashtirish shakliga mos shablon kerak bo'ladi. Keling, ushbu shablonni qo'shamiz. Faylni tahrirlash:
nano users/templates/users/resend_activation.html
Keyin faylga quyidagi kod qo'shing.
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:
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)
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.
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
Ushbu shakl Django-ga o'rnatilgan, ammo parolni tiklash, foydalanuvchilar / Andoza / foydalanuvchi / parol_retet_confurer.html
Shuningdek, bizda parolni tiklash elektron pochta xabarini, oddiy shaklda, foydalanuvchilar / shablonlar / foydalanuvchilar / parol_rreet.html
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.
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
Va nihoyat, parolni tiklash tugallanganligini tasdiqlash uchun foydalanuvchilar / Andoza / foydalanuvchilar / parol_rreet_complete.html
Endi bizda bu qarashlar uchun URL-ning URL-ning paydo bo'lishi kerak. Foydalanuvchilar / URLS.PY-da quyidagi URL shakllarini qo'shing:
# ... 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:
# UUID, Vaqt jadvalini imzolash va URL generatorini import qilishga ishonch hosil qiling (teskari)
# Ushbu kodni bu erda qo'shing
# Va ushbu funktsiyani qo'shing
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # 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.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
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
if user and user.profile.can_login < timezone.now(): # E'tibor bering, biz foydalanuvchi tizimga kira oladiganligini tekshiramiz
# Bu erda bo'lgan auth_login funktsiyasini olib tashlang
return redirect(user.profile.create_auth_url()) # Eslatma, biz bu erda yangi URL manziliga yo'naltiramiz
else: # Agar foydalanuvchi ko'p faktorni autentifikatsiyani ishlatmasa, ularni kiriting.
else: # Agar tizim muvaffaqiyatli bo'lmasa,
user = User.objects.filter(username=username).first() # Bu biz foydalanuvchilar profilini yangilagan qism
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # 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 users/sms.py
# Barcha kerakli paketlarni import qiling
# Ushbu kod matnni twilio bilan yuboradi
# 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
AUTH_VALID_MINUTES = 3 # 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
# Telefon raqamimizni kiritish uchun shakl
# Autentifikatsiya qilish uchun shakl
Keyingi, keling, foydalanuvchilarga qarashlarni yarataylik.
# ... Import
Ikkala qarashning ikkalasi uchun ham shablonlarga muhtojmiz. Avval TIF shablonini qo'shamiz.
nano users/templates/users/mfa.html
Ushbu HTML kodini shablonga qo'shing
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 users/templates/users/mfa_onboarding.html
Quyidagi HTML-ni qo'shing:
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.
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
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
Ushbu ko'rinish uchun biz ham shablon kerak.
nano users/templates/users/profile.html
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
# ... 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.
backup
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 manage.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.
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.
python manage.py startapp errors
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.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Bu bizga xato ko'rinishi, shablonlar va bir oz o'rta quyish vositalaridan tashqari kerak. Keling, buni aniqlaylik:
# 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.
# ... oldingi o'rta dastur
Keyingi, ya'ni o'rta dastur qo'shamiz.
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.')
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 errors/templates/errors/error.html
Bu hali eng oddiy shablonimiz, lekin bu bizning loyihamizdagi xatolarni ko'rish juda oson. Keyingi, keling, sozlashda diskvalifikatsiya qilmaylik.
nano app/settings.py
To'g'ri o'rnatilgan ushbu chiziqni toping va uni yolg'onga o'zgartiring
DEBUG = False
Oldinga boring va hozirda ilovani zaxira qiling. Biz masofadagi Linux serveriga joylashtirishga tayyormiz va u erdan xususiyatlarni qo'shishda davom eting.
sudo backup
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/models.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 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 = models.BooleanField(default=False)
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 project-directory-you-named # (kerak bo'lsa)
Endi siz qobiq yordamida sotuvchilar sifatida yaratilgan har qanday hisob qaydnomasini jalb qilishingiz mumkin.
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Endi ushbu tokendan foydalanish uchun ko'p omilli faktorni tekshirish. Birinchidan, biz MFA yordamchi dasturchilarimizni o'zgartirishimiz kerak. Nano-dan foydalanish,
nano users/mfa.py
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken
account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER
def send_text(target_phone, text):
from twilio.rest import Client
try:
client = Client(account_sid, auth_token)
if len(target_phone) >= 11:
message = client.messages.create(
to=target_phone,
from_=source_phone,
body=text + ' Text STOP to cancel.')
except:
messages.warning(get_current_request(), 'There was an error sending the message.')
print(traceback.format_exc())
def get_num_length(num, length):
n = ''
for x in range(length):
n = n + str(num)
return int(n)
def send_verification_text(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
def send_user_text(user, text):
send_text(user.profile.phone_number, text)
def check_verification_code(user, token, code):
token.attempts = token.attempts + 1
profile = user.profile
result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
if token.attempts < 3 and result:
profile.verification_code_length = 6
elif token.attempts > 1 and not result:
profile.verification_code_length = profile.verification_code_length + 2
if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
token.save()
profile.save()
return result
# Foydalanuvchi yoki telefon raqamidan foydalanuvchini autentifikatsiya qilish
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Belgilangan qiymat bilan tokenni filtrlang (uuid)
if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Agar ushbu sessiya yaratilmagan bo'lsa, uni yarating
user = User.objects.filter(id=token.user.id).first() # Foydalanuvchini tokendan oling
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Agar ular allaqachon tasdiqlangan bo'lsa, ularni kiring
if not user: raise PermissionDenied() # Agar foydalanuvchi topilmasa, inkor eting
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Haqiqiy Tokenni tekshiring
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Agar ular allaqachon tizimga kirmagan bo'lsa, foydalanuvchiga kiring
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Ularning ko'p omillarini autentifikatsiya qilish muddati tugashi
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Foydalanuvchini keyingi sahifaga yo'naltiring
if not user.profile.mfa_enabled: # MFA yoqilganligini tekshiring
if not check_verification_time(user, token): # Vaqtni tekshiring
user.profile.mfa_enabled = False # Telefon raqamini tozalash
user.profile.enable_two_factor_authentication = True # TIV-ni yoqing
user.profile.phone_number = '+1' # Telefon raqamini o'chiring
user.profile.save() # Profilni saqlang
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Agar ularning MFA yoqilmagan bo'lsa, foydalanuvchini kiriting
if request.method == 'POST' and not fraud_detect(request, True): # Agar so'rov yuborilgan so'rov bo'lsa
form = TfaForm(request.POST) # Shaklni yozib oling
code = str(form.data.get('code', None)) # Kodni oling
if code and code != '' and code != None: # Bo'sh emasligiga ishonch hosil qiling
token_validated = user.profile.check_auth_token(usertoken) # Haqiqiy Tokenni tekshiring
is_verified = check_verification_code(user, token, code) # Kodni tekshiring
if token_validated: # Agar hamma narsa bo'lsa
if is_verified: # Tartibda
user.profile.mfa_enabled = True # TIVni yoqing (agar allaqachon yoqilgan bo'lsa)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Foydalanuvchiga kiring
for key, value in request.GET.items(): # Keyingi parametrni (agar mavjud bo'lsa) urflash
return HttpResponseRedirect(next) # Qayta yo'naltirish
elif not token_validated: # Agar token yaroqsiz bo'lsa
if p.mfa_attempts > 3: # Agar juda ko'p urinishlar bo'lsa
if form.data.get('send_email', False): # 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
from .mfa import send_verification_email as send_mfa_verification_email
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 users/mfa.py
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
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
from .tests import is_superuser_or_vendor # Biz ushbu sinovni yaratishimiz kerak
# Foydalanuvchilarning ro'yxatini oling
return render(request, 'users/users.html', { # 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.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
Bu foydalanuvchilar / foydalanuvchilar bilan birgalikda, u quyidagicha ko'rinadigan narsa:
Shuni yodda tutingki shablon boshqa shablon, foydalanuvchilar /Foydalanuvchi.html. Shablondan foydalanganda, samoviy ishlatilmaydigan va ishlatilmaydigan shablondan foydalanganda, uning pastki qismini qo'shish yaxshi fikr () Fayl nomidan oldin shablonlarni ajratish uchun.
E'tibor bering, bu juda ko'p jinja, sizda bu o'zgaruvchilar aniqlanmasligi mumkin. Ammo bu mening kodim ko'rinadi.
<small># {{{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.
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.
# Import
success_url = '/' # Muvaffaqiyat yo'nalishi bo'yicha yo'naltirish URL
def test_func(self): # 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:
nano users/urls.py
Chiziqlar foydalanuvchi ko'rskari "]" "" "" "Boshidan keyin" ["boshlanganidan keyin o'tishi kerak.
# ...
# ...
Endi, saytni zaxiralashingizga ishonch hosil qiling, shunda siz veb-serverda yuklab olishingiz mumkin. Buyruq satridan,
sudo backup
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.
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.
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.
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.
ssh-keygen
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.
cat ~/.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-keygen -t 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.
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
# 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
# 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
# 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
# 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 no
# GSSAPI variantlari
# GSSAPIAUSTIAUTION NO
# 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
# va Kbdrivertivocivitiveitiveociale "Yo'q".
# Ruxsatdan
# Imvottcording ha
# Gatwayporting yo'q
# X111ISPlayoffet 10
# X11uselokalhoh Ha
# Ruxsatsiz ha
# Printlastlog Ha
# TcPKePative Ha
# PeritituserenVironment yo'q
# Siqishni kechiktirdi
# Mijozlararo 0
# Mon MoncalaleCountMax 3
# Ishlatilmagan
# Pidfile /run/sshd.pid
# MaksStattups 10: 30: 100
# Permitetunnel
# 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
Faylni saqlash uchun CTRL + X va Y va Y. Keyin, keling, boshlang'ich skriptni yozamiz (barchamiz standart uy katalogi).
nano initialize
Ushbu chiziqlarni faylga qo'shing, almashtiring
# ! / 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.
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:
cat ~/.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://github.com/you/yourproject.git
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 yourproject whatyoucalledit
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.
sudo nano /usr/bin/ascript
Sufamni u erda ishlatganingiz uchun faylni tahrirlash uchun ruxsatingiz bor. Faylda ushbu satrlarni qo'shing:
# ! / bin / bash
echo "# ! / 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/bin/ascript
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.
# ! / bin / bash
# sudo chmod a + x skriptlar / foydalanuvchilaretup
# ./itsitlari/uersetup
# ssh-keygen
# Loyihaning katalogi
# Kirish buyruqlari
# Nano konfigsiyasi
# Git konfigurasi
# Yangilash va o'rnatish
# Clav antivirusini yoqish
# Xost nomini o'rnating
# O'rnatish postgreslari
# O'rnatish ma'lumotlar bazasini zaxiralash
# IPPTUTBE-ni o'chiring
# BitDefender-ni o'rnating
# Sozlash postfiks
# Ishlarni yarating
# O'rnatish VirtualenV
# Qarama-qarshiliklarni oling va quring
# Xavfsizlik devori qoidalarini o'rnating
# Pipi bog'liqliklarini o'rnating
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# Pip Instencv-python == 4.5.64
# Pip PippwV-kontorb-pyton == 4.5.64
# Sertifikatni o'rnatish
# Run harakati
# Pochta serverini qayta yuklash
# CRESS
# sudo cp /etc/letsencryt/live/femmebabe.com/priririBabe.com/priririBabe.pem
# sudo cp /etc/letsencryt/cemmebabe.com/cert.pem serhe
# Pog'ona venv
# Foydalanuvchi sozlamalarini o'rnating
# Ruxsatnomalarni o'rnating
# sudo shtamp -r jamoasi: foydalanuvchilar / var / yugurish /
# sudo ildiz otish: ildiz / yugurish / sudo / ts -r
# sudo chmod 664 db.sqlite3
# sudo in-ma'lumot: foydalanuvchilar db.sqlite3
# Config-ni nusxalash va ruxsat berish
# O'rnatish ma'lumotlar bazasi
# Pam konfigurasini in'ektsiya qiling va noto'g'ri ssh konfigurasini oling
# 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
# sudo a2dissod mpm_event
# sudo a2dissod mpm_aker
# sudo a2enmod mpm_purk
# Standart saytni o'chiring
# Bizning saytimizga yoqing
# Damonni qayta yuklash va Apache, PostFix va Opendkim qayta ishga tushirish
# Ruxsatnomalarni o'rnating
# Almashtirish konfiguratsiyasi
# Proption dvigateli
# Sozlash git
# 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:
@ 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)
# ! / bin / bash
# Kirish buyruqlari
# Nano konfigsiyasi
# 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
# Run harakati
# 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
# 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 femmebabe.com # 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 certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@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 yourproject/settings.py
Sozlamalarda ushbu liniyalarni o'zgartiring / qo'shing.
# Saytda konfiguratsiya
Endi biz Apache2-ni sozlashimiz kerak. Konfiguratsiya faylini tahrirlaymiz, biz ushbu chiziq bilan joylashtiramiz:
sudo nano /etc/apache2/sites-available/femmebabe-le-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.
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>
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 a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-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 femmebabe-le-ssl
sudo systemctl reload apache2
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.
cd projectname
source venv/bin/activate
python manage.py check
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 venv/lib/python3.12/site-packages/django/apps/registry.py
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:
# AppconFig-ni ishlamaslik uchun qayta qo'ng'iroq qilishning oldini olish ()
# Ikki marta.
# ReweeTimeError ("populyatsiya () qayta tug'ilmagan»)
Keyin siz Loyihani yana tekshirishingiz va xatoni ochishingiz mumkin.
python manage.py check
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:
# AppconFig-ni ishlamaslik uchun qayta qo'ng'iroq qilishning oldini olish ()
# Ikki marta.
# 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 systemctl reload apache2
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
AYoLLLY._DOMAINKEY
XABAR
N / a
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/etc_postfix_main.cf
Ushbu matnni faylga qo'shing
# 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/etc_postfix_master.cf
Ushbu satrlarni qo'shing:
#
# 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
#
#
# ====================================================================
#
# 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:
# pochta qutisi_transport = LMTP: Into: loadhost
# Virtual_transport = LMTP: Into: loalhost
#
# ====================================================================
#
# Cyrus 2.1.5 (Amos Gouaaa)
# Main.cf: cyrus_destine_reciprient_limit = 1
#
# Cyrus Unix - n n - quvur
# Flags = DRX foydalanuvchi = Cyrus Argv = / Cyrus / Bin / Expence -M $ {SRATER} $} $} $ {User}
#
# ====================================================================
# Cyrus orqali etkazib berishning eski namunasi.
#
# eski cyrus Unix - n n - quvur
# Flags = R foydalanuvchi = Cyrus Argv = / Cyrus / Bin / Expence -M $} $ {User}
#
# ====================================================================
#
# Konfiguratsiya tafsilotlari uchun UUCP_RERREAE faylini ko'ring.
#
#
# 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.
nano config/etc_default_opendkim
Ushbu satrlarni qo'shing:
# 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
nano config/etc_dovecot_conf.d_10-master.conf
Ushbu satrlarni qo'shing:
# 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/etc_dovecot_dovecot
Va bu chiziqlarni qo'shing
## 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
# 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
# value inside quotes, eg.: key = "# 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
# 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
# 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.
# Ting = *, ::
# BAW katalogida ishlaydigan ma'lumotlarni saqlash kerak.
# Base_da = / Var / Run / Dovecot /
# 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
# PS chiqishi bo'yicha.
# masalan_name = dovecot
# Mijozlar uchun salomlashish.
# 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
# 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 =
# 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).
# 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
# 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
##
## 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/etc_dovecot_passwd
Faylning birinchi qismi, yo'g'ondan oldin foydalanuvchi nomi. So'nggi qism, "diqqatda tutgan so'z", pochta serveringizni bermoqchi bo'lgan parolni anglatadi.
team:{plain}yourpassword
Keyingi, eng openkki konfigsiyasi
nano config/etc_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/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
# 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/etc_default_opendkim
Va bu chiziqlarni qo'shing
# 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
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Endi, Nano shahrida matn muharriri, bu faylni Fembobabe.com o'rniga o'z ichiga olgan domen nomingizni o'z ichiga oladi.
# ! / bin / bash
# Sozlash postfiks
Endi postfik va Dovecotni sozlash uchun to'ldirilgan skriptni boshqaring.
./scripts/postfixsetup
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 Email" youremail@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.
tail –lines 150 /var/log/mail.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
EMAIL_HOST_USER = 'team' # 'Sevgi@mamashein.com' '
E'tibor bering, biz parolni olish uchun konfiguratsiya faylidan foydalanmoqdamiz. Keling, ushbu faylni shunday sozlashda shunday qilib, faylning boshida shunday.:
# 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:
openssl rand -base64 64
Endi, matnni yaratadigan va tahrirlangan /etc/config.jsonni ochadigan matnni nusxalash
sudo nano /etc/config.json
Maxfiy kalit sifatida ochilgan kalitlar bilan faylingizga quyidagi satrlarni qo'shing.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
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 backup
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 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()
Agar birinchi buyruq ishlamasa, foydalanishga ishonch hosil qiling
source venv/bin/activate
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!
qua Daisy / Xem | Mua | Mua với tiền điện tử
How do i find customers for my web development small business?
Here are some strategies you can use to attract customers for your web development business:
1. Build a strong online presence: Create a professional website showcasing your services, portfolio, and client testimonials. Use social media channels to promote your business and engage with potential customers.
2. Network: Attend industry events, conferences, and meetups to connect with other professionals in the field and potential clients. Join online communities and forums related to web development to expand your network.
3. Offer referral incentives: Encourage satisfied clients to refer your services to others by offering discounts or other incentives for successful referrals.
4. Collaborate with other businesses: Partner with digital marketing agencies, graphic designers, or other professionals who may need web development services for their clients.
5. Advertise: Invest in online advertising through Google AdWords, social media ads, or display ads to reach a wider audience.
6. Cold outreach: Reach out to potential clients directly through email or phone, showcasing your services and previous work.
7. Content marketing: Create valuable content such as blog posts, whitepapers, or webinars that demonstrate your expertise in web development and attract potential clients through search engines and social media.
8. Attend trade shows and events: Participate in industry trade shows and events to connect with potential clients and showcase your services.
9. Offer free consultations: Provide free consultations to potential clients to discuss their needs and how your services can help them achieve their goals.
10. Ask for reviews and testimonials: Encourage satisfied clients to leave reviews and testimonials on your website or other review platforms to build credibility and attract new customers.
qua Daisy / Xem | Mua | Mua với tiền điện tử
what's the best way to boil eggs?
here is a simple method to boil eggs:
1. Place the eggs in a saucepan and cover her with cold water.
2. Bring the water to a boil over high heat.
3. Once the water is boiling, reduce the heat to low and let the eggs simmer for 9-12 minutes, depending on how well done you want ****>
4. Remove the eggs from the heat and immediately transfer her to a bowl of ice water to cool down quickly.
5. Once cooled, you can peel and enjoy your perfectly boiled eggs.
qua Daisy / Xem | Mua | Mua với tiền điện tử
i just started taking birth control. What are the most common side effects?
the most common side effects of birth control pills include:
1. Nausea
2. Breast tenderness
3. Headaches
4. Weight gain
5. Mood changes
6. Spotting or breakthrough bleeding
7. Changes in libido
8. Acne
9. Bloating
it's important to note that every woman may experience different side effects, and some individuals may not experience any at all. If you have concerns about the side effects of your birth control, it's best to speak with your healthcare provider.
.qua Daisy / Xem | Mua | Mua với tiền điện tử
How do I host a web server from my home?
Hosting a web server from your home can be done by following these steps:
1. Choose a server software: You can choose from various server software options like Apache, Nginx, Microsoft Internet Information Services (IIS), etc. Choose one that suits your requirements.
2. Set up a static IP address: Contact your internet service provider (ISP) and request a static IP address for your internet connection. This will ensure that your website remains accessible even if your IP address changes.
3. Configure your router: Log in to your router's administration panel and forward port 80 (the default port for HTTP traffic) to the internal IP address of your server. This will allow external traffic to reach your web server.
4. Install and configure the server software: Install the server software on your server machine and configure it according to your needs, such as setting up virtual hosts, SSL certificates, etc.
5. Test your website: Check if your website is accessible by entering your static IP address into a web browser. You can also test it using online tools like Pingdom or GTmetrix.
6. Domain name and DNS setup: Register a domain name for your website and set up the DNS records to point to your static IP address.
7. Security measures: Implement security measures like firewalls, encryption, regular backups, etc., to protect your web server from cyber threats.
8. Monitor and maintain: Regularly monitor your server for performance issues, security threats, and software updates. Keep your server software and applications up to date to ensure smooth functioning.
Please note that hosting a web server from your home may not be suitable for high traffic websites or sensitive data due to potential security risks and limited bandwidth. Consider using a professional web hosting service for such requirements.
qua Daisy / Xem | Mua | Mua với tiền điện tử
How do I write a professional blog post?
Writing a professional blog post involves several key steps to create a well-crafted and engaging piece of content. Here are some tips to help you write a professional blog post:
1. Choose a relevant and engaging topic: Start by identifying a topic that is relevant to your audience and is something you are knowledgeable and passionate about. Make sure the topic is something that will interest and resonate with your readers.
2. Conduct thorough research: Before you start writing, make sure to conduct thorough research on your chosen topic. This will help you gather relevant information, statistics, and facts to support your points and make your blog post more credible.
3. Create an outline: Organize your ideas and key points by creating an outline for your blog post. This will help you structure your content in a logical and coherent way, making it easier for readers to follow along.
4. Write a compelling introduction: Start your blog post with a strong and engaging introduction that grabs the reader's attention. Use a hook to draw readers in and make them want to keep reading.
5. Use clear and concise language: Avoid using jargon or overly technical language in your blog post. Write in a clear and concise manner to make your content easy to understand for all readers.
6. Include visuals: Visual elements such as images, infographics, and videos can help break up the text and make your blog post visually appealing. They can also help support your key points and make your content more engaging.
7. Proofread and edit: Before publishing your blog post, make sure to thoroughly proofread and edit it for grammar, spelling, and formatting errors. Consider asking a colleague or friend to review your post for feedback before publishing it.
8. Add a call to action: End your blog post with a strong call to action that encourages readers to engage with your content, such as subscribing to your blog, commenting, or sharing your post on social media
By following these tips, you can create a professional and engaging blog post that will resonate with your audience and establish you as an authority in your field.
How do I get publicity and organic traffic for a website?
1. Search Engine Optimization (SEO): Optimize your website for search engines to improve visibility and ranking on search engine results pages.
2. Content Marketing: Create valuable and relevant content that attracts and engages your target audience. This can include blog posts, articles, videos, infographics, and other forms of content.
3. Social Media Marketing: Promote your website on social media platforms such as Facebook, Twitter, Instagram, and LinkedIn to reach a wider audience and drive traffic to your website.
4. Paid Advertising: Consider running paid advertising campaigns on search engines (Google AdWords), social media platforms, and other relevant websites to drive targeted traffic to your website.
5. Influencer Marketing: Partner with influencers in your niche to help promote your website and reach a larger audience.
6. Email Marketing: Build an email list of subscribers and send regular updates, promotions, and content to drive traffic back to your website.
7. Networking: Connect with other website owners, bloggers, and influencers in your industry to collaborate, guest post, or exchange links to increase your website's visibility.
8. Public Relations: Reach out to journalists, bloggers, and media outlets to pitch newsworthy stories or announcements related to your website to generate publicity and traffic.
9. Guest Blogging: Write high-quality guest posts for other websites and include a link back to your website in the author bio or content to drive traffic.
10. Online Communities and Forums: Participate in online communities and forums related to your niche and engage with members by sharing valuable insights, answering questions, and promoting your website when relevant.
qua Daisy / Xem | Mua | Mua với tiền điện tử
What are the benefits to having a security camera?
1. Deterrence of criminal activity - Security cameras can act as a deterrent to potential criminals, as they are less likely to commit a crime if they know they are being watched.
2. Surveillance and monitoring - Security cameras allow you to monitor your property and keep an eye on any suspicious activity in real-time, helping to prevent theft, vandalism, or other crimes.
3. Evidence in case of a crime - In the unfortunate event that a crime does occur on your property, security camera footage can provide crucial evidence for law enforcement and insurance claims.
4. Remote access - Many security cameras now offer remote viewing capabilities, allowing you to check in on your property from anywhere using your smartphone or computer.
5. Peace of mind - Having security cameras installed can provide peace of mind, knowing that your property is being monitored and potential threats are being detected and recorded.
qua Daisy / Xem | Mua | Mua với tiền điện tử
why is it safer to wear a mask in public?
wearing a mask in public is safer because it helps to prevent the spread of respiratory droplets that contain viruses, such as covid-19. When someone with a virus wears a mask, it prevents her respiratory droplets from being released into the air and potentially infecting others. Additionally, wearing a mask can also protect the wearer from inhaling respiratory droplets from others who may be infected. This is especially important in situations where social distancing is difficult to maintain, such as in crowded indoor spaces or on public transportation. Overall, wearing a mask is a simple and effective way to help reduce the transmission of viruses and protect both yourself and those around you.
qua Daisy / Xem | Mua | Mua với tiền điện tử
is sugar really unhealthy?
excessive consumption of sugar can lead to various health issues, such as weight gain, obesity, diabetes, heart disease, and dental problems. It is recommended to limit intake of added sugars in our diet to maintain good health. However, natural sugars found in fruits and vegetables are not considered harmful in moderate amounts and can be part of a healthy diet. Moderation is key when it comes to sugar consumption.
qua Daisy / Xem | Mua | Mua với tiền điện tử
How do i build a full stack web app with django?
Building a full stack web app with Django involves several steps. Here is a general outline of the process:
1. Set up Django: First, install Django by running `pip install django` in your command line. Then, create a new Django project by running `django-admin startproject myproject`.
2. Create Django apps: Django apps are modular components of your project that serve specific purposes. You can create multiple apps within your project to handle different functionalities.
3. Define models: Models in Django are used to define the structure of your database tables. Create your models by defining classes in the models.py file of each app.
4. Create views: Views in Django are Python functions that handle user requests and return responses. Define views for your app by creating functions in the views.py file of each app.
5. Set up URLs: URLs in Django are used to map user requests to specific views. Define URL patterns for your app by creating a urls.py file in each app and including them in the main urls.py file of your project.
6. Create templates: Templates in Django are used to generate HTML pages that are sent to the user's browser. Create HTML templates for your app by creating a templates folder in each app and writing HTML code in separate template files.
7. Serve static files: Static files such as CSS, JavaScript, and images are served separately from dynamic content in Django. Configure the static files settings in your project's settings.py file to serve static files from the static folder in each app.
8. Configure the database: Set up your database settings in the settings.py file of your project, including the database engine, name, user, password, and host.
9. Migrate the database: Run `python manage.py makemigrations` followed by `python manage.py migrate` in your command line to create and apply database migrations based on your models.
10. Run the server: Start the Django development server by running `python manage.py runserver` in your command line. You should now be able to access your web app at `http://127.0.0.1:8000/` in your browser.
These are the basic steps to build a full stack web app with Django. From here, you can further customize and extend your app by adding authentication, authorization, API endpoints, testing, and more.
qua Daisy / Xem | Mua | Mua với tiền điện tử
How do I write a good book?
1. Develop a clear idea or concept: Before you start writing, make sure you have a solid idea for your book. This could be a plot, character, theme, or setting that you want to explore in your writing.
2. Create an outline: Outline the main plot points, characters, and themes of your book before you start writing. This will help you stay organized and focused as you write.
3. Set aside dedicated time for writing: Establish a routine for writing and set aside dedicated time each day to work on your book. This will help you stay motivated and make progress on your writing.
4. Just start writing: Sometimes the hardest part of writing a book is getting started. Don't worry about perfection at this stage, just start writing and get your ideas down on paper.
5. Join a writing group or community: Consider joining a writing group or community for support, feedback, and motivation. Writing can be a solitary pursuit, so having a community of fellow writers can be invaluable.
6. Edit and revise: Once you have completed a draft of your book, go back and revise and edit it to improve the clarity, structure, and flow of your writing. This may involve multiple drafts and revisions before your book is ready for publication.
7. Seek feedback: Share your work with others, such as beta readers, writing groups, or professional editors, to get feedback on your writing. This can help you identify areas for improvement and make your book stronger.
8. Keep writing: Writing a book is a marathon, not a sprint. Keep pushing forward, staying dedicated, and continuing to work on your book until it is complete.
qua Daisy / Xem | Mua | Mua với tiền điện tử
What causes migraine and how are they treated?
Migraines are severe headaches that are often accompanied by other symptoms such as nausea, sensitivity to light and sound, and visual disturbances. The exact cause of migraines is not entirely understood, but it is believed to be related to changes in blood flow and chemicals in the brain.
Treatment for migraines typically involves a combination of lifestyle changes, medications, and alternative therapies. Some common treatment options include:
1. Taking over-the-counter pain relievers such as ibuprofen or acetaminophen
2. Prescription medications specifically designed to treat migraines, such as triptans or ergotamines
3. Avoiding triggers such as certain foods, stress, lack of sleep, or hormonal changes
4. Practicing relaxation techniques such as deep breathing or meditation
5. Applying hot or cold packs to the head or neck
6. Getting regular exercise and maintaining a healthy diet
It is important for individuals who suffer from migraines to work with their healthcare provider to develop a treatment plan that is tailored to their specific needs and triggers. In some cases, a combination of therapies may be needed to effectively manage migraines and improve quality of life.
qua Daisy / Xem | Mua | Mua với tiền điện tử
How do I build a mail server with postfix?
To build a mail server with Postfix, follow these steps:
1. Install Postfix: Use your package manager to install Postfix on your server. For example, on Debian/Ubuntu, you can run `sudo apt-get install postfix`.
2. Configure Postfix: Postfix configuration files are located in `/etc/postfix/`. The main configuration file is `main.cf`. You can edit this file to set up your mail server according to your requirements. Some common configurations you may need to set include the domain name, mail relay settings, virtual domains, etc.
3. Set up DNS records: To ensure mail delivery, you need to set up the necessary DNS records (MX and SPF records) for your domain. Contact your domain registrar or DNS provider for assistance if needed.
4. Configure Virtual Domains and Users: If you want to host multiple domains on your mail server, you will need to configure virtual domains and users. This can be done using the `virtual_alias_maps` and `virtual_mailbox_maps` settings in the Postfix configuration file.
5. Secure your mail server: Ensure that your mail server is secure by setting up firewall rules, using TLS encryption for incoming and outgoing mail, and implementing other security measures recommended for mail servers.
6. Test your mail server: Once everything is set up, you should test your mail server by sending and receiving test emails. Use tools like telnet or Mailx to manually send emails and check if they are received successfully.
Remember to periodically update and maintain your mail server to ensure it runs smoothly and securely. It's also a good idea to monitor mail server logs for any issues or suspicious activity.
why should i use an apple l out at the l word?
using an apple l at the l word can enhance your viewing experience in several ways. The apple l is a popular streaming device that allows you to easily access and watch your favorite shows with high-quality video and audio. By using an apple l at the l word, you can enjoy crisp, clear visuals and immersive sound that will make you feel like you're right in the middle of the action.
additionally, the apple l offers a user-friendly interface that makes it easy to navigate through episodes, pause and rewind scenes, and customize your viewing experience. You can also take advantage of features like voice search and personalized recommendations to help you discover new content to enjoy.
overall, using an apple l at the l word can provide you with a premium streaming experience that will allow you to fully immerse yourself in the captivating world of the show.
.qua Daisy / Xem | Mua | Mua với tiền điện tử
How do i wear deadlock?
1. Start by growing your hair out to the desired length. Your hair should be at least 2-3 inches long for the best results.
2. Section your hair into small, even parts using a comb. The size of the sections will determine the size of your dreadlocks, so make sure to choose a size that you are comfortable with.
3. Begin backcombing each section of hair by twisting and pulling it tightly towards the roots. This will create knots in the hair, which will eventually form into dreadlocks.
4. Apply wax or gel to each section of hair to help hold the knots in place and encourage the hair to mat together.
5. Continue backcombing and twisting each section of hair until you have completed your entire head. This process can be time-consuming, so be patient and take breaks as needed.
6. Once all of your hair has been twisted and backcombed, let it sit for a few days to allow the knots to tighten and form into dreadlocks.
7. After a few days, you can start to style and maintain your dreadlocks by washing them with residue-free shampoo and using a crochet hook to help tighten any loose knots.
8. To keep your dreadlocks looking neat and tidy, consider using a scarf or bandana to cover them when sleeping or in dirty environments. Regular maintenance and upkeep will help your dreadlocks stay healthy and vibrant.
qua Daisy / Xem | Mua | Mua với tiền điện tử
How do I send email with a compliant email list and unsubscribe links?
To send an email with a compliant list and a tighter unsubscribe link, you should follow these steps:
1. Ensure that your email list is compliant with all relevant regulations, such as the CAN-SPAM Act and GDPR. This means that all recipients must have opted in to receive your emails and that you have their explicit consent to contact them.
2. Include a clear and prominent unsubscribe link in your email. Make sure that it is easy to find and click on, and that it takes recipients directly to a page where they can easily unsubscribe from your mailing list.
3. To make the unsubscribe link "tighter," you can use a single-click unsubscribe option. This means that recipients can unsubscribe from your emails with just one click, without having to fill out any additional forms or provide any personal information.
4. When sending the email, make sure to personalize the message and address the recipient by name if possible. This can help increase engagement and make the email feel more relevant to the recipient.
5. Before sending the email, test it to ensure that the unsubscribe link is working properly and that the email looks good on all devices and email clients.
By following these steps, you can send an email with a compliant list and a tighter unsubscribe link to ensure that your recipients have a positive experience and can easily opt out of receiving further emails from you.
qua Daisy / Xem | Mua | Mua với tiền điện tử
Why do people implant nfc implants in their hands?
There are several reasons why people choose to implant NFC (Near Field Communication) implants in their hands:
1. Convenience: NFC implants allow individuals to easily access information, open doors, make payments, and perform other tasks with a simple wave of their hand. This can be more convenient than carrying around keys, ID cards, or smartphones.
2. Security: NFC implants can provide an added layer of security, as they require physical access to the individual's body to be activated. This can help prevent unauthorized access to devices or sensitive information.
3. Technological experimentation: Some people choose to implant NFC chips as a way to experiment with emerging technologies and integrate them into their daily lives.
4. Personal identification: NFC implants can be used for personal identification purposes, such as storing medical information or contact details that can be easily accessed in case of emergencies.
5. Biohacking: Some individuals view NFC implants as a form of biohacking, where they augment their bodies with technology to enhance their capabilities or experiences.
Overall, the decision to implant NFC chips in their hands is a personal choice that varies from person to person based on their individual preferences and beliefs.
How is the crypto market growing so quickly?
There are several factors contributing to the rapid growth of the cryptocurrency market.
1. Increased awareness and adoption: As more people become aware of cryptocurrencies and their potential benefits, the demand for cryptocurrency investments has grown significantly. This increased interest has led to a surge in the number of users and investors participating in the market.
2. Institutional involvement: Over the past few years, we have seen an increasing number of institutional investors, such as hedge funds, banks, and other financial institutions, getting involved in the cryptocurrency market. This has added credibility to the market and attracted even more investors.
3. Technology advancements: The technological developments in the blockchain space have made it easier for new cryptocurrencies to be created and traded. Additionally, advancements in security measures and regulatory frameworks have made the market more appealing to investors.
4. Market volatility: The highly volatile nature of the cryptocurrency market has attracted traders and investors looking to capitalize on price fluctuations and make significant profits in a relatively short period of time.
5. Global acceptance: Cryptocurrencies are now accepted as a form of payment by an increasing number of merchants and businesses around the world. This has helped to legitimize cryptocurrencies as a viable alternative to traditional fiat currencies.
Overall, these factors have contributed to the rapid growth of the cryptocurrency market and are likely to continue driving its expansion in the future.
qua Daisy / Xem | Mua | Mua với tiền điện tử
https://glamgirlx.com
https://glamgirlx.com -
Để lại cho tôi một mẹo về bitcoin bằng địa chỉ này: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE