Misal ilə praktik veb əsaslı dərin öyrənmə və təhlükəsizlik Üçüncü nəşr Şarlotte Harper 3 iyul 2024 Yenilənib / 3 İyun, 2025-ci il
Ön söz:
İnternet üçün internet üçün təhlükəsizlik mülahizələri, mühəndislik mühəndisliyi, etibarlı, sabit və praktik məqsədlər üçün faydalı olan prototipi mühəndisliyinin vacib hissəsidir. HTML, JavaScript və CSS-nin tətbiqi ilə, həmçinin Python, C / C ++, Java və Bash tətbiq etmək, veb tərtibatçıları, yaradıcılığı və funksionallıq rahatlığı, təvazökarlıq və xarakterin rahatlığı, həm də orta Joe, həm də rahatlıq və vacib xidmətlər göstərmək üçün, son istifadəçi üçün rahatlıq və vacib xidmətlər təqdim etmək Vaxtı öldürmək və ya internetdə bir şey əldə etmək, ümumiyyətlə toxunma ekranlı smartfon cihazında bir şey əldə etmək. Sıfırdan bir veb sayt qurmaq istədikləri zaman, başqa bir şəxsin veb saytında başlamağı və funksionallıq, asılılıq, istifadə etmək üçün istifadə etmək üçün bir neçə insanın istifadə etmək istədikləri üçün bir neçə insanın istifadəsi və rahatlıqdan istifadə etmək istədikləri zaman öz sərəncamında, xüsusən də yaradıcılığın olması və xüsusilə yaradıcılıq, istifadəsi və xüsusən də yaradıcılıq. Bu kitabı oxumaq və sizinlə öyrətmək istədiyimi öyrənmək və hətta məqsədləriniz barədə şəxsən mənimlə danışmaq və özünüzə uyğun bir rəhbərlik etmək, bu kitabı evləndirmək və özünüzə uyğun bir şey etmək üçün bir az vaxt ayırın və istədiyinizi və istədiklərinizi və tamaşaçılarınızın ehtiyaclarını ödəməyi öyrənmək üçün bir az vaxt ayırın.
Mənim haqqımda: Mən C / C ++, Java, Python, HTML, CSS və JavaScript-də geniş təcrübə olan bir proqram inkişaf etdiriciyəm. İnsanların istifadə etmək istədiklərini, ziyarət etmək və hətta öyrənmək, yenidən öyrənmək və öldürmək üçün istifadə etmək istədikləri veb saytlar qururam və hətta vaxt və öldürməyə alışıram və ən başlıcası, proqramı satıram. Bir veb saytın görüntüsü və işləməyinizi necə istədiyinizi düşündünüzsə, mən sizinlə görüşərkən öz ehtiyaclarımla görüşə bilərəm və özünüzə bir veb saytın işləməsi xərclərini ödəməyə hazırsınız, növbəti YouTube, TIKTOK, Twitter, Google və ya yalnız əldə edə biləcəyiniz yüksək texnologiyalı bir təhlükəsizlik tətbiqetməsini qurardım. Vaxtımı satmağa çalışmaq əvəzinə, sənin almağa çalışıram: Mən sizinlə birlikdə mövcud olan məlumatlarla bir tətbiq (veb sayt) özünüzü bir tətbiq qurmaq və istədiklərinizdə müvəffəqiyyətli bir karyera quraraq müstəqil bir proqram geliştirici, sahibkar olmağınız lazım olanı öyrədir. Və məlum olum, sizə məlumat verdiyim təhsil qeyri-rəsmi olacaq. Məktəbə gedə və bütün bunları rəsmi təhsillə öyrənə və ya hətta bu kitabı məktəbdə oxuya, tapşırıqlarınızı yerinə yetirir və təhsilinizdən çox şey götürməyəcəyəm və tapşırıqları yerinə yetirməyəcəyəm. Mən sizin professorunuz deyiləm, məni şəxsi müvəffəqiyyətinizlə idarə etdiyi bir karyeraya yönəltmək istəyən bir dost kimi düşünə bilərsiniz. Və mən sizə uğurlar da satmıram, vaxtınızla satın almalı olacaqsınız. Kod deməyi öyrənmək dik bir öyrənmə əyrisi var və heç vaxt asan deyil və ya hətta olmalı idi. Ehtiyacınız ola bilər və cəhd etmək və uğursuz olmaq və tətbiq etmək və tətbiq etmək üçün əsəbiləşdiyiniz zaman yenə də cəhd etməyiniz üçün çətin bir şəkildə çalışmalısınız. Bu kodun özünün təbiətindədir. Kod, proqramçı səhv mesajlarını vermək üçün hazırlanmış bir tərtibçi tərəfindən idarə olunur və bunlar sadəcə səhvinizi axtarış motorunuza kopyalayıb və digər insanların nümunələrini oxuyun. Deməliyəm ki, son dərəcə zəngin, ağıllı, uğurlu və ya hətta detallı və ya bir tətbiq qurmaq üçün təşkil etmək lazım deyil. Kompüter sizin üçün həmin təşkilata qayğı göstərir. Sadəcə sınaq və səhv yolu ilə davam etməlisiniz, diqqəti qorumalı və etdiyiniz işdə çox çalışmalısınız və etdiyiniz işin bütövlüyündə çox uğurlu bir karyera quracaqsınız.
Mən kiməm: Son hissənin öyrənmə və bu kitabdan bir yol çəkdiyini başa düşürəm. Mən dəqiqəm kiməm? Bu mürəkkəb bir sualdır. Tibbi şəraitdən əziyyət çəkdiyim kimi, tibbi şəraitdən əziyyət çəkdiyim kimi, özümü tanıtmağa gələndə həyatımı daha da çətinləşdirən və ya şəxsiyyət məsələləri ilə çətinliklər təqdim edərkən, bu kitabı da çətinləşdirə bilər və ya bu kitabı da çətinləşdirə bilər. Bir sözlə, bu kitabı oxuyursanız, onu evə gətirdin, çünki bu, onun arasından keçdiyin və ya bu günə qədər oxusanız, gördüyünüz hər şeydə uğur qazanmağınızı düşünən kimi düşünən bir insanam. Mən bir mühəndis, bir proqram geliştiricisi və bir tələbədir, bir tələbə və bu kitabı öz həyatlarını etmək istəyən digər şagirdlər üçün həyatlarını asanlaşdırmaq istəyən, iş, faydalı, böyük, işlək, işləmə, iş xəttindən asılı olmayaraq müvəffəqiyyəti idarə edə biləcək bir kopyalamaq üçün nümunələri asanlaşdırır. Əsasən budur: Mən özümə və digər insanlara uğur qazana kömək etmək üçün tətbiqlər qururam. Mən bir müəllifəm, baxmayaraq ki, bu mənim portfelimi bir araya gətirmək üçün portfelimi bir araya gətirmək üçün başa çatdırmaq niyyətindəyəm və mən də sənətkaram. Bunu sizə etiraf edəcəyəm, mən qəribə bir insanam. Mükəmməl deyiləm, hətta daha çox müvəffəqiyyətlə özüm üçün bir ad hazırlamaq üçün kollec və universitetləri tərk etmək və dövlətləri tərk etmək üçün məni aparıcı olan qanunlarla işlətmişəm. Doğuşdan bir qadınam, makiyaj geyinirəm, özümün şəkillərini çəkirəm, paltarlar və digər qadın geyimləri geyin və mən təbiətcə qadın kimi özümü şüurlu qalıram. Keçmişdə digər insanlarla bağlı problemlər yaşanmış və WebApps-ı bina ilə mübarizə aparan və üzr istəyirəm ki, bu kitabı daha tez əlinizdə ala bilmədim: buna ehtiyacınız var. Mina kimi görünən və mina kimi işləyən və eyni şeyi oxumağı və eyni şeyi etməsini istəyərsən, amma daha da yaxşıdır, çünki bu kitabı özünüz üçün pul istədikləri kimi, həyatınızda uğur qazanmağınız lazım olan mənbələriniz var. Ailə böyümək, sağlamlıq şəraiti, həkimlər, media və qanunla hər cür problem yaşadım və qanun və məyus olan və məyuslanan dünyada qadın təbiəti olan mübarizəni dərindən əks etdirir. Ancaq bu kitab, bu kitab, körpəm, mənim portfelim və dolanışığımdan, mənimsəməyimdən və məndən öyrənmək üçün diqqətinizi diqqətlə izlədiyim bir şeydir. Zəhmət olmasa, mükəmməl olmadığımı unutmayın, bu kitab səhvlər, düzəlişlər və yeni nəşrlər olacaq və mənim yazımla uğurlu bir təcrübəyə sahib olmaq üçün edə biləcəyiniz ən yaxşı kimi məntiqi beyninizlə düşünməlisiniz. Ayrıca, yazarkən çətinliklərlə üzləşdiyiniz zaman da sizin üçün yaxşı demək olduğunu başa düşürəm. Bu barədə bu barədə düşünün. Eyni çətinliklərlə qarşılaşdığım üçün bunu sizə deyirəm. Bu kitabı öz riskinizlə istifadə edin, icma və icmalarınızla işləyin və yanlış yolda olmadıqda və ya niyə bu mətni gətirə və ya niyə bu mətni gətirə bilməyəcəyəm və niyə bu mətni gətirməyinizə kömək etdim. Biz işləyəcəyik, İnternet. Bir neçə kəlmə ilə kim olduğum üçün çox tanış olmaya bilərsən, amma oxumağımı tövsiyə edirəm, işinizi başa çatdırmaq üçün öz layihələrinizi qurarkən məni oxumağa və başa düşməyə davam edərkən məni tanıyacaqsınız. Bu kitabla bu kitabla heç bir ev tapşırığı olmayacaq, çünki professorlarınız və ya müəllimləriniz hər hansı birinizi təyin etmədikcə, həm də oxuduqlarınızı oxuduğunuz kimi özünüz, həm də öyrəndiyiniz bir portfelin portfelini, həmçinin öyrəndiklərinizi necə tətbiq edə biləcəyinizi nümayiş etdirməyi məsləhət görürəm. Mənim Capstone layihəm bu kitabda oxuduğunuzun əksəriyyəti üçün əsasdır, çünki əvvəlki layihələrimdən kodu özündə cəmləşdirdiyim və mənimlə birlikdə və ya ailənizi istifadə edərək, və ya xəbərlərdə, və ya xəbərlərdə dostunuzu və ya ailənizi görə biləcəyiniz sadə bir tətbiqə bənzər bir tətbiq və davranmağımda müvəffəq olmağımıza uyğun gəlir.
Bu kitab nədir: Bu kitab nümunə ilə bir dərslikdir. Kod, kodlaşdırma kodu, kodunuzu və kodunuzu düzəltmək üçün necə öyrənmək, kodunuzu necə qorumaq və saxlamaq üçün təlimatları, kodunuzu necə saxlaya, kodunuzu idarə etmək, kodunuzu yerləşdirmək, kodunuzu idarə etmək, interaktiv veb saytları, niyə bu vacibdir və özünüzü, tətbiqinizi və şirkətin necə də vacib olduğunu düşünəcəksiniz Mütləq ən yaxşı işıqda qurursunuz, son istifadəçiləriniz, veb saytınızın ziyarətçilərinizə mümkün qədər cəlbedici olmaq. Bu kitabda, bir platforma və təhlükəsizlik kimi internetdə bir fokus olan proqram dizaynının bir sıra nümunələrini nümayiş etdirəcəyəm. Unix Shell, yedekləmə və skript xüsusiyyətləri ilə istifadə edərək əsas bir layihə quraraq öyrənmə təcrübəsinə başlanacağıq. Sonra, əsas blog veb saytını araşdıracağıq, blogumuzu foto və video xüsusiyyətləri ilə təkmilləşdirəcəyik, həm də pulsuz proqramdan istifadə edərək təhlükəsizlik həllərini istifadə etmək və serverimizi istifadə etmək üçün istifadə edərək serverimizi təmin etmək və serverimizi təmin etmək və serverimizi təmin etmək üçün istifadə edin. Daha sonra digər anlayışlar arasında video redaktə, səsvermə, barkod tarama və optik xarakter tanınması araşdırmaq, faylla işləmə və işləmə, araşdırma aparacağıq. Yol boyu, proqramımızı pulsuz və ödənişli seçimləri ilə daha faydalı və etibarlı olmağımıza kömək edəcək API-ləri araşdıracağıq. Yolda, yanğınsöndürənlər və batırma dizaynı, qüllə və dükan dizaynı və digər müdirlər də daxil olmaqla, proqramımızı qorumaq və özünü müdafiə və təkrarçatcılığı göstərmək üçün mövcud şəbəkədə proqramımızla birləşdirəcəyimiz digər müdirlər kimi fiziki təhlükəsizlik və yaraqlı alətləri araşdıracağıq. Oyunlar, 2D və 3D göstərmə mühərrikləri qurmaq, əsas ölçülü göstərmə proqramının öyrənilməsi və silikon kauçukda elektron titrəyən masajçı nümunələrində, quraşdırılmış aparat ilə işləmə yolu ilə fasilə alacağıq və quraşdırılmış aparat ilə işləyəcəyik. Yolda, proqramımızı daha yaxşı təmin etmək üçün artıq mövcud olan maşın öyrənmə həllərini də işə götürəcəyik. Prosesi asanlaşdırmaq və təmin etmək üçün internet üçün mövcud olan səhm alətlərini də işə götürəcəyik. Bu kitab bir veb tətbiqi qurmaqda uğurunuz üçün bir bələdçidir və kompüter və quraşdırılmış mexaniki sistemlərin peşəkar şəbəkəsi ilə birləşdirir və heç bir fon biliyi və ya əvvəlki təcrübəsi olmayan proqram təminatı və quraşdırılmış aparat yaratmaq üçün bələdçi.
Bu kitab nə deyil: Həqiqətən bir veb sayt keçirmək istəyirsinizsə, sadəcə sadə bir mağaza qura və sizə lazım olanı sata, bir blog, post foto və ya video göndərə, ya da başqa bir kod xətti yazmadan bir blog göndərə bilərsiniz. Bu kitab bu deyil. Bu kitab artıq tapa biləcəyiniz hər bir proqramdan daha faydalı, tam özellikli, işlək, işlək və etibarlı olan proqramı necə qurmağı öyrədəcəkdir, çünki hələ də prototiplər olan ən son proqramı yerləşdirə bilər və həqiqətən heç bir şey etməyən insanlar üçün pul qazanmaq üçün qurulmuşdur. Bu kitabı yaxından izləsəniz, kod, tədqiqat kodu yazmaq, öz tətbiqlərinizi yaratmaq və nə etdiyinizdən pul qazanacaqsınız. Mən bu kitabdan, erkən mərhələlərdə belə pul qazanacağam, çünki bu, insanların ehtiyac duyduğu və oxumaq istədikləri və ya tətbiqlərimi aldıqda və ya istifadə etdikdə artıq satın aldıqları üçün pul qazanacağam. Bu kitab sizin üçün bir tətbiq qurmayacaq, ancaq sizə lazım olan vasitələrlə işarə edəcək və internet üçün bir nümunə olaraq özünüzə uyğun olaraq öz uğurlarını asanlaşdıracaq bacarıq və tövsiyələr, hər bir kodunuzu sizin və tərəfdarlarınız, müştəriləriniz, dostlarınız, ailəniz, ziyarətçilər, podratçılar və internetin insanları və dəstəkləmək istəyərsiniz.
Nə öyrənəcəksiniz: Bu kitab, proqramı, həqiqətən işləyən, faydalı proqram təminatı, media qeydləri, media qeydləri, media qeydləri, maşın oxunan zona barkod tarama, video və fotoşəkilləri təsdiqləmək, rekord və şəkillər (NFC) rabitə kimi birja mesajları necə qurmağı və satmaq barədə məlumat verməyi öyrədir. Bu kitab, Debian Linux-a diqqət yetirərək, Debian Linux-da, Avtomatik Meydanı quraşdırmaq və dəstəkləmək üçün, Python kodunu necə quraşdırmaq və dəstəkləmək üçün, Python kodunu necə qurmaq üçün necə qurulması, şəbəkəli cihazlar vasitəsilə istifadəçi girişləri və interaktivliyini təmin etmək, interaktiv media və digər veb saytlarla interaktiv media və şəbəkə qurmaq üçün digər veb saytları ilə interaktiv media və şəbəkə qurmaq Məqsədlər, şəxsiyyət sənədləri, şəkil və video moderasiyası, proqram təminatını, ödəniş emalı, kriptovalyutası ticarət, asinxron vəzifələr və s. Solder, tel və 3D çap materiallarından istifadə edərək, batareyalar, şarj cihazları, mikroontroldaşlar, sxemlər, mühərriklər və sensorlar, habelə çap materialları olan öz bluetooth cihazlarınızı necə qurmağı öyrənəcəksiniz. Mən əlavə istehsal və alətə tətbiq olunan 3D dizayn prinsiplərini nümayiş etdirəcəyəm, buna görə də ölmək və ölmək, öz quraşdırılmış, cihaz cihazlarınızı inteqrasiya edilmiş batareyalar, şarj cihazları, elektron sxemlər və funksional çıxışlar istehsal edə bilərsiniz. və onları Bluetooth və İnternetlə şəbəkələşdirin. Xüsusilə, hər ikisi, hər ikisini bir qrafik interfeys və ya əmr satırı proqramı və ya əmr satırı proqramı və ya komandanlıq xətti proqramı kimi proqramlaşdırılmış və daha sürətli nəticələr əldə etmək üçün bir internetə inteqrasiya edilə bilən iki qutu araşdırmasını araşdıracağıq. Əvvəlcədən təcrübəsiz bir veb sayt qurmağı və yerindən heç bir təcrübə olmadan necə qurulacağını və yerləşdirməyi öyrənəcəksiniz, işlək, təhlükəsiz, gözəl, faydalı və ən əsası praktik olun. Saytın etibarlı və daha praktik, video və audio etmək üçün maşın öyrənmə və kompüter görüntülərindən necə istifadə edəcəyinizi öyrənəcəksiniz, səsinizi bağışlayın, təklif etməli olduğunuz bütün faydalı məlumatları bölüşmək üçün digər saytları istifadə edərək səs-küydən necə keçin və insanları proqram və biznesinizə daha da vacibdir. Bu kitab ən çox media, təhlükəsizlik və maşın öyrənməsinin ən ağır şəkildə yönəldiləcək, bu, düzgün istifadəçiləri cəlb etmək və yanlış olanları real, praktik, əl və cəlbedici bir şəkildə, həm də avtomatik və möhkəm bir şəkildə yayındırmaq üçün faydalı proqram təminatına kömək edəcəkdir. Bu kitab UNIX, xüsusi olaraq Debian (Ubuntu), Bash Shell, HTML, HTML, CSS, JavaScript və Python kimi bir sıra faydalı proqram paketləri, habelə git və ffmpeg kimi faydalı bash proqramını öyrədir. Ayrıca, kriptovalyutası avtomatik olaraq necə ticarət etməyi və kriptovalyutada və ya mütəmadi debet kartlarından, hətta bunu etməyi seçsəniz, gəlininizin payıını ödəyərkən daimi debet kartlarından almağı da öyrədəcəyəm. Veb saytınızdan reklam vasitəsi ilə necə pul qazanmağı, axtarış motorları üçün tətbiqinizi necə hazırlamağı və müştərilərin sizi tapmaq üçün axtaracağı və mümkün qədər çox ümumi axtarışlarda sıralamasında yer almağı öyrədirəm. Proqramınızı necə satmaq, reklam etmək, xidmətlərinizi axtaran müştərilərə müraciət etməyi öyrədəcəyəm və artıq mövcud olan prospektlər vasitəsilə internetdə özünüz üçün bir ad hazırlayacağam və yaxşı işləyin. İstifadəçilərinizin istədiyi və istədiyinizi və istədiyinizi və istədiyiniz bir veb saytına necə qurtarmaq və necə istifadə etməklə məşğul olan bir veb saytına necə qulluq etmək üçün necə saxlanmağınızı və istifadəçilərinizi necə saxlayacağınızı necə saxlamağı öyrənin və istifadəçilərinizi yalnız sizə təmin etmək üçün bir düyməni tipli bir veb saytına qoyaraq necə saxlayacaqsınız. Bu kitab, medianın çox miqdarda, medianın çox miqdarda fotoşəkilləri səsini və yayılmasının praktikliyinə, son istifadəçilərin (müştərinizdə), yalnız sizin və yalnız sizin və şirkətinizin ən yaxşı şəkildə yaxşı görünməsi üçün etdiyiniz hər hansı bir şəkildə özünüzü satın alma və özünüzü satın almağın praktikasına diqqət yetirəcəkdir. Ayrıca, kodlaşdırma məsləhətlərindən, makiyaj və fotoqrafiya, modelləşdirmə və aktyorluq kimi bir neçə məsləhət və fiş, modelləşdirmə və aktyorluq kimi praktik boşluqları və daha çox şeydən istifadə etmək üçün lazım olan bütün vasitələrdən istifadə etmək üçün vacib olan bütün vasitələrdən istifadə etmək üçün vacib olan bütün vasitələrdən istifadə etmək üçün vacibdir. Bu kitab "praktik" adlanırVeb əsaslı dərin öyrənmə və təhlükəsizlik üçün "Bir səbəbdən:" bu mətnin öyrənmə komponenti, praktik bir nöqteyi-nəzərindən xüsusi diqqət mərkəzində, kompüterin öyrənmə, üz tanınması, görüntü və video moderasiya, görüntü inkişaf etdirmə, qətnamə İnkişaf etdirmə, görüntü başlığı və digər vəzifələr, görüntülərin xarakteri kimi digər vəzifələr, orijinal, kompüter köçürülmüş bir şəkil və ya bir optik surət (və ya çap şəklinin bir fotoşəkili kimi olması çox vacibdir. Üzünüz. Bir istifadəçi adı və şifrə və ya yeni bir IP ünvanı üçün bir istifadəçi adı və şirkəti və ya yeni bir IP ünvanı üçün bir təsdiqləmə, bəlkə də bir istifadəçi proqramı, proqramınızın təhlükəsizliyi və ya mətn mesajı kimi olması üçün bir kompüterinizi birləşdirə biləcək bir kompüter edə bilərsiniz. istifadə etmək). Qeyri-qüsursuz olan proqramı quran hər kəs bunun nə demək olduğunu bir hissi var. Proqram, istifadə etdiyimiz qurğular və hesablar həmişə bizim ixtiyarımızda deyil, proqramın özü üçün xəstə niyyəti olan hər kəsin əlində ola bilər və buna görə də proqramın özü üçün risk yarada bilər. Bu kitabın diqqət mərkəzində olan bir şeydir. Şəbəkə edilmiş bir kompüter, uzun bir açar token, adlı və ssh və ya etibarlı qabıq açarı ilə təmin edilmiş və başqa bir veb server ilə ən yaxşı şəkildə təmin edilmişdir, çünki veb server, eləcə də serverin özündə olan sənət təhlükəsizlik vasitələrinin vəziyyətini təmin edir. Veb server istifadəçinin veb brauzerinə, bu istifadəçinin cihazının ən güclü hissəsi olan istifadəçinin veb brauzerinə giriş imkanı var, çünki istifadəçinin şəbəkəli proqram təminatına daxil ola biləcəyi yerdir. Bu alət dəsti, gördüyünüz veb, səs və video (üz və ya bir şəxsin şəxsiyyəti şəkli kimi), həm də Bluetooth radio cihazlarını oxuya və yaza və yaza və yazıla bilən və hətta veb saytına bağlanan məlumatlar ilə oxuya və yazıla bilən unikal seriya implantları ilə oxuya və yaza bilər. Vasitələrin hamısını sizin ixtiyarınızdadır, bu kitabla özünüzü etibarlı bir veb sayt qurmaq üçün özünüzü biliklə təchiz edəcək və ümumiyyətlə sizin üçün işləyən təhlükəsiz şəbəkə edilmiş kompüter sistemi, təklifinizi edir və görünür və hiss edir
Harada başlamaq lazımdır: Bu kitabı və ya hər hansı bir bölmədə sizə ehtiyac duyduğunuz dəqiq kodla başlamağımdan keçmişəm, xüsusən də bu kitabdan əvvəl və ya hər hansı biri də bu kitabda ətraflı təsvir olunacağımı və bununla yanaşı, istifadə halları və praktik nümunələr barədə ətraflı təsvir olunacağam. Yazı kodunda təcrübəniz yoxdursa, bu kitabın hamısını oxumağı məsləhət görürəm və bu kitabın sizin üçün uyğun olduğundan əmin olmaq üçün əvvəlki bölmələri oxumağı tövsiyə edirəm. Bu kitab sizin üçün uyğun deyilsə, veb inkişafı özləri haqqında öyrənməkdə maraqlı ola biləcək bir dostunuza və ya qohumuna hədiyyə etməyi düşünün və hətta bir müəllim kimi və ya əvvəllər mənimdən başqa müəllimlər olduğum boşluqları doldurmaq üçün onları geri qaytarmağı və onlardan öyrənməyi düşünün. İstədiyiniz yerə başlayın, bu kitabın hər bir hissəsi faydalı bir tətbiq qurmaq niyyətindəsiniz və ən yaxşı tətbiqlərin son istifadəçi ilə inşa edildiyini düşünün: Müştərinizi bilin. İndi məni tanıyırsan, bu kitabı tanıyırsan və başlamağa hazırsan. Başlamaq üçün bir kompüterə (hətta bir qutu mağazasından, Amazon və ya köhnə bir masaüstündən ən ucuz noutbuku da (hətta köhnə masaüstündən istifadə edin və sizin üçün işləyən bir şəkildə qurun.
Bu kitabı necə oxumaq olar: Mətn vurğulanmış, mətnin bir əmr təklifinə aid olduğunu göstərir, burada işlədiyiniz kodu yazacaqsınız. Əmr əmri ağır klaviatura yönəldilmiş və heç bir tıklayarak, iş axınını sürətləndirərək və sizə daha asan bir şey tələb edir.
Başlamaq: Gəlin içəri girək. Yerli bir maşında kodu quraraq İnternetə qoşulmuş bir veb sayt qurmadan başlayacağıq. Bu, başlamaq üçün daha təhlükəsizdir, heç bir şey deyil və sizin üçün asandır. Əməliyyat sisteminizdən asılı olaraq, bir baş qabığına girmək bir az fərqli olacaq. Mac OS üçün, bir virtual maşınla ən uyğunluğu əldə edəcəyiniz üçün bu nöqtədə bir virtual maşın quraşdırmağı məsləhət görürəm. VirtualBox və Paralelllər kimi müxtəlif provayderlər sizin üçün bir virtual maşın idarə edə bilər, baxmayaraq ki, sürətli, düzəldilmiş təcrübə yaratmaq üçün tövsiyə olunan doğma mühitdən istifadə etməyi üstün tutursanız, maşınla birbaşa maşın üzərində quraşdırmaq mümkündür. Tövsiyə etdiyim Linux və ya Windows istifadə edirsinizsə, bir layihə yaratmaq olduqca asan olmalıdır. Terminalınızı açın, ölçünü uyğun gördüyünüz kimi tənzimləyin və 2-ci addımdan sonra başlayın. Pəncərələrdən istifadə edirsinizsə, 1-ci addımı izləyin.
Addım 1: - Yalnız Windows istifadəçiləri Windows-da, idarəçi və növ kimi Açıq əmr təklifi WSL -INSTALL
Addım 2: - Burada davam edin və ya Windows istifadə etməsəniz, 1-ci addımı atın Açıq Terminalda, (OS-dən asılı olaraq, Windows-da Ubuntu, Mac və ya Linux-da Terminal və ya oxşar bir ad), bir layihə yaratmaqla başlayır. Bunu bir qovluq yaradan MKDIR əmri ilə edirik. Tövsiyə olunan layihənizi saxlamaq üçün bir qovluq yaratmaq lazımdırsa, qovluğa dəyişdirmək üçün CD əmrindən istifadə edin və və
CD / PATH / TO / Directory - Yol, təyinat qovluğunuzu, standart yolunuzdan əvvəl, defolt yolunuzdan və ya / ev / istifadəçi adıdır (istifadəçi adı istifadəçi adınızdır). Defolt qovluğuna dəyişmək, CD və ya CD yazın ~ MKDIR Misal - Kataloq adı ilə "Nümunə" əvəz edin
İndi layihəniz üçün bir işçi qovluğunuz var. Fərqli bir maşına keçməyiniz və ya yazdığınız kodu yerləşdirməyiniz üçün bu qovluğunun saxladığınız qədər vacib olduğu üçün, vebin hazır olduğu üçün kodu yerləşdirin, növbəti bir neçə addımdakı qovluğunuzu yedekləmək üçün bir skript quracağıq. Ancaq bir skript qurmaq bir az kod götürür və kodun mümkün qədər faydalı olması üçün avtomatlaşdırılmalıdır. Beləliklə, əvvəlcə skript yaratmaq üçün bir skript quraq. Ssenari yaratmaq və icra etməklə başlayaq. Sudo, Chmod və bunun üçün toxunuşdan istifadə edəcəyik və "Ascript" skriptinə zəng edəcəyik.
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
İndi skript yaratdıq, bunu icra edilə bilən və onu redaktə etməyə hazır olduq. Nano, tıklayarmadan mətni düzəltməyə imkan verən mətn redaktorudur, bu, qrafik istifadəçi interfeysindən istifadə etməkdən daha asandır. Nano ilə bir faylı redaktə etmək üçün Nano və sonra faylın yolunu istifadə edin. Bir skript edən bir skript etmək üçün, ilk növbədə skriptimizi düzəltməyə kifayət qədər oxşardır. Skriptin adını, "ascript" adını, bir mübahisə parametri ilə əvəz edən eyni kodu istifadə edəcəyik. Bu, skripti yazaraq skripti yazmağa çağırırıq, bu nöqtədə yazdığınız "newscript" ni skriptinizin adı ilə dəyişdirərək yeni bir skript yarada biləcəyimizi yazmağa imkan verir. Nanodakı kod kimi görünməlidir:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
Nano bağlamaq üçün, Nəzarət düyməsini basıb X düyməsini basıb X düyməsini, sonra faylın saxladığını və geri qayıtdığımızı ifadə edə bilərik. İndi bu üç əmri skriptini redaktə etmək üçün yazmaq əvəzinə, skriptin yenidən redaktə etmək üçün sudo ascript tipini yaza biləcəyik. Bu işləyir! Və hər hansı bir yeni skript, qabığa zəng edərək asanlıqla işləyə bilər. Gəlin işimizi indi saxlayaq: yeni skriptimizi saxlamaq və sonra ehtiyat skriptini dəstəkləyərkən, sonra yeni skriptimizi saxlamaq üçün bir yedek skriptini yazaq.
sudo ascript backup
İndi, Nano-da:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Harada / yol / qovluq MKDIR ilə yaratdığınız layihəyə gedən yoldur. Sonradan bu kimi təkrar yolları bir döngə və bir siyahı ilə necə kopyalamağı öyrənəcəyik, bu da daha az koddur, lakin bu da bu sadə saxlayaq və bir neçə sətirdə olaq. Bu skriptinizi idarə etmək və kodunuzu nüvəni idarə etmək, Nano-da Nano-da qeyd edin
backup
Bu kitabı oxuyarkən və qabıqda izləyərkən bir parol üçün heç bir şəkildə istənirsinizsə, istifadəçi şifrənizi düzgün daxil edin, əmrini yenidən işə salmadan əvvəl üç cəhdiniz olacaq. Rerun əmrlərinə qədər yuxarı və aşağı oxlardan istifadə edə və iki dəfə bir şey işlətməlisiniz. Sadə bir əmr seçmək üçün ara-sıra, bir əmr seçmək üçün, sağa, sol oxlar və açarı silmək və klaviatura və geri dönməklə işləyərək bir əmr seçmək üçün
Təbrik edirəm! İşçi qovluğunuzda iki vacib qabıq skriptini dəstəkləyən zəhmli bir ehtiyat skript yaratmağı bacardınız. Layihə daha da böyüdükcə hər şeyi daha da hərəkət etdirə bilərik, amma bu, bu iş üçün işləyir. Buludda böyümək üçün davam edək, bunun üçün Github-dan istifadə edəcəyik (yedek üçün çox sayda digər git həlli olsa da, hər şey eynidir. Xüsusilə proqramınızı qənaət etmək üçün instrumentaldır, xüsusən də bir kod xətti uğursuz olduqda, kilidlənməyəcəyiniz zaman kilidlənməyəndə, onu avtomatik olaraq geri qaytarmaq olmazsa, kodunuzu geri qaytarmaq olmaz.
Bu nöqtədə bir Ubuntu Virtual Maşınından istifadə etmirsinizsə, bu nöqtədə bir Ubuntu virtual maşınını istifadə edərək, işləyən veb sayt qurmaq və kompüterinizdə dərin öyrənmə əməliyyatlarını hazırlamaq üçün zəruri olan paketləri quraşdırarkən həyatınızı asanlaşdıracaqdır. Kodu yaxın gələcəkdə bir veb serverinə köçürəcəyik, ancaq bu, фишингəyə davamlı olan veb serverimizin ən azı bir neçə təhlükəsizlik təbəqəsinin olduğunu və bunun üçün bir sıra Linux paketlərini işə götürdüyünə əmin olmaq istəyirik. Hələ də Mac OS-dən istifadə etmək istəyirsinizsə, lazımi paketləri onlayn axtarmaq və quraşdırmaq üçün xoş gəlmisiniz, lakin hər paket üçün alternativ olmaya bilər, bu kitab və ya seriya əhatə edəcəkdir.
Sudeo SuboSpipt Backup-u işləyərək işimizi backup skripti ilə yerinə yetirmək üçün bir neçə əmr əlavə edək.
# ...
Bir daha qənaət etmək üçün X idarə edin.
İndi bu layihə üçün birdəfəlik konfiqurasiya etməliyik. Tezliklə bir git layihəsi olacağına görə, bir git depozitariyadan yerləşdirdiyimiz hər şeyi yazmağa ehtiyac duymuruq, ancaq yerləşdirmə skriptlərimizi yazanda bunun asğunu alacağıq. Başlamaq üçün, düzgün qovşaqda olduğumuzu və Git depo-nu işə saldığımızdan və SSH düymələrini yaratdığımızdan əmin olaq.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Ssh-Keygen yazdıqdan sonra yeni açar ev qovluğunda deyilən bir qovluq altında saxlanılmalıdır .Ssh .Ssh. ID_RSA.PUB adlanır. Bu açarı tapıb kopyalayaq. Görmək üçün,
cd ~
cat .ssh/id_rsa.pub
Son əmrlə geri qaytarılmış mətni kopyalayın və hesabınızdakı SSH düyməsini əlavə etmədən əvvəl GIT təminatçısı (ideal github) ilə bir hesab yaradın. Bir hesabınız varsa, SSH və Menyuda giriş altındakı SSH və GPG düymələrində SSH düyməsini əlavə etmədən əvvəl yuxarı sağ menyuya vurun və parametrləri vurun. Bir ssh düyməsini əlavə edin və yeni bir depo yaratmaq üçün Github-a qənaət etmədən və Github-a qayıtmadan əvvəl bir ssh açar əlavə edin və onu əlavə edin. Bu, digər git provayderləri üçün oxşardır, sənədlərini oxumalı olacaqsınız. Yeni depozitura konfiqurasiyasında depolarınızı təsviri ad verin və dərc etmək istəməyinizə qərar verin və hələ də daxil olmadığı üçün heç bir fayl konfiqurasiya etməyinizə əmin olun. Repozitoriya yaradıldıqdan sonra klonunu SSH URL ilə kopyalayın və aşağıdakı əmrinə yapışdırın.
git remote add git://… (your remote URL)
İndi CD ilə depo-ya qayıda bilərsiniz, bu ilə tanış olacaqsınız. Yedekləmə yazısını indi yedeklə sınayın
Əla! İndi kodlaşdırmanı həqiqətən əldə edə bilərik. İndi Django quraşdıraq ki, bash və git-də yaxşı bir şey var. Django, bizə avtomatik olaraq proqramımızı geri qaytarmağa imkan verəcək, amma Django daha sadə bir tətbiqə sahib ola bilər (əlil və asanlıqla konfiqurasiya edilə bilər).
Proqramı Ubuntu-da quraşdırmaq üçün Sudo Apt-Get əmrindən istifadə edəcəyik. Birincisi, artıq yaşadığımız proqramı yeniləyək və təkmilləşdirək. Bu, Sudo Apt-Get Update və Sudo Apt-Get yeniləmə ilə edilə bilər. Sonra, Python və virtual mühitimizi, kodumuzun evi, aşağıdakı əmri ilə, Python-Is-Python3 Python3-Venv quraşdırın
Ubuntu instansiyasında proqram quraşdırması baxımından Django ilə getməyiniz lazımdır. Windows və Linux üçün bu kifayət qədər sadə olmalıdır, ancaq Mac üçün virtualbox və ya paralells masaüstündəki pulsuz və ya Pinalds masaüstündən istifadə edərək bir virtual maşın və Linux quraşdırmaq istəyə bilərsiniz və bir Ubuntu mühitini qurmaq üçün yuxarıdakı addımları yenidən qurun. Ubuntu bu vəziyyətdə kritikdir, çünki bu veb saytların işlədiyi proqramdır və bu, yuxarıda göstərilən proqramların hamısı ilə veb saytlara ev sahibliyi etməyə imkan verir.
Gəlin Djangoya qazaq.
CD ilə yenidən bizim qovluğunda:
python -m venv venv # Kodun saxlandığı virtual mühiti yaradır
source venv/bin/activate # Virtual mühiti aktivləşdirir
django-admin startproject mysite . # MySite'nin indiki qovluğumda başladığım layihə olduğu yerdir.
Django, yalnız bizi işə salır, çünki Django veb serverə ev sahibliyi edir və əsas yerli veb saytı əldə etmək üçün lazım olan hər şeyi edirik. İndi Django quraşdırıldığımız, onu necə ehtiyac etdiyimizi işlətmək üçün parametrləri bir az düzəltək. Əvvəlcə yeni bir tətbiq yaradaq
python manage.py startapp feed
İlk tətbiqin yem adlandırıldığını görəcəksiniz. Tətbiqə istədiyiniz hər şey adlandırılmalı və yeni tətbiqlər yaradacağıq, lakin hər tətbiqin adı hər dəfə tətbiqin kodda istinad edildiyi zaman ardıcıl olmalıdır. Yeni bir tətbiq əlavə etmək üçün, Tətbiqin yaratdığı digər qovluqdakı parametrləri həmişə düzəldəcəyik. Nano istifadə edərək,
nano app/settings.py
Parametrlərdə quraşdırılmış_Apps tapın və [] (] birini 3 xəttə ayırın. Boş mərkəz xəttindəki dörd boşluqdan istifadə edərək, 'yem' və ya tətbiqinizin adını əlavə edin. Parametrlərin bu bölməsi.py kimi görünməlidir:
INSTALLED_APPS = [
'feed',
]
Unutmadan əvvəl, Djangonun işlədiyini sınayaq. Command Python.py RunServer 0.0.0.0:8000-dən istifadə edərək, serveri işlədə bilərik və sonra kodu http: // localhost: 8000-ə işləyən kompüterdə bir veb brauzerində (işləyir!) Nəzarət C-yə baxın.
İndi bir az Python kodu yazmağa girək. Django'nun üç əsas komponenti var, hamısı tamamilə kodla idarə olunur. Komponentlər model, görüntüləmə və şablon adlanır və hər biri veb səhifənin istifadəçiyə çatdırılmadan əvvəl müvafiq olaraq daha yüksək və aşağı səviyyədədir.
Model, axtarış, çeşidləmə və göstərmə üçün məlumat bazasında məlumat saxlayan koddur.
Görünüş, modelin necə göstərildiyini, manipulyasiya edilmiş və dəyişdirildiyini, demək olar ki, hər görünüşə birbaşa bir modeldən istifadə edəcəkdir.
Şablon, şablon dili adlanan bəzi əlavə zəng və fitləri olan HTML kodudur. Şablon, məsələn, piton kodu və modellər və məlumatlar (USUALL və tam) kimi kontekstlə doldurulduğu görüntü ilə göstərilir.
Django da digər komponentlərə malikdir, lakin bunlarla məhdudlaşmır:
Müzakirə etdiyimiz kimi tətbiqin konfiqurasiyası olan parametrlər.
İstifadəçinin veb tətbiqinin müəyyən hissələrinə giriş əldə etmək üçün izlədiyi naxışlar olan URL-lərdir.
Serverə göndərilən məlumatların nə qədər məlumatı, eləcə də istifadəçiyə, eləcə də verilənlər bazasına (verilənlər bazasına (verilənlər bazasına (verilənlər bazasına) müəyyənləşdirən formalar. Bunlar server tərəfində məlumatların işlənməsi əsasıdır və hər hansı bir məlumat növünü kompüter mağazalarını, ən çox mətn ipləri, nömrələri və həqiqi / saxta booleans (adətən onay qutuları) qəbul edə bilər.
HTML kodu və şablon dili olan və Python və HTML arasındakı boşluğu olan şablonlar, Python məlumatları, Python kodunu internetdə əldə edə bilsə də, Python kodu əldə edə biləcək və serverin yaxınlığında olmaması üçün bir sıra məqsədlər üçün faydalı bir veb saytı olan HTML kodu kimi təqdim edilə bilər.
Adətən JavaScript və serverin xidmət etdiyi və şablon ilə əlaqəli olan kitabxanalar olan statik sənədlər.
Serverin xidmət etdiyi və ya xarici ev sahibliyi etdiyi və ya işlənmədən əvvəl serverə yazdığı və başqa bir serverə (bir çömçə) göndərilən media faylları.
Hər mənzərə ilə eyni vaxtda işləyən və görüntüdə "daxil edilmiş" sayılan kod parçaları olan orta proqram.
Hər bir görünüşün kontekstini emal edən və əlavə kontekst əlavə etmək üçün istifadə olunan kontekst prosessorları.
İstifadəçi və ya sorğunun görüntüləmədən əvvəl müəyyən tələblər keçdiyini təsdiqləyən testlər.
Webcockets-in necə idarə olunduğunu və ünsiyyətə cavab verdiyini diktə edən istehlakçılar.
Modelləri qeydiyyatdan keçmək üçün istifadə olunan admin, bu, verilənlər bazasının qrafik interfeys vasitəsilə idarə oluna biləcəyi Django Admin səhifəsi daxilində ətraflı şəkildə idarə oluna biləcəklər.
Asinxron tapşırıqları müəyyənləşdirən kərəviz Django kodunun hissələri dərhal növbəti vəzifəyə və ya kod xəttinə keçmədən əvvəl işə başlaya bilər.
Django burada ətraflı müzakirə edəcəyimiz bir çox digər komponentlərə sahib ola bilər. Django daha funksional halına gətirməyin, sürətli, düzəldilmiş rabitə kanalları olan, asinxron vəzifələri icra edən kərəvizlər və Django'nun çox sayda digər proqramının, xüsusən də kodun əksəriyyətinin icra olunduğu görüntü funksiyalarında çox sayda proqram təminatını əlavə etmək üçün çox sayda funksionaldır. Görünüş funksiyaları, adətən müəyyən bir URL nümunəsinə və ya serverin bir hissəsinə xas olan hər kod parçasını elan etdikləri üçün açardır.
Birincisi, Görünüş funksiyalarını araşdıraq. Görünüş funksiyaları, görünüşdə istifadə ediləcək və müntəzəm funksiya tərifləri və ya dərslərdən istifadə edərək müəyyənləşdirilmiş idxal ilə başlayır. Ən sadə mənzərələr funksiya tərifi defi ilə müəyyən edilir və əsas şablon ilə bir httpresponse geri qaytarılır. "Salam Dünyası" mətnini qaytarmaq üçün əsas mənzərəni təyin etməklə başlayaq. Unutmayın ki, hər dəfə def kimi bir ifadədən sonra kod əlavə etdikdə, əgər, əgər, əgər və s. Əgər və s. Tezliklə bu vasitələrin hər birinin nə etdiyinə girəcəyik.
Saytın qovluğundan, nano istifadə edərək yem / baxış.py faylını düzəldin və faylın sonuna aşağıdakı xətləri əlavə edin.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
Django'nun HTTPrespesponse, açılış və bağlanması ilə işarələnmiş bir mətn sətri ilə cavab verir '. Hər dəfə bir funksiyaya və ya sinifdə, istək və ya bir sətir kimi bir funksiya və ya sinfə ötürdüyünüz zaman, mötərizədən (, açılır və bağlanır) istifadə etməlisiniz.
Bu, hələ də fikrimizi görməyimiz lazım deyil. Əlbəttə ki, mənzərənin tam olduğu serverə deyilməmişik, baxışı hələ də göstərməli olan bir yolu təyin etməliyik. App / Urls.py-də əsas yolu təyin etməklə başlayaq və daha sonra yol qruplarına girəcəyik.
App / Urls.py-də, yalnız yaratdıqdan sonra görüntü idxalını idxal etdikdən sonra idxal hesabatlarından sonra bir xətt əlavə edin.
from feed import views as feed_views
İndi görünüş nümunəsini təyin edək. Nümunələrə baxın, baxışların server daxilində mövcud olan serverdə mövcuddur (veb səhifəni daxil etmək üçün istifadəçinin naviqasiya çubuğuna daxil olan URL yolu), görüntü üçün bir şablonun görüntüsünü və başqa bir görünüş üçün yer dəyişdirmək və ya daha çox məntiqi bir ad çəkmək üçün bir şəkil dəyişdirilə və yenilənə bilər. Bu şəkildə iş görməyin mənası var və çevik olun, çünki kod bazanız, qiymətli və işləmək üçün rahatlıq və doğaçlama ehtiyacı olan hər zaman dəyişən bir mühit olacaqdır. Görünüşünüz budur, bunu Urlpatters = [Tətbiq / Urls.py bölməsinə əlavə edə bilərsiniz. Görünüş nümunəsi yuxarıda təsvir olunan üç komponent və yol adlanan bir funksiya ilə müəyyən edilir. URL nümunələriniz bir siyahıdır, buna görə hər şeyi bir vergüllə hər bir elementi bitirməyə əmin olun, çünki bu, hər birini ayırır. Hər bir maddə də yeni bir xəttə getməlidir, bir daha dörd boşluq ilə bir daha, parametrlərdəki tətbiq kimi. Veb serverin kök qovluğunda işləyən bir görünüş yaratmaq üçün görünüşün ilk komponentini boş bir simli funksiyası ilə təyin edəcəyik. Urls.py indi belə görünməlidir:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
Bu, tamamilə statik olan Django ilə bir veb sayt yaratmaq üçün əsasdır. Şəkillər, videolar, audio və daha çox kimi məlumatı əldə edə biləcəyimiz daha dinamik bir veb sayt etmək üçün, növbəti araşdıracağıq modellərdən istifadə etməliyik. İndi kodumuzu yoxlayaq və serveri işə salaq. Səhvlər üçün kodu yoxlamaq üçün qaçın:
python manage.py check
Hər hansı bir səhv mesajı varsa, tətbiqinizə edilən dəyişiklikləri diqqətlə nəzərdən keçirməlisiniz və kənar və ya olmaması, əlverişsiz bir sim, istənilən tip, istənilən tip, hər hansı bir tip, istənilən tip, və ya başqa bir şey kimi düzəldilməlidir. Səhv mesajı ilə oxuyun (əgər varsa), bir xətt nömrəsi ilə birlikdə yaratdığınız və ya redaktə etdiyiniz bir faylın yolunu görə bilməlisiniz və orada olan hər şeyi düzəldə biləcəyinizə baxın. Məsələni həll etmisinizsə, yuxarıdakı əmri yenidən işə salın. Proqramınız işləməyə və işləməyə hazır olduqda, "Sistem yoxlanışı heç bir problemi müəyyənləşdirməmiş" çıxışını görəcəksiniz. İndi getməyə hazırsınız. Serveri işə salın:
python manage.py runserver 0.0.0.0:8000
İndi bir veb brauzerini açın və http-ə gedin: // LocalHost: 8000. Görünüşünüzdə HTTPresponse funksiyasının mötərizəsində və sitatlarında geri qaytarılmış mətni görməlisiniz. Bu, sadəcə əsas nümunədir, amma bu günə qədər etmisinizsə, Linux, Bash, Python və Django'nun əsaslarını başa düşürsən. Bəzi verilənlər bazası modelləşdirməsində daha dərin qazaq və məlumatların saxlanması sahəsində piton sinifinin gücünü araşdıraq. Sonra, JavaScript və maşın öyrənmə istifadə edərək saytımızı tam özəl, çevik və etibarlı etməzdən əvvəl HTML və CSS-də bir tutuş almağa başlayacağıq.
Dərslər tətbiqetmənin modellərində saxlanılır. Nano istifadə edərək, tətbiq / modelləri düzəldin və yeni bir sinif əlavə edin. Bir sinif sinif tərifi ilə müəyyən edilir və bu vəziyyətdə modellər.model-dən miras alan super bir yerdən keçir. Sinifin adı sinif tərifindən sonra gəlir və sinif tərifindən sonra A: (Colon) istifadə olunur, sinfə bağlanan atribut və funksiya təriflərindən əvvəl aşağıda qeyd olunur. Sinifimizi almaq üçün istifadə edə biləcəyimiz və özünəməxsus saxlamaq üçün istifadə edə biləcəyimiz bir şəxsiyyət vəsiqəsinə ehtiyac duyur və bəzi məlumatları saxlamaq üçün bir mətn sahəsinə ehtiyac duyur. Sonralar, bir zaman işarəsi, fayllar, booleans əlavə edə bilərik, kodumuzun modellə nə etmək lazım olduğu barədə qərar qəbul edə bilər və onu sıralamaq üçün istifadə edilə bilər), modeli serverə daxil edilmiş bir istifadəçiyə bağlamaq üçün bir nümunə və daha çox. Aşağıdakı kodu çıxaraq:
from django.db import models # Sinifimizi müəyyənləşdirmək üçün istifadə olunan idxal və bu xüsusiyyətlərdir
class Post(models.Model): # Sinifimizin özünün tərifi
id = models.AutoField(primary_key=True) # Modelimizin şəxsiyyəti, modelin sorğusuna, onu unikal saxlamağa imkan verən avtomatik yaradılan bir açar və yaradıldıqdan sonra modellə qarşılıqlı əlaqə qurmağınız lazım olduqda faydalıdır.
text = models.TextField(default='') # Sinif mağazalarımız, bu vəziyyətdə, bəzi mətn, boş bir sətrə defolt.
Faylı bitirməkdən əvvəl və qeydiyyatdan keçməyimizi bağlayın.
Bu sinfi tətbiqimiz inkişaf etdikcə bu sinfi yenilədikdə araşdıracağımız bir çox sahə və seçimlər var, ancaq bu, bəzi mətn göndərmək üçün bir tətbiq yaratmaq üçün əsas ehtiyaclardır. Ancaq bu model tək işləməyəcək. Daha əvvəl təsvir olunduğu kimi, bu model işləməsi üçün xüsusi bir görünüş və xüsusi bir URL nümunəsinə ehtiyac duyacağıq və şablon ilə birlikdə bir forma ehtiyac duyacağıq. Əvvəlcə formanı araşdıraq.
Bir formanı təyin etmək, Nano ilə tətbiq / formaları düzəldin və aşağıdakı xətləri əlavə edin. İki idxal, forma sinifimizi, habelə yaratdığımız model, həmçinin formaya bənzər bir sinif tərifi və bir sinif şəklində bir sahə ilə birlikdə meta olan bir sinif tərifi və bir sahə ilə birlikdə əlaqə qurma modelini müəyyənləşdirəcəkdir. Formanın sorğusu, model və ya başqa şəkildə məlumatlara əsasən müəyyən edən bir başlanğıc funksiyası da ola bilər, bu sonradan araşdıracağıq.
Model formaları bu qədər faydalıdır, çünki bir model yarada və ya bir modeli redaktə edə bilər, buna görə də onlardan ikisindən istifadə edəcəyik. Aşağıdakı Forms.py-də birini təyin edək.
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 bir forma və modelin göründüyü əsaslardır. Bu model forması, bir yazını dəyişdirmək və ya redaktə etmək, tərkibindəki mətni dəyişdirmək üçün istifadə edilə bilər. Bu formanı sonrakı bir görünüşə inteqrasiya etməyə baxacağıq. Birincisi, miqrasiyanı düzəltək və verilənlər bazasını köçürək, buna görə kodumuz işlədikdə modellə qarşılıqlı əlaqə qura bilər. Bunu etmək üçün aşağıdakı əmrləri işə salın:
python manage.py makemigrations
python manage.py migrate
Bu, icra etmək üçün bir dəqiqə çəkəcək, ancaq bir dəfə də bir dəfə modelə baxışlarda, orta qab və ya proqramda başqa bir yerdə daxil olmağa imkan verəcəkdir. Modelimizi görə biləcəyimiz bir fikir söyləyərək davam edək. Feed / Baxışları düzəldin və qeyd etdiyi kimi aşağıdakı kodu əlavə edin. # İşarədən sonra bir şey əlavə etməyinizə ehtiyac olmayacaq, bu kod kod haqqında məlumatı ifadə etmək üçün istifadə olunan şərhlərdir. Modelimizi fikirlərdə idxal edərək başlayacağıq və onu bir şablonda göstərə biləcəyimiz bir kontekstə əlavə edəcəyik. Sonrakı, modelə əsaslanan yeni bir obyekt yaratmaq və serverə göndərin və bir düymə ilə forma və modeli bir düymə əlavə edə biləcəyimiz bir şablon əlavə edəcəyik. Bu mürəkkəb səslənir, buna görə addım-addım ataq. Görünüşü bitirmədən əvvəl, yalnız modeli təqdim edən bir şablon yaradaq və qabıqda yeni bir yazı yarataraq görə biləcəyimizə əmin olun. Bu baxımdan necə görünməlidir:
posts = Post.objects.all() # İndiyə qədər verilənlər bazasındakı bütün yazıları sorğu
Altına çatana qədər hamısı olduqca sadə görünür. Göstərilən, əvvəlki nümunə kimi bir HTTP cavabının əvəzinə funksiyanın əvəzinə, ilk giriş kimi bir sorğu tələb edir, həmişə şablonda göstərilə bilən bir konteksti (bu vəziyyətdə verilənlər bazasında yazılar) qəbul edir və funksiyada müəyyənləşdirilmiş şablonu geri qaytarır. Şablon, Python məlumatlarını HTML-ə təqdim edən Jinja2 adlı bir az bir dildə HTML sənəd olacaqdır.
Şablonlar yaratmağa başlamaq üçün yemdə iki qovluq hazırlayın.
mkdir feed/templates
mkdir feed/templates/feed
Sonra, yuxarıdakı qovluqda bir şablon redaktə edin, qidalandırın / şablonlar / yem və bu nümunə üçün kodu əlavə edin. Bu nümunə üçün şablona baxaq.
Bu çox sadə bir şablondur. HTML etiketlərini, bir sənəd tipi etiketi, bir əfsanə adı olan bir lövhə titulunu, bir lövhə tüfəngi, ekranda kiçik bir xətt əlavə edən bir bədən etiketini və şablondakı yazıların siyahısında hər bir yazını verən bir braunt etiketi və bir braunt etiketi, bir braunt etiketi və bir break etiketi, bir break etiketi və bir braunt etiketini müəyyənləşdirir. Bu, ismarıcları göstərmək üçün lazım olan şeydir, ancaq hələ verilənlər bazasında heç biri yoxdur. Qabıqla bəzilərini yaradaq. Qabığı idarə edə bilərik.
python manage.py shell
İndi post modelimizi idxal edək
from feed.models import Post
Sonra, bir simli bir sadə yazı yaradırıq və qabıqdan çıxacağıq. Sətir bir şey ola bilər, çünki etibarlı mətndir.
Post.objects.create(text='hello world')
exit()
Nəhayət, yemimizə bir URL nümunəsi əlavə etməliyik. Feed tətbiqetməmizdən çox URL-lərdən istifadə edəcəyik və fayl ölçülərini kiçik saxlamaq istəyirik, gəlin bu kimi görünən yem tətbiqimizdə yerli URLS.PY yaradaq:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
Baza tətbiqetməsindəki URLS.PY-ni də redaktə etməliyik, buna zəng etmək qərarına gəldiyimiz hər şey yaratdığımız ilk qovluq idi. Tətbiq / app.py redaktə edin və URL nümunələrinə aşağıdakıları əlavə edin
from django.urls import include # başında
# ... əvvəlki kod burada
İndi Python idarəedicisi ilə serveri işlədiyimiz zaman, yaratdığımız səhifəni, çünki məlumat bazasında olan maddələrlə birlikdə model, görüntü və şablon, həm də URL naxışımız var. Sonra, yaratdığımız formanı həyata keçirək və öz yazılarımızı yaratmağa başlayaq. Ancaq çox kod yazmadan əvvəl, əvvəllər yazdığımız skriptdən istifadə edərək yedekləmə edək. Bu skriptin qabığına işlədin, bir neçə dəqiqə gözləyin və bütün kodu Git depolarımıza dəstək veriləcəkdir.
backup
Formanı həyata keçirmək nisbətən sadədir. Formamızı idxal edəcəyik, bir yazı sorğusu işləyicisi əlavə edəcəyik və eyni mənzərəyə yönləndirmədən əvvəl verilənlər bazasında yazını saxlayacağıq. Artıq idxal etdiyimiz yönləndirmə funksiyasından istifadə edə bilərik və görüntü nümunəsi üçün URL-ni əldə etmək üçün tərs adlandıra bilərik. Daxil edilmiş naxışın adları yemi, çünki bu, 'yemi: yemi' ilə soruşacağıq, çünki daxil edilmiş naxışın adları qidalandırılır və görünüş də yem adlanır.
posts = Post.objects.all() # İndiyə qədər verilənlər bazasındakı bütün yazıları sorğu
if request.method == 'POST': # Yazı tələbini idarə edin
form = PostForm(request.POST) # Formanın nümunəsi yaradın və məlumatları ona saxlayın
if form.is_valid(): # Formanı təsdiqləyin
form.save() # Yeni obyekti xilas edin
return redirect(reverse('feed:feed')) # Bir tələbi ilə eyni URL-ə yönləndirin
'form': PostForm(), # Formanı kontekstə keçdiyinizə görə, buna görə də göstərə bilərik.
İndi şablonu yeni formanı hesablamaq üçün yeniləməliyik. Bunu istifadə edərək bunu edə bilərik
Bunu qıraq. Yeni bir forma sinfi, bir əlamət, forma özü və bir təqdim düyməsi var. Olduqca sadə, ancaq bir nəzər saldığımızda, onu daha yaxşı görünmək istəyə bilərik. Bu işləyir, yeni yazıları forma ilə göndərə bilərik və indi bazada saxlanılır. Burada bir neçə şey davam edir. Sənədin HTML sənədi olduğunu elan etmək üçün HTML etiketlərindən istifadə edirik, forma üçün işarəni və digəri, digəri, {% ...%}} şəklini göstərmək üçün bir şablon etiketindən ({% ...%} istifadə edirik) istifadə edirik. Blok etiketlərindən və şablon etiketindən istifadə edərək mətni göstərmək üçün bir döngəmiz var. Blok etiketləri həqiqətən vacibdir, çünki şablonun onlarla necə qurulduğunu müəyyənləşdirə bilərik və şablon etiketləri dəyişənlərimizi kodumuza necə qoyduğumuzun əsasını təşkil edə bilərik.
İndi tətbiqimizi daha yaxşı görüntüləməliyik, çünki indi həqiqətən əsas görünür. Bunu CSS-dən istifadə edərək, ya da, ya da sənəddəki hər bir obyektə bağlanmış siniflərdə edə bilərik. CSS həqiqətən gözəldir, çünki səhifədəki hər şeyi necə görünməlidir və onu həqiqətən yaxşı görünə bilər. Bunu edə biləcək bir neçə kitabxana var, amma şəxsi gedişim Bootstrap.
Bootstrap veb saytından yüklənə bilər,getbootstrap.com/. Orada bir dəfə quraşdırma sənədlərini oxumaq və kodu CDN bölməsi vasitəsilə daxil etmək üçün kodu kopyalayın. HTML sənədinizin başında bu koda, baş adlı bir etiketdə ehtiyacınız olacaq. Ayrıca, hər şablonda bu bağlantıları yenidən yaratmağa ehtiyac duymadığımız üçün bir əsas şablon yaradaq.
MKDIR şablonları ilə şablonlar adlı yeni bir qovluq edin və sonra şablonları / baza.html redaktə edin.
Bu belə görünməlidir:
CSS və JavaScript, .css və .js sənədlərini, çünki saytımızı gələcəkdə daha funksional etmək üçün JavaScript-ə ehtiyac duyacağıq.
İndi, baş qabığına qayıdaq və sürətli bir əmr qaçaq. Unutmayın ki, virtual mühitə daxil olmağınız lazımdırsa, mənbə Venv / bin / aktivləşdirin. Bu, Python paketlərini yerli olaraq Django-nun onlara daxil olmasına imkan verən bir şəkildə quraşdırmağa imkan verəcəkdir. Django Bootstrap dərsləri tərəfindən yaradılan formalarımızı vermək üçün, xırtıldayan formalar adlanan bir python paketindən istifadə edəcəyik. Bunu aşağıdakı əmrlə yükləyə bilərik
pip install django-crispy-forms
Bu quraşdırıldıqdan sonra Parametrlər.py-ə əlavə edin
# ... əvvəlki kod burada
İndi yem şablonumuza qayıdın, bəzi şeyləri silə bilərik. Sənədin başlanğıcını və sonunu çıxaraq və uzanan və blok tərifindən istifadə edərək baza şablonumuzdan mirasla əvəz edək. Ayrıca, forma və şablon filtri ilə şablon filtr idxalı əlavə edəcəyik. Nəhayət, daha çox düyməyə bənzəmək üçün formadakı düyməyə düyməsinə düyməsinə əlavə edək. Bu belə görünməlidir:
Gözəl! Artıq onsuz da bir az koddur. Sonra, onu sınamalı və hər şeyin gözəl göründüyünü və hər şeyin düzgün işlədiyinə əmin olmalıyıq. Əvvəlki təlimatlara uyğun olaraq serveri işə salın və saytın göründüyünə və yaxşı işlədiyinə əmin olun. Əla iş! Bənzər URL, Formalar, Formalar, Baxışlar və Şablonlardan istifadə edərək istifadəçi giriş funksiyasını əlavə edəcəyimiz növbəti mərhələyə keçməyə hazırsınız. Baza şablonu vacibdir və onu dəyişdirməyə və lazım olduqda dəyişiklik etməyə davam edəcəyik, lakin bu gün istifadəçilərin istifadəçi adı və parol kodu ilə daxil olmağa və yalnız sizin tərəfindən əldə edilə bilən daha vacib məlumatlar hazırlayaraq, saytımızı daha etibarlı şəkildə düzəltməyə diqqət yetirək.
Bunu etmək üçün, Django-ya quraşdırılmış istifadəçi modelindən istifadə etməliyik. İstifadəçi modeli, bir istifadəçiyə veb saytına daxil olmaq üçün göstərilə bilən bir verilənlər bazası modelidir. Gələcəkdə saytı internetə yerləşdirməzdən əvvəl bu modeli ona aid digər modellərlə uzatacağıq və fişinqə davamlı olan giriş üçün əlavə təhlükəsizlik tədbirləri quracağıq. Django'nun təmin etdiyi giriş formalarında bəzi quraşdırılmış bəzi istifadə edərək başlayacağıq. Birincisi, əsas giriş səhifəsi üçün şablon və fikirləri göstərmək üçün istifadə edəcəyimiz yeni bir tətbiq yaradaq. Ayrıca, bir pinkode, üz tanınması, sahə rabitəsi, xarici cihazların, çox amil identifikasiyası və barmaq izi tanınması daxil olmaqla, tətbiqin təmin edilməsi üçün davamlı giriş problemlərini də təmsil etmək üçün digər tətbiqlər də yaradacağıq.
Artıq bir tətbiqə başlamaq barədə danışdıq. Virtual mühitin içərisində olan qovluğumuzdan, bu dəlilləri keçin
python manage.py startapp users
İndi yeni tətbiq üçün bir qovluq olmalıyıq. İstifadəçi girişinə uyğun gələn bu qovluqda bir görünüş yaratmaqla başlayaq. Django istifadəçi girişləri üçün fikirlər qurdu, lakin bu, bizə uyğun olmayacaq, çünki bir təriflə edilən xüsusi bir görünüşə ehtiyacımız var.
Bu baxımdan, bir poçt sorğusu, sorğu keçirərək, Django-dan idxal edilən bir giriş formasına keçərək, istifadəçi hesabını təsdiqləməyinizə və istifadəçiyə yönləndirmədən əvvəl istifadəçiyə daxil olacağıq.
İstifadəçilər / Baxışlar.py-də, aşağıdakı kodu əlavə edin
username = request.POST['username'] # İstifadəçi adı və şifrənizi poçt sorğusundan alın
password = request.POST['password'] # İstifadəçini təsdiqləyin
Əsas giriş görünüşü üçün lazım olan hər şey budur. İndi baza şablonunu uzatmaqla görünüş üçün bir forma yaradaq. İstifadəçilər qovluğundakı şablonlar üçün yeni bir qovluq yaratmaqla başlayacağıq.
mkdir users/templates
mkdir users/templates/users
İndi istifadəçilər / şablonları / istifadəçiləri / Giriş.html-i düzəldə bilməliyik. Bunda olduğumuz zaman, istifadəçiyə də qeydiyyatdan keçmək üçün bir şablon yaradacağıq.
nano users/templates/users/login.html
İndi şablonda,
Bu giriş şablonunun əsaslarıdır. Bu, həqiqətən quruluşdakı digər şablon kimidir, ancaq göstərildiyi zaman bir az fərqli görünür. Bu kodu qeyd edə biləcəyimiz və qurulduğumuz yeni bir forma istifadə edəcəyimiz bir qeydiyyat.html adlı digər oxşar bir şablon qurmaq üçün kopyalaya bilərik. Əvvəlcə şablonu edək. İstifadəçilər / şablonlar / istifadəçiləri / Qeydiyyatdan istifadə edin / Qeydiyyat.html və Aşağıdakı kodu əlavə edin:
İndi istifadəçi qeydiyyatı üçün bir forma quraq və bir model ilə istifadəçi girişlərimizi təkmilləşdirməzdən əvvəl fikirlərə yenidən çevrək. Bu formanı başlamaq üçün əsas hala gətirəcəyik, lakin gələcəkdə razılaşmalar və captcha kimi daha çox məlumat və təhlükəsizlik xüsusiyyətlərini özündə birləşdirəcəyik. Nano istifadəçiləri / forma.py ilə formaları düzəldin və aşağıdakı kodu əlavə edin.
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']
Beləliklə, burada ədalətli işləyən başqa bir forma var. Bir istifadəçi adı, e-poçt və şifrə, eləcə də bir istifadəçi qeydiyyatı forması, eləcə də bir parol sahəsidir. Qeyd edək ki, bu forma müntəzəm formaları uzatmır. Bir sahə eyni şəkildə müəyyən edilir və Sinif meta formasını müəyyənləşdirir, formanın formaya yazılacaq məlumatların qalan hissəsinə uyğundur. Bunun əksəriyyəti Djangonun istifadəçi tərəfindən qurulmuş istifadəçi formasında quraşdırılmışdır, buna görə də bu sinif üçün əsas kimi istifadə edəcəyik (mötərizədə keçdi).
Sonrakı, indi bir forma və şablonumuz olan bir istifadəçiyə qeydiyyatdan keçmək üçün görünüşü araşdıracağıq. Bu, yeni yazı baxımından biri kimi bir modelformdur. İstifadəçiləri / Views.py redaktə edin və aşağıdakı kodu əlavə edin:
# ... İdxal
Bu, istifadəçi qeydiyyatdan keçmiş bir istifadəçi almalıyıq, amma daha çox məlumatımız olmalıdır. İstifadəçinin qeydiyyata alındığını, saytda sonuncu dəfə, onlar haqqında bəzi məlumatlar, bir tərcümeyi-halı, vaxt qurşağı və s. Bildiyiniz bir məlumat, postumuzu istifadəçi modeli və hər bir istifadəçiyə atribut yazılarımızı yeniləməliyik. Bunu etmək üçün hər iki tətbiqdə modelləri yeniləyəcəyik. Yem modelini redaktə etməklə başlayaq. İndi belə görünməlidir:
from django.db import models # ... İdxal
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Bu xəttə əlavə edin
Faylın əlavə edilmiş ikinci xəttə diqqət yetirin. Bu, hər bir yazını bir post başına bir istifadəçiyə aid edəcək bir xarici açardır, buna görə istifadəçi başına bir istifadəçi əsasında ismarıcları saxlamadığımızdan əmin ola bilərik və bir istifadəçiyə aid deyil. Bu xarici açarı təmsil etdiyi siniflə müəyyənləşdiririk, mesajları təmin etmək üçün istifadəçilər, null və boş arqumentlər, lazım olduqda istifadəçini silə bilməyəcəyimiz və istifadəçinin yaratdığımız, istifadəçinin yaratdığı yazı obyektlərinə istinad etdiyimizi və istifadəçi adının yaratdığımızdan istifadə edə biləcəyimizi və boş bir arqumentlə silinir. Bu əlaqəli ad, post.author'dan fərqli olaraq, postun müəllifi, postun özündən yerləşdirən istifadəçisini verir. İndi mesajları istifadəçi ilə istifadəçi, istifadəçi və ya müəllifi () və ya müəllif.posts.all () tərəfindən hazırlaya bilərik.
İndi girişlərimizi daha rahat edək. Saytımıza bir giriş sayını məhdudlaşdıracağıq, saytın sayına girməyimizi məhdudlaşdırmaq üçün saytımızı daha az həssas edə bilərik, bu, bu olduqca asandır. Tətbiqimizi inkişaf etdirməyə davam etdikdən sonra hər bir istifadəçi haqqında bəzi məlumatlar da saxlayaq. İstifadəçilər / modelləri düzəltmək, aşağıdakı kodu əlavə edin.
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='')
Qeyd edək ki, bu model post modelinə kifayət qədər bənzəyir. Bizdə DateTime sahələrində defoltları təyin etməyə imkan verən əlavə bir idxal, vaxt zonası var və həm də post kimi bir simvolfeild və mətn sahəsi var. Bu timestampların hamısından istifadə saytın təhlükəsizliyinə və istifadəsini başa düşməyə kömək edir və mətn sahələri hər bir istifadəçi və ya müəllif haqqında məlumat verməyə imkan verir. OneToonefield, yeganə kiçik düşüncə olmalıdır, bu, bir foreginkey ilə eyni davranır, ancaq sonrakı model üçün yalnız biri ilə. Bu yolla, istifadəçinin yalnız bir profilinə malikdir, bir çox ismarıc ola bilər.
İndi, Girişimizi yaxşılaşdıraq və profil üçün hesablama üçün görüntüləri qeyd edək. Birincisi, istifadəçiləri düzəldin / Views.py və Reyestr görünüşünə diqqət yetirin:
# ... İdxal
Profile.objects.create(user=user) # İstifadəçi üçün bir profil yaratmaq üçün bu xətti əlavə etdiyinizə əmin olun
Bu, sadəcə məlumatı doldurmadan istifadəçi üçün bir profil yaradır. İndi istifadəçi hesabının çox tez-tez daxil ola bilmədiyinə və ya ən azı şifrələrə çox tez-tez cəhd edilə bilməyəcəyinə əmin olmaq istəyirik, buna görə giriş görünüşünü yeniləyək.
# ... İdxal
if user and user.profile.can_login < timezone.now(): # Qeyd edək ki, istifadəçinin daxil ola biləcəyi olub olmadığını yoxlayırıq
else: # Giriş uğurlu olsaydı,
user = User.objects.filter(username=username).first() # Bu istifadəçilərin profilini yenilədiyimiz bir hissədir
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Beləliklə, bir neçə saniyə yenidən daxil ola bilmirlər
Bu, təhlükəsizliyin əsas fundamentaldır. Saytın eyni zamanda hər mümkün şifrə birləşməsini və ya hətta bir neçəsini sınamaq üçün saytın həssas olmadığından əmin olun. Bu, onların parol kodunu bilən və yalnız bir neçə cihazda qeyd edən adi istifadəçiyə əsəbi olmayacaq, lakin bu, çox sayda phishing robotlarını tətbiqdən kənarda saxlayacaqdır. Qeyd edək ki, dəyişən, Can_login, keçmişdə bir zaman olmalıdır və eyni istifadəçi adından istifadə edərək hər uğursuz giriş ilə yeniləyəcəyik. Bu yolla, zərərli bir istifadəçi tez yaxın bir yerdə bir parol təxmin edə bilməz. Datetime.Timedelta () saniyələrin sayı da yenilənə bilər və veb sayt daha rahat olacaq, lakin daha çox saniyə ilə biraz daha az istifadə edilə bilər. İlə başlamaq üçün 15 tövsiyə edirəm.
Unutmayın, işimizi xilas etmək üçün bir ehtiyat skript qurduq, buna görə də, hər şeyin saxladığımızdan əmin olmaq üçün indiyə qədər əldə etdiyimiz şeyləri geri və geri çəkək. Əmri işə salın:
sudo backup
Bir daha, bu günə qədər işinizi xilas edəcəkdir. İşinizi saxlamaq üçün tez-tez ehtiyat nüsxələrini işlətməyi məsləhət görürəm və hətta avtomatik olaraq bir ehtiyat işi idarə etmək istəyə bilərsiniz. Bunu Cron adlı bir UNIX yardım proqramından istifadə edərək edə bilərsiniz. Bu yardım proqramını aktivləşdirmək üçün aşağıdakı əmri işə salın və şifrənizi daxil edin:
sudo crontab -e
Nano üçün 1-ci seçim seçməmisinizsə, onsuz da tanış olmalı olduğunuz mətn redaktoru və ox düymələrindən istifadə edərək faylın altına gedin. Aşağıdakı sətri əlavə edin:
0 * * * * sudo backup
Cron format dəqiqəsində, saat, ay, ay, ayın günü, bir * və ya bir nömrənin əmrini nə vaxt işlədikləri zaman bir * və ya bir nömrəni təmsil edir. Dəqiqə və * Vestlər üçün 0-dan istifadə etmək üçün, dəqiqələrin başlanğıcında hər saatın ilk dəqiqəsində bir əmr edə bilərik. Bu, kodu avtomatik olaraq geri qaytarmağa imkan verir. Sudo ilə icra edildikdə bütün Cronun işləri kök kimi çalışır, buna görə hər saatda bir parol yazmağa ehtiyac qalmayacağıq.
Bir şifrə istifadə etmədən kodumuzu yedekləməyi asanlaşdırmaq üçün, yedək əmrimiz üçün şifrəni deaktiv edək. Bunu aşağıdakı əmri yerinə yetirmək və şifrə daxil etməklə edəcəyik:
sudo visudo
İndi faylın altına gedək və başqa bir xətt əlavə edək:
ALL ALL=NOPASSWD: /bin/backup
Bu, hər hansı bir istifadəçi olaraq "Yedekləmə" əmrini hər hansı bir istifadəçi kimi işə salmağa imkan verir. Bunun üçün format asandır, sadəcə "Hamısı = Nopasswd: / bin /" ilə xətti önə çəkin və əmrlə, məsələn / usr / bin / bacı / BİN / yedekləmə.
İndi e-poçtla işə başlayaq. Elektron poçt, veb saytlar üçün həqiqətən vacibdir, çünki veb saytın daha etibarlı olmasının bir yolu, istifadəçilərin real insanlar və hətta müştərilərə bazar məhsulları və ya xidmətləri olduğunu yoxlayın. İnternetdən tez-tez tez-tez bir çox insan e-poçtlarını yoxlayır və maraqlandıqları məhsul və xidmətlər haqqında hər cür marketinq e-poçtunu alır. Bir Django veb saytında e-poçtu işə salmağa gəldikdə bir neçə seçim var və sizin üçün ən yaxşı işləməyi seçsəniz.
Birincisi, domeninizdən e-poçt göndərməyinizə və minimal kod tələb etməyinizə imkan verən bir e-poçt xidməti üçün ödəyə bilərsiniz. Google Workpace, SendinBlue, Mailgun və sair kimi bunu təklif edən bir çox xidmətlər var.
Əks təqdirdə, sıfırdan serverinizdə öz e-poçt xidmətinizi qurmadan yaxşısınız. Daha çox kod və xüsusi hosting tələb edə bilsə də, bu seçimi tövsiyə edirəm. Çox güman ki, ev kompüterinizdən bir poçt serverinə başlaya bilməyəcəksiniz, buna görə də buludda bir serverə başlamazdan və öz poçt serverimizi yaratmadan əvvəl e-poçt göndərmək üçün konfiqurasiya və kodu göndərək.
Əvvəlcə aşağıdakı əmr ilə parametrləri düzəldin:
nano app/settings.py
Tətbiq başlanğıc ilə yaratdığınız tətbiqin adıdır.
Aşağıdakı xətləri əlavə edin:
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)
Tətbiqinizi yerləşdirməyə hazır olduğunuzda bunları dəyişdirdiyinizə əmin olun, bu barədə sonra yenidən baxacağıq. Email_Address qəbulu göndərmək istədiyiniz e-poçt olmalıdır və şifrəniz (e-poçt_host_password) server üçün yaraddığınız şifrəyə təyin olunmalıdır. Şifrəni konfiqurasiya faylından bir konfiqurasiya faylından, aşağıdakı məntiqdən istifadə edərək, parametrlərdəki bu sətirlərdən istifadə edərək, bu sətirlərdən istifadə edərək yükləyirəm.
import os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
Sonra Nano istifadə edərək Nano istifadə edərək /etc/config.jon konfiqurasiya ilə bir json faylı qurdum.
Faylın redaktəsi üçün:
sudo nano /etc/config.json
Aşağıdakı xətləri əlavə edin:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
Konfiqurasiya faylını redaktə etməyə və tətbiqdə istifadə edəcəyimiz bütün şifrələrin və düymələrin hamısını əlavə etməyə davam edəcəyik. İndi, Python istifadə edərək e-poçtu necə göndərəcəyinizi tez bir zamanda araşdıraq. Birincisi, istifadəçilərimizə göndərə biləcəyimiz bir yoxlama e-poçtu üçün bir şablon yaradaq və istifadəçi şablonları qovluğuna qoyun. Bu şablon HTML-də yazılacaq.
nano users/templates/users/verification_email.html
Bu e-poçt kifayət qədər sadədir. Bir istifadəçi, sayt üçün baza URL və istifadəçinin e-poçtunu yoxlamaq üçün istifadə olunan bir istifadəçi id və əlamətləri bir konteksti və bir istifadəçi identifikatoru və Token tələb edir. Şablonu göstərmək üçün bəzi Python kodunu yazmadan əvvəl parametrlərdə əsas URL-i təyin etdiyinizə əmin olun. Gedin və başlanğıc yaxınlığında tətbiq / parametrlər.py üçün aşağıdakı xətləri əlavə edin.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
Nəhayət, saytınız internetə hazır olduqda və onu yerləşdirdiyiniz zaman, ərazinizi təmsil etmək üçün satın aldığınız domen adı olaraq domeninizi təyin etmək istəyəcəksiniz. Bu saytınıza daxil olmaq üçün Navbar-da yazacağınız addır. Hələlik, domeni boş buraxa və ya bir yerdən istifadə edə bilərsiniz. Site_name saytınızı seçdiyiniz saytınıza vermək istədiyiniz bir ada dəyişdirmək istəyəcəksiniz.
E-poçt göndərməzdən əvvəl, bir token generatoru yaradaq ki, heç vaxt bitməyən bir hesab aktivləşdirmə tokeninə sahibik. Bunu aşağıdakı kimi görünən bir hesab aktivləşdirmə əlaməti quraraq idxal etməklə edə bilərik. Faylı düzəldin:
nano users/tokens.py
Aşağıdakı kodu əlavə edin:
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()
Bu əsas token generatoru istifadəçiyə bir URL-də göndərə biləcəyimiz bir token yaradır və istifadəçi e-poçtlarını yoxlamaq və hesablarını aktivləşdirmək üçün istifadə edə bilər.
Sonra, bir e-poçt göndərməyinizi görək. Nano istifadə edərək istifadəçilər / e-poçt.py.
nano users/email.py
Doğrulama HTML e-poçtunu göndərmək belə görünəcəkdir:
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 olduqca sadədir. E-poçtu göndərməyimiz lazım olan funksiyaları idxal edirik, elektron poçtu şablon və parametrlərimizlə göstərin və sonra şablon adı ilə e-poçtu müəyyənləşdiririk və istifadəçiyə bir funksiya istifadə edərək göndəririk. Məktubu göndərmək üçün funksiyanı müəyyənləşdirməməyimizi görəcəksiniz, beləliklə, hələ istifadəçilərə / e-poçt.py-də əlavə etdiyimiz kodun altından yazaq
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 bir az daha mürəkkəbdir və bu kodun hamısını hələ də işləməyə hazır deyilik. Diqqət yetirin, istifadəçinin e-poçtlarımızdan imtina etmək üçün istifadə edə biləcəyi bir link. Bu vacibdir, çünki istifadəçilər istənilən vaxt görmək istəməsələr, e-poçtlarımızdan imtina edə biləcəklər. HTML etiketlərinin soyulduğu HTML mesajı olan mesajımıza bir mətn alternativi əlavə edirik. Nəhayət, e-poçtun göndərildiyini yoxlayırıq və etməsəydi, e-poçtlarının etibarlı olmadığının istifadəçisinin profilində qeyd edirik.
Bütün işləri edə biləcəyimiz üçün istifadəçi modellərinə qayıdaq. Abunə olmaq üçün bir link yaratmaq üçün bir funksiyanı müəyyənləşdirməliyik və istifadəçinin e-poçtunun etibarlı olmadığını qeyd etmək üçün bir boolean sahəsini təyin etməliyik.
Əvvəlcə istifadəçilərin / modellərin başına aşağıdakı idxalı əlavə edin.
nano users/models.py
# ...
Sonrakı, işarəni etmək və e-poçtu aktivləşdirmək üçün istifadə olunan işarəni, eləcə də istifadəçini müvəffəqiyyətlə poçtlarını alıb-verməməsini saxlamaq üçün istifadə olunan işarəni yoxlamaq üçün istifadəçi modelinə funksiyaları əlavə edək. İstifadəçilər / modellər.py-də yenidən modelin sonuna aşağıdakı kodu əlavə edin (girilmiş kod)
# ...
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # 30 gündür etibarlıdır
Bu olduqca sadədir, müəyyən bir müddətdən sonra başa çatacaq bir əlamət yaratmaq üçün əsas kriptoqrafiya vasitəsi olan bir timestampsigner istifadə edirik və bunun etibarlı olub olmadığını yoxlamaq üçün başqa bir funksiyadan istifadə edirik. Bu ayələrdən iki dəfə, bir dəfə e-poçtu yoxlamaq və bir dəfə link üçün bir dəfə istifadə edirik.
İndi bunların olduğunu, görməli olduğumuz işlərin sonuncusu var. İstifadəçilər / Baxışlar.py daxilində, e-poçt adresini yoxlamaq və abunə olmaq üçün fikir əlavə edək.
nano users/views.py
Əvvəlcə aşağıdakı idxal əlavə edin. Bir neçə əlavə atdım, buna görə daha sonra daha çox məhsul idxal etməyəcəyik.
from .email import send_verification_email # Doğrulama e-poçt göndərmə funksiyasını idxal etdiyinizə əmin olun
Artıq bu idxalımızdan bir neçə ola bilər, ancaq onları təkrarlamaq zərər vermir. Doğrulama e-poçt göndərmə funksiyasını, eləcə də istifadəçilərdən, digər idxal arasında istifadəçi ilə hesab_aktivation_token idxal etmək lazımdır.
İndi, faylın altındakı, aşağıdakı kodu əlavə edin:
# Onları abunə olun
# Əks halda giriş səhifəsinə yönləndirin
# SendWelcomeMail (sorğu, istifadəçi)
Bu çox koddur. Gəlin onu qıraq. İlk funksiyanı təmiz və sadə, istifadəçini poçt siyahısından çıxarır. İkinci funksiya onların e-poçtlarını aktivləşdirir və şərh olunan bir funksiyanı, göndərməceleMail əlavə etdiyimi görəcəksiniz. Xoş bir e-poçt göndərmək üçün bir e-poçt şablonu və funksiya tərifindən istifadə etmək üçün xoş gəlmisiniz. Atladığım son funksiya vacibdir, çünki aktivləşdirmə e-poçtları sona çatır. Buna görə də aktivləşdirmə e-poçtunu bir müddət geri qaytarmalıyıq. Bunun üçün əsas bir forma istifadə edə bilərik və yoxlama e-poçtunu göndərmək üçün funksiyanı çağıra bilərik. Bunu etməzdən əvvəl, qeydiyyat görünüşünə bir funksiya çağırışı əlavə edərək, ilk növbədə göndərildiyinə əmin olaq. İstifadəçilər / baxışlarda, Def Qeydində, Def Qeydində, Def qeydində bu xətti əlavə edin.
nano users/views.py
# ... (sonra) def qeydiyyatı (sorğu):
# ... (əvvəl) yönləndirmə (
Bu kod parçasını birinci və son sətirləri əlavə etmək lazım deyil, reyestr görünüşünün yoxlama e-poçtunu istifadəçiyə göndərdiyinə əmin olun. Bu belə görünməlidir:
# ... İdxal
send_verification_email(user) # Bu xətti əlavə etdiyinizə əmin olun!
İndi aktivləşdirmə e-poçtunu yenidən göndərmək üçün bir forma əlavə etməliyik. İstifadəçilər / Forms.py-də aşağıdakı formanı əlavə edin:
# ... (idxal)
Bu, e-poçt aktivləşdirmə formasına uyğun bir şablona da ehtiyacımız olacaq. Bu şablonu əlavə edək. Faylını redaktə edin:
nano users/templates/users/resend_activation.html
Sonra, faylı aşağıdakı kodu əlavə edin.
Whew, bu çox şeydir! İndi, kodu serverimizə yerləşdirdiyimiz zaman, HTML e-poçtunu göndərə və istifadəçi hesablarını e-poçtdakı bir kliklə aktivləşdirə biləcəyik. Sadə bir xoş bir e-poçt göndərmək istəyə bilərik, buna görə bunu necə edəcəyimizi görək. Geri istifadəçilər / e-poçt.py, aşağıdakı kodu əlavə edin:
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)
Ayrıca, bu məlumatların hamısını göstərmək üçün şablona ehtiyacımız olacaq. Veb saytımda şablon aşağıdakı kimi görünür, ancaq bəyəndiyiniz kimi format-formatlamağa xoş gəlmisiniz.
Qeyd edək ki, bağlama orqanı və ya HTML etiketləri yoxdur, çünki HTML abunə linkini əlavə etdikdə bunları əlavə edirik. Bunlar vacibdir, amma onları iki dəfə müəyyənləşdirmək istəmirik.
Bəs növbəti nədir? Uzun bir yol qət etdik. Həqiqətən, saytı bir serverə yerləşdirməyə hazır olmalıyıq. @Login_Requared Decoratoru əlavə edə və fikirlərimizi etibarlı şəkildə əlavə edə, istifadəçi qeydiyyatdan keçirə, uyğun e-poçt və cache məlumatlarını göndərə bilərik, bu da veb saytın aktual olmaq üçün nə etməsi üçün nə etməli olduğunu əsaslandırıcı göndərin. Daha bir neçə faydalı xüsusiyyət əlavə edəcəyik və sonra kodumuzu uzaq bir serverə yerləşdirmək, poçt serveri, domen konfiqurasiyasını və filtrləri qurmaq üçün süzgəclərimizi etibarlı və uyğunlaşdırmaq üçün bir əsas quracağıq.
Şifrə sıfırlama görünüşünə də ehtiyac duyacağıq, buna görə də bunu həqiqətən tez bir şəkildə əlavə edək. Djangonun parol sıfırlanması görünüşü bəzi funksiyalarda pozulmuşdur, ancaq öz görünüşümüzü, e-poçt şablon, formaları və URL nümunələrini necə yazacağınıza baxacağıq. Budur, görünüşü, istifadəçilər / baxışsızdır.
# ... İdxal
Bu forma Django-ya quraşdırılmışdır, ancaq parol sıfırlamasını, istifadəçilər / şablonları / istifadəçiləri / istifadəçiləri təsdiqləmək üçün bir şablona ehtiyacımız olacaq
Sadə bir forma ilə, istifadəçilər / şablonlarda / istifadəçilər / İstifadəçilər / İstifadəçilər / İstifadəçilər / İstifadəçilər / İstifadəçilər / Sıra / İstifadəçiləri ilə Şifrə sıfırlama e-poçtu göndərmək üçün bir şablonuz var
E-poçtun özü üçün şablon sadədir, şifrəni sıfırlamaq üçün bir link, istifadəçilər / şablonlar / istifadəçilər / istifadəçilər / parol_reset_email_email.html. Django avtomatik olaraq bu faylı şərh edəcəkdir.
Daha iki şablona da ehtiyacımız olacaq. Birincisi, e-poçtun göndərildiyini təsdiqləməkdir. Bunlar üçün baxışlar artıq Django-dadır, buna görə də onları URLS.PY-də həll etməliyik. Bu şablon istifadəçilər / şablonlar / istifadəçilər / parol_reset_done.html-də yerləşir
Və nəhayət, parol sıfırlamasının tamamlandığını təsdiqləmək üçün istifadəçilər / şablonlar / istifadəçilər / parol_reset_complete.html
İndi bu görüşlər üçün URL nümunələrinə ehtiyacımız var. İstifadəçilər / Urls.py-də aşağıdakı URL nümunələrini əlavə edin:
# ... əvvəlki urls burada
Dörd şablon, bu çox şeydir! Ancaq indi istifadəçinin şifrəsini istədiyimiz vaxt, hamısını veb brauzerdən sıfırlaya biləcəyimizə əmin ola bilərik.
Bu çox kod olduğunu başa düşürəm. Başınızın üstündə bir az görünsə, yaxşıdır. Siz yaxşılaşacaqsınız, anlayışınız yaxşılaşacaq və kodla daha çox bacarıqlı olacaqsınız. Tamamilə itirmisinizsə, onlayn olaraq bu proqrama qayıdandan sonra bu proqrama qayıtmağı məsləhət görürəm. Bunlar ümumiyyətlə işə başlamaq üçün pulsuzdur və bu layihəyə qayıdanda uğurlu olmağınız lazım olan hər şeydən sizə yol göstərəcəkdir. Əgər davam etməyə hazır olduğunuzu hiss edirsinizsə, yanında oxuyun, sonrakı, kodunuzu uzaq bir serverə yerləşdirməyi və bir neçə sadə əmr ilə yeni bir layihə qura biləcəyiniz üçün bir poçt serverinə, həm də bir poçt serverinə yerləşdirilməsini təmin edəcəyik.
Uzaq bir serverə yerləşdirmədən əvvəl etməyimiz lazım olan son şey saytımızı bir az daha etibarlı edir. Giriş görünüşünün yalnız bir istifadəçi adı və şifrə aldığını görəcəksiniz və çox amil identifikasiyası və ya birdəfəlik kod yoxdur. Bu asan bir düzəlişdir və eyni kodla saytımızı mətn mesajları göndərə bilərik və hətta serverə göndərilən mətn mesajlarına cavab verə bilərik. Başlamaq üçün istifadəçi modellərinə qayıdacağıq və hər bir girişi təmsil edəcək bir vaxt işarəsi işarəsi əlavə edəcəyik. Girişimizə əlavə təhlükəsizlik əlavə etmək üçün istifadə ediləcək istifadəçi modelinə bənzərsiz, fırlanan identifikator əlavə edəcəyik. İstifadəçi modellərini, istifadəçiləri / modellərini düzəltmək, aşağıdakı kodu əlavə edin:
# UUID, Timestamp imza və URL generatorunu idxal etdiyinizə əmin olun (tərs)
# Bu kodu burada əlavə edin
# Və bu funksiyanı əlavə edin
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # 3 dəqiqə etibarlıdır
İstifadəçilər / modelləriniz, şərhlərdən başqa, bu kimi göründüyünüzdən əmin olun. Bunu aşağı salmaq, sadədir. Təhlükəsiz bir kod yarada biləcək bir kriptovalyutası olan bir neçə idxal, bir timestampsignerimiz var və etibarlı olduğundan əmin olmaq üçün yoxlaya biləcək bir timestampsignerimiz var, yalnız bir dəfə və ya bir neçə saniyəlik yaşlı deyil, yaşlı deyil. Həm də istifadəçimizi işarənin imzalanmasında və işarənin istifadəçiyə göndərildiyi URL-də müəyyən edən unikal identifikator olan bir UUID istifadə edirik. İki amil identifikasiyası görünüşü yaratmaq üçün bu əsas kriptoqrafiyadan istifadə edəcəyik. Başqa bir şey etməzdən əvvəl, istifadəçi modellərimizin yenilənməsi üçün miqrasiyaları işlətək. İdarəetmə.ple olan qovluqda miqrasiyaları etmək və tamamlamaq üçün aşağıdakı əmrləri işləyin.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Bu vacibdir, çünki hər dəfə modellərdə dəyişiklik etdikdə, modellərdən istifadə etməzdən əvvəl cədvəllər yaratmalı və defoltlarla verilənlər bazasını yeniləməliyik.
Sonra, ikinci dərəcəli identifikasiya görünüşünə yönləndirmək üçün giriş görünüşümüzü inkişaf etdirək. İstifadəçilər / Baxışlar.py-də, giriş funksiyasını çıxarın və yalnız istifadəçi modellərində yaratdığımız URL-ə yönləndirin.
# ... İdxal
if user and user.profile.can_login < timezone.now(): # Qeyd edək ki, istifadəçinin daxil ola biləcəyi olub olmadığını yoxlayırıq
# Burada olan Auth_login funksiyasını çıxarın
return redirect(user.profile.create_auth_url()) # Qeyd edək ki, burada yeni bir URL-ə yönləndiririk
else: # İstifadəçi çox faktorlu identifikasiyadan istifadə etmirsə, onları daxil edin.
else: # Giriş uğurlu olsaydı,
user = User.objects.filter(username=username).first() # Bu istifadəçilərin profilini yenilədiyimiz bir hissədir
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Beləliklə, bir neçə saniyə yenidən daxil ola bilmirlər
Beləliklə, bu olduqca sadədir, indi yaratdığımız zaman iki amil identifikasiyasına yönləndirmə yolunuz var. İstifadəçi telefon nömrəsi əlavə etmədiyi təqdirdə bir daim bir dönüşümüz var. Tezliklə bir telefon nömrəsi əlavə etmək və tezliklə mətn mesajı ilə daxil olmaq üçün əsas bir görünüş əlavə edəcəyik.
Birincisi, kodumuzdan mətn mesajı göndərmək üçün asan bir yola ehtiyacımız var. Bunu etmək üçün bir sıra API-dən birini seçə bilərik, amma mənim fikrimcə ən asan biri Twilio. Kiçik layihələr, habelə toplu endirimlər üçün də yaxşı qiymət təklif edirlər. Twilio.com-da bir hesab yaradın, layihəniz haqqında bəzi təfərrüatları doldurun, telefon nömrəsini satın alın və API düymələrinizi parametrlərinizə kopyalayın. Sonra bu kodu yeni bir fayl, istifadəçilər / sms.py altında əlavə edin.
nano users/sms.py
# Bütün lazımi paketləri idxal edin
# Bu kod mətni Twilio ilə göndərir
# Çox sayda rəqəmlə bir nömrə almaq üçün bir köməkçi funksiyası
# İstifadəçini yoxlamaq üçün mətni göndərin
# Bu funksiya ilə istifadəçi istənilən mətn göndərin
# Kodu bu funksiya ilə təsdiqləyin
# Vaxtı təsdiqləyin
Parametrlərinizi lazımi qaydada dəyişdirdiyinizə əmin olun, bu xətləri açarlarınızla əlavə edin:
# Bunları Twilio tablosunuzdan kopyaladığınızdan əmin olun
AUTH_VALID_MINUTES = 3 # TFA səhifəsinin bir neçə dəqiqə ərzində aktivdir
Birincisi, iki amil identifikasiya baxışı üçün formalara ehtiyacımız olacaq. İstifadəçilər / Formalar.py redaktə etmək, aşağıdakı kodu əlavə edin.
# ... İdxal
# Telefon nömrəmizə daxil olmaq üçün bir forma
# İdentifikasiya üçün bir forma
Sonrakı, istifadəçilərdə / baxışsız görüntülər yaradaq
# ... İdxal
Bu baxışların hər ikisi üçün şablonlara da ehtiyacımız olacaq. Əvvəlcə MFA şablonunu əlavə edək.
nano users/templates/users/mfa.html
Bu html kodu şablona əlavə edin
Bu olduqca izahlıdır. Forma ya kodu, ya da boş kodu göndərir və boş kodu alsaq kodu göndərdiyimiz görünüşü görəcəyik. Sonra yalnız iki təqdimetmə düyməsinə sahibik və bu yolla kodu ya düymə ilə göndərə bilərik. Sonra, telefon nömrəsi əlavə etmək üçün sadə bir forma əlavə edəcəyik.
nano users/templates/users/mfa_onboarding.html
Aşağıdakı HTML əlavə edin:
Bu forma çox sadədir, yalnız yaratdığımız telefon nömrəsi formasını təqdim edir və istifadəçiyə telefon nömrəsini əlavə etməyə imkan verir.
Bu, həqiqətən yaxşı görünür! Hər şey düzgün qurulduğuna qədər, mesaj göndərə və URL nümunələrini əlavə etdikdən sonra istifadəçini telefon nömrələri ilə daxil etməliyik. Quraşdırma üçün lazım olan son şey, istifadəçiyə daxil olmadan istifadəçinin telefon nömrələrini dəyişdirə biləcəyinə əmin ola biləcəyimizə görə, nəticədə "STOP" seçimini əlavə etmək istəyəcəyik, buna görə də istifadəçi gələcək mətn mesajlarından imtina etmək üçün "STOP" yaza bilər.
Gəlin istifadəçilərə profil görüntüləri əlavə edək. Bu görünüş istifadəçinin bio, e-poçtu, istifadəçi adını və telefon nömrəsini, həmçinin çox amil identifikasiyasını təmin etməyə imkan verəcəkdir. Birincisi, istifadəçilər / formalarda daha iki formaya ehtiyacımız olacaq
# ... İdxal
Sonra, bu formaların hər ikisini istifadə etmək üçün bir fikir yarada bilərik. İstifadəçiləri / Views.py redaktə edin və görünüşü əlavə edin.
# Bu idxalı əlavə edin
Bu görünüş üçün də şablona ehtiyacımız olacaq.
nano users/templates/users/profile.html
Bu kifayət qədər sadə bir forma olduğunu görəcəksiniz, ancaq yenilənən şəklin məzmununu avtomatik olaraq göndərən bəzi javascript var. Bu, hər dəfə təqdim etmədən düzəlişlər edə bilməyiniz üçün bu faydalıdır.
Sonrakı, istifadəçilərin URL pitterlərində bütün bu fikirləri təmsil edən URL-lərə ehtiyacımız var. İstifadəçilər / Urls.py redaktə edin və bu kodu əlavə edin:
# ... əvvəlki kod, idxal
# ... əvvəllər daxil etdiyimiz URL nümunələri, növbəti üç xətti əlavə edin
İndi layihəmizi sınamaq üçün yaxşı vaxtdır. Ancaq əvvəlcə başqa bir ehtiyat nüsxəsini işə salaq.
backup
Və serveri işə salın. Bir Linux serverinə yerləşdirmədən əvvəl, hesabdakı iki amil identifikasiyasını təmin etmək üçün yaxşı bir fikirdir. Bunu profilimiz URL, / istifadəçilərimiz / profilimizə və telefon nömrəmizə daxil olduqdan sonra və sonra formanı təqdim etdikdən sonra identifikasiyasını təmin etmək üçün qutuya yoxlanacağıq.
python manage.py runserver localhost:8000
Veb brauzerinizə gedərək veb səhifəni ziyarət edin, bu nümunədəki Google Chrome istifadə edirəm və URL-ləri daxil edirəm: // LocalHost: 8000 / Hesab / Profil /
Lazım gələrsə daxil ola və iki amil identifikasiyasını aktivləşdirə biləcəksiniz.
Bu layihənin həqiqətən poçt göndərə biləcəyi üçün işə başlamaq üçün bir server lazımdır. Ancaq əvvəlcə səhvləri görmək üçün bir yola ehtiyacımız var. Serveri Debug rejimində idarə etsəniz, Parametrlər.Debug ilə serveri olan server avtomatik olaraq səhvləri göstərir. Bir istehsal serveridə təhlükəli olan Debug rejimindən istifadə etmədən səhvləri göstərmək üçün, bunun üçün bir görünüş əlavə etməliyik. Dəstəyə biləcəyimiz ən vacib səhvlər:
Səhv 500 - Kodumuzdakı bir problem Səhv 404 - tapılmayan bir səhifə (qırıq url) Səhv 403 - bir icazə rədd edilmiş səhv
Səhvlər adlanan bu səhvləri idarə etmək üçün yeni bir tətbiq əlavə edək.
python manage.py startapp errors
Bunu əvvəllər etdiyimiz kimi parametrlərə əlavə edin.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Səhv mənzərələri, şablonları və bir az orta proqramdan başqa ehtiyacımız var. Bunları belə təyin edək:
# Baxışlarınızı burada yaradın.
Sonra, bu səhvləri idarə etmək üçün orta proqramı təyin edək. Bunu əvvəlcə orta proqramın adı ilə Parametrlər.py-dəki MiddleWare_Classes-ə əlavə edərək edəcəyik.
# ... əvvəlki orta proqram
Sonra, orta proqram əlavə edək.
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.')
Məcəllənimizdə hər hansı bir səhvi izləməyə kömək edən bir iplikli bir yerli istifadə edərək cari istisnanı əldə etmək üçün bir funksiya əlavə edirik. Şablonlar baxımından yalnız birinə ehtiyacımız var, çünki mənzərədəki başlığı dinamik şəkildə müəyyənləşdiririk. Şablon, sadəcə başlığı və "izi", kontekstdən səhv izləməyimizə ehtiyac duyur.
nano errors/templates/errors/error.html
Bu hələ ən sadə şablonumuzdur, ancaq layihəmizdəki səhvləri görmək nə qədər asandır. Sonra, parametrlərdə debugu deaktiv edək.
nano app/settings.py
Bu xətti doğru yönəldildiyi yerə tapın və yalançıya dəyişdirin
DEBUG = False
İndi tətbiq edin və indi tətbiq edin. Uzaqdan Linux serverinə yerləşdirməyə hazırıq və oradan xüsusiyyətlər əlavə etməyə hazırıq.
sudo backup
Bu kodu bir serverə göndərməzdən əvvəl, kodla bağlı bəzi problemlər ola biləcəyini düşünməliyik. Davadan asılı olaraq, onlara göndərilən məlumatları qəbul edən saytlar spam göndərilən və spamın çıxarılması ilə bağlı problemlər olacaqdır. Bu, dərhal baş verməməlidir, amma sonradan saytdakı spamı avtomatik olaraq mülayim bir şəkildə mülayim və robotların saytına necə daxil olmasını, barmaq izi və ya üz tanınması kimi bir istifadəçinin şəxsiyyətini və ya biometrik tarama ilə bir istifadəçinin şəxsiyyətini yoxlayacağını yoxlayacağıq.
Təqdim etdiyimiz çox amil identifikasiya nümunəsinə baxaraq, istehsalda, əşyalar fərqli ola bilər. Girişləri məhdudlaşdıran və tokensləri necə qiymətləndirdiyimizə diqqət yetirin. Robotlar bir sayta daxil olarsa, iki amil identifikasiyası daha çətin ola bilər, çünki istifadəçi eyni vaxtda kodları daxil edə bilər. Bu mübarizə aparmaq üçün, telefon nömrəsi ilə çox amil identifikasiyasından istifadə edərək, saytla necə qarşılıqlı əlaqə qurduğumuzu elan edərək, istifadəçi modellərində bir modeldən istifadə edək. E-poçtla eyniləşdirmək üçün bir seçim də əlavə edəcəyik. Nano ilə istifadəçi modellərini redaktə etməklə başlayın.
nano users/models.py
Əlavə etdiyimiz modelin görünməsi budur. Hər hansı bir üsula, bir nömrəni, istifadəçi, vaxt işarəsi, bitmə müddəti və hər hansı bir çox amil identifikasiyasına qarşı cəhdləri (bir telefon və ya e-poçta göndərilən bir kod) saxlamaq üçün dəyişənlərə ehtiyac yoxdur.
# Veb saytına daxil olmaq üçün istifadə olunan əsas token
Gəlin də istifadəçimizə bir imtiyaz əlavə edək və sonda imtiyazlı istifadəçiləri avtomatik olaraq qeyd etmək üçün köç etməzdən əvvəl indi bunu əl ilə təyin edəcəyik. İstifadəçi modellərində bu xətti profildə əlavə edin:
vendor = models.BooleanField(default=False)
Verilənlər bazasında hər hansı bir dəyişiklikdə olduğu kimi, Django-da bir model.py faylını redaktə etdiyimiz zaman köçürmə və verilənlər bazasını köçürməliyik. Unutmayın ki, bunu etmək üçün əvvəlcə mənbədən istifadə edirik (terminal açıq olduğundan artıq istifadə edilməmişdirsə) və sonra Python.py-ni köçürmək və köç etmək.
cd project-directory-you-named # (lazım olduqda)
Hələlik, qabığından istifadə edərək satıcı kimi yaratdığınız hər hansı bir hesabı cəlb edə bilərsiniz.
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
İndi bu möcüzədən istifadə etmək üçün çox amil identifikasiyasını inkişaf etdirək. Birincisi, MFA köməkçi kommunallarımızı dəyişdirməliyik. Nano istifadə edərək,
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
# E-poçt və ya telefon nömrələrini istifadə edərək istifadəçini təsdiqləyin
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # URL-də (bir UUID) keçən dəyəri ilə işarəni süzgəcdən keçirin
if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Bu seans yaradılmasa, yaradın
user = User.objects.filter(id=token.user.id).first() # İstifadəçini əlamətdən alın
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Əgər onlar artıq təsdiqlənmişdirsə, onları daxil edin
if not user: raise PermissionDenied() # Heç bir istifadəçi tapılmasa inkar edin
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Auth Token'i yoxlayın
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # İstifadəçi daxil olmadıqda istifadəçiyə daxil olun
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Çox amil identifikasiyasına sona çatır
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # İstifadəçini növbəti səhifəyə yönləndirin
if not user.profile.mfa_enabled: # MFA-nın aktiv olub olmadığını yoxlayın
if not check_verification_time(user, token): # Vaxtı yoxlayın
user.profile.mfa_enabled = False # Telefon nömrəsini təmizləyin
user.profile.enable_two_factor_authentication = True # XARAZİYA
user.profile.phone_number = '+1' # Telefon nömrəsini deaktiv edin
user.profile.save() # Profilinizi qeyd edin
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # İstifadəçini öz mfa effektiv olmadıqda daxil edin
if request.method == 'POST' and not fraud_detect(request, True): # İstək bir poçt tələbidirsə
form = TfaForm(request.POST) # Formanı dərhal edin
code = str(form.data.get('code', None)) # Kodu almaq
if code and code != '' and code != None: # Boş olmadığından əmin olun
token_validated = user.profile.check_auth_token(usertoken) # Auth Token'i yoxlayın
is_verified = check_verification_code(user, token, code) # Kodu yoxlayın
if token_validated: # Hər şeysə
if is_verified: # Qaydasındadır
user.profile.mfa_enabled = True # MFA-nı aktivləşdirin (onsuz da aktiv olmadıqda)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # İstifadəçiyə daxil olun
for key, value in request.GET.items(): # Növbəti parametr üçün bir sorğu qurun (varsa)
return HttpResponseRedirect(next) # Yönləndirmək
elif not token_validated: # Token etibarsız olsaydı
if p.mfa_attempts > 3: # Çox cəhdlər olsaydı
if form.data.get('send_email', False): # E-poçtu (və ya mətn) göndərin
# Formanı göstərin (sorğular üçün)
Bu kodda əlavə etdiyimiz zaman bir e-poçt göndərmək üçün funksiyanı idxal etməyinizə əmin olun. Faylın başında istifadəçi baxışları (digər idxallarla), əlavə edin
from .mfa import send_verification_email as send_mfa_verification_email
İndi bu funksiyanı bu funksiyanı işləyəcəkdən əvvəl yazmalıyıq. Göndərmə e-poçt funksiyamızı genişləndirməlidir və yoxlama kodu ilə istifadəçiyə bir e-poçt göndərməlidir.
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))
Beləliklə, hamısı əla işləyir, indi bir telefon nömrəsindən və ya e-poçtdan asılı olan bir çox amil identifikasiya sistemimiz var. Ancaq bizim şərtlərimizlə əməkdaşlıq etməyən istifadəçiləri də gizlətmək üçün bir yola da ehtiyacımız var. Bunlar spam, robotlar və ya işimiz üçün yaxşı demək olmayan hər kəs ola bilər. Veb saytımdakı istifadəçiləri izləmək üçün bir mənzərəyə nəzər yetirin:
# idxal
from .tests import is_superuser_or_vendor # Bu testi yaratmalıyıq
# İstifadəçilərin siyahısını alın
return render(request, 'users/users.html', { # İstifadəçiləri şablonda geri qaytarın
Qeyd edək ki, bu kod bir imtahandan istifadə etdiyini, bu testi testlərdə elan etməyəcəyimiz və onu idxal etməliyik. İstifadəçilər / testləri düzəltmək, testi yaradaq.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
Bu, istifadəçilər / istifadəçiləri ilə birlikdə, bu kimi bir şeyə bənzəyən istifadəçilərlə birlikdədir:
Qeyd edək ki, şablon başqa bir şablon, istifadəçi /İstifadəçi.html. Alttemplate olan və uzanan bir şablon istifadə edərkən, alt bir alt əlavə etmək üçün yaxşı bir fikirdir (şablonları ayırd etmək üçün faylın adı verilmədən əvvəl.
Qeyd edək ki, bu çox Jinja, bu dəyişənlərin hamısının müəyyən olmasına baxmayaraq. Ancaq kodumun göründüyü budur.
<small># {{istifadəçi.id}} </ kiçik>
Ayrıca başqa bir alt dəsti, toggle_active.html-ə ehtiyacımız var. Bu şablon, bir istifadəçinin aktiv olub olmadığını dəyişməyə imkan verən bir forma olmalıdır.
İstifadəçi fəaliyyətini dəyişdirmək və müvafiq URL nümunələrini dəyişdirmək üçün bir fikir əlavə etməliyik. Bunda olduğumuz zaman, bu, ehtiyacımız olan bir istifadəçini silmək üçün bir görünüş əlavə edək.
# İdxal
success_url = '/' # Uğur URL-də yönləndirmə
def test_func(self): # İstifadəçi super istifadəçidirsə və silmək icazəsi varsa test edin
Lazım olduqda bu praktik olsa da, bir istifadəçini silmək çox vaxt lazım olmamalıdır, sadəcə onları işdən çıxarmaq lazımdırsa, saytı ziyarət edən istifadəçilərin görünməsini dəyişə bilərik.
Əlavə etdiyimiz URL nümunələri bu kimi görünür. Nano ilə istifadəçilər / urls.py redaktə edin və bu xətləri əlavə edin:
nano users/urls.py
Xətlər istifadəçi mənzərəsindəki yolların siyahısına, sona qədər "]" başlanğıcından sonra "[" [".
# ...
# ...
İndi, saytı yedekləməyinizə əmin olun ki, onu davam etdirəcəyimiz veb serverdə yükləyə bilərsiniz. Əmr satırından,
sudo backup
İndi saytımız dəstəklənir.
Beləliklə, indi daha faydalı xüsusiyyətimiz var. Bəs burada böyük şəkil haqqında nə demək olar? Bu kod hələ internetdən əlçatan deyil, hələ də poçt serverimiz yoxdur və bizə, həm də, həm də, həm də, güzəştli istifadəçilərin təsdiqlənməsi üçün təhlükəsiz protokollarla yanaşı, hərtərəfli doğrulama prosesi və hamar planları daxil etmək üçün tətbiqimizi genişləndirməliyik.
Bütün bunlara çatacağıq. İndi ən vacib şey, yalnız bir Ubuntu serverində bir neçə sətir ilə edə biləcəyimiz bu kodu onlayn əldə edəcəkdir. Evdə bir serveriniz və limanları açmağa imkan verən bir işçi abunə olmadıqca bunun üçün bir server icarəyə götürməlisiniz. Mən mənim mənzilimdə quraşdırılmış bir HP Z440-da veb saytımı şəxsən idarə edirəm, amma ümumiyyətlə virtual özəl bir server (VPS) icarəyə vermək üçün ümumiyyətlə çox ucuzdur.
Unutmayın ki, indi işlədiyimiz kod nisbətən nazikdir, məhsul qurmalı olduğumuzu istifadə etməyə hazır olduğumuzdan əvvəl saxlanılmalı və təkmilləşdirilməlidir. İnternetlə etdiyiniz işlərə diqqətli olmağınızdan əmin olun, bu saytın bir linux serverindəki vebə açıq şəkildə yerləşdirilmədiyinə əmin olun, veb saytınızla istenmeyen qarşılıqlı əlaqələri bloklamaq üçün bir planınız var. Bu, əvvəlcə bir problem olmayacaq, ancaq bu, maşın öyrənmə, süni intellekt və kompüter görmə də daxil olmaqla, buna qarşı mübarizə üçün müxtəlif həll yollarına baxacağıq. Bir problem halına gəldikdə, bir həll üçün bu mətndə daha da baxın.
Bir VPS icarəsi baxımından, gedə biləcəyiniz çox yer var. Google Cloud VPS serverləri, İonos, Kamatera, Amazon AWS və daha çox provayderlər ehtiyaclarımıza uyğun bulud server həlləri təklif edir.
Onların formalarını tıklamalı və başlamaq üçün bir plan seçməlisiniz. Hər hansı bir provayderlə əsas bir planla gedə bilərsiniz, ancaq provayderin e-poçt göndərmək üçün port poçt server limanlarını açmağa və əmin olun (bu portu 587 və liman olmalıdır), bəzi provayderlər bu limanları bloklayır. İndiyə qədər İonos və Kamatera ilə ən yaxşı təcrübəm var, ikisi də sınırsız e-poçt göndərməyə imkan verəcək və onların qiyməti olduqca ucuzdur.
Şəxsi kompüterinizdən, fərdi kompüterinizdən tam olaraq server ilə uzaqdan interfeysdə olan SSH və ya etibarlı bir qabıq adlı bir protokol üzərində yeni serverinizə qoşulacaqsınız. Server qurduğunuzda, hosting provayderi, ehtimal ki, bir ssh düyməsini əlavə etməyinizi xahiş edir və ya bir istifadəçi adı və şifrə verəcəklər. SSH açarı, kodu düzəltmək üçün əmr satırından serverə necə daxil olacağınızdır. SSH düyməsini yaratmaq üçün aşağıdakı ssh-keygen seçimlərindən istifadə edin.
ssh-keygen
Faylı saxla və ehtiyacınız varsa, ssh düymələrinizi döndərmək yaxşıdır. İndi SSH düyməsini görmək üçün aşağıdakı əmrdən istifadə edə bilərsiniz. Doğrulandırmaq üçün istifadə edə biləcəyiniz üçün onu uzaq serverinizə kopyalamaq istəyəcəksiniz.
cat ~/.ssh/id_rsa.pub
Bu əmr yazarkən bir ssh düyməsini görə bilmirsinizsə, "SSH-RSA AAA" ilə başlayan uzun bir rəqəm və məktublar "), RSA açarı (daha etibarlıdır), onlardan istifadə etməyi məsləhət görürəm.) 4096 bit RSA SSH açarı yaradacaqdır.
ssh-keygen -t rsa -b 4096
Ubuntu-nu işlədən bir VPS yaradın, ancaq bunu etməyi planlaşdırırsınız. Təchizatçılar veb saytındakı (Kamatera.com, ionos.com, ionos.com və ya oxşar) formalarını tıklayarak bir VPS yaratdıqdan sonra daxil olmaq istəyərsiniz. Bunu etmək üçün, SSH əmrindən IP ünvanınızdan istifadə edin (xx.xx.xxx.xx kimi görünən ünvan). Yarandığımız serverdə, məsələn, Ubuntu-nun standart istifadəçi adına həssas olmalısınız.
ssh ubuntu@XX.XX.XX.XX
Şifrə istənən bir şifrə istənə bilər, əgər bir şifrə istənirsinizsə, daxil edin. Defolt istifadəçi adını istifadə etməyəcəyik.
Serverin SSH-dən necə istifadə edəcəyini söyləyən yeni bir sshd_config faylı əlavə edərək başlayaq.
nano sshd_config
# Bu SSHD Server sisteminin geniş konfiqurasiya faylıdır. Görmək
# Daha çox məlumat üçün sshd_config (5).
# Bu SSHD yolu ilə tərtib edildi
# Defolt sshd_config ilə göndərilən seçimlər üçün istifadə olunan strategiya
# OpenSSH, harada olanların dəyəri olan seçimləri təyin etməkdir
# Mümkündür, ancaq onları şərh edin. Boşaltılmamış seçimlər ləğv edin
# Defolt dəyəri.
# Port 22
# Ünvansız
# DinyAddress 0.0.0.0
# DinyadAddress ::
# HOSTKEY / ETC / SSH / SSH_HOST_RSA_KEY_KEY
# HOSTKEY / ETC / SSH / SSH_HOST_ECDSA_KEY_KEY
# HOSTKEY / ETC / SSH / SSH_HOST_ED25519_KEY
# CIPHERS VƏ DƏYİŞMƏSİ
# Veylimit default heç biri
# Giriş
# Syslogfacility anh
# Loglevel məlumatı
# Doğrulama:
# Giriş nöqtəsi 2m
# Permitrotlogin qadağan-şifrə
# StrictModes Bəli
# Maxauttries 6
# Maxsessions 10
# Gözləyin .Səfə / səlahiyyətli_keys2 gələcəkdə standart olaraq nəzərə alınmalıdır.
# Yazılan Yoxdur
# AvtorediteKeySCommand Yoxdur
# AvtorediteKeyScommanduser Heç kim
# Bunun üçün işləməyiniz üçün / ssh / ssh / ssh_known_hosts daxilində ev sahibi düymələri də lazımdır
# HostbaseDauthentication yox
# Bəli, ~ / .shsh / tanınan_hosts etibar etməsəniz, bəli dəyişin
# Hostbasedantika
# Ignoreuserknownhosts yox
# İstifadəçinin ~ / .Rhosts və ~ / / .Shosts fayllarını oxumayın
# Cayerhosts bəli
# Tunnelli təmiz mətn şifrələrini deaktiv etmək üçün burda yox!
# İcazə-Passwords YOX
# Çağırış cavab şifrələrini aktivləşdirmək üçün Bəli dəyişin (problemlərdən çəkin)
# Bəzi Pam modulları və mövzuları)
# Kerberos variantları
# KerberoSauthentication yox
# KerberosorlocalPasswd Bəli
# KerberosticketCleanup Bəli
# Kerberosgetafstoken yox
# GSSAPI Seçimləri
# GSSapiAbleMicatication yox
# Gssapicleanupcredimients bəli
# GSSAPIcTRICTACCOCCOCCHECCHECH Bəli
# Gssapikeyexchange yox
# Pam identifikasiyasını, hesabın işlənməsini təmin etmək üçün bunu 'bəli' olaraq təyin edin,
# və seans emalı. Bu aktivdirsə, PAM identifikasiyası olacaq
# KBDinteractiveArtrentication ilə icazə veriləcək və
# Parisiqifikasiya. Pam konfiqurasiyasından asılı olaraq,
# Pam identifikasiyası KBDinteractiveArtrentication vasitəsilə keçə bilər
# "Perforitlogin şifrəsiz" qəbulu.
# Sadəcə Pam hesabı və sessiya yoxlanılmasını istəsəniz
# Pam identifikasiyası, sonra bunu aktivləşdirin, ancaq şifahi sənədləri təyin edin
# və KBDinteraktiveTifikasiya 'Xeyr'.
# AllowAmporwarding Bəli
# Bəli icazə
# Gatewayports yox
# X11displayoftet 10
# X11uselocalhost bəli
# Permittty bəli
# Printlastlog bəli
# TCPEkeepalive Bəli
# Permituserenvironment yox
# Sıxılma gecikdi
# ClientaliveInterval 0
# ClientaliveCountmax 3
# Ustns yox
# Pidfile /run/sshd.pid
# MaxStartUps 10: 30: 100
# Permittunnel yox
# Chrootdirectory heç biri
# VersiyaDendum heç biri
# Defolt pankart yolu yoxdur
# Müştəriyə yerli mühit dəyişənlərini keçməsinə icazə verin
# Alt systemlərin standartını ləğv edin
# Bir istifadəçi əsasında parametrləri ləğv etmək nümunəsi
# Uyğun istifadəçi anoncvs
# X11orwarding yox
# Lottcporwarding yox
# İcazəli yox
# FORCECOMMAND CVS Server
Yadda saxla, faylı saxlamaq üçün Ctrl + X və Y. Sonra, başlatma adlı əsas skript yazaq (hamısı istifadəçimizin standart ev qovluğunda).
nano initialize
Bu xətləri faylı əlavə edin, dəyişdirin
# ! / bin / bash
Bu fayl vasitəsilə gəzmək üçün, xətt ilə xəttə başlayaq. Birinci sətir bu tərtibçiyə bu bir baş ssenarisi olduğunu söyləyir. Sonra, sshd_config-in düzgün qovluğa, ssh-lərinə yenidən başladığını, SSH-lərin yenidən başladığını, SSH düymələrini yenidən başladıq, istifadəçi "komandası" adını əlavə edərək, bu üçün bəyəndiyiniz bir ad ala bilərsiniz, adları və əlil parol ilə adduser əmrindən istifadə edə bilərsiniz). Ayrıca sudo qrupuna komanda əlavə edirik, SSH düyməsini yaradırıq, açarlarımızı da səlahiyyətli düymələrimizə və onların açarlarına əlavə edin və açarlarını çap edirik. Bu yeni istifadəçi sayta necə daxil olduğumuz olacaq.
Yeni bir terminalda davam edin və yenidən serveri açın.
ssh team@XX.XX.XX.XX
SSH açarınız olduğu kimi bu dəfə bir şifrə ehtiyacınız olmamalıdır. Saytın daha etibarlı olması üçün şifrə ilə giriş əlil oldu.
İndi bu server bu barədə heç bir məlumat olmadan tamamilə boşalır. Layihəmizi Gitdən klonlaşdırmaqla başlayaq ki, yükləyə və uzaq maşında işləyə bilərik. SSH üzərindən bağlı olan uzaq serverdə əvvəlcə SSH düyməsini çap edin:
cat ~/.ssh/id_rsa.pub
Sonrakı, bu düyməni Git depolarımızı qurmadan əvvəl etdiyimiz kimi git parametrlərinə yapışdırın. İndi layihəmizi birbaşa serverə klonlaya bilərik. Layihəni yerli olaraq dəstəklədiyinizə əmin olun ki, yükləmək üçün GIT serverindədir.
git clone git://github.com/you/yourproject.git
Mükəmməl. İndi bütün fayllar burada. Onları ls ilə görə bilərik
ls
İndi server qurmağa başlayaq. Əvvəlcə layihə üçün istifadə edəcəyimiz sadə, yaddaqalan bir ada layihə qovluğunuzu kopyalayın.
cp -r yourproject whatyoucalledit
"Whatyoucalledit" layihənizin yeni adıdır. Sonra, server qurmaq üçün əsas bir yardım proqramı qurmalıyıq. Bu yardım proqramını saxlayacağıq və gələcəkdə istifadə edəcəyik. Bu yardım proqramını qurmaq üçün bir skriptin necə redaktə etdiyimizi müəyyənləşdirmək üçün bir istifadəçi ikili yaradaq. Baş, redaktə / usr / bin / ascript istifadə
sudo nano /usr/bin/ascript
Sudo-nu orada istifadə etdiyinizə əmin olun ki, faylı düzəltmək üçün icazəniz var. Faylda bu xətləri əlavə edin:
# ! / bin / bash
echo "# ! / bin / bash ">> / usr / bin / $ 1
Unutmayın ki, bu skript, skript adını, $ 1 olaraq bir arqument alır. Əvvəlcə faylın mövcud olub olmadığını yoxlayır, ya da onu yaradır, skriptin yarandığını elan etmək, icazələrini dəyişdirmək, yaratdığımız skriptlərin adlarını saxlamağa imkan verən adını əlavə edir və adını verir. Fayl artıq mövcuddursa, sadəcə icazələri dəyişdirin və redaktə edin. Faylı saxla və sonrakı icazələrini dəyişdirəcəyik. Bu skriptdən istifadə etdiyimiz müddətcə bir daha bunu etməliyik.
sudo chmod a+x /usr/bin/ascript
Mükəmməl. İndi Quraşdırma adlı bir skript yaradaq. Birincisi, səni üstələməmək, ancaq qurulmuş skriptimin göründüyünə nəzər salın. Bu skriptinizin layihənizdə olduğu üçün nə ilə gəzəcəyik, başlamaq üçün skriptimdə hər şeyə ehtiyacınız olmayacaq.
# ! / bin / bash
# sudo chmod a + x skriptlər / istifadəçilər
# ./scripts/usersetup
# ssh-keygen
# Layihə kataloqu
# Giriş əmrləri
# Nano konfiqurasiya
# Git konfiqurasiya
# Yeniləyin və quraşdırın
# Clamav antivirusunu aktivləşdirin
# Host adı təyin etmək
# Setup postgres
# Quraşdırma Database Backup
# Ittable'i deaktiv edin
# Bitdefender quraşdırın
# Setup Postfix
# Dirsəlik
# Quraşdırma virtualenv
# Asılılığı əldə edin və qurun
# Firewall qaydalarını təyin edin
# PYPI asılılıqlarını quraşdırın
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP quraşdırın OpenCV-Python == 4.5.5.64
# PIP quraşdırın OpenCV-töhfə-Python == 4.5.5.64
# Certbot quraşdırın
# Certbotu işə salın
# Poçt serverini yenidən yükləyin
# Sertifikatları kopyalayın
# sudo cp /etc/letcrypry/Live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Yamaq venv
# İstifadəçi parametrlərini təyin edin
# İcazələri təyin edin
# Sudo Chown -r Komandanı: İstifadəçilər / Var / Run /
# sudo shown kök: kök / run / sudo / ts -r
# sudo chmod 664 db.sqlite3
# sudo chowwwn www-data: istifadəçilər db.sqlite3
# Kopyalayın və icazələri təyin edin
# Quraşdırma verilənlər bazası
# Pam Konfiqurasiyanı vurun və səhv SSH Config çıxarın
# sudo sed -i '' $ d'/pam.d/sshd
# sudo sed -i '' $ d '/ s. / Profil
# Kopyalama skriptlərini kopyalayın və icazələri təyin edin
# Xidmətləri yenidən yükləyin və aktivləşdirin
# Apache modullarını aktivləşdirin
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Defolt saytını deaktiv edin
# Saytımızı aktivləşdirin
# Daemonu yenidən yükləyin və Apache, Postfix və OpendKim-i yenidən başladın
# İcazələri təyin edin
# Dəyişdirmə konfiqurasiyası
# TAY TAM TƏHSİLİ
# Quraşdırma git
# Domen konfiqurasiyası üçün IPv6 və OpendKim-ni göstərin
# Quraşdırma tamamlandı
Bu çox quraşdırma! Bir sözlə, bu kod nano və giti, nano və git, yükləmələri, postfixi (verilənlər bazası serverini) konfiqurasiya edir və quraşdırır, UFW-ni (tamamlanmamış bir firewall) konfiqurasiya edir, bir antivirusu hiss edir, qovluqlar, klonuz asılılıqlar qurur Sertifikatlar və sertifikatlar qurur, konfiqurasiya quraşdırır, başlayır və kəsir, dəyişdirir, icazələr ayırır, IP, IPv6 ünvanı və Opendkim düyməsini çap edir. Olduqca sadə, amma çox kod kimi görünür. Bağışlılığımız olmadığına görə, bu, kərəviz, kərəviz və ya Daphne istifadə etmirik, lakin başlamaq üçün onlardan bəzilərini quraşdıracağıq. Bu kodun bir domeninin bir neçə dəfə elan etdiyinə diqqət yetirin.
Ayrıca bir domen adı (kiçik illik ödəniş) almalıyıq. Bir domeni satın aldığına görə snyarpace tövsiyə edirəm, onların düzeni asan və istifadəsi asandır. Seçdiyiniz hər hansı bir domeni ala bilərsiniz, ancaq bu nümunədə domen femmebabe.com saytından istifadə edirəm. Bir domen aldıqdan sonra, Squarespace DNS konfiqurasiya panelinə baş vurun və IP ünvanı ilə serverə domeninizə işarə edən bir qeyd əlavə edin. Bu belə görünməlidir:
@ A xx.xx.xx.xx
Host kimi @ operatoru ilə bu domenin altındakı bütün alt domenlər və kök domeninin hamısı serverə yönləndirəcəkdir. Bəyan etmək üçün daha çox qeyd var, ancaq poçt göndərməyə hazır olduqdan sonra bunlara keçə bilərik. Unutmayın ki, serverdən uğurla poçt göndərməyinizdən əvvəl bir neçə gün çəkə bilər. DNS qeydlərimizi təbliğ etmək üçün vaxt lazım olacaq.
Hər halda, başlamaq lazım olan yeganə qeyd bir rekorddur. Beləliklə, indi aşağıdakı skriptinizi layihəmizə görə doldurub işlətək.
Yalnız əsas tərəqqi üçün lazım olanı yalnız quraşdırmaq üçün daha kiçik bir quraşdırma skriptindən başlayaq. Bu qədər bir çox asılılıq və ya postgresql istifadə etməyəcəyik, yalnız əsas HTTP serverinə başlayacağıq və iş görüldükdə təsdiqləməkdən narahat olacağıq. Unutmayın ki, HTTPS sertifikatı almaq və serveri etibarlı şəkildə idarə etmək üçün bir server icarəyə götürməklə birlikdə bir domen almalıyıq. İndi bu sənəddəki "Komandası" adlı istifadəçinizin adı, "Dir", layihənizin qovluğu ilə "Dir" və <> etiketlərdə e-poçt və domeninizi təmin etməklə əvəz edin.
Bundan əlavə, bu kodu işlətmədən əvvəl, parametrləri Firewall-a aparmalıyıq, hosting provayderinin dəstəkləyir, əgər varsa. Adətən bu, hosting provayderinizin 'şəbəkələrinə' və ya özünüzə hostinqiniz varsa, routerinizin 'port ekspediqi' bölməsindədir. Özünüzə hosting istifadə edirsinizsə, marşrutlaşdırıcı vasitəsi ilə statik bir IP-ni server maşınınızın ünvanı ilə qurmaq istəyəcəksiniz. Oxumaq / yazmaq üçün aşağıdakı limanları açmalısınız.
22 (SSH) 25 (poçt) 587 (poçt) 110 (poçt müştəri) 80 (http) 443 (HTTPS)
# ! / bin / bash
# Giriş əmrləri
# Nano konfiqurasiya
# Git konfiqurasiya
# Yeniləyin və quraşdırın
# Clamav antivirusunu aktivləşdirin
# Host adı təyin etmək
# Quraşdırma Database Backup
# Ittable'i deaktiv edin
# Quraşdırma virtualenv
# Certbot quraşdırın
# Certbotu işə salın
# İstifadəçi parametrlərini təyin edin
# İcazələri təyin edin
# Sudo Chown -r Komandanı: İstifadəçilər / Var / Run /
# sudo shown kök: kök / run / sudo / ts -r
# Xidmətləri yenidən yükləyin və aktivləşdirin
# Apache modullarını aktivləşdirin
# Daemonu yenidən yükləyin və Apache, Postfix və OpendKim-i yenidən başladın
# Domen konfiqurasiyası üçün IPv6 və OpendKim-ni göstərin
Bu kodu işlətmədən əvvəl satın aldığınız domenin serverə qoşulduğundan əmin olun. Bunu etmək üçün yerli maşınınızda bir terminal açın və bu əmri domeninizlə işləyin:
ping femmebabe.com # Pingdən sonra domeninizi buraya daxil edin
Hamısı yaxşı görünsə və server cavablar göndərirsə, skriptini işə salmağa və paketləri quraşdırmağa, həmçinin Apache serverimizi işə salmağa və sertifikatlaşdırmağa hazırıq.
Bu, postfixi konfiqurasiya etmək üçün lazım olan bütün quraşdırma deyil, daha sonra o quraşdırma baxacağıq. İndi bu quraşdırma kodunu işə salın və serverinizi quraşdırmaq və sertifikatlaşdırmaq üçün bir neçə dəqiqə çəkməlidir. Bir daha, satın aldığınız ada görə skript adını, e-poçt və domen adını əvəz etdiyinizə əmin olun.
İndi serverin təmin olunduğu, istənilən veb brauzerdə URL-ə gedə və serverin HTTPS işlədiyinə əmin olun. Əgər deyilsə, DNS qeydləri üçün bir az gözlədiyiniz üçün bir az gözləyin və sonra Certbot sertifikatını təkrar etmək üçün aşağıdakı əmri işə salın:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Hər şeyi düzgün konfiqurasiya etdiyiniz müddətcə, kodunuzun işlədiyini və canlı bir veb səhifəsini göstərmək üçün Apache-nin standart səhifəsinə daxil olmağı bacarmalısınız. Sonra, defolt debug rejimimizi istehsal etmək üçün dəyişdirmək üçün parametrləri düzəltək. Parametrlərdə, eləcə də daxili IP-lərdə domeni konfiqurasiya edəcəyik.
nano yourproject/settings.py
Parametrlərdə bu xətləri dəyişdirin / əlavə edin.
# Sayt konfiqurasiya
İndi Apache2-ni konfiqurasiya etməliyik. Bu xətt ilə yerləşdirəcəyimiz konfiqurasiya faylını redaktə edək:
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Bu konfiqurasiya faylı içərisində domen adımız və istifadəçi və layihənin adı olmalıdır. Mən Domen Adı Femmebabe.com, istifadəçi adı komandası və Layihə adı Femmebabe istifadə edirəm.
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>
Serverinizi konfiqurasiya edərkən bu nümunə kodunda layihənin, qovluqların və domenin adını əvəz etdiyinizə əmin olun. İndi standart saytı deaktiv etməliyik. Bu bash istifadə etmək olar.
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Sonra, standart saytı aktivləşdirə və Pash istifadə edərək Apache2-i yenidən yükləyə bilərik. Femmebabe'yi redaktə edərkən elan etdiyiniz fayl adı ilə əvəz etməyi unutmayın / Saytlar mövcuddur / mövcuddur.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Navbardakı domeninizə qayıdın. Veb brauzerinizdə konfiqurasiya etdiyiniz saytı görməlisiniz. Təbrik edirəm! Bunu görmürsənsə, bəzi dəyişikliklər etmək lazım ola bilər. Layihənizdəki parametrləri diqqətlə nəzərdən keçirin və heç bir səhviniz olmadığından əmin olun və səhvlər üçün layihəni yoxlamaq üçün aşağıdakı əmrləri işə salın.
cd projectname
source venv/bin/activate
python manage.py check
Python layihənizdə səhvləriniz varsa, onları harada olduqlarını və düzəldin. Sadəcə "Populyasiya vermir" deyən bir səhviniz varsa, səhvinizi ehtiva etmək üçün, registry.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Bu iş vaxtı xətası qaldırıldığı 83-ə gedin (RuntimeErroru qaldırın ("Populyasiya () yenidən")))) və bu sətirdən əvvəl bir şərh əlavə edin, sonra eyni girinti, self.app_configs = {}. Bu belə görünür:
# AppConfig.Ready () işləməməsi üçün təkrar zənglərin qarşısını al
# metodlar iki dəfə.
# RuntimeErroru qaldırın ("Populyasiya () yenidən göndərilmir")
Daha sonra layihəni yenidən yoxlaya və səhvini ifşa edə bilərsiniz.
python manage.py check
Sonra səhvi görə və düzəldə bilərsiniz. Sabit olduqda və kod heç bir səhv olmadan tərtib edərkən, bu kimi göründüyü kimi faylın geri dəyişdirildiyinə əmin olun:
# AppConfig.Ready () işləməməsi üçün təkrar zənglərin qarşısını al
# metodlar iki dəfə.
# self.app_configs = {}
Serverin onlayn olduğu təqdirdə, ona daha da dəyişiklik etdikdə, serverin yenidən yükləmək üçün aşağıdakı əmrdən istifadə etməliyik:
sudo systemctl reload apache2
Doesome! Bəs poçt göndərmək haqqında nə demək olar? E-poçt göndərməyə başlamaq üçün əvvəlcə domen konfiqurasiyasını yeniləməliyik. Bu, Squarespace-də DNS panelinizdə olmalıdır və ya seçdiyiniz domen adı qeydiyyatı. Konfiqurasiyanı quraşdırmalı və əlavə etməli və bir neçə əmr işləməliyik.
Birincisi, serverin IPv6 ünvanını alaq. Bundan sonra DNS-lərinizi açıb qeydləri əlavə edəcəyik.
Serverin IPv6 ünvanını əldə etmək üçün bu əmrdən istifadə edin:
ip -6 addr
İndi DNS parametrlərinə aşağıdakı qeydləri əlavə edə bilərik. Qeydlərim bu kimi görünür. Bununla birlikdə, qeydləriniz üçün IP adresinizi IP ilə əvəz etməlisiniz (75.147.182.214 deyil, bu mənimdir). Ayrıca femmebabe.com saytının yerində domeninizi əlavə edin, eləcə də əvvəlki əmrlə (Mina, Fe80 :: 725a :: 725A istifadə edə bilməzsiniz: fe49: 3E02). İndi Domainkey-dən narahat olmayın, bu, postfix, poçt serveri, opendkim ilə, açarı çap etdikdə yaradılmışdır. Bu sonu konfiqurasiya edəcəyik.
@ Bir N / a 75.147.182.214
@ Mx Əqrəb femmebabe.com
@ Ptr N / a femmebabe.com
@ Txt N / a TXT @ v = SPF1 MX IP75.147.182.214IP6: FE80 :: 725A: FFF: FFF: FE49: 3E02 ~ Hamısı
Default._Bimi Txt N / a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_dmarc Txt N / a v = dmarc1; p = heç biri
sendonly._domainkey
Txt
N / a
İndi postfix üçün bəzi davamlı konfiqurasiya əlavə etməliyik. Etməyimiz lazım olan hər şey, istifadə etdiyiniz domen adı ilə domen adını, femmebabe.com-u əvəz etdiyimizə əmin olmaqdır. Bütün konfiqurasiya fayllarına bir-bir baxaq və onları yenidən quraşdırıldığınız üçün konfiqurasiya adlanan bir qovluğa quraşdıraq.
nano config/etc_postfix_main.cf
Bu mətni fayla əlavə edin
# Bir şərh üçün / daha çox istifadə üçün / postfix/main.cf.dist baxın
# Debian Xüsusi: Bir fayl adının müəyyənləşdirilməsi birinci yerə səbəb olacaq
# ad kimi istifadə ediləcək bu faylın xətti. Debian defolt
# / və s. / poçt adı.
# myorigin = / s. / poçt adı
# əlavə .Domain MUA-nın işidir.
# "Gecikmiş poçt" xəbərdarlıqlarını yaratmaq üçün növbəti sətirdən kəsilmir
# talk_warning_time = 4h
# Http://www.postfix.org/compatity_readme.html - default 3 3.6-a baxın
# Təzə quraşdırır.
# TLS parametrləri
# Milail konfiqurasiya
Növbəti konfiqurasiya!
nano config/etc_postfix_master.cf
Bu xətləri əlavə edin:
#
# Postfix Master Procure konfiqurasiya faylı. Format haqqında ətraflı məlumat üçün
# Faylın, Master (5) Manual səhifəsinə baxın (əmr: "Man 5 Master" və ya
# On-line: http://www.postfix.org/master.5.html).
#
# Bu faylı redaktə etdikdən sonra "postfix yenidən yükləmə" icra etməyi unutmayın.
#
# ==========================================================================================================================================================================================================================================
# Xidmət tipi Şəxsi IPSSIP Chroot Wakeup MaxProc əmri + Args
# (bəli) (bəli) (yox) (heç vaxt) (100)
# ==========================================================================================================================================================================================================================================
# smtp inet n - y - 1 poster
# SMTPD Pass - - Y - - SMTPD
# DNSBLOG UNIX - - Y - 0 dnsblog
# TLSPROXY UNIX - - Y - 0 TLSPROXY
# Bir birini seçin: Yalnız və ya hər hansı bir müştəri üçün loopback müştəriləri üçün təqdim etməyin.
# 127.0.0.1:submission inet n - y - - smtpd
# -O syslog_name = postfix / təqdim
# -O smtpd_tls_security_level = şifrələyin
# -O smtpd_sasl_auth_enable = bəli
# -O smtpd_tls_auth_only = bəli
# -O smtpd_reject_unlisted_realIpient = yox
# -O smtpd_client_grutrictions = $ mua_client_grutricks
# -O smtpd_helo_grutrictions = $ mua_helo_grutricks
# -O SMTPD_Sender_Qeestallıq = $ mua_sender_Qeestallıq
# -O smtpd_reecientient_grutriction =
# -O smtpd_relay_hestallıq = icazə_sasl_aUrentifikasiya edilmiş, rədd et
# -O milter_macro_daemon_name = yaranan
# Biri seçin: Yalnız və ya hər hansı bir müştəri üçün SMTPS-i aktivləşdirin.
# 127.0.0.1:mtps inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -O syslog_name = postfix / smtps
# -O smtpd_tls_wrappermode = bəli
# -O smtpd_sasl_auth_enable = bəli
# -O smtpd_reject_unlisted_realIpient = yox
# -O smtpd_client_grutrictions = $ mua_client_grutricks
# -O smtpd_helo_grutrictions = $ mua_helo_grutricks
# -O SMTPD_Sender_Qeestallıq = $ mua_sender_Qeestallıq
# -O smtpd_reecientient_grutriction =
# -O smtpd_relay_hestallıq = icazə_sasl_aUrentifikasiya edilmiş, rədd et
# -O milter_macro_daemon_name = yaranan
# 628 inet n - y - - qmqpd
# QMGR UNIX N - N 300 1 OQMGR
# -O smtp_helo_timeut = 5 -o smtp_connect_timeut = 5
#
# =======================================================================================================================================================================================================================================================================
# Postfix proqram təminatına interfeyslər. Təlimatı araşdırdığınızdan əmin olun
# İstədiyini tapmaq üçün qeyri-postfix proqram səhifələrinin səhifələri.
#
# Aşağıdakı xidmətlərin bir çoxu postfix boru (8) çatdırılma istifadə edir
# Agent. $ {Alıcının} haqqında məlumat üçün boru (8) man səhifəsinə baxın
# və digər mesaj zərf variantları.
# =======================================================================================================================================================================================================================================================================
#
# Mailild. Ətraflı məlumat üçün postfix mailildrop_readme faylına baxın.
# Main.cf-də də göstərin: Mailildrop_Destination_ReciPient_limit = 1
#
#
# =======================================================================================================================================================================================================================================================================
#
# Son Cyrus versiyaları mövcud "LMTP" magistr.cf girişindən istifadə edə bilər.
#
# Cyrus.conf-də göstərin:
# lmtp cmd = "lmtpd -a" qulaq asmaq = "Localhost: lmtp" proto = tcp4
#
# Əsas.cf-də aşağıdakılardan biri və ya daha çoxunu göstərin:
# poçtbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
#
# =======================================================================================================================================================================================================================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Ayrıca Main.CF-də göstərin: Cyrus_Destination_ReciPient_limit = 1
#
# Cyrus Unix - N N - - Boru
# bayraqlar = drx istifadəçi = Cyrus Argv = / Cyrus / Bin / çatdırılma
#
# =======================================================================================================================================================================================================================================================================
# Cyrus vasitəsilə çatdırılmanın köhnə nümunəsi.
#
# Old-Cyrus Unix - N N - - Boru
# Bayraqlar = R İstifadəçi = / Cyrus Argv = / Cyrus / Bin / çatdırılma -M-in -m $ {Genişləndirmə} $ {İstifadəçi}
#
# =======================================================================================================================================================================================================================================================================
#
# Konfiqurasiya təfərrüatları üçün postfix uucp_readme faylına baxın.
#
#
# Digər xarici çatdırılma üsulları.
#
Və opendkim konfiqurasiya. Opendkim, onları daha etibarlı etmək üçün domen açarları olan e-poçt serverlərini müəyyənləşdirir. Onsuz, poçt imzalanmadı və onu bir qutuya çevirə bilməz.
nano config/etc_default_opendkim
Bu xətləri əlavə edin:
# Qeyd: Bu bir miras konfiqurasiya faylıdır. Opendkim tərəfindən istifadə edilmir
# Sistemd xidməti. Zəhmət olmasa, müvafiq konfiqurasiya parametrlərindən istifadə edin
# /etc/opendkim.conf əvəzinə.
#
# Əvvəllər, burada standart parametrləri redaktə etmək və sonra icra etmək olar
# / klib/opendkim/opendkim.service.generate Sistemd-də faylları ləğv etmək üçün
# /etc/systemd/system/opendkim.service.d/override.conf və
# /etc/tmpfiles.d/opendkim.conf. Bu hələ mümkündürsə, indi budur
# Parametrləri birbaşa /etc/opendkim.conf-də tənzimləmək tövsiyə olunur.
#
# Daemon_opts = ""
# Bir Unix Soket istifadə etmək üçün / Var / Spool / PostFix / Run / Opendkim
# Bir Chroot-da postfix:
# Rundir = / Var / Spool / Postfix / Run / Opendkim
#
# Alternativ bir yuvanı təyin etmək üçün kasx
# Qeyd edək ki, bu tənzimləmə opendkim.conf-də hər hansı bir yuvası dəyərini ləğv edəcək
# Defolt:
# Port 54321-də bütün interfeysləri dinləyin:
# Socket = Inet: 54321
# Port 12345-də loopback-də qulaq asın:
# Socket = Inet: 12345 @ localhost
# 12345 portunda 192.0.2.1-də qulaq asın:
# Socket = Inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
Bu xətləri əlavə edin:
# Defolt_process_limit = 100
# default_client_limit = 1000
# VSZ (virtual yaddaş ölçüsü) Xidmət prosesləri üçün limiti. Bu əsasən
# Yeməyin yedikdən əvvəl sızan prosesləri tutmaq və öldürmək üçün nəzərdə tutulmuşdur
# hər şey.
# Defolt_vsz_limit = 256m
# Giriş istifadəçisi giriş prosesləri tərəfindən daxili olaraq istifadə olunur. Bu ən dözülməzdir
# Dovecot sistemində istifadəçi. Heç bir şeyə giriş imkanı olmamalıdır.
# default_login_user = dovdull
# Daxili istifadəçi, elan edilməmiş proseslər tərəfindən istifadə olunur. Ayrı olmalıdır
# Giriş istifadəçisi, buna görə giriş prosesləri digər prosesləri narahat edə bilməz.
# Defolt_internal_user = Dovecot
# port = 143
# port = 993
# ssl = bəli
# Yeni bir prosesə başlamazdan əvvəl idarə etmək üçün əlaqələrin sayı. Adətən
# Yeganə faydalı dəyərlər 0 (sınırsız) və ya 1-dir. 1 daha etibarlıdır, amma 0
# daha sürətli. <Doc / Wiki / Loginprocess.txt>
# service_count = 1
# Həmişə daha çox əlaqəni gözləməkdə davam edən proseslərin sayı.
# proses_min_avail = 0
# Service_count = 0 təyin etsəniz, ehtimal ki, bunu böyütməlisiniz.
# vsz_limit = $ default_vsz_limit
# port = 110
# port = 995
# ssl = bəli
# port = 587
# Yuxarıdakı Unix yuvasından istifadə edə bilmirsinizsə, inet dinləyicisi yaradın
# inet_listener lmtp {
# Bütün internet üçün LMTP görünən etməkdən çəkinin
# Ünvan =
# port =
# }
# Yaddaşın əksəriyyəti MMAP () Ing Fayllarına gedir. Bunu artırmaq lazım ola bilər
# Böyük poçt qutularınız varsa məhdudiyyət.
# vsz_limit = $ default_vsz_limit
# Maks. IMAP proseslərinin sayı (əlaqələr)
# proses_limit = 1024
# Maks. POP3 proseslərinin sayı (əlaqələr)
# proses_limit = 1024
# Maks. SMTP təqdimetmə proseslərinin sayı (əlaqələr)
# proses_limit = 1024
# Auth_Socket_Path bu userdb soketinə default olaraq işarə edir. Adətəndir
# Dovecot-LDA, Doveadm, bəlkə də imap prosesi və s. İstifadəçilər tərəfindən istifadə olunur
# Bu soket üçün tam icazələr bütün istifadəçi adlarının siyahısını əldə edə bilir və
# Hər kəsin userdb axtarışlarının nəticələrini əldə edin.
#
# Defolt 0666 rejimi hər kəsə yuvaya qoşulmağa imkan verir, ancaq
# USERDB axtarışları yalnız UserDB-nin "UID" yatağını qaytarsa, müvəffəq olacaqdır
# Zəng edən prosesin UID-ə uyğun gəlir. Zəng edənin UID və ya GID uyğun gəlsə də
# rozetkanın UID və ya GƏLƏCƏK GƏLƏCƏK. Başqa bir şey bir uğursuzluğa səbəb olur.
#
# Bütün istifadəçiləri axtarmaq üçün zəng edənə tam icazələr vermək üçün rejimi təyin edin
# 0666 və Dovecot-dan başqa bir şey, kernelin tətbiq olunmasına imkan verir
# İcazələr (məsələn, 0777 hər kəsə tam icazə verilir).
# Auth fəhlə prosesi, o, əldə edə bilməsi üçün standart olaraq kök kimi idarə olunur
# / s. / Kölgə. Bu lazım deyilsə, istifadəçi dəyişdirilməlidir
# $ standart_internal_user.
# İstifadəçi = kök
# Dict Proxy istifadə olunarsa, poçt prosesləri onun yuvasına giriş imkanı olmalıdır.
# Məsələn: MODE = 0660, qrup = vmail və qlobal mail_access_groups = vmail
# MODE = 0600
# İstifadəçi =
# Qrup =
Bir daha, seçdiyiniz domenlə, bu faylların hamısında domeni dəyişdirdiyinizə əmin olun. Növbəti faylı düzəldin, Dovecot-un konfiqurasiya,
nano config/etc_dovecot_dovecot
Və bu xətləri əlavə edin
## DoveCot konfiqurasiya faylı
# Tələsinsə, http://wiki2.dovecot.org/quickconfiguration baxın
# "Doveconf -n" əmri dəyişdirilmiş parametrlərin təmiz bir çıxışı verir. İstifadə etmək
# Dovecot poçt siyahısına göndərərkən faylları kopyalamaq və yapışdırmaq əvəzinə.
# '# 'Xarakter və hər şey şərh olaraq müalicə olunur. Əlavə boşluqlar
# və nişanlar nəzərə alınmır. Əgər bunların hər ikisini açıq şəkildə istifadə etmək istəyirsinizsə, qoyun
# value inside quotes, eg.: key = "# Xəmir və arxadan Whitspace "
# Ən çox (lakin hamısı deyil) parametrləri fərqli protokollar və / və ya / və ya tərəfindən ləğv edilə bilər
# Mənbə / təyinat IPS Parametrləri bölmələrdə yerləşdirərək, məsələn:
# Protokol IMAP {}, yerli 127.0.0.1 {}, uzaq 10.0.0.0/8 {}
# Defolt dəyərlər hər bir parametr üçün göstərilir, bu da kəsilməsi tələb olunmur
# bunlar. Bunlar buna baxmayaraq istisnalardır: heç bir hissə yoxdur (e.g. adları} {})
# Və ya plugin parametrləri standart olaraq əlavə olunur, onlar yalnız nümunə kimi sadalanmışdır.
# Yollar da yalnız konfiqurasiyaya əsaslanan həqiqi defoltlar olan nümunələrdir
# Seçimlər. Burada sadalanan yollar konfiqurasiya üçün --PRefix = / usr
# --Sysconfdir = / s. - / Var
# Quraşdırılmış protokolları aktivləşdirin
# Bağlantılar üçün harada dinləmək istədiyiniz IPS və ya ev sahiblərinin vergüllə ayrılmış siyahısı.
# "*" bütün IPv4 interfeyslərində, "::" bütün IPv6 interfeyslərində dinləyir.
# Defolt olmayan limanları və ya daha mürəkkəb bir şey təyin etmək istəyirsinizsə,
# Conf.d / master.conf redaktə edin.
# Dinlə = *, ::
# İcra məlumatlarını saxladığı baza qovluğu.
# Base_Dir = / VAR / RUN / DOVECOT /
# Bu instansiyanın adı. Çox instansiya quruluşunda Doveadm və digər əmrlərdə
# Hansı nümunənin istifadə olunduğunu (alternativ) seçmək üçün -i <instansion_name> istifadə edə bilərsiniz
# -c <config_path>). Nümunə adı Dovecot proseslərinə də əlavə olunur
# PS çıxışında.
# Instanse_name = Dovecot
# Müştərilər üçün təbrik mesajı.
# Giriş_greeting = Dovecot hazırdır.
# Etibarlı şəbəkə aralığının kosmik ayrılmış siyahısı. Bunlardan bağlantılar
# IP-lərin IP ünvanlarını və limanlarını ləğv etməyə icazə verilir (giriş üçün) və
# identifikasiya yoxlamaları üçün). deaktiv_praintext_auth da nəzərə alınmır
# Bu şəbəkələr. Adətən IMAP proxy serverlərinizi burada göstərərdiniz.
# LOGIN_TRUSTDED_NETWORKS =
# Giriş Giriş Yoxlama Soketlərinin Kosmik ayrılmış siyahısı (məsələn, TCPWRAP)
# login_access_socketet =
# Proxy_maybe = bəli ilə proxy təyinatı bu IP-lərdən hər hansı birinə uyğun gəlmirsə, etməyin
# ProXing. Bu normal olaraq lazım deyil, ancaq təyinat varsa, faydalı ola bilər
# İp e.g. bir yük balansının IP.
# auth_proxy_elf =
# Daha çox Verbose Proses Başlığı (PS-də) göstərin. Hal-hazırda istifadəçi adını göstərir və
# IP ünvanı. IMAP proseslərindən istifadə etdiyini görmək üçün faydalıdır
# (məsələn. Paylaşılan poçt qutuları və ya eyni UID çox hesab üçün istifadə olunursa).
# verbose_proctitle = yox
# Dovecot Master prosesinin sönəndə bütün proseslər öldürülməlidir.
# Bunu "Xeyr" üçün təyin etmək, Dovecotun olmadan yüksəldilməməsi deməkdir
# mövcud müştəri əlaqələrini bağlamaq üçün məcbur etmək (baxmayaraq da ola bilər)
# Yeniləmə e.g. bir təhlükəsizlik düzəltdiyinə görə).
# bağlama_clowients = bəli
# Sıfır deyilsə, Doveadm serverinə bu bir çox əlaqə vasitəsilə poçt əmrlərini işə salın,
# Onları birbaşa eyni müddətdə işlətmək əvəzinə.
# doveadm_worker_count = 0
# Unix Socket və ya Host: Doveadm serverinə qoşulmaq üçün istifadə olunan liman
# Doveadm_socket_path = Doveadm-Server
# Dovecotda qorunan ətraf mühit dəyişiklərinin kosmik ayrılmış siyahısı
# başlanğıc və bütün uşaq proseslərinə keçdi. Ayrıca verə bilərsiniz
# Açar = hər zaman müəyyən parametrləri təyin etmək üçün dəyər cütləri.
# İdxal_environment = tz
##
## Lüğət server parametrləri
##
# Lüğət düyməsini = dəyər siyahılarını saxlamaq üçün istifadə edilə bilər. Bu bir neçə tərəfindən istifadə olunur
# plaginlər. Lüğəti ya birbaşa, ya da a baxmayaraq əldə etmək olar
# Lüğət serveri. Aşağıdakı Dict Block Xəritələr URIS-ə olan adlar
# server istifadə edildikdə. Bunlar daha sonra URIS formatında istifadə edilə bilər
# "Proxy :: <ad>".
# kvota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Həqiqi konfiqurasiyanın əksəriyyəti aşağıda daxil olur. Fayl adları var
# əvvəlcə ASCII dəyəri ilə sıralanır və bu qaydada təhlil olunur. 00 prefikslər
# Fayl adlarında sifarişin əmrini başa düşməyi asanlaşdırmaq üçün nəzərdə tutulmuşdur.
# Konfiqurasiya faylı da səhv etmədən daxil olmağa çalışıla bilər
# Tapılmadı:
# Dovecotun bütün giriş əlaqələrini dinləməsinə imkan verir (IPv4 / IPv6)
Dovecot istifadəçisi üçün bir parol əlavə edin:
nano config/etc_dovecot_passwd
Faylın ilk hissəsi, kolondan əvvəl, istifadəçi adıdır. Son hissə, "YourPassword", poçt serverinizə vermək istədiyiniz şifrəni bildirir.
team:{plain}yourpassword
Sonrakı, Opendkim Konfiqurasiya
nano config/etc_opendkim.conf
Və bu xətləri əlavə edin:
# Bu imzalamaq və yoxlamaq üçün əsas bir konfiqurasiya. Asanlıqla ola bilər
# əsas bir quruluşa uyğun uyğunlaşdırılmışdır. Opendkim.conf (5) və
# /usr/share/doc/opendkim/examplces/opendkim.conf.sifle üçün nümunə
# Mövcud konfiqurasiya parametrlərinin sənədləşdirilməsi.
# Giriş yox
# Ümumi imza və yoxlama parametrləri. Debianda, "dən" başlıqdır
# həddindən artıq çox, çünki bu, tez-tez nüfuz sistemləri tərəfindən istifadə olunan şəxsiyyət açarıdır
# və beləliklə bir qədər təhlükəsizlik həssasdır.
# Domain, selektor və açar imzalamaq (tələb olunur). Məsələn, imza atın
# Selector "2020" (2020._domainkey.example.com) olan domen "nümunə.com" üçün
# /etc/dkimkeys/eXample-də saxlanılan xüsusi açardan istifadə etmək. Daha dənəvər
# Quraşdırma seçimləri /usr/share/doc/opendkim/readme.opendkim-də tapa bilərsiniz.
# Domain nümunəsi
# Selector 2020
# Keyfile /etc/dkimkeys/Example.Private
# Debianda Opendkim istifadəçi "opendkim" kimi çalışır. Nə vaxt 007 007-nin bir 007
# Soketə imtiyazlı olaraq rozetka daxil olan mtas olan yerli bir yuvadan istifadə etmək
# istifadəçi (məsələn, postfix). Qrupa istifadəçi "postfix" əlavə etmək lazım ola bilər
# "Opendkim" bu vəziyyətdə.
# MTA bağlantısı üçün yuva (tələb olunur). MTA bir chroot həbsxanasındadırsa,
# Soketin əlçatan olması təmin edilməlidir. Debianda, postfix içəri girir
# Bir chroot / Var / makaron / postfix, buna görə bir Unix yuvası olmalı idi
# Aşağıdakı son sətirdə göstərildiyi kimi konfiqurasiya edilmişdir.
# Soket Yerli: /run/opendkim/opendkim.Sock
# Socket Inet: 8891 @ localhost
# Soket inet: 8891
# Doğrulamaqdan daha çox imza atacaq, standart 127.0.0.1-dir. Görmək
# Daha çox məlumat üçün Opendkim-in əməliyyat bölməsi (8).
# DaxiliHostlar 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Etibar lövbər DNSSEC imkan verir. Debianda, güvən lövbər faylı təmin edilir
# Paket DNS-kök-məlumatlar tərəfindən.
# Adververs 127.0.0.1
# Mesajları imzalamaq üçün istifadə olunan düymələrə ünvanlardan xəritədaxili domenlər
# Məktubu imzalanmalı olan daxili hostlar dəsti
nano config/etc_default_opendkim
Və bu xətləri əlavə edin
# Qeyd: Bu bir miras konfiqurasiya faylıdır. Opendkim tərəfindən istifadə edilmir
# Sistemd xidməti. Zəhmət olmasa, müvafiq konfiqurasiya parametrlərindən istifadə edin
# /etc/opendkim.conf əvəzinə.
#
# Əvvəllər, burada standart parametrləri redaktə etmək və sonra icra etmək olar
# / klib/opendkim/opendkim.service.generate Sistemd-də faylları ləğv etmək üçün
# /etc/systemd/system/opendkim.service.d/override.conf və
# /etc/tmpfiles.d/opendkim.conf. Bu hələ mümkündürsə, indi budur
# Parametrləri birbaşa /etc/opendkim.conf-də tənzimləmək tövsiyə olunur.
#
# Daemon_opts = ""
# Bir Unix Soket istifadə etmək üçün / Var / Spool / PostFix / Run / Opendkim
# Bir Chroot-da postfix:
# Rundir = / Var / Spool / Postfix / Run / Opendkim
#
# Alternativ bir yuvanı təyin etmək üçün kasx
# Qeyd edək ki, bu tənzimləmə opendkim.conf-də hər hansı bir yuvası dəyərini ləğv edəcək
# Defolt:
# Port 54321-də bütün interfeysləri dinləyin:
# Socket = Inet: 54321
# Port 12345-də loopback-də qulaq asın:
# Socket = Inet: 12345 @ localhost
# 12345 portunda 192.0.2.1-də qulaq asın:
# Socket = Inet: 12345@192.0.2.1
Postfix serverimizi qurmağa hazır olduğumuzda, aşağıdakı kodu, müvafiq domen adı quraşdırılmışdır. Bir skript yaratmaqdan başlayın
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
İndi Nano-da, mətn redaktoru, bu faylı redaktə edin ki, femmebabe.com əvəzinə domen adınızı ehtiva edir.
# ! / bin / bash
# Setup Postfix
İndi postfix, Opendkim və Dovecot'u konfiqurasiya etmək üçün tamamlanmış skript işləyin.
./scripts/postfixsetup
Bu skript qaçdıqdan sonra, son sətri nüsxəsini yazın və DNS konfiqurasiyasına göndərin. Bu etibarlı poçt göndərərkən domeninizi müəyyən etmək üçün istifadə olunan OpendKim düyməsini istifadə edir.
Doesome! Bir neçə gün ərzində hər şeyin düzgün qurulduğu təqdirdə serverdən poçt göndərə bilməlisiniz.
Yalnız poçt serveriniz üçün DNS-ni konfiqurasiya etmisinizsə, qeydlərin yeniləməsi üçün 72 saatdan az vaxt lazımdır. Adətən daha sürətli. Serverinizin bu əmri istifadə edərək işlədiyini yoxlaya bilərsiniz, e-poçtunuzu təqdim etdi:
echo "test" | mail -s "Test Email" youremail@gmail.com
Hər şey düzgün işləsə, serverinizlə e-poçt göndərə bilməlisiniz. İşləmirsə, səhvin nə ola biləcəyini görmək üçün qeydlərə baxmağa çalışın.
tail –lines 150 /var/log/mail.log
Bu, server tərəfindən göndərilən və düzgün işləməsi ilə göndərilən poçt haqqında məlumat verəcəkdir. E-poçtunuzu da qutusunuzda görə bilməlisiniz, əgər orada deyilsə, spam qovluğunuzu yoxlayın.
Parametrlərinizin parametrlərinizdəki parametrlərinizi konfiqurasiya etməlisiniz. Parametrlərinizdə bu xətləri əlavə edin və ya dəyişdirin
EMAIL_HOST_USER = 'team' # 'Love@mamasheen.com'
Şifrəni əldə etmək üçün bir konfiqurasiya faylından istifadə etdiyimizə diqqət yetirin. Bu faylı faylın başlanğıcında bu kimi parametrlərdə yükləyək.:
# Açıq və yükləmə konfiqurasiya
Gəlin bu faylı yaradaq və ona gizli bir açar əlavə edək, eləcə də poçt parolunu əlavə edək. Gizli bir açar yaratmaq üçün, bu əmrdən istifadə edin, sonunda istədiyiniz uzunluğu ilə istifadə edin:
openssl rand -base64 64
İndi açılan mətni nəsil və /etc/config.json
sudo nano /etc/config.json
Gizli açar olaraq yaradılan açarı olan açarı olan faylınıza aşağıdakı sətirləri əlavə edin.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
JSON Format sadə və istifadəsi asandır, bu şəkildə layihəmizdə də istifadə etmək istədiyimiz digər düymələri elan edə bilər və layihələr kataloqumuzdan ayrı saxlaya bilər və buna görə də digər istifadəçilərimizi yalnız layihə qovluğumuzdan oxuya bilmirlər. Bu, burada bir neçədən çox istifadə edəcəyimiz API düymələri üçün tövsiyə olunur.
Hər şeyin xilas olduğundan əmin olmaq üçün layihənizi də yedekləmək istəyəcəksiniz və artıq bir server icarəyə götürmək istəməsəniz, işinizi bərpa edə biləcəksiniz.
sudo backup
İndi bir əmr satırından birini göndərməklə bir html e-poçt göndərməyə çalışın, əmr satırından birini göndərir. İstifadəçi nümunənizi qabıqda soruşun və Django vasitəsilə istifadəçiyə HTML e-poçtunu göndərin. Adımı CHARLOTTE, istifadəçi adınıza dəyişdirin.
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()
Birinci əmr işləmirsə, istifadə etməyinizə əmin olun
source venv/bin/activate
Hər şeyin düzgün qurulduğu, indi veb tətbiqiniz tərəfindən göndərilən poçt qutusundakı xoş bir e-poçt alacaqsınız. ! Uzun bir yolla gəldin.
Əlavə etmək istədim, əgər bu kimi bir layihə üzərində işləyərkən heç bir səhvlə mübarizə aparırsan, cavab axtarmaqdan və kömək istəməkdən çəkinməyin. Google, digər axtarış motorları arasında, proqramlaşdırma yardımını axtarmaq üçün əla mənbələrdir. Sadəcə əldə etdiyiniz səhvi axtarın və digər insanların problemi necə həll etdiyini görə biləcəksiniz. Ayrıca, mənimlə əlaqə qurmağı, müəllimləriniz (müəllimlər, professorlar, müəllimlər), proqramlaşdırma yardımı üçün mövcud olan hər hansı bir həmyaşıd, bu kitabı və ya digər mənbələrlə qarşılaşdığınız məsələlərin həllini tapmaq üçün müraciət edə bilərsiniz. Mən bu asan deyil, amma bu günlərdə oxusan və heç bir kod yazmamısınızsa da, sıfırdan bir veb tətbiqetməsini qurmaq haqqında çox şey öyrənirsiniz. Özünüzü arxa tərəfdən vurun, əla bir iş görürsən.
Bu üçüncü nəşr veb inkişafı təlimatını oxumağa vaxt ayırdığınız üçün təşəkkür edirəm. Gələcək nəşrlərdə mən sənədin əvvəlində müzakirə olunan vacib nümunələrin daha çoxunu əhatə edəcəyik və proqram və aparat inkişafı dünyasına daha dərin dalış edəcəyik. Nə gələcəyinə görə durun və inanılmaz bir proqram qurmağı öyrətməyi səbirsizliklə gözləyirəm. Növbəti nəşrdə görüşək!
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
.-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
.-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
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 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.
-z Daisy / Ikusmen | Erosi | Erosi kriptografiarekin
https://glamgirlx.com
https://glamgirlx.com -
Utzi punta bat bitcoin helbide hau erabiliz: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE