Ukufunda Okujulile Okusekelwe Kuwebhu Nokuvikeleka Ngokwesibonelo

Daisyisithombe sephrofayili

Ngu Daisy

Ukufundwa okujulile kwewebhu okujulile nokuphepha ngesibonelo Isiqondisi Esithathu UCharlotte Harper Julayi 3, 2024 Isandulela: Ukucatshangelwa Kwezokuphepha ekwakheni isoftware yewebhu kuyingxenye ebalulekile yanoma yiliphi uhlelo lonjiniyela weWeb kanye nokwenzayo ngenkathi ubunjiniyela obuhle obunokwethenjelwa, lube wusizo ngezinhloso ezisebenzayo. I-DOM (Idokhumenti Yento Ukukhishwa kwe-DOM), Ngokuqaliswa kwe-HTML, i-JavaScript, kanye ne-CSS kanye nesoftware yokusebenzisa i-Python, C / C+, Java, Java, Java kanye ne-Breaks Inkululeko ekhombisa Ukuqamba, hlinzeka ngokusetshenziswa kalula nokusebenza, ukuveza ukuthobeka kanye nomlingiswa, futhi unikeze kalula ukusetshenziswa kanye nezinsizakalo ezibalulekile zonke ezikhangayo ku-joe average, Umsebenzisi wokugcina ofuna ukubulala isikhathi noma ukwenza okuthile okwenziwe kwi-Intanethi, imvamisa kudivayisi ye-smartphone yokuthinta. Abantu abaningi bebengeke bazi ukuthi bangaqala kuphi lapho bafuna ukwakha iwebhusayithi kusuka ekuqaleni,Bazovame ukuqala ngewebhusayithi yomunye umuntu futhi bakha okuthile okulinganiselwe ekusebenzeni, ukwethenjwa, ukusetshenziswa kalula futhi ikakhulukazi ubuqambe lapho bebengabathola khona izinkinobho zokucindezela isikhathi, futhi Imali ebiza kakhulu imali yokubhaliswa okubizayo ku-software abambalwa abantu ababefuna ukuyisebenzisa noma kunjalo ukulinganiselwa kokusebenziseka kalula nokuvumelana nezimo. Uma unemizuzu embalwa yokufunda ngale ncwadi futhi ufunde ukuthi yini engifuna ukukufundisa yona, noma ngikhulume nami ngokwami ​​ngezinhloso zakho futhi ngithole ukuholwa endaweni efanele, futhi ngigqugquzelwe ukuba ngifunde ukubhala futhi ngibhale isoftware yakho , Thatha le ncwadi ikhaya bese ubeka eceleni isikhathi sokufunda ukwakha uhlelo lwewebhu olulandelayo, olunamandla, olubalulekile futhi olubalulekile lwewebhu, iwebhusayithi enikuwe futhi yenza kahle lokho okufunayo futhi kuhlangabezana nezidingo zezithameli zakho. Mayelana nami: Ngingumthuthukisi wesoftware obanziI-Ange yesipiliyoni ku-C / C ++, Java, Python, HTML, CSS kanye neJavaScript. Ngakha amawebhusayithi abantu abafuna ukusebenzisa, abafuna ukuvakasha, futhi bathole umlutha wokusebenzisa nje ukufunda, ukuphinda uphinde uphinde ufunde, ukuphinda futhi ubulale isikhathi, futhi okubaluleke kakhulu, ngithengisa isoftware. Ukube ubunomqondo wokuthi ubufuna kanjani iwebhusayithi ukuthi ubukeke futhi usebenze, ubukade ungisekela ukuze ngikwazi ukubhekana nezidingo zami ngenkathi ngihlangana nezindleko zokusebenzisa iwebhusayithi ngokwakho, Ngingakwakha i-YouTube elandelayo ye-YouTube, Tiktok, Twitter, Google, noma uhlelo lokusebenza lokuphepha lobuchwepheshe obuphezulu kuphela ongaluthola. Esikhundleni sokuzama ukukuthengisa isikhathi sami, ngizama ukuthenga kwakho: Ngifuna ukukhuluma nawe ngokwakha uhlelo lokusebenza (iwebhusayithi) ngokwakho ngolwazi oluvele lukhona, futhi lukufundise lokho okudingeka kube ngunjiniyela wesoftware ozimele, Usomabhizinisi, ohola umsebenzi ophumelelayo kunoma iyiphi insimu oyifisayo. Futhi ake ngicace, imfundo ngikunikeza ukuthi izohleleka. Ungaya esikoleni futhi ufunde konke lokhu ngeImfundo ye-RMAl, noma ifunde le ncwadi esikoleni, iqedele izabelo zakho, futhi uthathe imali enkulu evela emfundweni yakho, kodwa ngeke ngikubeke phansi esihlalweni esishisayo futhi ngikucele ukuthi ugcwalise izabelo. Angisiye uprofesa wakho, ungacabanga ngami njengomngane ofuna ukukuqondisa emsebenzini oqhutshwa yimpumelelo yakho. Futhi angikuthengise impumelelo noma, uzodinga ukuyithenga nesikhathi sakho. Ukufunda kwikhodi kune-curve yokufunda ijika futhi akukaze kube lula, noma kufanele kube. Udinga ukusebenza kanzima ngangokunokwenzeka futhi uqhubeke nokuzama futhi wehluleke futhi uzame futhi lapho ukhungathekile ukuze ufunde futhi wakhe izinhlelo zokusebenza ngokwakho. Lokho kungokwemvelo yekhodi uqobo. Ikhodi iqhutshwa ngumhlanganisi owenzelwe ukunikeza imiyalezo yephutha ye-Programmer, futhi lokhu kuzokufundisa ukuthi ungayibonisa kanjani ikhodi, noma ngabe ukukopisha iphutha kwi-Injini yakho yokusesha nokufunda izibonelo zabanye abantu. Futhi kufanele ngithi, awudingi ukuba ucebe kakhulu, uhlakaniphile, uphumelele,en ethambekeleni noma ehlelekile ukwakha uhlelo lokusebenza. Ikhompyutha iyakunakekela leyo nhlangano. Udinga nje ukukhuthazela ngesivivinyo nephutha, gcina ukugxila futhi usebenze kanzima kulokho okwenzayo, futhi uzoba nomsebenzi ophumelele kakhulu kulo lonke wenzani. Ngingubani: Ngiyabona ukuthi isigaba sokugcina sasisemayelana nokufunda futhi uthathe izindlela ezivela kule ncwadi. Ngingubani ngempela? Lowo ngumbuzo oyinkimbinkimbi. Angikacaci ukuthi ngokwami, njengoba ngihlushwa izimo zezokwelapha ezingenza kube nzima kimi ukubhala noma zibhale le ncwadi ngezinye izikhathi, ngenkathi zethula izinselelo zokuhlalisana nobunikazi ezenza impilo yami ibe nzima ngokwengeziwe maqondana nami . Ngamafuphi, uma ufunda le ncwadi, ulethe ekhaya ngoba ulibutheke ngalo futhi wacabanga ukuthi bekulusizo, noma uma nje ufunda lokhu okude, kuwe ngingumuntu othanda ukukubona uphumelela Konke okwenzayo. Ngingunjiniyela uqobo, isoftwareUnjiniyela, kanye nomfundi, futhi ngibhala le ncwadi kwabanye abafundi abafuna ukwenza izimpilo zabo zibe lula ngokuba nencwadi yesoftware abayidingayo ukwenza izimpilo zabo zibe lula ngokubhala ndawonye njengephazili enkulu ekusebenzeni , ewusizo, enkulu, esebenzayo, enobumbano, nokwenza uhlelo lokusebenza oluhlanganayo olungashayela impumelelo noma ngabe umugqa webhizinisi. Kakhulu, yilokhu engikwenzayo: Ngakha izinhlelo zokusebenza ukuze ngizisize mina nabanye abantu baphumelele. Ngingumbhali futhi, yize le yincwadi yami yokuqala engihlose ukuyigcwalisa ukuze ngibeke iphothifoliyo yami ibe yincwadi ewusizo, futhi ngingumculi futhi. Ngizokuvuma lokhu kuwe, ngingumuntu ongaziwa. Angiphelele, sengiphelile ngomthetho ngisho nokungiholela ngisho ngishiya amakolishi kanye namanyuvesi futhi ngishiye izifundazwe ukuze ngizame ukuzenzela igama ngempumelelo. Ngingowesifazane ngokuzalwa, ngigqoka izimonyo, thatha izithombe zami, ngigqoke izingubo kanye nezinye izingubo zabesifazane, futhi ngihlala ngizazi ukuthiowesilisa ngokwemvelo. Ngibe nezinkinga nabanye abantu esikhathini esedlule esiholela ezimpini ngokubhala nokwakha iWebApps, futhi ngiyaxolisa ukuthi angikwazi ukuthola le ncwadi ezandleni kungekudala: Uyakudinga lokhu. Uzofuna ukufunda nokubhala ikhodi ebukeka efana neyami futhi isebenze njengeyami futhi yenza into efanayo kepha ingcono, ngoba uma ukwazi ukuthenga le ncwadi esikhundleni sokusebenzisa incwadi yakho enjengezincwadi Kuyo, unezinsizakusebenza okudingeka uziphumelele empilweni yakho. Nginazo zonke izinhlobo zezingqinamba ngokukhula komndeni, izimo zezempilo, odokotela, abezindaba, kanye nomthetho, futhi ikhodi yami ibonakala ngokujulile umzabalazo onobuntu besifazane nowesifazane emhlabeni ohlukene futhi okhungathekile. Kodwa-ke, le ncwadi yinto engiyikhathalela ngokujulile, ingane yami, iphothifoliyo yami, kanye nendlela yami yokuphila, ngakho-ke ngiyabonga ukucubungula kwakho lapho uthatha umbhalo wayo ukuze ufunde kimi. Sicela ugcine engqondweni angiphelele,Incwadi izoba namaphutha, izibuyekezo, kanye nohlelo olusha, futhi uzodinga ukucabanga ngengqondo yakho enengqondo ngangokunokwenzeka ukuze ube nesipiliyoni esiphumelelayo ngokubhala kwami. Futhi, qonda ukuthi ngiqonde kahle ngawe noma ngabe ubhekana nezinselelo lapho ubhala. Cabanga ngakho kanjena: Lapho ungavele uqashe uhlelo lwekhompyutha ukuze wenze noma yini ongayicabanga lapho ungacabanga khona endaweni yedijithali, gcina lonke ulwazi ohlangabezana nalo, ulihlele, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, Ukubhekana nobunzima obungenakugwemeka ngolwazi olifaka futhi nokushicilela. Ngikutshela lokhu ngoba ngihlangabezana nobunzima obufanayo. Sebenzisa le ncwadi ngengozi yakho, sebenza nomphakathi wakho kanye nemiphakathi etholakalayo kuwe ukwakha isoftware ngaphakathi kwesilungiselelo esiphephile, futhi ungahambi kahle noma uphumelele ngendlela engafanele , futhi kungani ngingakulethela lo mbhalo futhi ngikusize uphumelele ngaphandle kokuphambuka endleleni yobuhlanya eshiya amaqabungaNgichithekile, ngidwengulwe ngenkathi ngihlangabezana nezinkinga ezijwayelekile wonke umuntu owenza emhlabeni wonke ngenxa yesilinganiso somhlaba wonke esizosebenza kuyo, i-Intanethi. Kungenzeka ungajwayelani kakhulu ukuthi ngingubani ngamazwi ambalwa, kodwa ngikukhuthaza ukuthi ufunde, uzokwazi njengoba uqhubeka nokufunda nokungiqonda imisebenzi yakho ukuze uqedele umsebenzi wakho. Ngeke kube khona umsebenzi wesikole ngale ncwadi, inqobo nje uma oprofesa noma othisha bakho abangakukunikanga noma ngubani, kodwa ngikukhuthaza kakhulu ukuthi wakhe iphothifoliyo yamaphrojekthi ngokwakho njengoba ufunda, kanye nephrojekthi ye-capstone ekhombisa ukuthi ungakwazi kanjani Sebenzisa lokho okufundile. Iphrojekthi yami ye-Capstone isisekelo salokho ozofunda kule ncwadi, ngoba kufaka ikhodi kumaphrojekthi ami edlule, ikhodi engiyenzile futhi yafunda ukubhala ngokusebenza ngesandla, kanye nemibono eminingi ebingisize uphumelele iphuzu lapho ngikwazi ukuxuqa khona uhlelo lokusebenza olululaI-Welly ifakiwe futhi ibukeka futhi iziphatha njenge-app edumile ungabona umngani wakho noma umndeni usebenzisa, kwi-Intanethi, oyikhangisekile, noma ezindabeni. Le ncwadi yile: Le ncwadi iyisifundo ngesibonelo. Ungathola ikhodi lapha, imiyalo yokuthi ungafunda kanjani ikhodi, imininingwane ngekhodi ye-debugging kanye namaphutha okulungisa, ukuhambisa imiyalo yakho, uphinde usebenzise ikhodi yakho, uvikele Ikhodi yakho, yakha amawebhusayithi asebenzayo ajabulisayo, ahlanganyele, futhi umlutha, futhi uzothola umuzwa wokuthi ngingubani, kungani lokhu kubalulekile, futhi ungakuveza kanjani, nohlelo lwakho lwenkampani, kanye ne Isoftware owakhela ekukhanyiseni okuhle kakhulu ukuze ube ekhangayo kakhulu ngangokunokwenzeka kubasebenzisi bakho bokugcina, izivakashi zewebhusayithi yakho. Kule nc...
Ukufunda Okujulile Okusekelwe Kuwebhu Nokuvikeleka Ngokwesibonelo

Ukufundwa okujulile kwewebhu okujulile nokuphepha ngesibonelo Isiqondisi Esithathu UCharlotte Harper Julayi 3, 2024 Isandulela: Ukucatshangelwa Kwezokuphepha ekwakheni isoftware yewebhu kuyingxenye ebalulekile yanoma yiliphi uhlelo lonjiniyela weWeb kanye nokwenzayo ngenkathi ubunjiniyela obuhle obunokwethenjelwa, lube wusizo ngezinhloso ezisebenzayo. I-DOM (Idokhumenti Yento Ukukhishwa kwe-DOM), Ngokuqaliswa kwe-HTML, i-JavaScript, kanye ne-CSS kanye nesoftware yokusebenzisa i-Python, C / C+, Java, Java, Java kanye ne-Breaks Inkululeko ekhombisa Ukuqamba, hlinzeka ngokusetshenziswa kalula nokusebenza, ukuveza ukuthobeka kanye nomlingiswa, futhi unikeze kalula ukusetshenziswa kanye nezinsizakalo ezibalulekile zonke ezikhangayo ku-joe average, Umsebenzisi wokugcina ofuna ukubulala isikhathi noma ukwenza okuthile okwenziwe kwi-Intanethi, imvamisa kudivayisi ye-smartphone yokuthinta. Abantu abaningi bebengeke bazi ukuthi kufanele baqale kuphi lapho bafuna ukwakha iwebhusayithi kusukabhala, bazothambeka ukuqala ngewebhusayithi yomunye umuntu futhi bakha okuthile okulinganiselwe ekusebenzeni, ngokwethenjwa, ukusetshenziswa kalula futhi ikakhulukazi bathola amathuluzi asanda kulanda ukuze wakhe okuthile okuwusizo ngaphandle kokuchitha isikhathi , futhi ikakhulukazi ukuchitha imali ukukhokha imali ebizayo yokubhalisa okubizayo kubantu abambalwa be-software ababefuna ukuyisebenzisa noma kunjalo ukulinganiselwa kokusebenzisa kalula ukusetshenziswa nokuvumelana nezimo. Uma unemizuzu embalwa yokufunda ngale ncwadi futhi ufunde ukuthi yini engifuna ukukufundisa yona, noma ngikhulume nami ngokwami ​​ngezinhloso zakho futhi ngithole ukuholwa endaweni efanele, futhi ngigqugquzelwe ukuba ngifunde ukubhala futhi ngibhale isoftware yakho , Thatha le ncwadi ikhaya bese ubeka eceleni isikhathi sokufunda ukwakha uhlelo lwewebhu olulandelayo, olunamandla, olubalulekile futhi olubalulekile lwewebhu, iwebhusayithi enikuwe futhi yenza kahle lokho okufunayo futhi kuhlangabezana nezidingo zezithameli zakho. Mayelana nami: Ngingumthuthukisi wesoftware nayeUhla lokuhlangenwe nakho ku-C / C ++, Java, Python, HTML, CSS kanye neJavaScript. Ngakha amawebhusayithi abantu abafuna ukusebenzisa, abafuna ukuvakasha, futhi bathole umlutha wokusebenzisa nje ukufunda, ukuphinda uphinde uphinde ufunde, ukuphinda futhi ubulale isikhathi, futhi okubaluleke kakhulu, ngithengisa isoftware. Ukube ubunomqondo wokuthi ubufuna kanjani iwebhusayithi ukuthi ubukeke futhi usebenze, ubukade ungisekela ukuze ngikwazi ukubhekana nezidingo zami ngenkathi ngihlangana nezindleko zokusebenzisa iwebhusayithi ngokwakho, Ngingakwakha i-YouTube elandelayo ye-YouTube, Tiktok, Twitter, Google, noma uhlelo lokusebenza lokuphepha lobuchwepheshe obuphezulu kuphela ongaluthola. Esikhundleni sokuzama ukukuthengisa isikhathi sami, ngizama ukuthenga kwakho: Ngifuna ukukhuluma nawe ngokwakha uhlelo lokusebenza (iwebhusayithi) ngokwakho ngolwazi oluvele lukhona, futhi lukufundise lokho okudingeka kube ngunjiniyela wesoftware ozimele, Usomabhizinisi, ohola umsebenzi ophumelelayo kunoma iyiphi insimu oyifisayo. Futhi ake ngicace, imfundo ngikunikeza ukuthi izohleleka. Ungaya esikoleni futhi ufunde konke lokhu ngeImfundo ehlelekile, noma ifunde le ncwadi esikoleni, iqedele izabelo zakho, bese ususa kakhulu imfundo yakho, kepha angikubekise esihlalweni esishisayo futhi ngikucele ukuthi ugcwalise izabelo. Angisiye uprofesa wakho, ungacabanga ngami njengomngane ofuna ukukuqondisa emsebenzini oqhutshwa yimpumelelo yakho. Futhi angikuthengise impumelelo noma, uzodinga ukuyithenga nesikhathi sakho. Ukufunda kwikhodi kune-curve yokufunda ijika futhi akukaze kube lula, noma kufanele kube. Udinga ukusebenza kanzima ngangokunokwenzeka futhi uqhubeke nokuzama futhi wehluleke futhi uzame futhi lapho ukhungathekile ukuze ufunde futhi wakhe izinhlelo zokusebenza ngokwakho. Lokho kungokwemvelo yekhodi uqobo. Ikhodi iqhutshwa ngumhlanganisi owenzelwe ukunikeza imiyalezo yephutha ye-Programmer, futhi lokhu kuzokufundisa ukuthi ungayibonisa kanjani ikhodi, noma ngabe ukukopisha iphutha kwi-Injini yakho yokusesha nokufunda izibonelo zabanye abantu. Futhi kufanele ngithi, awudingi ukuba ucebe kakhulu, uhlakaniphile,Ukuthambekela okuthe xaxa, noma okuqondiswe imininingwane noma okuhlelekile ukwakha uhlelo lokusebenza. Ikhompyutha iyakunakekela leyo nhlangano. Udinga nje ukukhuthazela ngesivivinyo nephutha, gcina ukugxila futhi usebenze kanzima kulokho okwenzayo, futhi uzoba nomsebenzi ophumelele kakhulu kulo lonke wenzani. Ngingubani: Ngiyabona ukuthi isigaba sokugcina sasisemayelana nokufunda futhi uthathe izindlela ezivela kule ncwadi. Ngingubani ngempela? Lowo ngumbuzo oyinkimbinkimbi. Angikacaci ukuthi ngokwami, njengoba ngihlushwa izimo zezokwelapha ezingenza kube nzima kimi ukubhala noma zibhale le ncwadi ngezinye izikhathi, ngenkathi zethula izinselelo zokuhlalisana nobunikazi ezenza impilo yami ibe nzima ngokwengeziwe maqondana nami . Ngamafuphi, uma ufunda le ncwadi, ulethe ekhaya ngoba ulibutheke ngalo futhi wacabanga ukuthi bekulusizo, noma uma nje ufunda lokhu okude, kuwe ngingumuntu othanda ukukubona uphumelela Konke okwenzayo. Ngingunjiniyela uqobo,Unjiniyela, kanye nomfundi, futhi ngibhala le ncwadi kwabanye abafundi abafuna ukwenza izimpilo zabo zibe lula ngokuba nencwadi yesoftware abayidingayo ukwenza izimpilo zabo zibe lula ngokubhala ndawonye njengephazili enkulu ekusebenzeni , ewusizo, enkulu, esebenzayo, enobumbano, nokwenza uhlelo lokusebenza oluhlanganayo olungashayela impumelelo noma ngabe umugqa webhizinisi. Kakhulu, yilokhu engikwenzayo: Ngakha izinhlelo zokusebenza ukuze ngizisize mina nabanye abantu baphumelele. Ngingumbhali futhi, yize le yincwadi yami yokuqala engihlose ukuyigcwalisa ukuze ngibeke iphothifoliyo yami ibe yincwadi ewusizo, futhi ngingumculi futhi. Ngizokuvuma lokhu kuwe, ngingumuntu ongaziwa. Angiphelele, sengiphelile ngomthetho ngisho nokungiholela ngisho ngishiya amakolishi kanye namanyuvesi futhi ngishiye izifundazwe ukuze ngizame ukuzenzela igama ngempumelelo. Ngingowesifazane ngokuzalwa, ngigqoka izimonyo, thatha izithombe zami, ngigqoke izingubo kanye nezinye izingubo zabesifazane, futhi ngihlala ngizazi ukuthiOwesifazane ngokwemvelo. Ngibe nezinkinga nabanye abantu esikhathini esedlule esiholela ezimpini ngokubhala nokwakha iWebApps, futhi ngiyaxolisa ukuthi angikwazi ukuthola le ncwadi ezandleni kungekudala: Uyakudinga lokhu. Uzofuna ukufunda nokubhala ikhodi ebukeka efana neyami futhi isebenze njengeyami futhi yenza into efanayo kepha ingcono, ngoba uma ukwazi ukuthenga le ncwadi esikhundleni sokusebenzisa incwadi yakho enjengezincwadi Kuyo, unezinsizakusebenza okudingeka uziphumelele empilweni yakho. Nginazo zonke izinhlobo zezingqinamba ngokukhula komndeni, izimo zezempilo, odokotela, abezindaba, kanye nomthetho, futhi ikhodi yami ibonakala ngokujulile umzabalazo onobuntu besifazane nowesifazane emhlabeni ohlukene futhi okhungathekile. Kodwa-ke, le ncwadi yinto engiyikhathalela ngokujulile, ingane yami, iphothifoliyo yami, kanye nendlela yami yokuphila, ngakho-ke ngiyabonga ukucubungula kwakho lapho uthatha umbhalo wayo ukuze ufunde kimi. Sicela ugcine engqondweni angisiyeEct, le ncwadi izoba namaphutha, izibuyekezo, kanye nezinhlelo ezintsha, futhi uzodinga ukucabanga ngengqondo yakho enengqondo ngangokunokwenzeka ukuze ube nesipiliyoni esiphumelelayo ngokubhala kwami. Futhi, qonda ukuthi ngiqonde kahle ngawe noma ngabe ubhekana nezinselelo lapho ubhala. Cabanga ngakho kanjena: Lapho ungavele uqashe uhlelo lwekhompyutha ukuze wenze noma yini ongayicabanga lapho ungacabanga khona endaweni yedijithali, gcina lonke ulwazi ohlangabezana nalo, ulihlele, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, uzokuqonda, Ukubhekana nobunzima obungenakugwemeka ngolwazi olifaka futhi nokushicilela. Ngikutshela lokhu ngoba ngihlangabezana nobunzima obufanayo. Sebenzisa le ncwadi ngengozi yakho, sebenza nomphakathi wakho kanye nemiphakathi etholakalayo kuwe ukwakha isoftware ngaphakathi kwesilungiselelo esiphephile, futhi ungahambi kahle noma uphumelele ngendlela engafanele , futhi kungani ngingakulethela lo mbhalo futhi ngikusize uphumelele ngaphandle kokuphambuka endleleni yobuhlanyaUngonakalisiwe, wadabula futhi waphampula ngenkathi ngihlangabezana nezinkinga ezijwayelekile wonke umuntu owenzayo emhlabeni wonke ngenxa yesilinganiso se-Global Scale esisebandlululo senethiwekhi esizosebenza kuyo, i-Intanethi. Kungenzeka ungajwayelani kakhulu ukuthi ngingubani ngamazwi ambalwa, kodwa ngikukhuthaza ukuthi ufunde, uzokwazi njengoba uqhubeka nokufunda nokungiqonda imisebenzi yakho ukuze uqedele umsebenzi wakho. Ngeke kube khona umsebenzi wesikole ngale ncwadi, inqobo nje uma oprofesa noma othisha bakho abangakukunikanga noma ngubani, kodwa ngikukhuthaza kakhulu ukuthi wakhe iphothifoliyo yamaphrojekthi ngokwakho njengoba ufunda, kanye nephrojekthi ye-capstone ekhombisa ukuthi ungakwazi kanjani Sebenzisa lokho okufundile. Iphrojekthi yami ye-Capstone isisekelo salokho ozofunda kule ncwadi, ngoba kufaka ikhodi kumaphrojekthi ami edlule, ikhodi engiyenzile futhi yafunda ukubhala ngokusebenza ngesandla, kanye nemibono eminingi ebingisize uphumelele ephuzwini lapho engingakwazi khona uhlelo lokusebenza olulula lokuthiKufakwe ngokugcwele futhi kubukeka futhi ziphatha njengohlelo lokusebenza oludumile ungabona umngani wakho noma umndeni usebenzisa, kwi-Intanethi, kukhangise wena, noma ezindabeni. Le ncwadi yile: Le ncwadi iyisifundo ngesibonelo. Ungathola ikhodi lapha, imiyalo yokuthi ungafunda kanjani ikhodi, imininingwane ngekhodi ye-debugging kanye namaphutha okulungisa, ukuhambisa imiyalo yakho, uphinde usebenzise ikhodi yakho, uvikele Ikhodi yakho, yakha amawebhusayithi asebenzayo ajabulisayo, ahlanganyele, futhi umlutha, futhi uzothola umuzwa wokuthi ngingubani, kungani lokhu kubalulekile, futhi ungakuveza kanjani, nohlelo lwakho lwenkampani, kanye ne Isoftware owakhela ekukhanyiseni okuhle kakhulu ukuze ube ekhangayo kakhulu ngangokunokwenzeka kubasebenzisi bakho bokugcina, izivakashi zewebhusayithi yakho. Kule ncwadi, ngizokhombisa izibonelo eziningi zokwakheka kwesoftware ngokugxila kuwebhu njengeplatifomu kanye nokuphepha. Sizoqala okuhlangenwe nakho kokufunda ngokwakha okuyisisekeloFaka i-gell ye-UNIX, ngesipele nezici zokubhala. Ngemuva kwalokho, sizohlola iwebhusayithi ye-Blog eyisisekelo, sithuthukise ibhulogi yethu ngezithombe nezithombe zevidiyo futhi sisebenzisa lezi zici ukuqasha izixazululo zokuphepha zisebenzisa i-software yamahhala, futhi sivikele iseva yethu isebenzisa imodyuli yokufakazela i-pluggable (Pam). Sizobe sesibukeza ukuphathwa kwefayela nokucutshungulwa, ukuhlola ukuhlelwa kwevidiyo, ukunikela ngezwi, ukuskena ibhakhodi yokuskena kanye nokuqashelwa kwezinhlamvu ze-Optical, phakathi kweminye imiqondo. Endleleni sizohlola i-APIS ezosisiza ukuba senze isoftware yethu ibe lusizo futhi iphephe, ngezinketho zamahhala nezikhokhelwayo. Endleleni, sizohlola ukuphepha ngokomzimba kanye namathuluzi anamasosha anjengezibhamu kanye nokuklanywa kwemiklamo kubandakanya umgqomo kanye nothishanhloko, nothishanhloko, kanye nabanye othishanhloko, nabanye othishanhloko sizokwazi ukuhlanganisa nesoftware yethu futhi ukhombise ukuzivikela nokuqina. Sizothatha ikhefu lapho eyakha imidlalo, 2D ne-3DIzinjini ezinikelayo, futhi zisebenze ngehadiwe eshumekiwe uma kwenzeka zifunda izibonelo zesoftware yokunikeza ubukhulu kanye ne-massager ye-electronic evuthayo ye-silicone Rubber ngokulandelana. Endleleni, sizosebenzisa futhi izixazululo zokufunda zomshini sezivele zitholakala ukuze zivikeleke kangcono isoftware yethu. Sizophinde futhi sisebenzise amathuluzi wesitoko atholakalayo kwiWebhu ukuze aqondise futhi avikele inqubo. Le ncwadi iyinkomba empumelelweni yakho ekwakheni uhlelo lwewebhu futhi iluhlanganise nenethiwekhi yobuchwepheshe yezinhlelo zekhompyutha kanye nezinhlelo zokwakha ezishumekiwe, futhi yonke imihlahlandlela yokwakha i-software ne-Hardware yangasemuva engenalo ulwazi lwangemuva noma isipiliyoni sangemuva. LOKHO AKUKHO: Uma ngempela ufuna ukuba newebhusayithi, ungavele usethe isitolo esilula futhi uthengise okudingayo, thumela i-blog, izithombe noma amavidiyo, noma ngenye indlela ngaphandle kokubhala umugqa owodwa wekhodi. Le ncwadi akuyona lokho. Le ncwadi izokufundisa ukuthi ungakha kanjani isoftware ewusizo kakhulu, ngokugcweleKufakiwe, kuyasebenza futhi kuvikelekile kunanoma iyiphi isoftware ongayithola, ngoba isebenzisa isoftware yakamuva ebisabiza ama-prototypes, ingahle ibiza ukugijima ezinkampanini ezindala ezisebenza ngaphakathi, futhi ayikhange isipele emuva, yenza imali yabantu abangazenzi lutho. Uma ulandela le ncwadi eduze, uzofuna ukubhala ikhodi, ikhodi yocwaningo, wakhe izinhlelo zakho zokusebenza, futhi uzokwenza imali kulokho okwenzayo. Ngizokwenza imali kule ncwadi, ngisho nasezigabeni zokuqala, ngoba iqukethe imininingwane abantu abayidingayo futhi bafuna ukuyifunda, futhi isivele ithenga lapho bethenga noma besebenzisa izinhlelo zami zokusebenza. Le ncwadi ngeke yakha uhlelo lokusebenza kuwe, kepha izokukhomba indlela efanele bese uhlomela ngamathuluzi owadingayo namakhono azokwenza eyakho impumelelo ekwakheni i-web, nayo yonke imigqa ye ikhodi uzodinga ukubhala njengesibonelo, ulungele ukuhlanganiswa ndawonye ungene ku-software wena nabasekeli bakho, izivakashi, amakhasimende,Ama-Riends, umndeni, izivakashi, osonkontileka, futhi abantu be-Intanethi bafuna ukusebenzisa nokuxhasa. Ozofunda: Le ncwadi izokufundisa ukuthi ungakha futhi uthengise kanjani isoftware, isebenza ngempela, i-software ewusizo, ukuqoshwa kwezokuphepha, ukubhekisisa ukuqinisekiswa, ukuqopha futhi kunikeze ividiyo nezithombe, nokushintshana ngokushintshana okufana ne-Bluetooth kanye nezokuxhumana eziseduze (NFC). Le ncwadi izokufundisa ukuthi ungayisebenzisa kanjani ikhompyutha enethiwekhi, ugxile e-Debian Linux, ukuthi ungakha kanjani ikhodi ye-Bash ukwenza ukufaka i-software yakho ibe ngumthungo, umoya ozenzakalelayo, ukuthi ungawakha kanjani ikhodi ye-Python njenge-backon, isitayela izinto zisebenzisa izitayela ze-CSS nge-bootstrap, zinika amandla amalogi asetshenzisiwe kanye nokuxhumana ngamadivayisi anethiwekhi, akhiwe abezindaba abasebenzayo kanye namanye amawebhusayithi anikeza ezinye izinto zezokuphepha ezifana nemiyalezo yombhalo efana Ukuqinisekiswa noma ezinye izinhloso, ukuskena kwe-ID, isithombe kanye nokulinganiselwa kwevidiyo, idathaAma-Ransection ukugcina isoftware yakho iphephile, ukucubungula inkokhelo, ukuhweba nge-cryptocurlous, imisebenzi ye-asynchronous, nokuningi. Uzofunda ukuthi ungawakha kanjani owakho amadivaysi e-Bluetooth, ngamabhethri, amashaja, ama-microcoController, amasekethe, ama-motor kanye nezinzwa, usebenzisa i-soler, ucingo kanye ne-3D ephrintiwe kanye nezinto zokwakha. Ngizokhombisa othishanhloko be-3D Design basetshenziswa ekukhiqizeni okungeziwe nethuluzi nokufa kwenziwa, ngakho-ke uyakwazi ukwenza owakho amadivaysi ashumekile, ama-charger, amasekethe we-elekthronikhi, nokuphuma okusebenzayo. Futhi uxhumane nabo nge-Bluetooth nakuwebhu. Ngokuqondile, sizohlola izifundo ezimbili zamacala, i-massager evubsayo kanye nesibhamu esizenziwe ekhaya, zombili zihlelwe e-OpenScad, ezitholakala njengesibonakaliso sokuqhafaza noma i-Command Line Utility futhi ingahlanganiswa kwiWebhu yemiphumela esheshayo. Uzofunda ukuthi ungakha futhi ubeke kanjani iwebhusayithi kusuka emhlabathini up ngaphandle kokuhlangenwe nakho kwangaphambilini, kwenze kube yinto esebenzayo, evikelekile, enhle, ewusizo futhi iningiesebenza ngokusebenza. Uzofunda ukuthi ungayisebenzisa kanjani ukufunda ngomshini kanye nombono wekhompyutha ukwenza isayithi livikelekile futhi lisebenziseka kalula, thwesa ividiyo nomsindo kuwebhusayithi yakho, nikezela ngezwi lakho, wenze umculo futhi uguqule umsindo ukudala umsindo ngo Faka amanye amawebhusayithi ukwakha inethiwekhi engcono kakhulu yamawebhusayithi ongawaxhumanisa ngqo neyakho ukuze wabelane lonke ulwazi oluwusizo onawo, futhi okubaluleke kakhulu ukuletha abantu kwisoftware yakho nebhizinisi. Le ncwadi izogxila kakhulu kwabezindaba, ezokuphepha kanye nokufunda komshini, okuyingxenye emithathu emithathu ezokusiza ekwakheni isoftware ewusizo yewebhu ngokufaka abasebenzisi abalungile futhi ibeke phansi okungalungile ngendlela enengqondo, esebenzayo, izandla futhi zihlanganyele ngenkathi ezenzakalelayo futhi eziqinile. Le ncwadi ifundisa i-Unix, ngokukhethekile i-Debian (Ubuntu), i-Bash Shell, Python, HTML, CSS, JavaScript, kanye namaphakeji esoftware asebenzayon njengezicelo, kanye nesoftware ewusizo ye-bash efana ne-git ne-ffmpeg. Ngizokufundisa nokuthi ungathengisa kanjani i-cryptocurrencyction ngokuzenzakalelayo, futhi ngikhokha nge-cryptocurrencyn noma kusuka kumakhadi wedebithi ajwayelekile ngenkathi ukhokha ngisho nezivakashi zakho isabelo semali engenayo uma ukhetha ukwenza kanjalo. Ngizokufundisa ukuthi ungayenza kanjani imali kuwebhusayithi yakho ngokusebenzisa ukukhangisa futhi, ungalulungisa kanjani uhlelo lwakho lokusebenza lwezinjini zokusesha futhi ulenze ngokushesha, zibekwe esimweni sokuqala salokho amakhasimende akho azowafuna ukukuthola, futhi abekwe kaningi ukusesha ngangokunokwenzeka. Ngizokufundisa ukuthi ungayithengisa kanjani isoftware yakho, ngikhangise, ukhange kumakhasimende afuna izinsizakalo zakho, futhi wazimele kwi-Intanethi nge-Avenues ezivele zikhona, azibizi futhi zisebenza kahle. Ngizokufundisa ukuthi ungayigcina kanjani idatha yakho kumakhompiyutha e-Cloud asebenzela wena futhi ugcine idatha yakho eshibhile, kanjani ukuhlela iwebhusayithi eyenza lokho okufunayo, nokuthi yini ongayisebenzisa ngayoukufaka isayithi lakho empompini kude nezingcingo zabo ngezaziso, i-imeyili, imiyalezo, izingcingo, kanye nezingcingo eziningi ukuletha abasebenzisi bakho kuwebhusayithi yakho ngemuva kokuchofoza kwakho kuphela. Le ncwadi izogxila ekusebenzeni kokushicilelwa kanye nokusabalalisa abezindaba ngamanani amakhulu, kusukela ku-Petric To Photos kuya kumavidiyo kuya kumavidiyo kuya ku-Audio, bese uyithengisa nganoma iyiphi indlela oyenzayo ukuze wenze nganoma iyiphi indlela Iwebhusayithi, uhlelo lokusebenza olumele wena nawe kuphela, futhi lukwenza wena, isoftware yakho nenkampani yakho ibukeka kahle ngendlela engcono kakhulu. Uzofunda futhi amathiphu ambalwa namaqhinga avela kimi, kusuka kumathiphu wokufaka amakhodi, okusebenzayo okufana nokwenza izimonyo nezithombe, ukumodela kanye nokubamba iqhaza, nokuningi, okuzoba yinkampani yakho ngokukhanya okungcono kakhulu usebenzisa wonke amathuluzi atholakalayo kuwe ngenkathi usabalalisa okuqukethwe okuningi njengoba udinga ibhalansi enempilo yamapulatifomu ukuletha okwakhoe ekulweni nomzamo, umsebenzi, noma imali kunalokho okudingekayo. Le ncwadi ibizwa ngokuthi "ukuphepha okujulile kwewebhu ngokuphepha ngesibonelo" ngesizathu: Isebenza ngokufunda kwekhodi, ngokuqondile nge-web, kusuka ekuveleni okusebenzayo, ngezibonelo zekhodi yokusebenza esebenza izinhloso ezisebenzayo ezichazwe embhalweni. Ingxenye yokufunda yalo mbhalo ifaka futhi ukufundwa komshini, ikhodi ngizokukhombisa ukuthi ungayisebenzisa kanjani i-web ezophatha umbono wekhompyutha, ukwamukelwa kobuso, ukuthuthukiswa kwesithombe, ukuthuthukiswa kwesithombe, neminye imisebenzi efana Amameyri okubikezela atholwe ezithombeni, njengohlobo lwesithombe njengesithombe esiqinisweni, esidlulisiwe kwekhompyutha, noma ikhophi elibonakalayo (isithombe sesithombe, noma isithombe esiphrintiwe). Ukufundwa komshini kubaluleke kakhulu uma kukhulunywa ngokuphepha kwewebhu kanye nokuphepha kwesoftware, ngoba kungadla imisebenzi ebingenzeka ngenye indlela. Ikhompyutha yakhoNgena ngemvume ngekhodi yephasi, kepha kungenzeka kube iphephe ukuyisebenzisa uma ingena ngemvume ngobuso bakho. Ungenza ikhompyutha yeseva lokhu kuphephile, ikhompyutha evame ukukubuza ngegama lomsebenzisi nephasikhodi bese lingena kulo, mhlawumbe ngethokheni lokuqinisekisa ngokungena ngakunye noma ikheli elisha le-IP, kodwa uma wenza isilinganiselo esikhulu, kulula Sebenzisa, ngokuyisisekelo se-software evikeleke, nenamandla, lokhu kungahle kwanele. Ukubopha isoftware yakho eduze kakhulu kwisoftware yomunye umuntu, njengensizakalo ye-imeyili noma insiza yemiyalezo yombhalo, akwanele ukwenza isoftware yakho iphephe, noma noma ngubani (noma iyiphi indawo oyisebenzisayo). Noma ngubani owakha isoftware evikelekile ngokungenangqondo inomqondo othile wokuthi lokhu kusho ukuthini. Isoftware ingavikelekile ngokwemvelo ngoba amadivaysi nama-akhawunti esiwasebenzisayo ukufinyelela kuwo awahlali onawo, angaba sezandleni zomunye umuntu onenhloso embi yesoftware uqobo. Lokhu kuyinto yokugxila kwale ncwadi. Ikhompyutha enethiwekhi ngokuzenzakalelayoIvikelwe ngethokheni ende ende, ebizwa nge-SSH noma i-SSH noma i-SSH SHELT Key, futhi itholakala kangcono ngeseva yewebhu, ngoba iseva yeWebhu ihlinzeka ukufinyelela okuvulekile kanye namathuluzi okuphepha abuciko asebenza kwiseva uqobo. Iseva yeWebhu inokufinyelela kwisiphequluli sewebhu somsebenzisi, okuyingxenye enamandla kakhulu yedivayisi yomsebenzisi, ngoba yindawo lapho umsebenzisi angafinyelela khona isoftware enethiwekhi. Leli thuluzi lamathuluzi lingahambisa umbhalo, futhi lingarekhoda izithombe, umsindo kanye nevidiyo (njengesithombe sobuso noma i-ID yombuso), bangafunda futhi babhalele inkambu ye-Bluetooth, futhi bangafunda futhi babhalele insimu esondele Amathegi we-Transponment, amakhadi asemqoka angabizi, ama-fobs, izitika, izindandatho kanye nezimila ze-chip ezinezinombolo ezihlukile ze-serial ezingafundwa futhi ziqinisekiswe yiseva yewebhu eboshwe kwiWebhusayithi. Usebenzisa wonke amathuluzi onawo, ngale ncwadi uzozihlomisa ngolwazi lokwakha iwebhusayithi ephephile, futhi jikelele aUhlelo lwekhompyutha lwenethiwekhi olusebenzela wena, luyakubhidliza, futhi lubukeka futhi luzwa kahle. Ukuqala kuphi: Wamukelekile ukweqa isigaba ngiqale le ncwadi nge, noma yisiphi isigaba, kwikhodi ngqo oyidingayo, ikakhulukazi uma unesipiliyoni sokufaka amakhodi ngaphambi noma noma yiliphi i kanye nokubhala amacala okusebenzisa kanye nezibonelo ezisebenzayo zazo. Uma ungenazo isipiliyoni kwikhodi yokubhala, ngincoma kakhulu ukuthi ufunde yonke le ncwadi, futhi ikakhulukazi incoma ukuthi ufunde izigaba ezedlule, ukuze uqiniseke ukuthi le ncwadi ilungile kuwe. Uma le ncwadi ilungile kuwe, cabanga ngokuwuphokela kumngane noma isihlobo esingaba nesifiso sokufunda ngentuthuko yeWebhu uqobo, futhi sicabangele ukumboleka emuva nokufunda kubo ukugcwalisa izikhala lapho ngihlulekile khona njenge Mfundisi, noma abanye othisha benze phambi kwami. Qala lapho uzothanda khona, yonke ingxenye yale ncwadi izoba wusizo uma uhlose ukwakha i-UlutyI-PP, bese ubheka ukuthi izinhlelo zokusebenza ezinhle kakhulu zakhiwe ngomsebenzisi wokugcina engqondweni: Yazi ikhasimende lakho. Manje uyangazi, uyayazi le ncwadi, futhi usukulungele ukuqala. Ukuqala, bamba ikhompyutha (ngisho ne-laptop eshibhile kunazo zonke esitolo sebhokisi, i-Amazon, noma ideskithophu yakudala iyasebenza, bese uyibeka ngendlela esebenza kuwe. Ungayifunda kanjani le ncwadi: Umbhalo uqokonyiswe, usho ukuthi lo mbhalo ungowokuqala komyalo, lapho uzobhala khona ikhodi oyigijimayo. Umyalo wokukhuthaza ikhibhodi enkulu egxile futhi kudinga okuncane ukuthi kungabikho ngokuchofoza, ukusheshisa ukuhamba kwakho kokusebenza nokwenza izinto zibe lula kuwe. Ukuqalisa: Masingene ngaphakathi. Sizoqala ngokwakha ikhodi emshinini wendawo futhi siqale ngaphandle kokwakha iwebhusayithi exhunywe kwi-Intanethi. Lokhu kuphephile ukuqala nge, kubiza lutho, futhi kulula kuwe. Ngokuya ngohlelo lwakho lokusebenza, ukungena egobolondweni le-bash kuzohluka kancane. NgeMac OS, ngincoma ukufaka umshini obonakalayo ngalesi sikhathi, ngoba uzothola ukuhambisana okuningiumshini obonakalayo. Abahlinzeki abahlukahlukene njenge-Virtualbox kanye nama-Cagerolls angagijimisa umshini obonakalayo kuwe, yize kungenzeka futhi ukufaka ubuntu ngqo emshinini okunconywayo ukuze kunconywe okusheshayo, okuhlangenwe nakho okusheshayo. Uma usebenzisa i-Linux noma iWindows, engincoma, kufanele kube lula ukudala iphrojekthi. Vula i-terminal yakho, lungisa ukulinganisa njengoba ubona kufanelekile, bese uqala ukulandela igxathu 2. Uma usebenzisa iWindows, sicela ulandele Isinyathelo 1. Isinyathelo 1: - Abasebenzisi beWindows kuphela Ku-Windows, i-Open Command Prompt esheshayo njengomphathi kanye nohlobo I-WSL -install Isinyathelo 2: - Qhubeka lapha, noma weqa isinyathelo 1 kuya lapha uma ungasebenzisi iWindows Esigungwini esivulekile, (kuya nge-OS yakho, ebizwa nge-Ubuntu kuWindows, e-terminal eMac noma iLinux, noma igama elifanayo), liqala ngokwakha iphrojekthi. Lokhu sikwenza ngomyalo weMKDIR, odala umkhombandlela. Uma udinga ukudala umkhombandlela wokugcina iphrojekthi yakho, enconyelwe, sebenzisaI-CD umyalo wokushintsha kwisikhombi futhi I-CD / PATT / TO / TO / TOCRECY - Indlela ingamafolda (amafayela) andulela umkhombandlela wakho wendawo, indlela yakho ezenzakalelayo yi- ~ noma / ikhaya / igama lomsebenzisi (lapho igama lomsebenzisi lingegama lakho lomsebenzisi). Ukushintshela kwisikhombi esizenzakalelayo, thayipha i-CD noma i-CD ~ Isibonelo seMKDIR - buyisela "Isibonelo" ngegama lesiqondisi Manje unesikhombi esisebenzayo sephrojekthi yakho. Ukuba njengoba kubaluleke kakhulu ukuthi lolu hlelo lugcinwe uma kwenzeka udinga ukushintshela kumshini ohlukile noma ukuthumela ikhodi oyibhala ngakho-ke isilungele i-Web, sizokwakha umbhalo ukuze silwele umkhombandlela wakho ezitebhisini ezimbalwa ezizayo. Kepha ukwakha umbhalo kuthatha ikhodi encane, futhi ikhodi idinga ukuthi isebenze ngokuzenzakalela ibe lusizo ngangokunokwenzeka. Ngakho-ke ake sakhe iskripthi sokwakha imibhalo kuqala. Ake siqale ngokudala iskripthi futhi siyenze. Sizosebenzisa i-sudo, Chmod futhi sithinte lokhu, bese ushayela umbhalo


sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Manje sesidale iskripthi, senze kwavela, futhi sekulungile ukuyihlela. I-NANO ingumhleli wombhalo ozokuvumela ukuthi uhlele umbhalo ngaphandle kokuchofoza, okulula kakhulu kunokusebenzisa isikhombimsebenzisi somsebenzisi. Ukuhlela ifayela nge-nano, sebenzisa i-nano bese indlela eya kwifayela. Ukwenza iskripthi esenza iskripthi, kufana nendlela efanele ekwenzeni umbhalo wethu kwasekuqaleni. Sizosebenzisa ikhodi efanayo nangaphezulu, sifaka esikhundleni segama leskripthi, "I-Ecryript" ngepharamitha yokuphikisana, $ 1. Lokhu kusivumela ukuba sibize umbhalo ngokuthayipha nje i-sudo redo Breadcript, lapho singakha noma yimuphi umbhalo omusha ngokufaka esikhundleni esithi "Breadcript" negama leskripthi sakho. Ikhodi e-Nano kufanele ibukeke:

sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
Futhi ukuvala i-nano, singabamba ukhiye wokulawula bese sicindezela u-X, bese u-Y ukuchaza esindisa ifayela, bese ushaya ukubuya. Manje esikhundleni sokuthayipha le miyalo emithathu ukuhlela iskripthi, sizokwazi ukuthayipha i-Sudow Brecript ukuhlela iskripthi. Lokhu kuyasebenza! Futhi noma yimuphi umbhalo omusha ungaqhutshwa kalula ngokuwushayela egobolondweni. Masilondoloze umsebenzi wethu manje: Bhala umbhalo wesipele ukuze usindise umbhalo wethu omusha bese ubuyela emuva kusikhombisi sethu sephrojekthi, ngenkathi bese ubeka umbhalo we-backup.

sudo ascript backup
Manje, eNano:

sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Lapho / Indlela / ku-Directory kuyindlela eya kuphrojekthi oyidalile ngeMKDIR. Kamuva kuso sizofunda ukuthi singakopisha kanjani izindlela eziphindwayo ezinje nge-loop kanye nohlu, okuyikhodi encane, kepha okwamanje masiyigcine ilula futhi ibe nemigqa embalwa. Ukuze usebenzise lo mbhalo bese uhlela kabusha ikhodi yakho, gcina ifayela eNano nge-control + x, y bese ubuya, bese uthayipha okungezansi kugobolondo lakho

backup
Uma ugqugquzelwa yi-password ngenkathi ufunda le ncwadi futhi ulandela egobolondweni, sicela ufake iphasiwedi yakho yomsebenzisi ngokufanele, uzoba nomzamo ezintathu ngaphambi kokudinga ukugijima kabusha umyalo. Ungasebenzisa imicibisholo ephezulu naphansi ukuyokwazi ukuhlela imiyalo bese uhlela, uma kufanele udinge ukusebenzisa noma yini kabili. Cindezela up up up futhi phansi ngezikhathi ezithile ukukhetha umyalo, ngaphambi kokuhlela umyalo ngesokunene, imicibisholo yangakwesobunxele bese ususa ukhiye kanye nekhibhodi, bese uyisebenzisa ngokubuya. Siyakuhalalisela! Ukwazile ukudala umbhalo owesabekayo wesipele obeka imibhalo emibili ebalulekile ye-Shell kwisikhombi sakho esisebenzayo. Singase sihambisa izinto kamuva njengoba iphrojekthi iba nkulu, kepha lokhu kuyasebenza manje. Ake siqhubeke sibheke efwini, sizosebenzisa i-GitHub yalokhu (yize kunezisombululo eziningi ze-git zesipele, zonke ziseduze okufanayo.) I-GIT yi-software yokulawula okukuvumela ukuba ubuyise ukuhlelwa kwakho kwakho isoftware njengoba uwenza kwiseva, kuyilaphoFuthi ukunika amandla okukwazi ukulanda wonke amakhophi wesoftware yakho ngemuva kwephasiwedi noma ukhiye. Kubangelwa ukonga isoftware yakho, ikakhulukazi njengoba sithuthela ezimweni ezivikelekile ze-Linux eziphule kwesinye isikhathi lapho umugqa owodwa we-code wehluleka, ushiya ukhiye uma ungatholi ithuba lokuyisekela phezulu ngokuzenzakalelayo, esizomboza. Uma ungekho vele usebenzisa umshini we-Ubuntu Virtualter kuleli phuzu, ngiphinda ngisebenzise umshini we-Ubuntu Virtualter kuleli phuzu ngoba kuzokwenza impilo yakho ibe lula lapho ufaka wonke amaphakheji adingekayo ukuze wakhe iwebhusayithi esebenzayo kanye nokufunda okujulile ukusebenza kukhompyutha yakho. Sizohambisa ikhodi kwiseva yeWebhu kungekudala, kepha sifuna ukuqiniseka ukuthi kunezendlalelo ezimbalwa zokuphepha ngemuva kweseva yethu yeWebhu ezimelana nobugebengu, futhi ziqashe amaphakheji e-Linux ukuze akwenze Lokhu. Uma usafuna ukusebenzisa iMac OS, wamukelekile ukusesha nokufakaAmaphakeji adingekayo ku-inthanethi, kepha kungenzeka angabi ezinye izindlela zayo yonke iphakheji le ncwadi noma uchungechunge oluzosibekela. Masingeze imiyalo embalwa yokwenza umsebenzi wethu nge-Isipele Isipele ngokusebenzisa umyalo we-Sudo Script

# ...
git add –all
git commit -m “backup”
git push -u origin master
Nakulokhu futhi, lawula u-X ukuze ulondoloze. Manje kudingeka senze ukucushwa kwesikhathi esisodwa sale phrojekthi. Ngoba kungekudala kuzoba yiphrojekthi ye-git, asidingi ukuthayipha yonke imiyalo ngaso sonke isikhathi lapho sisuka endaweni yokugcina izinto, kepha sizothola i-hanges yalokhu lapho sibhala imibhalo yethu yokuthumela. Ukuze uqale, ake siqinisekise ukuthi sisesikhombi esifanele futhi siqale indawo yokugcina i-git futhi sikhiqize okhiye be-SSH.

cd /path/to/directory
git init
git branch -m master
ssh-keygen
Ngemuva kokuthayipha i-SHSH-keygen, ukhiye omusha kufanele ugcinwe kwifolda yasekhaya ngaphansi kwefolda ebizwa nge-.ssh. Ibizwa nge-ID_RSA.PUB. Ake sithole le nkinobho bese sikopisha. Ukuyibona,

cd ~
cat .ssh/id_rsa.pub
Kopisha umbhalo obuyiselwe umyalo wokugcina, bese udala i-akhawunti nomhlinzeki wakho we-git (kahle github), ngaphambi kokungeza ukhiye we-SSH kwi-akhawunti yakho. Uma usune-akhawunti, chofoza imenyu ephezulu kwesokudla bese ufaka amasethingi, ngaphambi kokungeza ukhiye wakho we-SSH ku-SSH ne-GPG Keys ngaphansi kwemenyu. Khetha Faka ukhiye we-SSH bese ungeza eyakho ngokunamathisela futhi uyinikeze isihloko, ngaphambi kokonga futhi ubuyele ku-GitHub ukudala indawo entsha. Lokhu kuyafana nabanye abahlinzeki be-git, kuzodingeka ufunde imibhalo yabo. Ekuhlelweni okusha kokubeka kabusha, nikeza indawo yakho igama elichazayo bese unquma ukuthi uyafuna ukuyishicilela, futhi uqiniseke ukulungiselela amafayela okufakwa okwamanje. Lapho sekukhishwe indawo yokugcina impahla, kopisha i-Clone nge-SSH URL, bese uyinamathisela kumyalo olandelayo.

git remote add git://… (your remote URL)
Manje usungabuyela emuva kwindawo yakho yokubeka nge-CD, uzokwazi lokhu. Zama umbhalo wakho wesipele manje ngesipele Kuhle! Manje singathola ukufaka amakhodi ngempela. Ase sifake i-Django manje ukuthi sikubambe kahle ku-bash ne-git. I-Django izosivumela ngokuzenzakalelayo isoftware yethu, i-bash ingenza lokhu kodwa i-Django kufanele ibe nokuqaliswa okuphephile okulula (kungakhubazeka futhi kulungiselelwe kalula). Ukufaka isoftware e-Ubuntu, sizosebenzisa umyalo we-Sudo Apt-Get. Okokuqala, ake sivuselele futhi sithuthukise isoftware esasinayo. Lokhu kungenziwa nge-Sudo Apt-Thola Ukuvuselelwa kanye ne-Sudo Apt-Thola ukuthuthuka- Okulandelayo, ake sifake i-Python nemvelo yethu ebonakalayo, ikhaya lekhodi yethu, ngomyalo olandelayo: I-Sudo Apt-Get Faka Python-is-venv Lokhu konke okudingayo ukuze uhambe nge-DJango ngokuya ngokufakwa kwesoftware kwisibonelo sobuntu. Ku-Windows neLinux Lokhu kufanele kube ngqo ngqo, kepha nge-Mac ungafuna ukufaka umshini obonakalayo futhiI-Linux kuyo usebenzisa imvelo yamahhala noma ekhokhwayo ebonakalayo efana ne-Virtualbox noma i-Cagerolls Desktop bese uphinda izinyathelo ezingenhla ukuze usethe imvelo yobuntu. Ubuntu bubalulekile kulokhu ngoba yisoftware amawebhusayithi asebenza futhi abenze bakwazi ukusingatha amawebhusayithi ngayo yonke le software eshiwo ngenhla. Ake simbele ku-Django. Kwisikhombi sethu futhi futhi, nge

python -m venv venv # Kwakha imvelo ebonakalayo lapho ikhodi igcinwa khona
source venv/bin/activate # Kusebenze indawo ebonakalayo
pip install Django
django-admin startproject mysite . # Lapho i-MySite iphrojekthi engiqala khona kwisikhombi sami samanje.
I-Django isisenza nje siqale, ngoba i-DJango ibambe iseva yeWebhu futhi yenza konke esikudingayo ukuthola iwebhusayithi eyisisekelo yendawo phezulu nokusebenza. Manje njengoba sesifakwe i-Django, ake sihlele amasethingi kancane ukuze sikwenze kube yindlela esidinga ngayo. Okokuqala, ake sakhe uhlelo lokusebenza olusha

python manage.py startapp feed
Uzobona uhlelo lokusebenza lokuqala libizwa ngokuthi okuphakelayo. Uhlelo lokusebenza kufanele lubizwa noma yini oyithandayo, futhi sizokwakha izinhlelo zokusebenza ezintsha, kepha igama lohlelo lokusebenza ngalunye kufanele liguquguquke isikhathi ngasinye lapho uhlelo lokusebenza lubhekiselwe kwikhodi. Ukwengeza uhlelo lokusebenza olusha, sizohlala sihlela izilungiselelo.Phy Kokunye uhlelo lokusebenza okwenziwe, okuthiwa ku-StartProject, Aleafter App. Usebenzisa i-nano,

nano app/settings.py
Kuzilungiselelo, thola ufakiwe_apps bese uhlukanisa [] emigqeni emi-3. Kusetshenziswa izikhala ezine kulayini wesikhungo esingenalutho, engeza 'Okuphakelayo', noma igama lohlelo lwakho lokusebenza. Lesi sigaba sezilungiselelo.Phalo kufanele zibukeke:

INSTALLED_APPS = [
    'feed',
]
Ngaphambi kokuthi sikhohlwe, ake sihlole ukuthi i-Django iyasebenza. Usebenzisa umyalo we-python ukuphatha.py RunServer 0.0.0.0:8000, singakwazi ukuqhuba iseva bese sihamba esipheqululini seWebhu kwikhompyutha sisebenzisa ikhodi ku-HTTP: //) Yeka iseva ngokulawula c, okufanayo nanoma yimuphi omunye umyalo. Manje, ake sikubhale ukubhala ikhodi ethile yePython. I-Django inezinto ezintathu eziphambili, zonke zisebenza ngekhodi ngokuphelele. Izakhi zibizwa ngokuthi imodeli, ukubukwa kanye nethempulethi, futhi ngalinye lisezingeni eliphakeme neliphansi ngokulandelana ngaphambi kokuba ikhasi lewebhu lihanjiswa kumsebenzisi. Imodeli yikhodi egcina imininingwane kwi-database ukuze ibuyiselwe, ukuhlungwa nokuhunyushwa. Umbono unquma ukuthi imodeli ihunyushwa kanjani, yatholwa futhi yaguqulwa, cishe yonke imibono izosebenzisa imodeli ngqo. I-template iyikhodi ye-HTML enezinsimbi ezingeziwe kanye namakhwela abizwa ngokuthi ulimi lwesifanekiso. Ithempulethi ihunyushwa ngokubuka lapho igcwele ikhodi yePython futhiumongo njengamamodeli nolwazi (izintambo ezisetshenziswayo kanye nezinombolo) kusuka ekubukweni. I-Django inezinye izingxenye nayo, kufaka phakathi kepha ingagcini ku: Izilungiselelo, ezilungiselela uhlelo lokusebenza njengoba sixoxile. Ama-URLs, angamaphethini umsebenzisi alandela ukuthola ukufinyelela ezingxenyeni ezithile zohlelo lwewebhu. Amafomu, achaza ukuthi imininingwane ethunyelwe kanjani kwiseva isingathwa futhi yanikezwa ku-database kanye nomsebenzisi. Lezi ziyisisekelo sokucutshungulwa kolwazi ohlangothini lweseva, futhi angemukele noma yiluphi uhlobo lolwazi izitolo zekhompyutha, izintambo ezithenjezelwe kakhulu, izinombolo, kanye nama-booleans eqiniso (ama-Checks). Izifanekiso, okuyikhodi ye-html kanye nolimi lwe-html kanye ne-template yolimi bese uvala igebe phakathi kwePython ne-HTML, imininingwane ye-Python ingafakwa njengekhodi ye-hyml etholakala nge-web ekhawulelwe, ilusizo ngezinhloso ezahlukahlukene kudivayisi eyihlane engeyenau-eed ukuze abe eduze kweseva. Amafayela a-Static, ajwayele ukugcwala kwe-javascript futhi imitapo yolwazi lapho iseva isebenza futhi ixhumeke ngethempulethi. Amafayela wemidiya, lapho iseva esebenza noma aphethwe ngaphandle, noma abhalelwe nje kuseva ngaphambi kokucutshungulwa futhi athunyelwa kwenye iseva (ibhakede) yokusingathwa. I-Middleware, okuyizingcezu zekhodi eziqhutshwa ngasikhathi sinye njengokubukwa konke futhi kubhekwa "kufakiwe" ekubukeni. Ama-processor womongo, acubungula umongo wokubuka ngakunye futhi asetshenziselwa ukwengeza umongo owengeziwe. Izivivinyo, eziqinisekisa ukuthi umsebenzisi noma isicelo zidlulisela izidingo ezithile ngaphambi kokuba kunikezwe umbono. Abathengi, ababeka ukuthi amawebhusayithi aphatha kanjani futhi aphendule ekuxhumaneni. Admin, esetshenziselwa ukubhalisa amamodeli ukuze akhohliswe ngokuningiliziwe ekhasini le-Django Admin, lapho i-database ingalawulwa khona ngesimo esibonakalayo. UCelery, ochaza izingxenye zemisebenzi ye-asynchronous zekhodi ye-Django zingaqalanning ngaphambi kokuya emsebenzini olandelayo noma umugqa wekhodi. I-Django ingaba nezinye izinto eziningi, esizoxoxa ngemininingwane lapha. Kunezindlela eziningi zokwenza i-DJango zisebenze ngokwengeziwe, engeza ama-websockets, asheshayo, iziteshi zokuxhumana ezihle kakhulu, nenqwaba yezinye izingcezu zesoftware zokunweba imali, ikakhulukazi emisebenzini yokubuka, lapho iningi lemisebenzi Ikhodi yenziwa. Imisebenzi yokubuka ibalulekile ngoba imvamisa imemezela yonke ingxenye yekhodi eqondene nephethini ethile ye-URL, noma ingxenye yeseva. Okokuqala, ake sihlole imisebenzi yokubuka. Imisebenzi yokubuka iqala ngokungenisa ikhodi okubonisayo okuzosetshenziswa ekubukeni, futhi kuchazwa kusetshenziswa izincazelo zomsebenzi ezijwayelekile noma amakilasi. Imibono elula kunazo zonke ichazwa yi-def yencazelo yomsebenzi, bese ubuyisela i-httpresponse ngethempulethi eyisisekelo. Ake siqale ngokuchaza umbono oyisisekelo wokubuyisa umbhalo "Sawubona World". Khumbula ukuthi isikhathi ngasinye lapho ufakaFter isitatimende esinjenge-def, uma, ngenkathi, ngoba, njll, uzodinga ukwengeza izikhala ezi-4 zencazelo ngayinye evelele ongathanda ukuyisebenzisa emsebenzini wakho. Sizongena kulokho ngakunye kwalezi kungekudala. Ukusuka kwisikhombi sendawo yethu, hlela okuphakelayo / ukubukwa.py.py ifayela usebenzisa i-nano bese wengeza imigqa elandelayo kuze kube sekupheleni kwe

from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world')
I-Django's Httprespense iyaphendula ngentambo yombhalo, ebonisiwe ngokuvula nokuvala '. Njalo lapho udlulisa imininingwane emsebenzini noma ekilasini, njengesicelo noma ngentambo, uzodinga ukusebenzisa umzali (ukuvula nokuvala). Lokhu akusikho konke esikudingayo ukubona ukubuka kwethu okwamanje. Vele, asikaze sitshele iseva lapho umbono ulapho ngqo, kusadingeka sichaze indlela lapho umbono okufanele ulunikeze khona. Ake siqale ngokuchaza indlela eyisisekelo kuhlelo lokusebenza / ama-URL.Phy, futhi sizongena emaqenjini emindeni ngokuhamba kwesikhathi. Kuhlelo lokusebenza / ama-URLS.PY, engeza umugqa ngemuva kwezitatimende zokungenisa ngemuva kokuqala ukungenisa ukubuka esisanda kudalwa.

from feed import views as feed_views
Manje, ake sichaze iphethini yokubuka. Amaphethini wokubuka anezakhi ezintathu, ingxenye yendlela, etshela iseva lapho ukubukwa khona khona ngaphakathi kweseva (indlela ye-URL eyayingenayo umsebenzisi kubha yewebhu), ingxenye yokubuka lapho umbono uchaziwe khona, futhi a Igama elinobungane lombono ngakho-ke kulula ukuyithola kabusha iphethini ye-IT lapho usebenza ngethempulethi, ikakhulukazi ngakho-ke igama lingashintshwa futhi livuselelwa uma kunesidingo ukwenza isikhala sokubukwa noma sithathe igama elithile. Kunengqondo ukwenza izinto ngale ndlela futhi uvumelana nezimo, ngoba ikhodi yakho yekhodi izoba yindawo eshintshayo edinga ukuguquguquka nokuthuthuka ukuze kube lula futhi kube lula ukusebenza nakho. Nakhu ukuthi ukubukwa kwakho kuzobukeka kanjani, ungangeza lokhu ku-URLPATTRS = [isigaba sohlelo lokusebenza / ama-URL.Phs.Phy. Iphethini yokubuka ichazwa ngezakhi ezintathu ezichazwe ngenhla, kanye nomsebenzi obizwa nge-Path. Amaphethini akho e-URL uhlu, ngakho-ke qiniseka ukuthi uhlala uqeda into ngayinye kuzongekhefana, ngoba lokhu kuhlukanisa ngamunye. Into ngayinye kufanele futhi iqhubeke nomugqa omusha, futhi kanye nezikhala ezine ngaphambi kwayo, njengohlelo lokusebenza kuzilungiselelo.Phy. Sizochaza ingxenye yokuqala yombono ngomsebenzi ongenalutho, ukuze kwakhiwe umbono oqhuba umkhombandlela wezimpande weseva yewebhu. Ama-urls akho.PY kufanele manje abukeke

from feed import views as feed_views

urlpatterns = [
    path('', feed_views.hello, name='hello'),
]
Lesi yisisekelo sokwenza iwebhusayithi nge-Django e-static ngokuphelele. Ukuze wenze iwebhusayithi eshukumisayo lapho singaqala khona imininingwane yokulondolozwa, njengezithombe, amavidiyo, umsindo nokuningi, sizodinga ukusebenzisa amamodeli, esizohlola ngokulandelayo. Okwamanje, ake sihlole ikhodi yethu bese sisebenzisa iseva. Ukuhlola ikhodi yamaphutha, run:

python manage.py check
Uma kuneminye imilayezo yephutha, kufanele ubuyekeze ngokucophelela izinguquko ozenzile kuhlelo lwakho lokusebenza futhi ubone ukuthi ngabe kukhona yini okudinga ukulungiswa, njengesikhala esengeziwe, umlingiswa owengeziwe, noma iyiphi i-typo, noma iyiphi i-typo, noma iyiphi i-typo, noma iyiphi i-typo, noma yikuphi ngengozi umlingiswa osusiwe, noma yini enye. Ukufundwa ngomlayezo wephutha (uma unayo), kufanele ukwazi ukubona indlela eya kwifayela olidalile noma elihlelwe kanye nenombolo yomugqa, ngakho-ke bheka lelo fayela nomugqa futhi ubone ukuthi yini ekhona . Uma usuyilungisile inkinga, gijima umyalo ongenhla futhi. Lapho isoftware yakho isilungele ukugijima futhi iyasebenza, uzobona okuphumayo "Ukuhlola kohlelo akukhonjwanga zingqinamba." Manje usukulungele ukuhamba. Gijimisa iseva nge:

python manage.py runserver 0.0.0.0:8000
Manje vula isiphequluli sewebhu futhi uzulazule ku-HTTP: // I-Localhost: 8000. Kufanele ubone umbhalo ubuya kubazali kanye nezingcaphuno zomsebenzi we-HTTPresponse ekubukeni kwakho. Lesi yisibonelo esiyisisekelo nje, kepha uma ukwenze lokhu kude, uyakuqonda izisekelo ze-linux, bash, uPython, nomsebenzi we-Django. Ake sigaye sijule ukuze sifinyelele kuma-modeli athile wedatha, futhi uhlole amandla ekilasi lePython ekugcinweni kwemininingwane. Ngemuva kwalokho, sizoqala ukuthola ukubamba ku-HTML kanye ne-CSS ngaphambi kokuthi isayithi lethu lihleleke ngokuphelele, liguquguquke futhi livikeleke lisebenzisa iJavaScript kanye nokufunda komshini. Amakilasi agcinwe kumamodeli.py ohlelo lwakho lokusebenza. Usebenzisa i-Nano, hlela uhlelo lokusebenza / amamodeli.Spy bese wengeza isigaba esisha. Isigaba sichazwa nencazelo yekilasi futhi sidlulisela i-superclass ukuthi ifa kusuka kulo, kuleli cala amamodeli.Model. Igama lekilasi liza ngemuva kwencazelo yekilasi, nangemva kokuchazwa kwekilasi A: (IColon) iyasetshenziswa, ngaphambi kwezimfanelo nezincazelo zomsebenzi eziboshwe ekilasini ziboshwe ngezansi. Ikilasi LethuIdinga i-ID esingayisebenzisa ukuyibuyisa futhi siyigcine ihlukile, futhi idinga nenkambu yombhalo ukugcina imininingwane ethile. Kamuva kuqhubeke singangeza isikhathi, amafayela, ama-booleans (izincazelo zeqiniso noma ezingamanga ezingasiza ikhodi yethu ukuthi zenze izinqumo ngalokho okufanele zikwenze ngemodeli, futhi kungasetshenziselwa ukubopha imodeli kumsebenzisi ungene ngemvume kwiseva, nokuningi. Ake siyeke ikhodi

from django.db import models # Ukungenisa okusetshenziselwa ukuchaza ikilasi lethu futhi kunezimfanelo zethu

class Post(models.Model): # Incazelo yekilasi lethu uqobo
    id = models.AutoField(primary_key=True) # I-ID yemodeli yethu, ukhiye okhiqizwa ngokuzenzakalelayo ozosivumela ukuba sibuze imodeli, sigcine ihlukile, futhi ilusizo lapho sidinga ukuxhumana nemodeli uma seliwe.
    text = models.TextField(default='') # Izimfanelo zekilasi lethu, kulokhu, umbhalo othile, wehlisa isithunzi esingenalutho.
Vala bese ugcine ifayili njengoba senze ngaphambi kokuqeda. Kuneminye imikhakha eminingi nezinketho eziningi esizohlola lapho sibuyekeza lesi sigaba njengoba uhlelo lwethu lokusebenza luvela, kepha lesi izidingo eziyisisekelo zokwenza uhlelo lokusebenza ukuthumela umbhalo othile. Kodwa-ke, le modeli ngeke isebenze yedwa. Njengoba kuchaziwe ngaphambili, sizodinga ukubuka ngokwezifiso nendlela yangokwezifiso ye-URL yokwenza le modeli ukuthi isebenze, futhi sizodinga nefomu kanye nethempulethi. Ake sihlole ifomu kuqala. Ukuchaza ifomu, hlela uhlelo lokusebenza / amafomu.Spy ne-nano bese wengeza imigqa elandelayo. Sizodinga ukungeniswa kwezinto ezimbili, isigaba sethu samafomu, kanye nemodeli esadale (feed.models.Post), incazelo yekilasi efana nemodeli ezochaza i-meta exhumana nge. Ifomu lingaba nomsebenzi wokuqalisa olibeka kususelwa kulwazi ngesicelo, imodeli noma ngenye indlela, sizohlola lokhu ngokuhamba kwesikhathi. Amafomu amamodeli alusizo kakhulu ngoba angakha imodeli noma ahlele imodeli,Ngakho-ke sizowasebenzisa bobabili. Masichaze eyodwa ngezindlela.Phlisayo

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',)
Lezi yizisekelo zefomu nemodeli ebukeka ngayo. Leli fomu lemodeli lingasetshenziswa ukuhambisa noma ukuhlela okuthunyelwe, ukuguqula umbhalo oqukethe. Sizobheka ukuhlanganisa leli fomu ngombono olandelayo. Okokuqala, ake senze ukufuduka futhi sihambisa imininingo egciniwe ukuze ikhodi yethu ingasebenzisana nemodeli lapho isebenza. Ukuze wenze lokhu, gijimani imiyalo elandelayo:

python manage.py makemigrations
python manage.py migrate
Lokhu kuzothatha umzuzu ukuzokwenza, kepha uma kwenzeka, kuzokuvumela ukuthi ufinyelele imodeli ekubukeni, Middleware, noma kwenye indawo ku-software. Masiqhubeke ngokwenza umbono lapho singabona khona imodeli yethu. Hlela okuphakelayo / ukubukwa.Pokuhlelwa bese wengeza ikhodi elandelayo, njengoba kuphawuliwe. Ngeke udinge ukufaka noma yini ngemuva kwesibonakaliso #, leyo khodi yimibono esetshenziselwa ukukhombisa imininingwane ngekhodi. Sizoqala ngokungenisa imodeli yethu ekubukeni, futhi sikungeze kumongo lapho singayivumela khona esithebulethi njengohlu lokuboniswa. Okulandelayo, sizokwengeza ithempulethi lapho singanikeza khona ifomu nemodeli enenkinobho yokwakha into entsha ngokususelwa kwimodeli bese uyithumela kuseva. Lokhu kuzwakala kuyinkimbinkimbi, ngakho-ke asithathe nje isinyathelo ngesinyathelo. Ngaphambi kokuthi siqede umbono, ake sakhe isifanekiso esivele sinikeze imodeli futhi siqiniseke ukuthi singayibona ngokwakha okuthunyelwe okusha egobolondweni. Nakhu ukuthi lowo mbono kufanele ubheke kanjani:

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

def feed(request):
    posts = Post.objects.all() # Buza konke okuthunyelwe ku-database kuze kube manje
    return render(request, 'feed/feed.html', {
        'posts': posts,
    })
Konke lokhu kubukeka kulula impela kuze kube yilapho sifika ezansi. Nikeza, inani elibuyiselwe umsebenzi esikhundleni sempendulo ye-HTTP njengesibonelo esedlule, ngaso sonke isikhathi kuthatha isicelo njengokufaka kwayo okokuqala, kwamukela umongo (kulokhu okuthunyelwe ku-database), okungenziwa manje kwisifanekiso , bese ibuyisa isifanekiso esichazwe emsebenzini. I-template izoba yidokhumenti ye-HTML enolimi oluncane olubizwa ngeJinja2, olunikezela ngemininingwane ye-Pyphon ku-HTML. Ukuqala ukudala izifanekiso, yenza izinkomba ezimbili kokuphakelayo.

mkdir feed/templates
mkdir feed/templates/feed
Okulandelayo, hlela ithempulethi ku-Directory ngenhla, okuphakelayo / izifanekiso / okuphakelayo, bese wengeza ikhodi yalesi sibonelo. Ake sibheke ithempulethi yalesi sibonelo.
 
<!doctype HTML>
<html>
<body>
<legend>Feed</legend>
<hr>
{% for post in posts %}
<p>{{ post.text }}</p>
{% endfor %}
</body>
</html>
 
Lesi ithempulethi elula kakhulu. Kuchaza ukuvula nokuvala amathegi e-HTML, ithegi yohlobo lwedokhumenti, umaki womzimba onesihloko se-Legend, ithegi yebheki elingeza umugqa omncane esikrinini njengesigaba ithempulethi. Lokhu konke kudinga ukunikela okuthunyelwe, kepha akukho ku-database okwamanje. Ake sakhe amanye ngegobolondo. Singagijimisa igobolondo nge-phante.py

python manage.py shell
Manje, ake singethembele imodeli yethu yeposi

from feed.models import Post
Okulandelayo, sizokwakha okuthunyelwe okulula ngentambo bese siphuma egobolondweni. Intambo ingaba yinoma yini, inqobo nje uma umbhalo ofanele.

Post.objects.create(text='hello world')
exit()
Okokugcina, sizodinga ukwengeza iphethini ye-URL ekuphathweni kwethu. Ngoba uhlelo lwethu lokusebenza lokuphakelayo luzosebenzisa ama-URL amaningi futhi sifuna ukugcina osayizi befayela lincane, ake sakhe ama-URLS endawo.Pluy kuhlelo lwethu lokusebenza lokuphakelayo olubukeka kanjena:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.feed, name='feed'),
]
Sizodinga futhi ukuhlela ama-URL.Phy kuhlelo lokusebenza lwesisekelo, noma yini esinqume ukuyibiza, lokhu kwakuyisikhombisi sokuqala esidaliwe. Hlela uhlelo lokusebenza / uhlelo lokusebenza.Spy futhi ungeze okulandelayo kumaphethini we-URL

from django.urls import include # phezulu

urlpatterns = [
    # ... ikhodi yangaphambilini lapha
    path('feed/', include(('feed.urls'), namespace='feed')),
]
Manje, lapho sisebenzisa iseva ngePython Phatha.Spy RunServer, sizobona ikhasi esilidalile ngoba sinemodeli, ukubukwa kanye nethempulethi kanye nephethini ye-URL, kanye nezinto ezise-database. Okulandelayo, ake sisebenzise ifomu esilidalile bese liqala ukudala okuthunyelwe kwethu. Kepha ngaphambi kokuthi sibhale ikhodi eningi, ake senze isipele sisebenzisa umbhalo esiyibhale ngaphambili, isipele. Qalisa lo mbhalo egobolondweni, ulinde izikhathi ezimbalwa, futhi yonke ikhodi izosekelwa lapho isembozo sethu se-git.

backup
Ukusebenzisa ifomu kulula kakhulu. Sizongenisa ifomu lethu, engeza isipele sesicelo seposi ekubukeni, bese ugcine okuthunyelwe ku-database ngaphambi kokuqondisa kabusha ekubukeni okufanayo. Singasebenzisa umsebenzi wokuqondisa kabusha esivele singenise, futhi omunye umsebenzi obizwa nge-reverse ukuthola i-URL yephethini yokubuka. Sizobuza lokhu ngentambo 'Okuphakelayo' Okuphakelayo 'ngoba amagama afakiwe wephethini efakiwe awondla, futhi umbono ubuye wabizwa ngokuthi okuphakelayo.

from feed.forms import PostForm

def feed(request):
    posts = Post.objects.all() # Buza konke okuthunyelwe ku-database kuze kube manje
    if request.method == 'POST': # Phatha isicelo seposi
        form = PostForm(request.POST) # Dala isibonelo sefomu bese ugcine idatha kuyo
        if form.is_valid(): # Qinisekisa ifomu
            form.save() # Gcina into entsha
        return redirect(reverse('feed:feed')) # Ukuqondisa kabusha ku-URL efanayo ngesicelo se-Thola
    return render(request, 'feed/feed.html', {
        'form': PostForm(), # Qiniseka ukuthi udlulisa ifomu kumongo ukuze sikwazi ukukunikeza.
        'posts': posts,
    })
Manje, sizodinga ukubuyekeza ithempulethi ukuze i-akhawunti ngefomu elisha. Singakwenza lokhu ngokusebenzisa
Ithegi ku-HTML futhi unikeze ifomu kwithempulethi ye-HTML ngenkinobho yokuhambisa. Sizodinga futhi ithokheni ye-CSRF, ithokheni evimbela amasayithi angaphandle ekuthumeleleni kwifomu ngaphandle kokulayisha kuqala ikhasi.
 
<!doctype HTML>
<html>
<body>
<legend>Feed</legend>
<form method=”POST”>
{% csrf_token %}
{{ form }}
<button type=”submit”>New Post</button>
</form>
<hr>
{% for post in posts %}
<p>{{ post.text }}</p>
{% endfor %}
</body>
</html>
 
Ake sikwephule lokhu. Kunesigaba esisha sefomu, ithokheni, ifomu ngokwalo, nenkinobho yokuhambisa. Kulula, kepha uma sikubheka, singafuna ukukwenza kubukeke kangcono. Kuyasebenza, singathumela okuthunyelwe okusha ngefomu futhi manje sebesindisiwe ku-database. Kunezinto ezimbalwa ezenzeka lapha. Sisebenzisa amathegi e-HTML ukumemezela ukuthi idokhumenti idokhumenti ye-HTML, sisebenzisa ithegi ye-template ({% ...%}) ukuhumusha ithokheni lefomu, elinye, {{{{{{{{{{{{{{{{{{{...}} ukunikela ngefomu. Siphinde sibe ne-loop ukuze sinikeze umbhalo usebenzisa amathegi we-block kanye nethegi yethempulethi. Amathegi e-block abaluleke kakhulu ngoba singachaza ukuthi izingxenye zethempulethi zihunyushwa kanjani nazo, futhi amathegi wethempulethi ayisisekelo sendlela esibeka ngayo okuguqukayo kwikhodi yethu. Manje kudingeka senze uhlelo lwethu lokusebenza lubukeke lube ngcono, ngoba manje lubukeka lusekelo ngempela. Lokhu singakwenza ngokusebenzisa i-CSS, noma ku-inline, noma emakilasini aboshwe entweni ngayinye kudokhumenti. I-CSS imnandi impela ngoba itshela konke okusekhasini ukuthi kufanele libukeke kanjani,Futhi kungenza ukuthi kubukeke kukuhle impela. Kunemitapo yolwazi embalwa engakwenza lokhu, kepha ukuya kwami ​​kuya ku-bootstrap. I-Bootstrstrap ingalandwa kuwebhusayithi yabo,llbootstrap.com/. Lapho bese lapho, cindezela inkinobho ukuze ufunde amadokhumenti wokufaka, bese ukopisha ikhodi kusuka ku-CDN Isigaba. Uzodinga le khodi phezulu kwedokhumenti lakho le-HTML, kuthegi elibizwa ngekhanda. Futhi, ake siqhubeke futhi sakhe ithempulethi eyisisekelo ngakho-ke akudingeki ukuthi uphinde uphinde uphinde uphinde uphinde uphinde axhumane nalezi zixhumanisi kwithempulethi ngayinye. Yenza umkhombandlela omusha obizwa ngamathempulethi nge-MKDIR templates, bese uhlela izifanekiso / i-Base.html. Kufanele kubukeke kanjena:
 
<!doctype HTML>
<html>
<head>
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet" crossorigin="anonymous">
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js" crossorigin="anonymous"></script>
</head>
<body>
{% block body %}
{% endblock %}
</body>
</html>
 
Qinisekisa ukukopisha i-CSS ne-JavaScript, ama-.css namafayela .'s kanye namafayela we-.js, ngoba sizodinga iJavaScript ukwenza isiza sethu sisebenze ngokwengeziwe ngokuzayo. Manje, ake sibuyele e-Bash Shell bese sigijimisa umyalo osheshayo. Khumbula, uma kwenzeka udinga ukufinyelela imvelo ebonakalayo, uhlobo lomthombo we-venv / Bin / Cupha. Lokhu kuzokuvumela ukuthi ufake amaphakheji wePython endaweni yalapho evumela i-Django ifinyelele kubo. Ukunikeza amafomu ethu akhiqizwe amakilasi we-Django Bootstrap, sizosebenzisa iphakethe lePython elibizwa ngokuthi amafomu e-crispy. Singalanda lokhu ngomyalo olandelayo

pip install django-crispy-forms
Uma lokhu kufakiwe, kwengeze kuzilungiselelo.Phy

INSTALLED_APPS = [
    # ... ikhodi yangaphambilini lapha
    'crispy_forms',
]
Manje, emuva esithekweni sethu sokuphakelayo, singasusa ezinye izinto. Ake sisuse isiqalo nesiphelo sedokhumenti bese siyifaka esikhundleni sefa kusuka kusifanekiso sethu sesisekelo, usebenzisa ukunwebeka nencazelo yebhlokhi. Futhi, sizokwengeza ukungenisa kwesithombe se-template ngomthwalo nesihlungi sethempulethi kufomu. Okokugcina, ake sengeze isigaba se-bootstrap kwinkinobho esefomini ukulenza libukeke njengenkinobho. Lokho kufanele kubukeke kanjena:
 
{% extends 'base.html' %}
{% block body %}
{% load crispy_forms_tags %}
<form method=”POST”>
{% csrf_token %}
{{ form|crispy }}
<button type=”submit” class=”btn btn-outline-primary”>New Post</button>
</form>
<hr>
{% for post in posts %}
<p>{{ post.text }}</p>
{% endfor %}
{% endblock %}
 
Kuhle! Kuyinto encane kakhulu yekhodi. Okulandelayo, kufanele sikuhlole futhi siqiniseke ukuthi siyabona ukuthi yonke into ibukeka yinhle, futhi iqiniseke futhi ukuthi konke kusebenza kahle. Gijimisa iseva ngokwemiyalo edlule futhi uqiniseke ukuthi isayithi libukeka futhi lisebenza kahle. Umsebenzi omuhle! Usukulungele ukuqhubekela esigabeni esilandelayo, lapho sizofaka khona ukusebenza kokungena ngemvume kwabasebenzisi kusetshenziswa ama-URL afanayo, amafomu, ukubukwa kanye nezifanekiso. Isifanekiso sesisekelo sibalulekile, futhi sizoqhubeka nokuyiguqula futhi sisebenzise izinguquko njengoba kudingeka, kepha manje ake sigxile ekwenzeni isiza sethu siphephe kakhulu, ngokunika amandla abasebenzisi ukuthi bangene ngegama lomsebenzisi nephasikhodi, futhi ekugcineni bawulwazi olubaluleke kakhulu lokho Sizosiza ukugcina uhlelo lwakho lokusebenza luphephe futhi i-akhawunti yakho itholakale kuphela ngawe. Ukuze senze lokhu, sizodinga ukusebenzisa imodeli yabasebenzisi eyakhelwe ku-Django. Imodeli yabasebenzisi iyimodeli yedatha, efana neposi yethu, ekwazi ukunikelwa ukuze kufakwe umsebenzisi kuwebhusayithi. Ngokuzayo, ngaphambi kokuba sisebenzise indawo kwi-Intanethi, sizokwenzaNweba le modeli namanye amamodeli abhalwe kuyo, futhi wakhe amanye amanyathelo okuphepha okungena ngemvume okuvimbela ebugebeng. Sizoqala ngokusebenzisa ezinye ezakhelwe ngamafomu okungena nge-Django ahlinzekayo. Okokuqala, ake sakhe uhlelo lokusebenza olusha esizolusebenzisa ukuhumusha izifanekiso nokubukwa kwekhasi lokungena eliyisisekelo. Sizokwakha nezinye izinhlelo zokusebenza ukumela izinselelo eziqhubekayo zokungena ngemvume ukuze kuvikeleke uhlelo lokusebenza, kufaka phakathi i-pincode, ukwamukelwa kobuso, ukuxhumanisa insimu, ukuqinisekiswa kwezinto eziningi, nokuqashelwa kwezinto eziningi, kanye nokuqashelwa kweminwe. Sesikhulumile ngokuqala uhlelo lokusebenza. Ukusuka kwisikhombi sethu, ngaphakathi kwemvelo ebonakalayo, dlulisa Phatha.PY Lezi

python manage.py startapp users
Manje, kufanele sibe nesiqondisi sohlelo lokusebenza olusha. Ake siqale ngokwakha umbono kulowo mkhombandlela ohambelana nokungena komsebenzisi. I-Django yakhele ngokubukwa kwama-logins abasebenzisi, kepha lokhu ngeke kusilungele ngoba sidinga ukubuka ngokwezifiso, okungcono kwenziwa ngencazelo. Kulobu mbono, sizoqala ngokubheka isicelo seposi, i-Pass Cela.Post kwi-logform engeniswe kusuka ku-DJango, fakazela i-akhawunti yomsebenzisi, bese ungena kumsebenzisi ngaphambi kokuzithumela kuhlelo lwethu lokusebenza lokuphakelayo. Kubasebenzisi / ukubukwa.Pha, engeza ikhodi elandelayo

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

def login(request):
    if request.method == “POST”:
        username = request.POST['username'] # Thola igama lomsebenzisi nephasiwedi kusuka kwisicelo seposi
        password = request.POST['password'] # Qinisekisa umsebenzisi
        user = authenticate(username=username, password=password)
        if user:
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
            messages.success(request, 'Your password was accepted. Please continue')
            return redirect(reverse('feed:feed'))
        else: messages.warning(request, 'Username or password incorrect. Please try again')
    return render(request, 'users/login.html', {'form': AuthenticationForm()})
Konke lokhu okudingayo ukuthola umbono wokungena oyisisekelo. Manje, ake sakhe ifomu lokubuka ngokwandisa isibonisi sesisekelo. Sizoqala ngokwakha umkhombandlela omusha wezifanekiso kufolda yabasebenzisi.

mkdir users/templates
mkdir users/templates/users
Manje, kufanele sikwazi ukuhlela abasebenzisi / izifanekiso / abasebenzisi / Login.html. Ngenkathi sikulo, sizokwakha ithempulethi ukuvumela umsebenzisi ukuthi abhalise futhi.

nano users/templates/users/login.html
Manje, kuthempulethi,
 
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<form method="POST">
    {% csrf_token %}
    <fieldset class="form-group">
        <legend class="border-bottom mb-4 break">Log In</legend>
        {{ form|crispy }}
    </fieldset>
    <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Login</button>
    </div>
</form>
{% endblock %}
 
Lezi yizisekelo zethempulethi yokungena ngemvume. Kufana nenye ithempulethi esesakhiweni, kepha kubukeka kuhluke kancane lapho kunikelwa. Singakopisha le khodi ukwakha enye ithempulethi efanayo ebizwa ngokuthi irejista.html, lapho sizoshintsha khona amagama futhi sisebenzise ifomu elisha esakha. Masenze ithempulethi kuqala. Hlela abasebenzisi / izifanekiso / abasebenzisi / Rejista.html bese wengeza ikhodi elandelayo:
 
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
<form method="POST">
    {% csrf_token %}
    <fieldset class="form-group">
        <legend class="border-bottom mb-4 break">Create an account</legend>
        {{ form|crispy }}
    </fieldset>
    <div class="form-group">
        <button class="btn btn-outline-info" type="submit">Register</button>
    </div>
</form>
{% endblock %}
 
Manje, ake sakhe ifomu lokubhaliswa kwethu komsebenzisi bese sibuyisela emuva ekubukeni ngaphambi kokuthi sithuthukise ukungena komsebenzisi ngemodeli. Sizokwenza leli fomu libe lisekelo liqale nge, kepha faka imininingwane eminingi nezici zokuphepha ezifana nezivumelwano neCAPTCHA ngokuzayo. Hlela amafomu nabasebenzisi be-nano / amafomu.Spy, bese wengeza ikhodi elandelayo.

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']
Ngakho-ke sinelinye ifomu lapha, elisebenza kahle. Ifomu lokubhalisela umsebenzisi ngegama lomsebenzisi, i-imeyili nephasiwedi, kanye nenkambu yokuqinisekisa iphasiwedi. Qaphela ukuthi leli fomu alinwebi amafomu ajwayelekile.Iklasi elijwayelekile, liyifomu lemodeli okusho ukuthi line-meta. Inkambu eyodwa ichazwa okufanayo, futhi i-Meta yekilasi ichaza imodeli leli fomu elifana nalo lonke ulwazi oluzobhalwa kwifomu. Iningi lalokhu selivele likhona e-DJANGO elakhiwe ngokusebenza komsebenzisi, ngakho-ke sizosebenzisa lokho njengesisekelo sekilasi (kudlule kumzali). Okulandelayo, sizohlola umbono wokubhalisa umsebenzisi, manje njengoba sinefomu nethempulethi. Lesi yisibonelo, njengaleso ekubukeni okusha kweposi. Hlela abasebenzisi / ukubukwa.Po bese wengeza ikhodi elandelayo:

# ... amanani
from .forms import UserRegisterForm

def register(request):
    if request.method == “POST”:
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            messages.success(request, 'Welcome to the app, {}.'.format(user.username))
    return render(request, 'users/register.html', {'form': UserRegisterForm})
Lokhu konke esikudingayo ukuthola umsebenzisi abhaliswe, kepha kufanele sibe neminye imininingwane. Sifuna ukwazi isikhathi umsebenzisi abhaliswe ngaso, ngasiphi isikhathi esagcina esizeni, imininingwane ethile ngabo, njenge-biography, i-Timezone, njll. Futhi, sizodinga ukubuyekeza imodeli yethu yokuphakelayo, okuthunyelwe imodeli kanye nokuthunyelwe kwezwi kumsebenzisi ngamunye. Ukuze senze lokho, sizobuyekeza amamodeli.Phy kuzo zombili izinhlelo zokusebenza. Ake siqale ngokuhlela imodeli yokuphakelayo. Kufanele kubukeke kanjena manje:

from django.db import models # ... amanani
from django.contrib.auth.models import User

class Post(models.Model):
    id = models.AutoField(primary_key=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Faka kulomugqa
    text = models.TextField(default='')
Naka umugqa wesibili ongezwe kufayela. Lokhu kungukhiye wakwamanye amazwe, okuzothi okuthunyelwe ngakunye kumsebenzisi oyedwa othunyelwe ngakunye, ngakho-ke singakwazi ukuqiniseka ukuthi sisindisa okuthunyelwe kusisekelo somsebenzisi kanye nangekho okuthunyelwe ngaphandle kokufaka umsebenzisi. Sichaza lo mhluko wangaphandle ngekilasi elimele, ukususa impikiswano ukuze kuqinisekiswe ukuthi okuthunyelwe kususwa nabasebenzisi, izimpikiswano ezingenalutho nezingenalutho ukuze qiniseka ukuthi singasusa umsebenzisi uma kufanelekile, futhi ukuze kuhlaluleke ukuswela umsebenzisi kokuthunyelwe esivele sikhona Kwenziwe, negama elihlobene nalo, esingalisebenzisa ukubhekisa ezintweni ezithunyelwe umsebenzisi adala. Leli gama elihlobene, ngokungafani nePost.Author, umlobi weposi, lisinika umsebenzisi ukuthi athumele iposi uqobo. Manje sesingathola okuthunyelwe umsebenzisi owenziwe ngokusebenza komsebenzisi.posts.all (), noma umlobi.posts.onke (). Manje, ake senze ama-Egins ethu aqine ngokwengeziwe. Sesivele senze isayithi lethu libe lisengozini enkulu ebugebengle ngokubuphana ngokubumbana ngokukhawulela inani lezikhathi esizovumele ukungena ngemvume kuIsiza, lokhu kulula impela. Ake siqale ukugcina imininingwane ethile mayelana nomsebenzisi ngamunye ngaphambili njengoba siqhubeka nokuthuthukisa uhlelo lwethu lokusebenza. Ukuhlela Abasebenzisi / Amamodeli.Spy, engeza okulandelayo

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='')
Qaphela ukuthi le modeli ifana kahle nemodeli yeposi. Sinokungenisa okwengeziwe kokungenisa, isikhathi, okuzosivumela ukuthi sisekele okuzenzakalelayo kumasimu we-datettime, futhi futhi sinomlingiswa kanye ne-textifield njengokuthunyelwe. Ukusebenzisa wonke lamuhla ama-timestamp kusisiza ukuvikela isiza futhi siqonde ukusetshenziswa kwayo, futhi amasimu wombhalo ake sinikeze imininingwane mayelana nomsebenzisi ngamunye, noma umbhali, kwiwebhusayithi. I-OnetoOnefield kufanele kube kuphela ukucatshangelwa okuncane, iziphatha ngokufana ne-foreginkey kodwa eyodwa kuphela ngemodeli ngayinye elandelayo. Ngale ndlela, umsebenzisi kuphela unephrofayili eyodwa, ngenkathi beba nokuthunyelwe okuningi. Manje, ake sithuthukise ukungena kwethu futhi sibhalise ukubukwa ukuze ku-akhawunti ngephrofayili. Okokuqala, hlela abasebenzisi / ukubukwa.Po. Futhi gxila ekubukeni kokurejista:

# ... amanani
from .forms import UserRegisterForm

def register(request):
    if request.method == “POST”:
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            Profile.objects.create(user=user) # Qinisekisa ukwengeza lomugqa, ukudala iphrofayili yomsebenzisi
            messages.success(request, 'Welcome to the app, {}.'.format(user.username))
    return render(request, 'users/register.html', {'form': UserRegisterForm})
Lokhu kumane kwakha iphrofayili yomsebenzisi, ngaphandle kokugcwalisa noma yiluphi ulwazi. Manje, sifuna ukuqiniseka ukuthi i-akhawunti yomsebenzisi ayikwazi ukungena ngemvume kaningi, noma amaphasiwedi okungenani awakwazi ukuqulwa kaningi, ngakho-ke ake sivuselele ukubuka kokungena ngemvume.

# ... amanani
from .models import Profile
from django.utils import timezone
import datetime

def login(request):
    if request.method == “POST”:
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user and user.profile.can_login < timezone.now(): # Qaphela ukuthi manje sihlola ukuthi umsebenzisi angangena yini
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
            messages.success(request, 'Your password was accepted. Please continue.')
            return redirect(reverse('feed:feed'))
        else: # Uma ukungena ngemvume kungaphumeleli,
            messages.warning(request, 'Username or password incorrect. Please try again.')
            user = User.objects.filter(username=username).first() # Le yingxenye lapho sibuyekeza khona iphrofayili yabasebenzisi
            if user: 
                profile = user.profile
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Ngakho-ke abakwazi ukungena ngemvume ngemizuzwana embalwa
                profile.save()
    return render(request, 'users/login.html', {'form': AuthenticationForm()})
Lokhu kuyisisekelo sokuphepha. Qinisekisa ukuthi isiza singesengcupheko kumuntu umane nje uzama yonke inhlanganisela yephasiwedi, noma ambalwa ngasikhathi sinye. Lokhu ngeke kukhungathekise umsebenzisi ojwayelekile owaziyo iphasikhodi yabo futhi avele angena kumadivayisi ambalwa, kepha azogcina amarobhothi amaningi wobugebengu kokwenza imininingwane. Qaphela ukuthi sengeze isitatimende esinokuhlukahluka, can_login, okufanele kube yisikhathi esedlule, futhi sikuvuselele nge-login ngayinye engaphumelelanga usebenzisa igama lomsebenzisi elifanayo. Ngale ndlela, umsebenzisi onobungozi ngeke akwazi ukuqagela iphasiwedi noma kuphi lapho esheshayo. Inani lemizuzwana ku-DateTime.Timedelta () lingavuselelwa futhi, futhi iwebhusayithi izokhuthazeka kakhulu okwamanje kungasebenzi kahle ngemizuzwana engaphezulu. Ngincoma ukuthi ngiqale nge. Khumbula, sakha umbhalo wesipele ukuze asindise umsebenzi wethu, ngakho-ke ake siqhubeke sibuyele emuva kwalokho esikude kangaka ukuze siqiniseke ukuthi konke kusindisiwe. Gijimani umyalo:

sudo backup
Nakulokhu futhi, lokhu kuzosindisa umsebenzi wakho kuze kube manje. Ngincoma ukusebenzisa ama-backups ajwayelekile ukuze ngisindise umsebenzi wakho, futhi ungahle ngisho nokufuna umsebenzi wesipele ngokuzenzakalelayo. Ungakwenza lokhu usebenzisa umsebenzi we-UNIX obizwa ngeCron. Ukuze usebenzise lo msebenzi, gijima umyalo olandelayo bese ufaka iphasiwedi yakho:

sudo crontab -e
Uma ungakakhethi inketho 1 ye-nano, umhleli wombhalo kufanele usuvele ujwayele, bese upheqela ezansi kwefayela usebenzisa okhiye bemicibisholo. Faka umugqa olandelayo:

0 * * * * sudo backup
I-Cron isebenzisa umzuzu omncane wefomethi, ihora, usuku lwenyanga, inyanga, usuku lwesonto, lapho inombolo noma inombolo imelela lapho kufanele iqale khona umyalo. Usebenzisa i-0 ngomzuzu futhi * Kwazo zonke izinketho, singagijimisa umyalo ngomzuzu wokuqala wazo zonke ihora ekuqaleni komzuzu. Lokhu kusivumela ukuba senzele ikhodi ngokuzenzakalelayo. Yonke imisebenzi ye-cron lapho yenziwa nge-sudo igijime njengempande, ngakho-ke ngeke sidinge ukuthayipha kwiphasiwedi njalo ngehora. Ukwenza kube lula ukwenza isipele ikhodi yethu ngaphandle kokusebenzisa iphasiwedi, ake sikhubaze iphasiwedi yomyalo wethu wesipele. Sizokwenza lokhu ngokwenza umyalo olandelayo bese ufaka iphasiwedi:

sudo visudo
Manje, ake siphele ezansi kwefayela bese wengeza omunye umugqa:

ALL ALL=NOPASSWD: /bin/backup
Lokhu kusivumela ukuba sigijime umyalo "Isipele" njenganoma yimuphi umsebenzisi, ngaphandle kwephasiwedi. Ifomethi yalokhu ilula, isiqalo nje umugqa onama- "All All All = Nopasswd: / Bin /" bese uphela ngomyalo, isibonelo / i-Backup, ekhona /. Manje, ake siqale ukusebenza nge-imeyili. I-imeyili ibaluleke ngempela kumawebhusayithi, ngoba kuyindlela yokugcina iwebhusayithi iphephe ngokwengeziwe, qinisekisa ukuthi abasebenzisi babantu bangempela, futhi ngisho nemikhiqizo yemakethe noma izinsizakalo kumakhasimende. Abantu abaningi abavame ukubheka i-imeyili yabo nsuku zonke, futhi bathola zonke izinhlobo ze-imeyili ye-Marketing mayelana nemikhiqizo nezinsizakalo abazithandayo. Kufika izinketho ezimbalwa lapho uvumela i-imeyili kuwebhusayithi ye-DJANGO, futhi wamukelekile ukukhetha Noma yikuphi okusebenzele okuhle kuwe. Okokuqala, ungakhokhela insizakalo ye-imeyili ezokwenza ukuthi uthumele i-imeyili kusuka kwisizinda sakho futhi idinga ikhodi encane. Kunezinsizakalo eziningi ezinikeza lokhu, njengendawo yokusebenza ye-Google, i-SendInblue, iMeyiliGun, nokuningi. Ngaphandle kwalokho, ususekhandlekweni kahleInsizakalo yakho ye-imeyili yakho ngaphakathi kweseva yakho kusuka ekuqaleni. Ngincoma le nketho, noma ngabe yikhodi engaphezulu futhi ingadinga ukusingathwa okukhethekile. Ngeke ukwazi ukuqala iseva yemeyili kusuka kwikhompyutha yakho yasekhaya kungenzeka kakhulu, ngakho-ke ake siqhubeke sihlole ukucushwa kanye nekhodi ukuthumela i-imeyili ngaphambi kokuqala iseva yethu. Okokuqala, hlela izilungiselelo.py ngokulandelayo

nano app/settings.py
Lapho uhlelo lokusebenza igama lohlelo lokusebenza olwenzile nge-Startapp. Faka imigqa elandelayo:

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)
Qiniseka ukuthi ushintsha lezi lapho usukulungele ukusebenzisa uhlelo lwakho lokusebenza, sizophinde sivumele lokhu ngokuhamba kwesikhathi. Ukusetha i-imeyili_Address kufanele kube yi-imeyili ongathanda ukuyithumela kuyo, nephasiwedi (i-imeyili_host_password) kufanele isethwe kwiphasiwedi oyikhiqizayo kwiseva. Ngilayisha iphasiwedi kusuka kufayela le-config ukuze ngiligcine liphume kwikhodi esebenzisa logic okulandelayo, ngaphezulu kwale migqa kuzilungiselelo.Phy:

import os
import json
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
Ngemuva kwalokho, sengibekele ifayela le-JSON nge-Config ku /etc/config.json usebenzisa uNano ngale ndlela elandelayo. Ukuhlela ifayela:

sudo nano /etc/config.json
Faka imigqa elandelayo:

{
	“EMAIL_HOST_PASSWORD”: “<some password here>”
}
Sizoqhubeka nokuhlela ifayela le-Config futhi sengeze wonke amaphasiwedi nezinkinobho esizozisebenzisa kuhlelo lokusebenza. Okwamanje, masisihlole ngokushesha ukuthi singayithumela kanjani i-imeyili usebenzisa i-Python. Okokuqala, ake sakhe ithempulethi nge-imeyili yokuqinisekisa esingayithumela kubasebenzisi bethu, bese siyibeka kwisikhombisi sethempulethi yomsebenzisi. Le template izobhalwa ku-HTML.

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

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

<p>The link will expire in 30 minutes.</p>
<p>If you have not requested a verification email you can simply ignore this email.</p>
<p>See you there,</p>
<p>Daisy</p>
 
Le imeyili ilula. Kuthatha umongo womsebenzisi, i-URL eyisisekelo yesayithi, ne-ID yomsebenzisi nethokheni esetshenziselwa ukuqinisekisa i-imeyili yomsebenzisi. Qiniseka ukuthi uchaza i-URL eyisisekelo kuzilungiselelo.PY Ngaphambi kokuthi sibhale ikhodi yePython ukuhumusha ithempulethi. Qhubeka futhi ungeze imigqa elandelayo kuhlelo lokusebenza / izilungiselelo.Pow, eduze kwasekuqaleni.

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

BASE_URL = PROTOCOL + '://' + DOMAIN
Ekugcineni, lapho isiza sakho sesilungele i-Intanethi futhi uyayisebenzisa, uzofuna ukuchaza isizinda sakho njengegama lesizinda olithenga ukumela isiza. Leli igama ozolithayipha kwi-navbar ukuze ufinyelele kwisayithi lakho. Okwamanje, ungashiya isizinda esingenalutho noma usebenzise umninindawo. Futhi uzofuna ukushintsha isiza_ igama elithi Ufuna ukunikeza isiza sakho, sokukhetha kwakho. Ngaphambi kokuthi sithumele i-imeyili, ake sakhe i-Tysen Generator ukuze sibe nethokheni yokuvula i-akhawunti engaphelelwa yisikhathi. Lokhu singakwenza ngokwakha nokungenisa ithokheni yokuvuselelwa kwe-akhawunti okubukeka njengokulandelayo. Hlela ifayela:

nano users/tokens.py
Faka ikhodi elandelayo:

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()
Le generator yethokheni eyisisekelo ikhiqiza ithokheni singathumela umsebenzisi ku-URL futhi umsebenzisi angawasebenzisa ukuqinisekisa i-imeyili yakhe futhi asebenze i-akhawunti yawo. Okulandelayo, ake sibheke ukuthi ungayithumela kanjani i-imeyili. Usebenzisa i-Nano, hlela abasebenzisi / i-imeyili.Spy.

nano users/email.py
Ukuthumela i-imeyili yokuqinisekisa ye-HTML kuzobukeka kanjena:

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)
Lokhu kulula. Singenisa imisebenzi esiyidingayo ukuthumela i-imeyili, inikeze i-imeyili ngezifanekiso, kanye nezilungiselelo zethu, bese sichaza i-imeyili ngegama lethempulethi bese lilithumela kumsebenzisi esebenzisa umsebenzi. Uzobona ukuthi asikashintshi umsebenzi ukuthumela imeyili, uthumele_html_email, okwamanje, ngakho-ke ake sibhale lokhu ngezansi ikhodi esivele ingeziwe kubasebenzisi / imeyili.PY

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()
Lokhu kuyinkimbinkimbi ngokwengeziwe, futhi asikakulungeli ukugijima yonke le khodi. Qaphela Sichaza i-Unsub_Link, isixhumanisi somsebenzisi esingasisebenzisa ukuze sikhiphe ohlwini lwama-imeyili ethu. Lokhu kubalulekile, ngoba abasebenzisi kuzodingeka bakwazi ukuphuma kuma-imeyili ethu ngaphandle kokuthi bafuna ukubabona, nganoma yisiphi isikhathi. Siphinde singeze enye indlela yoMlayezo emyalezweni wethu, okuwumyalezo we-HTML osuswe kumathegi e-HTML. Okokugcina, sibheka ukuthi ngabe i-imeyili ithunyelwe, futhi uma kungenjalo, simaka kuphrofayili yomsebenzisi yokuthi i-imeyili yabo ayivumelekile. Masibuyele emuva kumamodeli omsebenzisi ukuze sikwazi ukwenza konke lokhu kusebenze. Sidinga ukuchaza umsebenzi wokukhiqiza isixhumanisi sokuzikhipha ohlwini, futhi sichaze insimu yaseBoolean ukumaka ukuthi i-imeyili yomsebenzisi ayisebenzi. Okokuqala, engeza okungeniswa okulandelayo kwesokudla kwabasebenzisi / amamodeli.Spy

nano users/models.py

# ...
from django.core.signing import TimestampSigner, BadSignature, SignatureExpired
from django.urls import reverse
Okulandelayo, ake sengeze imisebenzi kwimodeli yabasebenzisi ukwenza ithokheni futhi ihlole ithokheni elisetshenziselwa ukwenza kusebenze i-imeyili, kanye nenkambu yokusindisa ukuthi ngabe umsebenzisi uthola ngempumelelo yini imeyili yabo. Kubasebenzisi / amamodeli.Spy futhi, engeza ikhodi elandelayo kuze kube sekupheleni kwemodeli (ikhodi efakiwe)

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

    def check_token(self, token):
        try:
            key = '%s:%s' % (self.user.username, token)
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Ivumelekile izinsuku ezingama-30
        except (BadSignature, SignatureExpired):
            return False
        return True

    def create_unsubscribe_link(self):
        username, token = self.make_token().split(":", 1)
        return reverse('users:unsubscribe', kwargs={'username': username, 'token': token,})
Lokhu kulula, sisebenzisa i-Timestampsigner, okuyithuluzi lezincwadi eziyisisekelo, ukudala ithokheni ezophelelwa yisikhathi ngemuva kwesikhathi esithile, futhi sisebenzisa nomsebenzi wokuhlola ukuthi ngabe uvumelekile yini. Sisebenzisa la mathokheni kabili, kanye ukuze aqinisekise i-imeyili, kanye kanye kwesixhumanisi sokuzikhipha. Manje njengoba sinakho lokhu, owokugcina womsebenzi esizodinga ukuwenza ekubukeni. Ngaphakathi kwabasebenzisi / ukubukwa.Pha, ake wengeze ukubukwa ukuqinisekisa ikheli le-imeyili, nokuzikhipha ohlwini.

nano users/views.py
Okokuqala, engeza okungenisa okulandelayo. Ngaphonsa okungeziwe okumbalwa ngakho-ke ngeke sikwazi ukungenisa izinto eziningi futhi ngokuhamba kwesikhathi.

from django.contrib.auth import logout
from django.shortcuts import render, redirect, get_object_or_404
from django.contrib.auth.models import User
from django.utils.encoding import force_str
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
import json
import requests
import datetime, traceback
from django.contrib import messages
from .models import Profile
from django.utils import timezone
from django.views.decorators.cache import never_cache
from .email import send_verification_email # Qiniseka ukuthi ungenisa umsebenzi wokuthumela we-imeyili wokuqinisekisa
from django.contrib.auth.decorators import login_required
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.utils.decorators import method_decorator
from django.http import HttpResponseRedirect
from django.conf import settings
from django.utils import timezone
import datetime
import pytz
from django.views.decorators.csrf import csrf_exempt
from django.http import HttpResponse
from django.contrib.auth.tokens import default_token_generator
from django.utils.http import urlsafe_base64_decode
from .tokens import account_activation_token
Kungenzeka ukuthi usuvele unakho okunye kwalokhu okungeniswayo, kepha akulimazi ukuziphindaphinda. Uzodinga ukungenisa umsebenzi wokuthumela we-imeyili wokuqinisekisa, kanye ne-akhawunti_activation_token kusuka kubasebenzisi.Tokens, phakathi kokunye okungeniswa. Manje, ezansi kwefayela, engeza ikhodi elandelayo:

def unsubscribe(request, username, token):
    user = get_object_or_404(User, username=username)
    if((request.user.is_authenticated and request.user == user) or user.profile.check_token(token)):
        # Zibhalele
        profile = user.profile
        profile.subscribed = False
        profile.save()
        return render(request, 'users/unsubscribe.html')
    # Ngaphandle kwalokho phinda uqondise ekhasini lokungena ngemvume
    messages.warning(request,f'Your unsubscribe link has expired. Please log in to unsubscribe.')
    next_url = reverse('users:unsubscribe', kwargs={'username': username, 'token': token,})
    return HttpResponseRedirect('%s?next=%s' % (reverse('login'), next_url))

def activate(request, uidb64, token):
    try:
        uid = force_str(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    ip = get_client_ip(request)
    if user is not None and account_activation_token.check_token(user, token):
        user.profile.email_verified = True
        user.profile.save()
        user.save()
# I-SendwelcoreEmail (Cela, Umsebenzisi)
        messages.success(request, f'Thanks for confirming your email! You can now log into your account, and a welcome email has been sent to you.')
        return redirect(user.profile.create_face_url())
    else:
        messages.success(request, f'Your activation link has expired. Please request a new activation link.')
        return redirect('verify:verify')

def resend_activation(request):
    if request.method == 'POST':
        form = ResendActivationEmailForm(request.POST)
        email = request.POST['email']
        try:
            user = User.objects.get(email=email)
            send_verification_email(user)
            messages.success(request,'Your verification email sent. Please click the link in your email to verify your account.')
            return redirect(reverse('verify:verify'))
        except:
            messages.warning(request,f'Your email is not correct. Please try again.')
    else:
        form = ResendActivationEmailForm()
    return render(request,'users/resend_activation.html',{'form': form, 'title': 'Resend Activation', 'small': True})
Le yikhodi eningi. Asiphule. Umsebenzi wokuqala, uhlanzekile futhi olula, obhaliwe umsebenzisi ohlwini lwamakheli. Umsebenzi wesibili wenza i-imeyili yakhe, futhi uzobona ukuthi ngingeze umsebenzi onamazwana, i-Sendwelreemail. Wamukelekile ukusebenzisa ithempulethi ye-imeyili kanye nencazelo yomsebenzi wokuthumela i-imeyili yokwamukela, angikakakakakabi. Umsebenzi wokugcina engiphonse wona kubalulekile, ngoba ama-imeyili asebenze aphelelwa yisikhathi. Ngakho-ke, kuzodingeka siphinde sisebenzise kabusha i-imeyili yokuvula isikhathi esithile. Singasebenzisa ifomu eliyisisekelo lalokhu, futhi sibize umsebenzi ukuthumela i-imeyili yokuqinisekisa. Ngaphambi kokuthi senze lokhu, ake siqinisekise ukuthi sithunyelwa okokuqala, ngokungeza ucingo lomsebenzi ekubukeni kwerejista. Faka lo mugqa ngaphambi nje kokuqondisa kabusha ekubukeni kokurejista, ukubhaliswa kwe-def, kubasebenzisi / ukubukwa.Pha.

nano users/views.py

# ... (ngemuva) irejista (isicelo):
            send_verification_email(user)
# ... (Ngaphambi)) Ukuqondisa kabusha (
Awudingi ukwengeza imigqa yokuqala neyokugcina kulelo khodi snippet, vele uqiniseke ukuthi ukubukwa kokurejista kuthumela i-imeyili yokuqinisekisa kumsebenzisi. Kufanele kubukeke kanjena:

# ... amanani
from .forms import UserRegisterForm

def register(request):
    if request.method == “POST”:
        form = UserRegisterForm(request.POST)
        if form.is_valid():
            user = form.save()
            send_verification_email(user) # Qinisekisa ukwengeza lomugqa!
            messages.success(request, 'Welcome to the app, {}.'.format(user.username))
    return render(request, 'users/register.html', {'form': UserRegisterForm})
Manje, sizodinga ukwengeza ifomu lokuthumela kabusha i-imeyili yokuvula. Kubasebenzisi / amafomu.Spy, engeza ifomu elilandelayo:

# ... (amanani)
class ResendActivationEmailForm(forms.Form):
    email = forms.EmailField(required=True)
Sizodinga futhi ithempulethi ehambelana nale fomu yokusebenzisa kabusha i-imeyili. Masingeze le template. Hlela ifayela:

nano users/templates/users/resend_activation.html
Okulandelayo, engeza ikhodi elandelayo kufayela.

{% extends 'base.html' %}
{% block content %}
{% load crispy_forms_tags %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Resend activation email</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-secondary" type="submit">Resend activation email</button>
            </div>
        </form>
{% endblock %}
Whew, lokho kuningi! Manje, lapho sithumela ikhodi kwiseva yethu, sizokwazi ukuthumela i-imeyili ye-HTML futhi sisebenzise ama-akhawunti omsebenzisi ngokuchofoza ku-imeyili. Singase futhi sifune ukuthumela i-imeyili elula yokwemukela, ngakho-ke ake sibheke ukuthi ungakwenza kanjani lokho. Emuva kubasebenzisi / imeyili.Pha, engeza ikhodi elandelayo:

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)
Futhi, sizodinga ithempulethi ukunikeza lonke lolu lwazi. Kuwebhusayithi yami, ithempulethi ibukeka njengaphansi, kepha wamukelekile ukufometha noma ngabe uyathanda.
 
<html>
<body>
<h3>Welcome to {{ site_name }}</h3>
<p>Hello {{ username }},</p>
<p>We are happy to see you here! Thank you for joining {{ site_name }} and being a part of the fun. To get started, here are a few things you can do after you verify your identity.</p>
<ol>
    <li><a href="{{ base_url }}/" title="Use the app">Use the app</a>. This is the main page of {{ site_name }}</li>
    <li><a href="{{ base_url }}/feed/profile/Clementine/" title="See my profile">Visit my private {{ site_name }} profile</a>. This is a page for anyone wanting to get to know me.</li>
    <li><a href="{{ base_url }}/feed/profiles/" title="See all profiles currently on the site">More profiles</a>. You can find these people on the site, and see their content.</li>
    <li><a href="{{ base_url }}/feed/all/" title="See everything on {{ site_name }}">See all posts here</a>. This is the private front page of {{ site_name }}.</li>
</ol>
<p>There is even more on the site, so feel free to visit and see what you find. You can share the site with any of the social buttons on each page. I hope you enjoy your time with {{ site_name }}! Thanks for being here.</p>
<p>With much love,</p>
<p>{{ model_name }}</p>
<a href="{{ base_url }}" title="{{ site_name }}">{{ base_url }}</a>
 
Qaphela ukuthi asinawo umzimba wokuvala noma amathegi e-HTML, ngoba singeza lokhu lapho sifaka isixhumanisi sokuzikhipha ohlwini lwe-HTML. Lokhu kubalulekile, kepha asifuni ukuwachaza kabili. Ngakho-ke yini elandelayo? Size isikhathi eside. Ngempela, kufanele sikulungele ukuthumela isayithi kwiseva. Singangeza umhlobisi we- @login_required futhi senze ukubuka kwethu kuvikeleke, kuthathe ama-Sickpurs Abasebenzisi, thumela i-imeyili ethobekile, kanye nemininingwane yenqolobane, okuyisisekelo salokho iwebhusayithi okudingeka ukwenze ukuze uhlale ufanele. Sizongeza izici ezimbalwa eziwusizo, bese sakha isisekelo sokuthumela ikhodi yethu kwiseva ekude, ukusetha iseva yemeyili, ukucushwa kwesizinda, nokuhlunga ukwenza isiza sethu siphephe futhi kufanelekile. Sizodinga futhi ukubukwa kabusha kwephasiwedi, ngakho-ke ake singeze lokho kusheshe ngempela. U-Django owakhelwe ekubukeni kabusha kwephasiwedi uphukile kweminye imisebenzi, kepha sizobheka ukuthi singabhala kanjani umbono wethu, ithempulethi ye-imeyili, amafomu, namaphethini we-URL. Nakhu okubukeka sengathi ukubukwa okubukekayo, kubasebenzisi / ukubukwa.Py

# ... ukungenisa
from django.contrib.auth.tokens import default_token_generator
from django.contrib.auth.forms import SetPasswordForm
from django.utils.http import urlsafe_base64_decode

def password_reset(request, uidb64, token):
    user = get_object_or_404(User, id=urlsafe_base64_decode(uidb64))
    if request.method == 'POST':
        form = SetPasswordForm(user, request.POST)
        if form.is_valid() and default_token_generator.check_token(user, token):
            form.save()
            messages.success(request, 'Your password has been reset.')
        elif not form.is_valid():
            messages.warning(request, 'Your passwords do not match, or do not meet the requirements. Please try again.')
            return redirect(request.path)
        else:
            messages.warning(request, 'Your password reset link has expired. Please create a new one.')
        return redirect(reverse('users:login'))
    return render(request, 'users/password_reset_confirm.html', {
        'title': 'Reset your Password',
        'form': SetPasswordForm(user)
Leli fomu lakhiwa ku-Django, kepha sizodinga ithempulethi ukuqinisekisa ukusetha kabusha iphasiwedi, abasebenzisi / izifanekiso / abasebenzisi / Iphasiwedi_reset_conml.html
 
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Reset Password</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Reset Password</button>
            </div>
        </form>
{% endblock content %}
 
Siphinde sibe nethempulethi yokuthumela i-imeyili yokusetha kabusha iphasiwedi, ngefomu elilula, kubasebenzisi / izifanekiso / abasebenzisi / Iphasiwedi_Reset.html.html
 
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Reset Password</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Request Password Reset</button>
            </div>
        </form>
{% endblock content %}
 
Isifanekiso se-imeyili ngokwaso silula, iyifayela eliyisisekelo le-HTML elinikeza isixhumanisi sokusetha kabusha iphasiwedi, kubasebenzisi / izifanekiso / abasebenzisi / i-password_reset_email.html. I-Django izohumusha ngokuzenzakalelayo leli fayela.
 
<h1>Uglek - Reset Your Password</h1>
<p>Hello,</p>
<p>To reset your password, please <a href="https:/uglek.com{% url 'password_reset_confirm' uidb64=uid token=token %}">click here</a>.</p>
<p>Alternatively, you can paste the following link into your browser:</p>
<p>https://uglek.com{% url 'password_reset_confirm' uidb64=uid token=token %}</p>
<p>If you have not requested a password reset you can simply ignore this email.</p>
<p>Thanks for joining us,</p>
<p>Daisy</p>
 
Sizodinga futhi izifanekiso ezimbili eziningi. Owokuqala ukuqinisekisa ukuthi kuthunyelwe i-imeyili. Ukubukwa kwalokhu sekuvele ku-DJango, ngakho-ke sidinga nje ukubhekana nabo kuma-URL.Phy. Le template itholakala kubasebenzisi / izifanekiso / abasebenzisi / Iphasiwedi_reset_done.html
 
{% extends 'base.html' %}
{% block content %}
  <div class="media-body">
    <div class="alert alert-info">
        An email has been sent with instructions to reset your password.
    </div>
  </div>
{% endblock content %}
 
Futhi okokugcina, ukuqinisekisa ukuthi ukusetha kabusha kwephasiwedi kuqediwe, abasebenzisi / izifanekiso / abasebenzisi / Iphasiwedi_reset_complete.html
 
{% extends 'base.html' %}
{% block content %}
 <div class="media-body">
    <div class="alert alert-info">
        Your password has been set.
    </div>
    <a href="{% url 'users:login' %}">Sign In Here</a>
  </div>
{% endblock content %}
 
Manje, sidinga amaphethini we-URL wale mibono. Kubasebenzisi / ama-URLS.PY, engeza amaphethini alandelayo we-URL:

urlpatterns = [
    # ... ama-URL edlule lapha
    path('password-reset/',
         auth_views.PasswordResetView.as_view(
             template_name='users/password_reset.html',
             html_email_template_name='users/password_reset_html_email.html'
         ),
         name='password_reset'),
    path('password-reset/done/',
         auth_views.PasswordResetDoneView.as_view(
             template_name='users/password_reset_done.html'
         ),
         name='password_reset_done'),
    path('password-reset-confirm/<uidb64>/<token>/',
         auth_views.PasswordResetConfirmView.as_view(
             template_name='users/password_reset_confirm.html'
         ),
         name='password_reset_confirm'),
    path('password-reset-complete/',
         auth_views.PasswordResetCompleteView.as_view(
             template_name='users/password_reset_complete.html'
         ),
         name='password_reset_complete'),
]
Izibonisi ezine, lokho okuningi! Kepha manje singaqiniseka ukuthi sikwazi ukusetha kabusha iphasiwedi yomsebenzisi nganoma yisiphi isikhathi lapho sidinga khona, konke kusuka kusiphequluli seWebhu. Ngiyaqonda ukuthi le yikhodi eningi. Uma kubonakala kuncane ngaphezulu kwekhanda lakho, kulungile. Uzothuthuka, ukuqonda kwakho kuzothuthuka, futhi uzoba nekhono ngokwengeziwe ngeKhodi kungekudala. Uma ulahleka ngokuphelele, ngincoma ukubuyela kule software ngokuhamba kwesikhathi ngemuva kokusebenza ngokuzikhethela kokufunda okufundwayo ku-Code Course online. Lokhu kuvame ukukhululekile ukuqala, futhi kuzokuqondisa kukho konke okudingayo ukuze uphumelele lapho ubuyela kulo msebenzi. Uma uzizwa sengathi usukulungele ukuqhubeka, ukufundwa, okulandelayo, sizomboza ukuthumela ikhodi yakho kwiseva ekude futhi sisetha iseva yemeyili, kanye nokuzenzakalelayo kanye nokuthumela ngezenzeli zakho usebenzisa i-bash ukuze uhlale usetha iphrojekthi entsha Imiyalo embalwa elula. Into yokugcina esidinga ukuyenza ngaphambi kokuthumela kwiseva ekude yenza indawo yethu iphephe kancane. UzokwaziQaphela ukuthi ukubukwa kokungena ngemvume kuthatha kuphela igama lomsebenzisi nephasiwedi, futhi akukho ukuqinisekiswa kwe-multi poctor noma ikhodi yesikhathi esisodwa. Lokhu kulungiswa okulula, futhi ngekhodi efanayo, singenza isayithi lethu lithumele imiyalezo futhi liphendule imiyalezo ethunyelwe kwiseva. Ukuze uqale, sizobuyela emuva kumamodeli omsebenzisi bese wengeza isibonakaliso sesikhathi esizomela ukungena ngemvume ngakunye. Sizophinde sengeze isikhombi esiyingqayizivele, esijikelezayo kwimodeli yomsebenzisi ezosetshenziselwa ukwengeza ukuphepha okwengeziwe ekungeneni kwethu. Ukuhlela amamodeli omsebenzisi, abasebenzisi / amamodeli.Spy, engeza okulandelayo

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
# Qiniseka ukuthi ungenisa i-UUID, isibonakaliso se-Timestamp ne-URL Generator (Reverse)
import uuid
from django.core.signing import TimestampSigner, BadSignature, SignatureExpired
from django.urls import reverse

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
    account_created = models.DateTimeField(default=timezone.now)
    last_seen = models.DateTimeField(default=timezone.now)
    can_login = models.DateTimeField(default=timezone.now)
    preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
    bio = models.TextField(blank=True, default='')
    # Faka le khodi lapha
    uid = models.CharField(max_length=32, default=uuid.uuid4, null=True, blank=True)
    mfa_enabled = models.BooleanField(default=False)
    enable_mfa = models.BooleanField(default=False)
    phone_number = models.CharField(default='', null=True, blank=True, max_length=15)
    verification_code = models.CharField(default='', null=True, blank=True, max_length=15)
    verification_code_length = models.IntegerField(default=6)
    mfa_code_expires = models.DateTimeField(default=timezone.now)
    mfa_attempts = models.IntegerField(default=0)

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

    # Bese wengeza lo msebenzi
    def create_auth_url(self):
        username, token = self.make_auth_token().split(":", 1)
        return reverse('users:mfa', kwargs={'username': username, 'token': token,})

    def check_auth_token(self, token):
        try:
            key = '%s:%s' % (self.uid, token)
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Ivumelekile ngamaminithi ama-3
        except (BadSignature, SignatureExpired):
            return False
        return True
Qiniseka ukuthi abasebenzisi bakho / amamodeli.Spy ubukeka kanjena, ngaphandle kwamazwana (ikhodi emigqeni nge #). Ukuphula lokhu phansi, kulula. Sinokungenisa okumbalwa, i-Timestampsigner okuyinto eyinkohliso ye-cryptographic engakhiqiza ikhodi ephephile futhi ayiqinisekise ukuze uqiniseke ukuthi uvumelekile, futhi hhayi ngaphezulu kwenombolo ethile yemizuzwana. Siphinde sisebenzise i-UUID, okuyisikhombi esiyingqayizivele esikhomba umsebenzisi wethu ekusayineni koPhawu, futhi ku-URL lapho ithokheni ithunyelwa khona kumsebenzisi. Sizosebenzisa le hlaka lwe-cryptography eyisisekelo ukwakha umbono wokuqinisekiswa kokuqinisekiswa kwezici ezimbili. Ngaphambi kokuthi senze noma yini enye, ake siqhubekele ukufuduka ukuze amamodeli ethu omsebenzisi avuselelwa. Kukhombandlela nge-Phatha.Py, gijimisa imiyalo elandelayo ukwenza futhi uqedele ukuthutha.

source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Lokhu kubalulekile ngoba ngaso sonke isikhathi lapho senza izinguquko kumamodeli, sizodinga ukudala amatafula futhi sivuselele imininingwane ngezinto ezizenzakalelayo ngaphambi kokuthi sisebenzise amamodeli. Empeleni singasebenzisa amamodeli. Okulandelayo, ake sithuthukise umbono wethu wokungena ukuze uqondise kabusha ekubukeni kobuqiniso kwesibili. Kubasebenzisi / ukubukwa.py.py, susa umsebenzi wokungena ngemvume bese uqondisa kabusha kwi-URL esisanda kukhiqizwa kumamodeli omsebenzisi.

# ... amanani

def login(request):
    if request.method == “POST”:
        username = request.POST['username']
        password = request.POST['password']
        user = authenticate(username=username, password=password)
        if user and user.profile.can_login < timezone.now(): # Qaphela ukuthi manje sihlola ukuthi umsebenzisi angangena yini
            # Susa umsebenzi we-Author_login owawulapha
            messages.success(request, 'Your password was accepted. Please continue.')
            if user.profile.mfa_enabled:
                return redirect(user.profile.create_auth_url()) # QAPHELA SIBONISA I-URL entsha lapha
            else: # Uma umsebenzisi engasebenzisi ubuqiniso be-multi-factor, vele ungene kuwo.
                auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
                return redirect('feed:feed')
        else: # Uma ukungena ngemvume kungaphumeleli,
            messages.warning(request, 'Username or password incorrect. Please try again.')
            user = User.objects.filter(username=username).first() # Le yingxenye lapho sibuyekeza khona iphrofayili yabasebenzisi
            if user: 
                profile = user.profile
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Ngakho-ke abakwazi ukungena ngemvume ngemizuzwana embalwa
                profile.save()
    return render(request, 'users/login.html', {'form': AuthenticationForm()})
Ngakho-ke lokhu kulula, manje sinendlela yokuqondisa kabusha ukubukwa kokuqinisekiswa kokuqinisekiswa kwezici ezimbili lapho sakha. Siphinde sibe ne-fallback uma kwenzeka umsebenzisi engangezi inombolo yocingo. Sizokwengeza umbono oyisisekelo ukwengeza inombolo yocingo kungekudala futhi ungene ngemvume ngombhalo maduze. Okokuqala, sidinga indlela elula yokuthumela umyalezo ovela kwikhodi yethu. Ukuze senze lokhu, singakhetha kusuka kunombolo yama-API, kepha okulula ngombono wami nguTwilio. Baphinde banikeze amanani amahle amaphrojekthi amancane, kanye nezaphulelo eziningi. Dala i-akhawunti ku-wilio.com, gcwalisa imininingwane ethile ngephrojekthi yakho, uthenge inombolo yocingo, bese ukopisha okhiye bakho be-API kuzilungiselelo zakho.Pha. Ngemuva kwalokho, engeza le khodi ngaphansi kwefayela elisha, abasebenzisi / i-SMS.PY.

nano users/sms.py

# Ngenisa wonke amaphakheji adingekayo
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
import traceback

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

# Le khodi ithumela umbhalo nge-Twilio
def send_text(target_phone, text):
    from twilio.rest import Client
    try:
        client = Client(account_sid, auth_token)
        if len(target_phone) >= 11:
            message = client.messages.create(
                to=target_phone,
                from_=source_phone,
                body=text)
    except:
        print(traceback.format_exc())

# Umsebenzi wokusiza ukuthola inombolo ngamadijithi amaningi kangaka
def get_num_length(num, length):
    n = ''
    for x in range(length):
        n = n + str(num)
    return int(n)

# Thumela umbhalo ukuze uqinisekise umsebenzisi
def send_verification_text(user):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    user.profile.verification_code = code
    user.profile.mfa_code_expires = timezone.now() + datetime.timedelta(minutes=3)
    user.profile.save()
    send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))

# Thumela umsebenzisi noma yimuphi umbhalo ngalo msebenzi
def send_user_text(user, text):
    send_text(user.profile.phone_number, text)

# Qinisekisa ikhodi ngalo msebenzi
def check_verification_code(user, code):
    user.profile.mfa_attempts += 1
    result = user.profile.verification_code != None and code != '' and user.profile.verification_code == code and user.profile.mfa_code_expires > timezone.now() and user.profile.mfa_attempts <= 3
    if user.profile.mfa_attempts < 3 and result:
        user.profile.verification_code_length = 6
    elif user.profile.mfa_attempts > 2 and not result:
        user.profile.verification_code_length = 8
    user.profile.save()
    return result

# Qinisekisa isikhathi
def check_verification_time(user):
    result = user.profile.mfa_code_expires > timezone.now()
    return result
Qiniseka ukuthi ushintsha izilungiselelo zakho ngokufanele, ungeza le migqa ngezinkinobho zakho:

# Qiniseka ukuthi ukukopisha lokhu kusuka ku-Twilio Dashboard yakho
TWILIO_ACCOUNT_SID = “<your sid>”
TWILIO_AUTH_TOKEN = “<your token>”
PHONE_NUMBER = “<your twilio phone number>”
SITE_NAME = “<Your site name>”
AUTH_VALID_MINUTES = 3 # Inani lemizuzu yekhasi le-TFA lisebenza ngokushesha
Okokuqala, sizodinga amafomu emibono yethu yokufakazela ubuqiniso emibili. Ukuhlela Abasebenzisi / Amafomu.Spy, engeza ikhodi elandelayo.

# ... amanani
from django import forms

# Ifomu lokufaka inombolo yethu yocingo
class PhoneNumberForm(forms.Form):
    phone_number = forms.RegexField(regex=r'^\+?1?\d{9,15}$', error_messages = {'invalid': "Phone number must be entered in the format: '+999999999'. Up to 15 digits is allowed."})
    def __init__(self, *args, **kwargs):
        super(PhoneNumberForm, self).__init__(*args, **kwargs)
        self.fields['phone_number'].label = phone_number_label

# Ifomu lokuqinisekisa
class TfaForm(forms.Form):
    code = forms.IntegerField(required=False)
    def __init__(self, *args, **kwargs):
        super(TfaForm, self).__init__(*args, **kwargs)
        self.fields['code'].widget.attrs.update({'autocomplete': 'off'})
    help_texts = {
        'code': 'Please enter the six digit code after sending it to your phone with the button above.'
    }
Okulandelayo, ake sakhe ukubukwa kubasebenzisi / ukubukwa.py

# ... amanani
from django.http import HttpResponseRedirect
from .forms import PhoneNumberForm, TfaForm

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

@login_required
def mfa_onboarding(request):
    if request.method == 'POST':
        form = PhoneNumberForm(request.POST)
        request.user.profile.phone_number = form.data['phone_number'].replace('-', '').replace('(','').replace(')','')
        request.user.profile.mfa_enabled = True
        request.user.profile.enable_two_factor_authentication = True
        request.user.profile.save()
        messages.success(request, 'You have added a phone number to your account.')
        user = request.user
        return redirect(user.profile.create_auth_url())
    form = PhoneNumberForm(initial={'phone_number': request.user.profile.phone_number if request.user.profile.phone_number else '+1'})
    return render(request, 'users/mfa_onboarding.html', {'title': 'Enter your phone number', 'form': form, 'small': True})
Sizodinga futhi izifanekiso zazo zombili lezi zibuke. Masingeze ithempulethi ye-MFA kuqala.

nano users/templates/users/mfa.html
Faka le khodi ye-HTML kwisifanekiso
 
{% extends 'base.html' %}
{% block content %}
{% load app_filters %}
{% load crispy_forms_tags %}
        <form action="{{ request.path }}{% if request.GET.next %}?next={{ request.GET.next }}{% endif %}" method="POST">
            {% csrf_token %}
            <legend class="border-bottom mb-4">Enter Verification Code</legend>
            <p>Step 1: Send the code</p>
	    <i>Never share your code with anyone, as it can be used to access your account temporarily.</i>
	    <div class="form-group">
                <button class="btn btn-outline-primary" type="submit">Send code</button>
            </div>
	    <hr>
	    <p>Step 2: Enter the code</p>
            <fieldset class="form-group">
                {{ form|crispy }}
		<p>Press the enter button to send yourself the code at {{ user.profile.phone_number|securephone }}. Then, enter the code and press enter.</p>
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-secondary" type="submit">Enter code</button>
            </div>
        </form>
{% endblock %}
 
Lokhu kuhle kakhulu. Ifomu lithumela ikhodi noma ikhodi engenalutho, futhi uzokwazi ukubona umbono esithumela ikhodi uma sithola ikhodi engenalutho. Ngemuva kwalokho siba nezinkinobho ezimbili nje, futhi ngale ndlela singathumela ikhodi ngenkinobho noma iyiphi inkinobho. Okulandelayo, sizongeza ifomu elilula ukwengeza inombolo yocingo.

nano users/templates/users/mfa_onboarding.html
Faka i-HTML elandelayo:
 
{% extends 'base.html' %}
{% block content %}
{% load crispy_forms_tags %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Set Up Two Factor Authentication</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-secondary" type="submit">Add phone number</button>
            </div>
        </form>
{% endblock %}
 
Leli fomu lilula kakhulu, limane nje linikeze ifomu lenombolo yocingo esidala futhi livumela umsebenzisi engeza inombolo yocingo. Lokhu kubukeka kukuhle impela! Uma nje konke kusethwe kahle, kufanele sikwazi ukuthumela imiyalezo, futhi singene umsebenzisi ngenombolo yabo yocingo ngokushesha nje lapho sengeza amaphethini we-URL. Into yokugcina esiyidingayo ukusetha ukubonwa kwephrofayili ukuze siqiniseke ukuthi umsebenzisi angashintsha inombolo yakhe yocingo ngaphandle kokungena ngemvume. Futhi, ekugcineni umsebenzisi angathumela umbhalo "Misa" ukuphuma emibhalweni yombhalo esizayo. Masingeze umbono wephrofayili kubasebenzisi / ukubukwa.Py.py. Lo mbono uzovuselela i-bio yomsebenzisi, i-imeyili, igama lomsebenzisi, nenombolo yocingo, kanye nokusivumela ukunika amandla ukuqinisekiswa kwe-multi poctor. Okokuqala, sizodinga amanye amafomu amabili kubasebenzisi / amafomu.Spy

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

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

class ProfileUpdateForm(forms.ModelForm):
    subscribed = forms.BooleanField(required=False)
    phone_number = forms.CharField(required=False)
    def __init__(self, *args, **kwargs):
        super(ProfileUpdateForm, self).__init__(*args, **kwargs)
    class Meta:
        model = Profile
        fields = ['bio', 'phone_number', 'enable_mfa', 'subscribed']
Okulandelayo, singakha umbono ukuze sisebenzise womabili la mafomu. Hlela abasebenzisi / ukubukwa.Po bese ungeze ngokubuka.

# Faka lokhu okungeniswa
from .forms import UserUpdateForm, ProfileUpdateForm
from django.views.decorators.cache import never_cache
from django.views.decorators.csrf import csrf_exempt
from .models import Profile
from .mfa import send_user_text

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

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

{% endblock content %}
{% block javascript %}
var form = document.getElementById('profile-form');
$('input').change(function(){
	var formdata = new FormData(form);
	$.ajax({
		url: window.location.href,
		type: "POST",
		data: formdata,
		processData: false,
		contentType: false,
		timeout: 1000 * 60,
                success: function(data) {
                  $(posted).removeClass("hide");
		  setTimeout(function() {
			$(posted).addClass("fade-hidden");
			setTimeout(function() {
				$(posted).addClass("hide");
				$(posted).removeClass("fade-hidden");
			}, 2000);
		  }, 2000);
                }
	});
});
{% endblock %}
 
Uzobona ukuthi le yifomu elilula, kepha line-JavaScript kuyo elithumela ngokuzenzakalelayo okuqukethwe kwefomu njengoba kuvuselelwa. Lokhu kuyasiza ukuba nakho, ngakho-ke uyakwazi ukwenza ukuhlela ngaphandle kokuthi ucindezele ukuhambisa ngaso sonke isikhathi. Okulandelayo, sidinga ama-URL amele yonke le mibono kubasebenzisi be-URL ama-patterters. Hlela abasebenzisi / ama-URLS.PY bese wengeza le khodi:

# ... Ikhodi yangaphambilini, Ukungenisa ngaphakathi
from django.urls import path
from . import views

app_name='users'

urlpatterns = [
# ... amaphethini we-URL esiwafake phambilini, engeza imigqa emithathu elandelayo
    path('mfa/<str:username>/<str:token>/', views.mfa, name='mfa'),
    path('mfa/onboarding/', views.mfa_onboarding, name='mfa_onboarding'),
    path('profile/', views.profile, name='profile'),
]
Manje yisikhathi esihle sokuhlola iphrojekthi yethu. Kepha okokuqala, ake sisebenzise enye isipele.

backup
Bese usebenzisa iseva. Ngaphambi kokuthi sithumele kuseva ye-Linux, kuwumqondo omuhle ukunika amandla ukuqinisekiswa kwezici ezimbili kwi-akhawunti. Sizokwenza lokhu ngokuya kwi-URL yethu yephrofayili, / abasebenzisi / iphrofayili / ukubheka ibhokisi ukunika amandla ukuqinisekiswa ngemuva kokufaka inombolo yethu yocingo, bese kuthumela ifomu.

python manage.py runserver localhost:8000
Vakashela ekhasini le-web ngokuya kwisiphequluli sakho seWebhu, ngisebenzisa i-Google Chrome kulesi sibonelo, bese ngifaka i-URL HTTPS: // I-Localhost: 8000 / Ama-Akhawunti / Iphrofayili / Uzokwazi ukungena ngemvume uma kunesidingo futhi unika amandla ukuqinisekiswa kwezici ezimbili. Le phrojekthi idinga iseva ukuze isebenze ukuze ikwazi ukuthumela ngempela imeyili. Kepha okokuqala, sidinga indlela yokubona amaphutha. Uzobona ukuthi uma usebenzisa iseva kwimodi ye-debug, ngezilungiselelo.deBug zilingana neqiniso, iseva ikhombisa amaphutha ngokuzenzakalelayo. Ukukhombisa amaphutha ngaphandle kokusebenzisa imodi yokulungisa iphutha, okungaphephile kwiseva yokukhiqiza, kufanele sengeze umbono ngakho. Amaphutha abaluleke kakhulu esidinga ukukwazi ukuphatha yile: Iphutha 500 - Inkinga ngekhodi yethu Iphutha 404 - Ikhasi elingatholakali (i-URL ephukile) Iphutha 403 - Imvume yenqatshelwe iphutha Masingeze uhlelo lokusebenza olusha ukuphatha la maphutha, okuthiwa amaphutha.

python manage.py startapp errors
Faka lokhu kuzilungiselelo.Phy njengoba senze ngaphambili, ekuhlelweni kwe-_apps, bese uqala ngokungeza izinkomba kokubukwa okuthile kuhlelo lokusebenza / ama-URL.Phy, lapho uhlelo lokusebenza lungu-App wephrojekthi yakho ye-DJango.

handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Lokhu konke esikudingayo ngaphandle kokubukwa kwephutha, izifanekiso kanye nokuncane kwe-Middleware. Masichaze lezo njengoba kunjalo:

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

# Dala ukubukwa kwakho lapha.
@login_required
@user_passes_test(is_superuser_or_vendor)
def logs(request):
    logs = highlight_code(get_logs())
    return render(request, 'errors/live_error.html', {'title': 'Error Logs', 'pagetitle': 'Error Logs', 'notes': 'These are the recent error logs.', 'trace': logs, 'full': True})

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

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

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

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

def handler400(request, exception):
    return render(request, 'errors/error.html', {'title': 'Error 400', 'pagetitle': 'Error 400', 'notes': 'This was a bad request.'})
Okulandelayo, ake sichaze i-Middleware ukuphatha la maphutha. Sizokwenza lokhu ngokungeza kuqala ku-Middleware_Classes kuzilungiselelo.Phy, negama le-Middleware yethu.

MIDDLEWARE_CLASSES = [
    # ... Middleware edlule
    'errors.middleware.ExceptionVerboseMiddleware,
]
Okulandelayo, ake sengeze i-Middleware.

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.')
Sifaka umsebenzi ukuthola okuhlukile kwamanje ngokusebenzisa i-Threating Local, esisiza ukulandelela noma yimaphi amaphutha kwikhodi yethu. Ngokuya kwezifanekiso, sidinga eyodwa kuphela, ngoba sichaza ngamandla isihloko lapho kubukwa. Isifanekiso sidinga nje ukunikela ngesihloko kanye ne- "Landerati", iphutha lethu lilandela kumongo.

nano errors/templates/errors/error.html
 
{% extends 'base.html' %}
{% block content %}
<h1>{{ pagetitle }}</h1>
<p>{{ trace }}</p>
{% endblock %}
 
Lesi yithempulethi yethu elula kunazo zonke okwamanje, kepha yindlela elula ngayo ukubona amaphutha kuphrojekthi yethu. Okulandelayo, ake sikhubaze ukulungisa iphutha kuzilungiselelo.

nano app/settings.py
Thola lomugqa lapho isethwe khona kuyiqiniso, bese uyishintsha ibe ngamanga

DEBUG = False
Qhubeka futhi wenze isipele uhlelo lokusebenza manje. Silungele ukuphamba kwiseva ye-Linux ekude, futhi sigcine ukungeza izici kusuka lapho.

sudo backup
Ngaphambi kokuthi sibhale le khodi kwiseva, kufanele sicabange ukuthi kungenzeka kube nezinkinga ezithile ngekhodi. Ngokuya ngecala, amasayithi amukela imininingwane ethunyelwe kuwo azoba nezinkinga ezinogaxekile othunyelwa kanye nobunzima bokususa ogaxekile. Lokhu akufanele kwenzeke ngokushesha, kepha uma kwenzeka, ngokuhamba kwesikhathi sizohlola ukuthi singakwazi kanjani ukulinganisela kogaxekile esizeni futhi sikwenze kube nzima ukuthola amarobhothi ukufinyelela indawo, kanye nendlela yokusebenzisa ubunikazi bomsebenzisi. ukuskena kwe-id yabo noma i-scan ye-biometric, njengokuthola iminwe noma ukwamukelwa kobuso. Uma ubheka isibonelo sokuqinisekiswa kwe-Multi Peotor esikuhlolile, ekukhiqizeni, izinto zingahluka. Phawula ukuthi silinganisela kanjani ama-logins wokungena, futhi amathokheni aphelelwe yisikhathi. Uma amarobhothi efinyelela kwisiza, ukuqinisekiswa kwezici ezimbili kungahle kube nzima njengoba kungafaka amakhodi ngasikhathi sinye umsebenzisi. Ukulwa nalokhu, ake sisebenzise imodeli kumamodeli omsebenzisi, ememezela ukuthi sixhumana kanjani nesiza lapho sikhonaUkuqinisekisisa ukusebenzisa ukuqinisekiswa kwe-multi poctor ngenombolo yocingo. Sizophinde sengeze inketho yokuqinisekisa nge-imeyili. Qala ngokuhlela amamodeli wabasebenzisi nge

nano users/models.py
Lokhu yilokho imodeli esikufakayo kufanele ibukeke. Asidingi zindlela, okuguquguqukayo kuphela ukugcina i-ID, umsebenzisi, isikhathi, ukuphelelwa yisikhathi, ubude nemizamo yokulwa nokuqinisekiswa kwe-multi poctor (ikhodi efana ne-123456 ithunyelwe ocingweni noma nge-imeyili).

# Ithokheni eyisisekelo esetshenziselwa ukungena kuwebhusayithi
class MFAToken(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='mfa_tokens')
    timestamp = models.DateTimeField(default=timezone.now)
    expires = models.DateTimeField(default=timezone.now)
    token = models.CharField(default='', max_length=100)
    length = models.IntegerField(default=6)
    attempts = models.IntegerField(default=0)
    uid = models.CharField(default=uuid.uuid4, max_length=100)
Masingeze futhi ilungelo lomsebenzisi wethu, futhi sizosetha ngesandla manje, ngaphambi kokuphela kokufuduka ukuze sibhalise abasebenzisi abanelungelo ngokuzenzakalelayo. Kumamodeli womsebenzisi, engeza lomugqa kuphrofayela:

    vendor = models.BooleanField(default=False)
Njenganoma iziphi izinguquko ku-database, kudingeka senze izinto zokufuduka futhi sihambisa database nganoma yisiphi isikhathi lapho sihlela amamodeli.Spy Ifayela eDjango. Khumbula, ukwenza lokhu esisebenzisa kuqala umthombo

cd project-directory-you-named # (uma kudingeka)
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Okwamanje, ungafaka noma imaphi ama-akhawunti owadalile njengabathengisi ngokusebenzisa igobolondo.

python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Manje, ake siguqule umbono wethu wokuqinisekiswa kwe-Multi Poind Moder ukusebenzisa lolu phawu. Okokuqala, kudingeka siguqule izinsiza zosizo lwe-MFA. Usebenzisa i-nano,

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

# Qinisekisa umsebenzisi usebenzisa i-imeyili noma inombolo yocingo
def mfa(request, username, usertoken):
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Hlunga ithokheni ngenani elidluliselwe ku-URL (a UUID)
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Uma lesi seshini singadalwanga, dala
    user = User.objects.filter(id=token.user.id).first() # Thola umsebenzisi kusuka kuthokheni
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Uma sezivele zigunyaziwe, zingene kuzo
    if not user: raise PermissionDenied() # Uphike uma kungekho msebenzisi otholakele
    next = request.GET.get('next','')
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Bheka ithokheni eli-Author
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Ngena ngemvume umsebenzisi uma nje bengangenile ngemvume
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Setha ukuphela kokuqinisekiswa kwabo okuyiqiniso
        user.profile.save()
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Phinda uqondise umsebenzisi ekhasini elilandelayo
    if not user.profile.mfa_enabled: # Bheka ukuthi i-MFA inikwe amandla
        if not check_verification_time(user, token): # Bheka isikhathi
            user.profile.mfa_enabled = False # Sula inombolo yocingo
            user.profile.enable_two_factor_authentication = True # Nika amandla i-MFA
            user.profile.phone_number = '+1' # Khubaza inombolo yocingo
            user.profile.save() # Gcina iphrofayili
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Ngena umsebenzisi uma i-MFA yabo ingavunyelwe
            messages.warning(request, 'Please enter a valid phone number and verify it with a code.')
            return redirect(reverse('users:mfa_onboarding'))
    if request.method == 'POST' and not fraud_detect(request, True): # Uma isicelo siyisicelo seposi
        form = TfaForm(request.POST) # Faka ifomu
        code = str(form.data.get('code', None)) # Thola ikhodi
        if code and code != '' and code != None: # Qiniseka ukuthi akunalutho
            token_validated = user.profile.check_auth_token(usertoken) # Bheka ithokheni eli-Author
            p = user.profile
            is_verified = check_verification_code(user, token, code) # Bheka ikhodi
            p.mfa_authenticated = is_verified
            if token_validated: # Uma konke
                if is_verified: # Ihlelekile
                    user.profile.mfa_enabled = True # Nika amandla i-MFA (uma ingekho vele inikwe amandla)
                    user.profile.save()
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Ngena ngemvume umsebenzisi
                    face = user.faces.filter(session_key=None).last() 
                    p.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES)
                    p.save()
                    messages.success(request, 'You have been authenticated. Welcome.')
                    qs = '?'
                    for key, value in request.GET.items(): # Yakha i-BullString yepharamitha elandelayo (uma ikhona)
                        qs = qs + key + '=' + value + '&'
                    if next != '' and not (next.startswith('/accounts/logout/') or  next.startswith('/accounts/login/') or next.startswith('/admin/login/') or next.startswith('/accounts/register/')):
                        return HttpResponseRedirect(next) # Qondisa kabusha
                    elif next.startswith('/accounts/logout/') or next.startswith('/accounts/login/') or next.startswith('/accounts/register/'):
                        return redirect(reverse('/'))
                    elif request.META.get('HTTP_REFERER', '/').startswith('/accounts/login/'):
                        return redirect(reverse('/'))
                    elif not next:
                        return redirect(reverse('/'))
                    else:
                        return HttpResponseRedirect(reverse('verify:age') + '?next=' + request.META.get('HTTP_REFERER', '/'))
                else:
                    messages.warning(request, 'The code you entered was not recognized. Please try again.')
            elif not token_validated: # Uma ithokheni ibingalungile
                messages.warning(request, 'The URL token has expired or was not recognized. Please try again.')
                logout(request)
                return redirect(reverse('users:login'))
            if p.mfa_attempts > 3: # Ukube bekunemizamo eminingi kakhulu
                messages.warning(request, 'You have entered the incorrect code more than 3 times. please send yourself a new code.')
                p.verification_code = None
                p.save()
        elif user.profile.can_send_mfa < timezone.now():
            user.profile.mfa_attempts = 0
            user.profile.can_send_mfa = timezone.now() + datetime.timedelta(minutes=2)
            user.profile.save()
            if form.data.get('send_email', False): # Thumela i-imeyili (noma umbhalo)
                send_mfa_verification_email(user, token)
            else:
                send_verification_text(user, token)
            messages.success(request, "Please enter the code sent to your phone number or email. The code will expire in 3 minutes.")
        elif user.profile.can_send_mfa < timezone.now() + datetime.timedelta(seconds=115):
            messages.warning(request, 'You are sending too many two factor authentication codes. Wait a few minutes before sending another code.')
    form = TfaForm()
    hide_logo = None
    if user.profile.hide_logo:
        hide_logo = True
    if request.user.is_authenticated: return redirect(reverse('/'))
    # Nikeza ifomu (ukuthola izicelo)
    return render(request, 'users/mfa.html', {'title': 'Enter Code', 'form': form, 'xsmall': True, 'user': user, 'hide_logo': hide_logo, 'accl_logout': user.profile.shake_to_logout, 'preload': False, 'autofocus': request.method == 'POST'})
Lapho sengeza kule khodi, qiniseka ukuthi ukungenisa umsebenzi ukuthumela i-imeyili. Phezulu kwefayela, ukubukwa komsebenzisi (nabanye okungeniswayo), engeza

from .mfa import send_verification_email as send_mfa_verification_email
Manje, kudingeka sibhale lowo msebenzi ngaphambi kokuba noma yini yalokhu izosebenza. Kufanele kunwebe umsebenzi wethu we-imeyili Thumela, futhi umane uthumele i-imeyili kumsebenzisi ngekhodi yokuqinisekisa.

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))
Ngakho-ke konke lokhu kusebenza kakhulu, manje sesinohlelo lokuqinisekisa lobuqiniso obuningi kuncike inombolo yocingo noma i-imeyili ukungena ngemvume. Kepha futhi sidinga indlela yokususa, noma okungenani abasebenzisi abangasebenzisana nakathu. Lezi zingaba yi-spammers, amarobhothi noma noma ngubani ongasho kahle umsebenzi wethu. Bheka umbono enginawo wokuqapha abasebenzisi kwiwebhusayithi yami:

# amanani
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import user_passes_test
from .tests import is_superuser_or_vendor # Sizodinga ukudala lolu vivinyo

@login_required
@user_passes_test(is_superuser_or_vendor)
def users(request):
    # Thola uhlu lwabasebenzisi
    new_today = User.objects.filter(is_active=True, date_joined__gte=timezone.now() - datetime.timedelta(hours=24)).count()
    new_this_month = User.objects.filter(is_active=True, date_joined__gte=timezone.now() - datetime.timedelta(hours=24*30)).count()
    subscribers = User.objects.filter(is_active=True, profile__subscribed=True).count()
    return render(request, 'users/users.html', { # Buyisela Abasebenzisi ku-template
        'title': 'All Accounts',
        'users': User.objects.all(),
        'new_today': new_today,
        'new_this_month': new_this_month,
        'subscribers': subscribers
    })
Qaphela ukuthi le khodi isebenzisa isivivinyo, sizodinga ukumemezela lolu vivinyo ku-Test.py Ifayela futhi liyithumele. Ukuhlela Abasebenzisi / Ukuhlola.Phy, ake sakhe isivivinyo.

def is_superuser_or_vendor(user):
    return user.profile.vendor or user.is_superuser
Lokhu kuhlangana nabasebenzisi / abasebenzisi.html ithempulethi, ebukeka into enje:
 
{% extends 'base.html' %}
{% load app_filters %}
{% block content %}
<h1>All Registered Visitors</h1>
<p>{{ new_today|nts|capitalize }} new today, {{ new_this_month|nts }} new this month, {{ subscribers|nts }} subscribers, {{ users.count|nts }} total.</p>
<hr style="color: red;">
{% for user in users %}
{% include 'users/_user.html' %}
<hr style="color: blue;">
{% endfor %}
{% endblock %}
 
Qaphela ukuthi ithempulethi ifaka enye ithempulethi, abasebenzisi / _user.html. Lapho usebenzisa ithempulethi ene-subtemplate futhi ungasebenzisi ukunwebeka, umbono omuhle ukufaka i-underscore (_) ngaphambi kokuba igama lefayela linwebe, ukuze lihlukanise izifanekiso. Qaphela ukuthi lokhu kuningi kweJinja, kungenzeka ukuthi awunawo wonke lawa ma-eguquguqukayo achazwe. Kepha yilokhu okushiwo yikhodi yami.
 
{% load app_filters %}
<div>
<img src="{{ user.profile.get_image_url }}" alt="@{{ user.profile.name }}'s profile photo" width="120" height="120" align="left" style="margin-top:5px; margin-right:10px; margin-bottom:10px; border-radius: 50%;"/>
    <div class="article-metadata">
      <p class="mr-2">@{{ user.username }} - {{ user.profile.name }} ({{ user.profile.preferred_name }})</p>
      <small class="text-muted">Last seen {{ user.profile.last_seen|date:"F d, Y" }} {{ user.profile.last_seen|time:"H:i" }}</small>
      <small class="text-muted">Joined on {{ user.profile.date_joined|date:"F d, Y" }} {{ user.profile.date_joined|time:"H:i" }}</small>
      <small>{{ user.email }}</small>
      {% if user.profile.phone_number %}<small><i class="bi bi-phone-fill"></i>{{ user.profile.phone_number }}</small>{% endif %}
      {% if user.verifications.last %}
      <small>'{{ user.verifications.last.full_name }}'</small>
      <small><i class="bi bi-123"></i> {{ user.verifications.last.document_number }}</small>
      <small><i class="bi bi-calendar-heart-fill"></i> {{ user.verifications.last.birthdate }}</small>
      <a href="{{ user|document_front }}" class="btn btn-sm btn-outline-primary" title="ID front"><i class="bi bi-person-badge-fill"></i> ID front</a>
      <a href="{{ user|document_back }}" class="btn btn-sm btn-outline-primary" title="ID back"><i class="bi bi-upc-scan"></i> ID back</a>
      {% endif %}
      <small># {{User.id}} </ omncane>
      <small>{% if user.profile.subscribed %}Subscribed{% else %}Not subscribed{% endif %}</small>
    </div>
    {%if not user.is_superuser %}
    <div style="float: right;">{% include 'users/toggle_active.html' %}</div>
    {% endif %}
    {% autoescape off %}    
    <p class="article-content">{{ user.bio }}</p>
    {% endautoescape %}
    <hr>
    <p>{% if user.profile.identity_verified %}Verified user.{% else %}Unverified user.{% endif %} Verifications: {{ user.verifications.count|nts }}</p>
 
Siphinde sidinge enye engezansi, thobela_acce.html. Le template kufanele ibe yifomu elisivumela ukuthi siguqukele ukuthi ngabe umsebenzisi uyasebenza yini.
 
<form style="display: inline-block;" action="{% url 'users:toggle-user-active' user.id %}" method="POST" id="publishForm">
<button class="btn btn-sm btn-outline-danger" type="submit">{% if user.is_active %}<i class="bi bi-eye-fill"></i>{% else %}<i class="bi bi-eye-slash-fill"></i>{% endif %}</button>
</form>
 
Sizodinga futhi ukwengeza umbono wokuguqula umsebenzi womsebenzisi, kanye namaphethini afanele ama-URL. Ngenkathi sikulo, ake sengeze umbono wokususa umsebenzisi uma kwenzeka sidinga lokho.

from django.views.decorators.csrf import csrf_exempt

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


# Amanani
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import DeleteView

class UserDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = User
    success_url = '/' # Ukuqondisa kabusha ku-URL Yempumelelo
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

    def test_func(self): # Hlola uma umsebenzisi i-superuser futhi unemvume yokususa
        user = self.get_object()
        if self.request.user != user and self.request.user.is_superuser:
            return True
        return False
Ngenkathi lokhu kusebenza lapho kunesidingo, ukususa umsebenzisi akufanele kudingeke isikhathi esiningi, singakwazi nje ukuguqula ukubonakala kwabasebenzisi abavakashela isiza uma kudingeka sixoshe. Amaphethini we-URL esingezele abukeka kanjena. Nge-nano, hlela abasebenzisi / ama-URL.Spy bese wengeza le migqa:

nano users/urls.py
Imigqa kufanele ihambe ohlwini lwezindlela zokubukwa komsebenzisi, ngaphambi kokuphela "]" kodwa ngemuva kokuqala "[".

# ...
    path('user/<int:pk>/delete/', UserDeleteView.as_view(template_name='blog/user_confirm_delete.html'), name='delete-user'),
    path('user/<int:pk>/active/', views.toggle_user_active, name='toggle-user-active'),
# ...
Manje, qiniseka ukuthi ubuyela isiza ukuze uwayilande kwiseva yeWebhu sizoqhubeka nokusebenza. Kusuka kulayini womyalo,

sudo backup
Manje isayithi lethu lisekelwa. Ngakho-ke manje sinezinto ezimbalwa eziwusizo ezengeziwe. Kepha kuthiwani ngesithombe esikhulu lapha? Le khodi ayitholakali kwi-Intanethi, asinaseva yemeyili okwamanje, futhi sidinga ukwandisa uhlelo lwethu lokusebenza ukufaka inqubo yokuqinisekisa ephelele kanye nezakhiwo ezibushelelezi zokusisiza ukuba sihlole isiza, kanye nezinqubomgomo eziphephile zokuqinisekisa abasebenzisi abanenhlanhla . Sizofika kukho konke lokhu. Into ebaluleke kakhulu manje izothola le khodi online, esingayenza ngemigqa embalwa ye-bash kuseva ye-Ubuntu. Uzodinga ukuqasha iseva kulokhu, ngaphandle kokuthi uneseva ekhaya kanye nokubhaliswa kwe-Intanethi kwebhizinisi okuvumela ukuthi uvule amachweba. Mina uqobo ngisebenzisa iwebhusayithi yami kwi-HP Z440 efakwe efulethini lami, kepha imvamisa ishibhile kakhulu ngezidingo eziyisisekelo ukuqasha iseva yangasese ebonakalayo (VPS). Khumbula ukuthi ikhodi esisebenzayo manje iyincanyana, izodinga ukunakekelwa futhi ithuthukiswe ngaphambi kokuba sikhonaSilungele ukusebenzisa lokho esifanele sakhe umkhiqizo. Qinisekisa ukuthi uqikelela ukuthi wenzani nge-Intanethi, qiniseka ukuthi kuleli sayithi esidlangalaleni kwiWebhu kwiseva ye-Linux, unecebo lokuvimba ukusebenzelana okungafuneki ngewebhusayithi yakho. Lokhu kungenzeka kube yinkinga ekuqaleni, kepha sizobheka izixazululo ezahlukahlukene zokulwa nalokhu, kufaka phakathi ukufundwa komshini, ubuhlakani bokufakelwa kanye nombono wekhompyutha. Lapho iba yinkinga, bheka okunye kulo mbhalo ukuthola isisombululo. Mayelana nokuqasha i-VPS, kunezindawo eziningi ongahamba kuzo. I-Google Cloud inamaseva we-VPS, ionos, Kamatera, Ama-Amazon AWS, kanye nabahlinzeki abaningi bahlinzeka ngezixazululo ze-Cloud Server ezizofanela izidingo zethu. Uzodinga uchofoze amafomu abo bese ukhetha uhlelo ukuze uqalise. Ungahamba nohlelo oluyisisekelo nanoma yimuphi umhlinzeki, kepha qiniseka ukuthi umhlinzeki ukuvumela ukuthi uvule amachweba we-port port server ukuthumela i-imeyili (lokhu kufanele kube yiPort 587 nePort 25), abanye abahlinzeki bavimba la machweba. Kuze kube manje ngibe nayoIsipiliyoni se-EST nge-Ionos neKamatera, bobabili bazongivumela ukuthi ngithumele i-imeyili engenamkhawulo futhi amanani abo ashibhile. Uzoxhuma kwiseva yakho entsha ngaphezulu kwe-protocol ebizwa nge-SSH noma i-Shell evikelekile, evumela ukuthi ukhombe ukude neseva njengekhompyutha yakho, kusuka kwikhompyutha yakho. Lapho usetha iseva, umhlinzeki wokusingathwa kungenzeka azokucela ukuthi wengeze ukhiye we-SSH, noma azokunikeza igama lomsebenzisi nephasiwedi. Ukhiye we-SSH ukuthi uzongena kanjani kwiseva kusuka kulayini womyalo ukuhlela ikhodi. Sebenzisa izinketho ezingezansi ze-SHSH-keygen ukukhiqiza i-SSH

ssh-keygen
Gcina ifayili bese ubhala phansi uma udinga, kuhle ukushintshanisa okhiye bakho be-SSH uma ungakakwenzi. Manje, ungasebenzisa umyalo olandelayo ukubona ukhiye wakho we-ssh. Uzofuna ukuyikopisha kwiseva yakho eyihlane ukuze ukwazi ukuyisebenzisa ukuze uqinisekise.

cat ~/.ssh/id_rsa.pub
Uma ungakwazanga ukubona ukhiye we-SSH lapho uthayipha lowo myalo (umucu omude wamadijithi nezinhlamvu eziqala nge- "SHSH-RSA AAA"), zama ukukhiqiza ukhiye we-RSA (avikelekile kakhulu, ngakho-ke ngeluleka ukuthi ngizisebenzise .) Le khodi elandelayo izokhiqiza ukhiye we-4096 bit RSA ssh.

ssh-keygen -t rsa -b 4096
Dala i-VPS esebenzisa ubuntu, noma kunjalo uhlela ukwenza lokhu. Uma usudale i-VPS ngokuchofoza amafomu kwiwebhusayithi yabahlinzeki (Kamatera.com, ionos.com noma okufanayo), uzofuna ukungena ngemvume. Ukuze wenze lokhu, sebenzisa i-SSH Command ngekheli lakho le-IP (ikheli lokho kubukeka njenge-xx.xx.xx.xx). Uzodinga futhi ukuzwela igama lomsebenzisi elizenzakalelayo kwiseva esidale, isibonelo, ubuntu.

ssh ubuntu@XX.XX.XX.XX
Ungacelwa iphasiwedi, uma ucelwa iphasiwedi, uyifake. Ngeke sisebenzise igama lomsebenzisi elizenzakalelayo, ngakho-ke ake siqale ngokwakha umsebenzisi omusha futhi sengeze ukhiye we-SSH kwi-akhawunti yabo. Ake siqale ngokungeza ifayela elisha le-SHSHD_CONFIG, elitshela iseva ukuthi ingayisebenzisa kanjani i-SSH.

nano sshd_config

# Leli ifayela lokucushwa kwe-SSHD serversi ebanzi.  Qonda
# sshd_config (5) ukuthola eminye imininingwane.

# Le sshd yahlanganiswa nePath = / USR / Local / SBIN: / USR / Local / Bin / BBIN: / USR / Bin: / SBIN: / BBIn: / I-USR / imidlalo

# Isu elisetshenziselwa izinketho ku-sshd_config ezenzakalelayo ethunyelwe nge
# I-OpenSsh ukucacisa izinketho ngenani lazo elizenzakalelayo lapho
# kungenzeka, kepha ubashiye baphawule.  Izinketho ezingafuneki zidlula
# Inani elizenzakalelayo.

# IPort 22
# Ikheli noma iyiphi
# Ikheli Lohlu 0.0.0.0
# Lalela i-Adress ::

# I-Hostoty / njr / ssh / ssh_host_rsa_key
# I-Hostoty / njr / ssh / ssh_host_ecda_key
# I-Hostoty / njr / ssh / ssh_host_Ed25519_key

# Ama-CIPHERS NOKUFUNDA
# I-Requekeylimit Okuzenzakalelayo Akukho

# Ukukhanisa
# I-Syslogfacility Author
# I-Loglevel Info

# Ukuqinisekiswa:

# I-Logringracetime 2m
# Imvumerrootlogin yenqabela-iphasiwedi
# I-Strictmode Yebo
# Maxiauntyd 6
# Amakhulu 10

PubkeyAuthentication yes

# Lindela .ssh / Authorized_lides2 ukuze unganakwa ngokuzenzakalelayo ngokuzayo.
AuthorizedKeysFile	.ssh/authorized_keys .ssh/authorized_keys2

# AuthorisespricipalsFile Akukho

# Igunya eligunyaziwe
# Authorizedkeysommanduser akekho

# Ukuze lokhu kusebenze futhi uzodinga izinkinobho zomphathi ku / njll / ssh / ssh_ukwazisa_wo
# I-Hostbasedauthentication Cha
# Shintsha uye ku-yebo uma ungathembi ~ / .ssh / owaziwa_wokhweni
# I-Hostbasedausentication
# Aziwazi phansi
# Musa ukufunda umsebenzisi ~ /.
# Ama-inoreerhosts yebo

# Ukuvimbela amaphasiwedi wombhalo acacile e-turnelited
PasswordAuthentication no
# Imvume yokuvunyelwa cha

# Shintsha uye ku-Yebo ukuze unike amandla amaphasiwedi wokuphendula inselelo (izingqinamba ze-Qaphela nge
# Amamojula athile we-pam kanye nemicu)
KbdInteractiveAuthentication no

# Izinketho zeKerberos
# Kerberosauthentication Cha
# KerberosorlocalCalpassw Yebo
# Kerberosticketleapple Yebo
# Kerberoscotted rod cha

# Izinketho ze-GSSAPI
# Gssapiausentication cha
# GSSAPICLEANUUPCRIONSYISO YES
# Gssapeistretcetcedcheck yebo
# Gssapikeyexchange cha

# Setha lokhu ku- 'Yebo' ukunika amandla ubuqiniso be-PAM, ukucutshungulwa kwe-akhawunti,
# kanye nokucutshungulwa kweseshini. Uma lokhu kunikwe amandla, ubuqiniso be-pam buzovuma
# uvunyelwe ngokusebenzisa i-kbdinterActinectiveIveliveActicution futhi
# Iphasiwediauuntution.  Kuya ngokucushwa kwakho kwe-pam,
# Ukuqinisekiswa kwe-Pam nge-kbdinterInterActiveIveIvelication kungadlula
# ukuhlelwa kwe- "imvumeRootlogin ngaphandle kwephasiwedi".
# Uma ufuna nje i-akhawunti ye-PAM kanye neseshini kuhlola ukugijima ngaphandle
# Ukuqinisekiswa kwe-PAM, bese unika amandla lokhu kepha usethe i-passwoophauthentication
# kanye ne-kbdintercractiveausetion to 'no'.
UsePAM yes

# Vumela inqothulwa Yebo
# Vumela i-Yebo
# Ama-Gatewayports no
X11Forwarding yes
# X112displayset 10
# X11uselocalhost Yebo
# Permittty yebo
PrintMotd no
# I-PhrintaSallog Yebo
# Tcpkeepalive yebo
# I-Permittuenvelo in
# Ukucindezela kubambezelekile
# Isikhashana esivelayo 0
# I-ClientliveCountMax 3
# Kusetshenziswa ngaphakathi
# PidFile /run/sshd.pid
# I-Maxstartups 10: 30: 100
# I-Pemittunl no
# I-ChrootDirectory akekho
# I-adngerum yesengezo

# ayikho indlela ye-banner ezenzakalelayo
Banner /etc/banner

# Vumela iklayenti ukuthi lidlulise ukuguquguquka kwemvelo yendawo
AcceptEnv LANG LC_*

# ukweqa okuzenzakalelayo kwezinto ezingaphansi
Subsystem	sftp	/usr/lib/openssh/sftp-server

# Isibonelo sezilungiselelo eziphezulu kakhulu kumsebenzisi ngamunye
# Qondanisa umsebenzisi anoncvs
# X111Noming No
# I-SUVTTCPPRAMING NO
# Vumela
# I-Forcommand CVS Server
PermitRootLogin no
Khumbula, i-CTRL + X ne-Y ukuze ugcine ifayili. Okulandelayo, ake sibhale umbhalo oyisisekelo obizwa ngokuthi ukuqalisa (konke ku-Default Home Directory yomsebenzisi wethu).

nano initialize
Faka le migqa kufayela, ukufaka esikhundleniNgokhiye wakho we-SSH uthola usebenzisa ikati. (.ssh / id_rsa.pub)

# ! / BIN / Bash
sudo apt install -y nano git openssh-server
sudo cp sshd_config /etc/ssh/sshd_config
sudo service ssh restart
sudo service sshd restart
echo "/root/.ssh/id_rsa" | sudo su root -c "ssh-keygen -t rsa -N ''"
echo "root ssh key:"
sudo su root -c "cat /root/.ssh/id_rsa.pub"
sudo adduser --disabled-password --gecos "" team
sudo passwd -d team
sudo usermod -aG sudo team
echo "/home/team/.ssh/id_rsa" | su team -c "ssh-keygen -t rsa -N ''"
cat /home/team/.ssh/id_rsa.pub >> /home/team/.ssh/authorized_keys
echo '<key here>' >> /home/team/.ssh/authorized_keys
echo "team ssh key:"
cat /home/team/.ssh/id_rsa.pub
Ukukuhamba ngaleli fayela, ake siqale umugqa ngomugqa. Umugqa wokuqala utshela umhlanganisi ukuthi lokhu kungumbhalo we-bash. Ngemuva kwalokho sifaka ukuncika, ukukopisha i-SHSHD_Config kwisikhombi esifanele, ukuqala kabusha i-SSH, ukukhiqiza izinkinobho ze-SSH zezimpande, ukwengeza igama elithi 'Iqembu' (ungalikhetha igama olithandayo ngalokhu, sebenzisa umyalo wesengezo ngegama lawo nephasiwedi ekhubazekile ye manje). Siphinde sengeze iqembu eqenjini leSudo, sikhiqize ukhiye wabo we-SSH, engeza ukhiye wethu kwizinkinobho ezigunyaziwe kanye nezabo, bese uphrinta ukhiye wazo. Lo msebenzisi omusha uzoba yindlela esingena ngayo esizeni. Esigungwini esisha, qhubeka uphinde uvule iseva futhi.

ssh team@XX.XX.XX.XX
Akufanele udinge iphasiwedi kulokhu, ukuba njengoba une-SSH ukhiye. Siphinde sikhule ukungena ngemvume ngephasiwedi ukugcina isiza siphephe kakhulu. Manje, le seva iqala ngokungenalutho ngokuphelele ngaphandle kolwazi ngalo. Ake siqale ngokubopha iphrojekthi yethu kusuka ku-git ukuze sikwazi ukulanda bese siyiqhuba emshinini wakude. Eseva ekude exhunywe nge-SSH, okokuqala phrinta ukhiye wakho we-SSH:

cat ~/.ssh/id_rsa.pub
Okulandelayo, unamathisela lolu ke ukhiye kuzilungiselelo ze-git ezinjengasenza ngaphambi kokusetha indawo yethu yokubeka i-git. Manje senzeka sihlanganise iphrojekthi yethu ngqo kwiseva. Qiniseka ukuthi ususekele iphrojekthi yangakini kuqala ngakho kuseva ye-git ukulanda.

git clone git://github.com/you/yourproject.git
Iphelele. Manje wonke amafayela alapha. Singababona nge-LS

ls
Manje, ake siqale ukusetha iseva. Okokuqala, ukopishe umkhombandlela wakho wephrojekthi ube igama elilula, elikhumbulekayo esizolisebenzisa kulo msebenzi.

cp -r yourproject whatyoucalledit
Lapho "i-WhatYouCalledit" yigama elisha lephrojekthi yakho. Okulandelayo, sizodinga ukwakha ukusetshenziswa okuyisisekelo ukusetha iseva. Sizosindisa lokhu kusetshenziswa futhi sikusebenzise ngokuzayo. Ukwakha lo msebenzi, ake sakhe umsebenzisi kanambambili ukuchaza ukuthi sihlela kanjani umbhalo. Usebenzisa i-Bash, Hlela / USR / Bin / Brict

sudo nano /usr/bin/ascript
Qinisekisa ukusebenzisa i-sudo lapho ngakho-ke unemvume yokuhlela ifayela. Kuleli fayela, engeza le migqa:

# ! / BIN / Bash
if [ ! -f /usr/bin/$1 ]; then
    sudo touch /usr/bin/$1
    echo "# ! / Bin / Bash ">> / USR / Bin / $ 1
    sudo chmod a+x /usr/bin/$1
    sudo nano /usr/bin/$1
    echo $1 | sudo tee -a /etc/ascripts
else
    sudo chmod a+x /usr/bin/$1
    sudo nano /usr/bin/$1
fi
Khumbula lo mbhalo uthatha impikiswano, igama lesiskrisithi, njenge- $ 1. Okokuqala kuhlola ukuthi ngabe ifayela likhona, noma liyakha ngenye indlela, lingeza umugqa wokuqala ukumemezela iskripthi, liyashintsha, bese lingeza igama laso ku- / njll / okubhalwe phansi lisigcina amagama emibhalo thina bayakha. Uma ifayela selivele likhona, vele ushintshe izimvume bese ulihlela. Gcina ifayili, futhi ngokulandelayo sizoshintsha izimvume. Uma nje sisebenzisa lo mbhalo, ngeke siphinde sikwenze lokho.

sudo chmod a+x /usr/bin/ascript
Iphelele. Manje ake sakhe umbhalo obizwa nge-SETUP. Okokuqala, hhayi ukweqisa, kepha bheka ukuthi umbhalo wami wokusetha ubukeka kanjani. Sizohamba ngalokhu okubonakala ngalo mbhalo kuphrojekthi yakho, ngeke udingeke konke embhalweni wami ukuqala.

# ! / BIN / Bash
SECONDS=0
PYTHON_VERSION=3.12
echo "femmebabe installer initialized."
# sudo chmod a + x script / abasebenzisi
# ./script/usseretup
# Ssh-Keyen
# Isiqondisi sephrojekthi
DIR="/home/team/femmebabe"
USER="team"
# Imiyalo ye-Log
echo "Logging commands"
sudo cp log/commands.log /var/log/commands.log
sudo chmod -R a+w /var/log
sudo chown -R :syslog /var/log
echo $'alias venv="source /home/team/femmebabe/venv/bin/activate"' | sudo tee -a /home/team/.profile
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a /etc/bashrc
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a "/home/team/.bashrc"
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a /root/.bashrc
echo "source /etc/bashrc" | sudo tee -a /home/team/.profile
echo "/var/log/commands.log" | sudo tee -a /etc/logrotate.d/syslog
echo "local6.*    /var/log/commands.log" | sudo tee -a "/etc/rsyslog.d/bash.conf"
sudo service rsyslog restart
# I-Nano Config
echo "set tabsize 4" >> .nanorc
echo "set tabstospaces" >> .nanorc
# GIT Config
echo "Git configuration"
sudo git config --global user.email "jasper.camber.holton@gmail.com" && sudo git config --global user.name "Jasper Holton"
git config --global user.email "jasper.camber.holton@gmail.com"
git config --global user.name "Jasper Holton"
git config --global --add safe.directory $"$DIR"
sudo ssh-keyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/known_hosts
sudo ssh-keyscan -t rsa github.com | sudo tee -a /root/.ssh/known_hosts
echo "Mounting setup"
sudo mount -o remount,size=16G,exec /tmp
# Buyekeza futhi ufake
echo "Update and install packages"
sudo apt update && sudo NEEDRESTART_MODE=a apt upgrade -y
sudo apt purge postgresql-client-14 postgresql-client-common postgresql-common postgresql-contrib postgresql -y
echo "postfix postfix/mailname string femmebabe.com" | sudo debconf-set-selections
echo "postfix postfix/main_mailer_type string 'Internet Site'" | sudo debconf-set-selections
sudo NEEDRESTART_MODE=a DEBIAN_FRONTEND=noninteractive apt install -y postfix
sudo NEEDRESTART_MODE=a apt install -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cmake python-is-python3 python3-venv python3-pip python3-django expect tesseract-ocr openjdk-8-jdk redis-server libopencv-dev python3-opencv python3-dev libsasl2-dev opendkim opendkim-tools dovecot-core dovecot-pop3d dovecot-imapd auditd procmail libpq-dev postgresql postgresql-contrib libheif-dev snapd git software-properties-common certbot python3-certbot-apache
echo "-a exit,always -F arch=b64 -F euid=0 -S execve" | sudo tee -a /etc/audit/audit.rules
echo "-a exit,always -F arch=b32 -F euid=0 -S execve" | sudo tee -a /etc/audit/audit.rules
# Nika amandla i-Clamav Antivirus
echo "Starting antivirus"
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
# Setha igama lomsingathi
echo "127.0.0.1 femmebabe" | sudo tee -a /etc/hosts
sudo hostnamectl set-hostname localhost
# Setha Postgres
echo "Postgres setup"
sudo -u postgres psql -U postgres -c "DROP DATABASE database;"
sudo -u postgres psql -U postgres -c "CREATE DATABASE database;"
sudo -u postgres psql -U postgres -c "CREATE USER django WITH PASSWORD 'password';"
sudo -u postgres psql -U postgres -c "ALTER ROLE django SET client_encoding TO 'utf8';"
sudo -u postgres psql -U postgres -c "ALTER ROLE django SET default_transaction_isolation TO 'read committed';"
sudo -u postgres psql -U postgres -c "ALTER ROLE django SET timezone TO 'UTC';"
sudo -u postgres psql -U postgres -c "GRANT ALL PRIVILEGES ON DATABASE database TO django;"
# Setup Backup Database
echo "Building database from backup, this may take a while."
cat db.json.?? > db.json
echo "Configuring firewall"
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow 22
sudo ufw allow http
sudo ufw allow https
sudo ufw allow 'Postfix'
sudo ufw allow 'Postfix SMTPS'
sudo ufw allow 'Postfix Submission'
sudo ufw allow 'Dovecot POP3'
sudo ufw allow 'Dovecot Secure POP3'
sudo ufw allow 110/tcp
sudo ufw allow 25/tcp
echo "y" | sudo ufw enable
# I-IPatables ekhubazekile
echo "Configuring firewall"
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
sudo iptables-save
# Faka i-Bitdefender
cd $DIR
echo "Runnning BitDefender antivirus installer"
wget https://cloud.gravityzone.bitdefender.com/Packages/NIX/0/7aTSsy/setup_downloader.tar
mkdir bitdefender
tar -xf setup_downloader.tar -C bitdefender
sudo rm setup_downloader.tar
sed -i -e 's/{LOGINPASSWD/z&A*3BPd_qBGUMs/g' bitdefender/installer
sudo chmod a+x bitdefender/installer
sudo ./bitdefender/installer
# Setha Postfix Postfix
cd $DIR
echo "Mail services configuration"
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.backup
sudo cp config/etc_postfix_main.cf /etc/postfix/main.cf
sudo cp config/etc_postfix_master.cf /etc/postfix/master.cf
sudo cp config/etc_default_opendkim /etc/default/opendkim
sudo cp config/etc_dovecot_conf.d_10-auth.conf /etc/dovecot/conf.d/10-auth.conf
sudo cp config/etc_dovecot_conf.d_10-master.conf /etc/dovecot/conf.d/10-master.conf
sudo cp config/etc_dovecot_dovecot.conf /etc/dovecot/dovecot.conf
sudo cp config/etc_dovecot_passwd /etc/dovecot/passwd
sudo cp config/etc_opendkim.conf /etc/opendkim.conf
sudo cp config/etc_default_opendkim /etc/default/opendkim
sudo adduser postfix opendkim
sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
sudo mkdir /etc/opendkim/keys/femmebabe.com
sudo mkdir /var/spool/postfix/opendkim
sudo echo "*@femmebabe.com     sendonly._domainkey.femmebabe.com" | sudo tee -a /etc/opendkim/signing.table
sudo echo "sendonly._domainkey.femmebabe.com    femmebabe.com:sendonly:/etc/opendkim/keys/femmebabe.com/sendonly.private" | sudo tee -a /etc/opendkim/key.table
sudo echo "127.0.0.1" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "localhost" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "*.femmebabe.com" | sudo tee -a /etc/opendkim/trusted.hosts
sudo chown -R opendkim:opendkim /etc/opendkim
sudo opendkim-genkey -b 2048 -d femmebabe.com -D /etc/opendkim/keys/femmebabe.com -s sendonly -v
sudo chmod go-rw /etc/opendkim/keys
sudo chown opendkim:opendkim /etc/opendkim/keys/femmebabe.com/sendonly.private
sudo chown opendkim:postfix /var/spool/postfix/opendkim
cd $DIR
sudo cp mailbox/* /var/mail/
sudo chown :users /var/mail/*
sudo chmod -R a+rwx /var/mail/*
sudo systemctl restart opendkim postfix dovecot
# Dala ama-Dris
cd $DIR
mkdir media/audio
mkdir media/audio/fingerprints
mkdir media/security
mkdir media/secure
mkdir media/secure/media
mkdir media/secure/video
mkdir media/secure/profile
mkdir media/secure/face
mkdir media/images
mkdir media/live
mkdir media/live/files
mkdir media/live/stills
mkdir media/files
mkdir temp
mkdir temp/data
mkdir temp/gfpgan
mkdir mail/inbox
mkdir mailbox
# Setha i-Virtup VirtueAlenv
cd $DIR
echo "Creating virtual environment"
python -m venv venv
source venv/bin/activate
# Thola futhi wakhe ukuncika
echo "Getting and building dependencies, this may take a whike"
cd $DIR
git clone https://github.com/sukhitashvili/violence-detection.git
cp config/vd-requirements.txt violence-detection/requirements.txt
cp config/vd-model.py violence-detection/model.py
cd violence-detection
pip3 install -r requirements.txt
cd $DIR
wget https://github.com/TencentARC/GFPGAN/releases/download/v1.3.0/GFPGANv1.3.pth -P experiments/pretrained_models
git clone https://github.com/TencentARC/GFPGAN.git
git clone https://github.com/davisking/dlib.git
cd dlib
mkdir build; cd build; cmake ..; cmake --build .
cd ..
source venv/bin/activate
python setup.py install
cd $DIR
source venv/bin/activate
cd $DIR/GFPGAN/
echo "Installing python dependencies"
pip install basicsr
pip install facexlib
pip install -r requirements.txt
python setup.py develop
pip install realesrgan
cd $DIR
sudo chown -R team:users gfpgan
echo "Installing ta-lib"
wget https://prdownloads.sourceforge.net/ta-lib/ta-lib-0.4.0-src.tar.gz
tar xvzf ta-lib-0.4.0-src.tar.gz
sudo rm ta-lib-*
cd ta-lib
sudo ./configure
sudo make
sudo make install
# Setha imithetho ye-firewall
cd $DIR
# Faka ukuncika kwe-Pypi
echo "Installing remaining python dependencies (this may take a while)"
sudo systemctl mask tmp.mount
cd $DIR
source venv/bin/activate
pip3 install -U "celery[redis]"
pip3 install -r requirements.txt --use-deprecated=legacy-resolver --use-pep517
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# Faka ukufaka i-OpenCv-Python == 4.5.5.64
# Faka i-Pip Opencv-Porib-Python == 4.5.5.64
pip3 install --upgrade opencv-python-headless
pip3 uninstall channels
pip3 uninstall daphne
pip3 install channels["daphne"]
pip3 install Pillow==9.5.0
pip3 install librosa
pip3 install -U 'Twisted[tls,http2]'
pip3 install --upgrade certifi requests urllib3 numpy oauthlib twisted pyjwt sqlparse cryptography astral webauthn docbarcodes pdf417 deepface --no-cache-dir
pip3 install tensorflow==2.15.1
# Faka i-certot
echo "Installing certificates"
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo snap install redis
sudo systemctl enable apache2
sudo systemctl start apache2
# Run Certot
sudo certbot --apache --non-interactive --agree-tos --domains femmebabe.com --email jasper.camber.holton@gmail.com
# Layisha kabusha iseva yemeyili
sudo systemctl restart opendkim postfix dovecot
# Kopisha Certs
# sudo CP /ETC/LEDENENCRYPTPT/LIVE/FEMMEBabe.com/privkey.pem
# sudo CP /ETC/lettesencryprypryt/live/femmebabe.com/cert.pem cert.pem
# Chibiyela
cp scripts/content.py $"/home/team/femmebabe/venv/lib/python${PYTHON_VERSION}/site-packages/pyxb/binding/content.py"
cp scripts/pwa_webpush_forms.py $"/home/team/femmebabe/venv/lib/python${PYTHON_VERSION}/site-packages/pwa_webpush/forms.py"
cp scripts/webauth_views.py $"/home/team/femmebabe/venv/lib/python${PYTHON_VERSION}/site-packages/webauth/views.py"
cp scripts/json.py $"venv/lib/python${PYTHON_VERSION}/site-packages/django/core/serializers/json.py"
# Setha izilungiselelo zomsebenzisi
sudo gpasswd -a www-data users
# Setha izimvume
echo "Setting permissions"
sudo chown -R team:users cache/
sudo chmod a+rwx -R cache/
# Ithimba leSudo Chewn -R: Abasebenzisi / Var / run /
# I-Sudo Clown Root: Izimpande / Run / Sudo / TS -r
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /var/log/redis
sudo chmod -R u+rwX,g+rwX,u+rx /var/log/redis
sudo chmod +r /etc/redis/redis.conf
sudo chown -R team:users /var/log/
sudo chown -R :users .././
sudo chmod -R g+rwX ./
sudo chmod -R g+rX .././
sudo chmod -R g-rwX ../.ssh
sudo chmod 774 ./
# sudo chmod 664 db.sqlite3
# Idatha ye-Sudo Chew www ye-WWW: Abasebenzisi i-DB.SQLite3
sudo chown -R www-data:www-data media/
sudo chown www-data:users ./
sudo chown -R team:users media/
sudo chown -R team:users ./
sudo chown -R team:users ./gfpgan/
sudo chown -R team:users ./temp/
sudo chmod a+r team /var/mail/$USER
# Kopisha ukuhlela kanye nezimvume
echo "Configuring remaining services"
sudo cp config/apis.json /etc/apis.json
sudo cp config/config.json /etc/config.json
sudo cp config/femmebabe-le-ssl.conf /etc/apache2/sites-available/femmebabe-le-ssl.conf
sudo cp config/etc_dovecot_passwd /etc/dovecot/passwd
sudo cp config/etc_init.d_celery /etc/init.d/celery
sudo cp config/etc_init.d_celerybeat /etc/init.d/celerybeat
sudo cp config/etc_default_celerybeat /etc/default/celerybeat
sudo cp config/etc_default_celery /etc/default/celery
sudo cp config/etc_systemd_system_daphne.service /etc/systemd/system/daphne.service
sudo cp config/etc_systemd_system_celery.service /etc/systemd/system/celery.service
sudo cp config/etc_systemd_system_celerybeat.service /etc/systemd/system/celerybeat.service
sudo chmod a+x /etc/init.d/celery
sudo chmod a+x /etc/init.d/celerybeat
# Ukusetha kwesizinda semininingwane
echo "Running migrations, this should be quick"
python manage.py makemigrations
python manage.py migrate --run-syncdb
echo "Loading data, this may take a while"
python manage.py loaddata db.json
echo "Setup crontab/sudoers configuration"
sudo crontab -l -u root | cat - config/crontab | sudo crontab -u root -
sudo sh -c "cat config/sudoers >> /etc/sudoers"
# Faka i-PAM Config bese ususa i-SHS Config enephutha
# Sudo sed-'-And $ D' /tc/pam.d/sshd
# Sudo sed-'-And $ D' / njll / Iphrofayili
echo "session required pam_exec.so seteuid /home/team/femmebabe/pam.sh" | sudo tee -a /etc/pam.d/sshd
echo "session required pam_exec.so seteuid /home/team/femmebabe/logout.sh" | sudo tee -a /etc/pam.d/sshd
sudo chmod a+x pam.sh
sudo rm /etc/ssh/sshd_config.d/50-cloud-init.conf
# Kopisha imibhalo yeBin bese usetha izimvume
echo "Copying scripts"
sudo cp scripts/reload /usr/bin/
sudo cp scripts/check /usr/bin/
sudo cp scripts/enagpu /usr/bin/
sudo cp scripts/disgpu /usr/bin/
sudo cp scripts/activate /usr/bin/
sudo cp scripts/backup /usr/bin/
sudo cp scripts/ascript /usr/bin/
sudo cp scripts/setup /usr/bin/
sudo cp scripts/addsetup /usr/bin/
sudo cp scripts/watchlogs /usr/bin/
sudo cp scripts/logs /usr/bin/
sudo cp scripts/cmds /usr/bin/
sudo cp scripts/setup /usr/bin/
sudo cp scripts/pushweb /usr/bin/
sudo cp scripts/purgecache /usr/bin/
sudo cp config/banner /etc/banner
cd /usr/bin/
sudo chmod a+x activate
sudo chmod a+x backup
sudo chmod a+x ascript
# Phinda ulayishe kabusha futhi unike amandla izinsizakalo
echo "Enabling services"
sudo systemctl daemon-reload
sudo systemctl enable daphne.service
sudo systemctl enable celery.service
sudo systemctl enable celerybeat.service
sudo systemctl enable clamav-daemon
sudo systemctl start daphne.service
sudo systemctl start celery.service
sudo systemctl start celerybeat.service
sudo systemctl start clamav-daemon
# Nika amandla amamojula we-Apache
echo "Enabling apache2"
sudo a2enmod rewrite
sudo a2enmod wsgi
sudo a2enmod headers
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
# sudo a2dismod mpm_event
# sudo A2Dismod MPM_Urwor
# sudo a2enmod mpm_prefreft
# Khubaza isiza esizenzakalelayo
sudo a2dissite 000-default
sudo a2dissite 000-default-le-ssl
# Nika amandla isiza
sudo a2ensite femmebabe-le-ssl
# Layisha kabusha i-daemon bese uqala kabusha i-apache, i-postfix kanye ne-opendkim
sudo systemctl daemon-reload
sudo systemctl restart apache2
sudo systemctl restart opendkim postfix
sudo systemctl start daphne
# Setha izimvume
sudo chown -R :www-data /var/www/
sudo chown -R :www-data /var/www/.deepface
# Shintsha ukucushwa
echo "Allocating swap, this may take a while"
sudo swapoff /swapfile
sudo rm /swapfile
sudo fallocate -l 8G /swapfile
sudo dd if=/dev/zero of=/swapfile bs=1024 count=8388608
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo "/swapfile swap swap defaults 0 0" | sudo tee -a /etc/fstab
sudo swapon --show
# Injini yamagama
echo "Initializing routine caption"
/home/team/femmebabe/venv/bin/python /home/team/femmebabe/routine_caption.py
/home/team/femmebabe/venv/bin/python /home/team/femmebabe/setup_mail.py
# Isethaphu git
echo "Setting up git"
cd $DIR
sudo rm -r .git
git init --initial-branch=main
echo "Setting user password"
sudo usermod --password $(echo team | openssl passwd -1 -stdin) team
# Khombisa i-IPv6 ne-OpenKim ukuze kuculwe isizinda
echo "COPY the below information to domain configuration."
hostname -I
ip a | grep inet
ip -6 addr | grep "scope link"
sudo cat /etc/opendkim/keys/femmebabe.com/sendonly.txt | tr -d '\n' | sed 's/\s//g' | sed 's/""//g' | awk -F'[)(]' '{print $2}'
# Ukusetha kuqediwe
echo "Setup completed in"
wc -l scripts/setup
echo "lines of code."
echo "Total time:"
duration=$SECONDS
echo "$((duration / 60)) minutes and $((duration % 60)) seconds elapsed."
echo "TODO:"
echo "- COPY above IPv6 address to domain DNS configuration"
echo "- COPY domain key to domain DNS configuration"
echo "- ADD new git repository with git remote add originlab <repo>."
echo "- OPEN port 25"
echo "- INSTALL antivirus as per reccomendations"
echo "- TEST"
echo "If neccesary,"
echo "- DEBUG"
echo "- FIX setup and backup scripts"
echo "- Fix server"
echo ""
echo "Thank you for using the femmebabe installer. Have a great day!"
echo "Goodbye."
Lokho ukusetha okuningi! Ngamafuphi, le khodi ifaka imiyalo, ilungiselela i-nano ne-git, amakhophi amafayela, ukulanda kanye nokufaka i-PostFix, ukumisa i-postgresql, kumithwalo i-UFW (ilungiselelwe i-firewall), Ikhubaza ama-IPTAbles, ukulanda i-antivirus, kwenza izinkomba, ukuncika kwezimpawu, Ukufaka Izitifiketi bese usetha iseva, ukufaka ukucushwa, kuqala futhi kunikeze amandla i-sever, abezele ukushintshana, amasethi Imvume, bese kuphrinta ikheli le-IP, IPv6 kanye nokhiye we-IP, I-IPV6 ne-Opendkim Key. Kulula, kepha kubukeka njengekhodi eningi. Ngeke sidinge okuningi lokhu ngoba asinawo ukuncika, asisebenzisi i-celery, i-celerybeat noma i-daphne, kepha sizofaka ezinye zazo ukuze ziqale. Qaphela ukuthi le khodi inesizinda esimemezelwe kaningana. Sizodinga futhi ukuthenga igama lesizinda (okuyimali encane yonyaka). Ngincoma i-squarespace yokuthenga isizinda, ukwakheka kwawo kuyintoenembile futhi kulula ukuyisebenzisa. Ungathenga noma yisiphi isizinda sokukhetha kwakho, kepha ngisebenzisa isizinda femmebabe.com kulesi sibonelo. Uma usuthengile isizinda, ikhanda kwiphaneli yokucushwa kwe-squarespace DNS bese wengeza irekhodi elikhomba isizinda sakho kwiseva ngekheli le-IP. Kufanele kubukeke kanjena: @ A xx.xx.xx.xx Ngo-opharetha o- @ njengathi, okusho ukuthi zonke izizinda ngaphansi kwalesi sizinda futhi isizinda sezimpande sizophinda siqondise kuseva. Kunamarekhodi amaningi okumemezela, kepha singadlulela kulokhu uma sesikulungele ukuthumela imeyili. Khumbula, kungathatha izinsuku ezimbalwa ngaphambi kokuba ukwazi ukuthumela ngempumelelo imeyili kwiseva. Amarekhodi e-DNS Sibeka kuzothatha isikhathi sokusakazeka. Noma kunjalo, okuwukuphela kwerekhodi esidinga ukuqala ngalo kuyirekhodi. Ngakho-ke manje singakwazi ukugcwalisa umbhalo ongezansi ngokuya ngephrojekthi yethu bese uyiqhuba. Ake siqale ngombhalo omncane wokusetha ukuze nje ufake lokho esikudingayo ngentuthuko eyisisekelo. Ngeke sisebenzise ukuncika okuningi noma i-postgresql okwamanje, sizoveleUp iseva eyisisekelo ye-HTTP futhi ukhathazekile ngokuqinisekisa lapho kwenziwa. Khumbula, ukuthola isitifiketi se-HTTPS futhi usebenzise iseva ngokuphephile, sizodinga ukuthenga isizinda kanye nokuqasha iseva. Okwamanje, buyisela "iqembu" kuleli fayela ngegama lomsebenzisi wakho, "i-DR" nge-Directory yephrojekthi yakho, bese unikeza i-imeyili yakho nesizinda kumathegi we- <>. Ngaphezu kwalokho, ngaphambi kokuba siqhube le khodi, kudingeka siguqule izilungiselelo kwi-firewall umhlinzeki wokusingathwa asekela, uma ekhona. Imvamisa lokhu kuyithebhu 'yenethiwekhi' yomhlinzeki wakho wokubamba, noma uma uzindla, engxenyeni ethi 'Ukudluliselwa Ethekwini' kwe-router yakho. Futhi uzofuna ukusetha i-IP e-TOSTIC nge-router yakho ngekheli lomshini wakho weseva, uma usebenzisa ukuzibamba. Uzodinga ukuvula amachweba alandelayo wokufinyelela / wokubhala ukufinyelela. 22 (ssh) 25 (Imeyili) 587 (Imeyili) I-110 (Iklayenti le-imeyili) I-80 (http) 443

# ! / BIN / Bash
SECONDS=0
PYTHON_VERSION=3.12
echo "femmebabe installer initialized."
DIR="/home/team/<yourproject>"
USER="team"
# Imiyalo ye-Log
echo "Logging commands"
sudo cp log/commands.log /var/log/commands.log
sudo chmod -R a+w /var/log
sudo chown -R :syslog /var/log
echo $'alias venv="source /home/team/femmebabe/venv/bin/activate"' | sudo tee -a /home/team/.profile
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a /etc/bashrc
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a "/home/team/.bashrc"
echo $'PROMPT_COMMAND=\'RETRN_VAL=$?;logger -p local6.debug "$(whoami) [$$]: $(history 1 | sed "s/^[ ]*[0-9]\+[ ]*//" )"\'' | sudo tee -a /root/.bashrc
echo "source /etc/bashrc" | sudo tee -a /home/team/.profile
echo "/var/log/commands.log" | sudo tee -a /etc/logrotate.d/syslog
echo "local6.*    /var/log/commands.log" | sudo tee -a "/etc/rsyslog.d/bash.conf"
sudo service rsyslog restart
# I-Nano Config
echo "set tabsize 4" >> .nanorc
echo "set tabstospaces" >> .nanorc
# GIT Config
echo "Git configuration"
sudo git config --global user.email "<youremail>@gmail.com" && sudo git config --global user.name "<yourname>"
git config --global --add safe.directory $"$DIR"
sudo ssh-keyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/known_hosts
sudo ssh-keyscan -t rsa github.com | sudo tee -a /root/.ssh/known_hosts
# Buyekeza futhi ufake
echo "Update and install packages"
sudo apt update && sudo NEEDRESTART_MODE=a apt upgrade -y
sudo apt purge postgresql-client-14 postgresql-client-common postgresql-common postgresql-contrib postgresql -y
echo "postfix postfix/mailname string femmebabe.com" | sudo debconf-set-selections
echo "postfix postfix/main_mailer_type string 'Internet Site'" | sudo debconf-set-selections
sudo NEEDRESTART_MODE=a DEBIAN_FRONTEND=noninteractive apt install -y postfix
sudo NEEDRESTART_MODE=a apt install -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cmake python-is-python3 python3-venv python3-pip python3-django expect tesseract-ocr openjdk-8-jdk redis-server libopencv-dev python3-opencv python3-dev libsasl2-dev opendkim opendkim-tools dovecot-core dovecot-pop3d dovecot-imapd auditd procmail libpq-dev postgresql postgresql-contrib libheif-dev snapd git software-properties-common certbot python3-certbot-apache
# Nika amandla i-Clamav Antivirus
echo "Starting antivirus"
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
# Setha igama lomsingathi
echo "127.0.0.1 femmebabe" | sudo tee -a /etc/hosts
sudo hostnamectl set-hostname femmebabe
# Setup Backup Database
echo "Building database from backup, this may take a while."
cat db.json.?? > db.json
echo "Configuring firewall"
sudo ufw default allow outgoing
sudo ufw default deny incoming
sudo ufw allow 22
sudo ufw allow http
sudo ufw allow https
sudo ufw allow 'Postfix'
sudo ufw allow 'Postfix SMTPS'
sudo ufw allow 'Postfix Submission'
sudo ufw allow 'Dovecot POP3'
sudo ufw allow 'Dovecot Secure POP3'
sudo ufw allow 110/tcp
sudo ufw allow 25/tcp
echo "y" | sudo ufw enable
# I-IPatables ekhubazekile
echo "Configuring firewall"
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
sudo iptables-save
# Setha i-Virtup VirtueAlenv
cd $DIR
echo "Creating virtual environment"
python -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
# Faka i-certot
echo "Installing certificates"
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo snap install redis
sudo systemctl enable apache2
sudo systemctl start apache2
# Run Certot
sudo certbot --apache --non-interactive --agree-tos --domains femmebabe.com --email <youremail>@gmail.com
# Setha izilungiselelo zomsebenzisi
sudo gpasswd -a www-data users
# Setha izimvume
echo "Setting permissions"
sudo chown -R team:users cache/
sudo chmod a+rwx -R cache/
# Ithimba leSudo Chewn -R: Abasebenzisi / Var / run /
# I-Sudo Clown Root: Izimpande / Run / Sudo / TS -r
sudo chown -R redis:redis /var/lib/redis
sudo chown -R redis:redis /var/log/redis
sudo chmod -R u+rwX,g+rwX,u+rx /var/log/redis
sudo chmod +r /etc/redis/redis.conf
sudo chown -R team:users /var/log/
sudo chown -R :users .././
sudo chmod -R g+rwX ./
sudo chmod -R g+rX .././
sudo chmod -R g-rwX ../.ssh
sudo chmod 774 ./
sudo chown -R www-data:www-data media/
sudo chown www-data:users ./
sudo chown -R team:users media/
sudo chown -R team:users ./
# Phinda ulayishe kabusha futhi unike amandla izinsizakalo
echo "Enabling services"
sudo systemctl daemon-reload
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
# Nika amandla amamojula we-Apache
echo "Enabling apache2"
sudo a2enmod rewrite
sudo a2enmod wsgi
sudo a2enmod headers
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
# Layisha kabusha i-daemon bese uqala kabusha i-apache, i-postfix kanye ne-opendkim
sudo systemctl daemon-reload
sudo systemctl restart apache2
sudo systemctl restart opendkim postfix
# Khombisa i-IPv6 ne-OpenKim ukuze kuculwe isizinda
echo "COPY the below information to domain configuration."
hostname -I
ip a | grep inet
ip -6 addr | grep "scope link"
Ngaphambi kokusebenzisa le khodi, qiniseka ukuthi isizinda osithengile sixhumeke kwiseva. Ukuze wenze lokhu, vula i-terminal emshinini wangakini, bese uqhuba lo myalo ngesizinda sakho:

ping femmebabe.com # Faka isizinda sakho lapha, ngemuva kwe-ping
Uma konke kubukeka kahle futhi iseva ithumela izimpendulo, sikulungele ukusebenzisa iskripthi bese sifaka amaphakheji kanye nokuqala, vumela futhi uqinisekise iseva yethu ye-Apache. Lokhu akuyona yonke ukusetha okudingekayo ukumisa i-PostFix, sizobheka lokho kusethwa kamuva. Okwamanje, gijimisa le khodi yokusetha futhi kufanele uthathe imizuzu embalwa ukufaka futhi iqinisekise iseva yakho. Nakulokhu futhi, qiniseka ukufaka igama, i-imeyili negama lesizinda kwiskripthi ngokwegama owathengile. Manje njengoba iseva ihlinzekiwe, ungaya kwi-URL kunoma yisiphi isiphequluli sewebhu bese uhlola ukuqiniseka ukuthi iseva isebenza nge-HTTPS. Uma kungenjalo, zama ukulinda isikhashana ukuthi amarekhodi e-DNS ukubamba bese ugijimisa umyalo olandelayo ukuze uzame kabusha isitifiketi se-certbot:

sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Uma nje usuhlele konke kahle, kufanele ukwazi ukufinyelela ikhasi elizenzakalelayo le-Apache ukuze wazi ukuthi ikhodi yakho isebenza futhi ibonisa ikhasi lewebhu bukhoma. Okulandelayo, ake sihlele amasethingi.py ukushintsha imodi yethu yokulungisa iphutha ekukhiqizeni. Sizophinde futhi silungiselele isizinda kuzilungiselelo, kanye nama-IPs angaphakathi.

nano yourproject/settings.py
Kuzilungiselelo, shintsha / engeza le migqa.

DEBUG = False

# Ukulungiswa kwesayithi
SITE_NAME = 'Femme Babe'
PROTOCOL = 'https'
DOMAIN = 'femmebabe.com'
SITE_ID = 1
BASE_URL = PROTOCOL + '://' + DOMAIN
ALLOWED_HOSTS = [DOMAIN]

INTERNAL_IPS = [
    'XX.XX.XX.XX',
]
Manje, sizodinga ukumisa i-Apache2. Ake sihlele ifayela le-Config Sizohambisa nalomugqa:

sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Leli fayela lokuhlela kufanele libe negama lethu lesizinda kulo, negama lomsebenzisi nephrojekthi. Ngisebenzisa igama lesizinda femmebabe.com, Iqembu lomsebenzisi, negama lephrojekthi we-FEMMEBabe.

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

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

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

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

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

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

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

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

	TimeOut 60000
	LimitRequestBody 0

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

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

	RewriteEngine on
	RewriteCond %{SERVER_NAME} =femmebabe.com
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>
Qiniseka ukuthi uthatha isikhundla segama lephrojekthi, izinkomba, nesizinda kule khodi yesibonelo lapho ulungiselela iseva yakho. Manje, sizodinga ukukhubaza isiza esizenzakalelayo. Lokhu kungenziwa kusetshenziswa i-bash.

sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Okulandelayo, singavumela indawo ezenzakalelayo futhi silayishe kabusha i-Apache2, futhi sisebenzisa i-bash. Khumbula ukufaka esikhundleni se-femmebabe ngegama lefayela olimemezele lapho uhlela / njll / apache2 / amasayithi-atholakalayo /.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Buyela esizindeni sakho e-Navbar. Kufanele ubone isiza osilungiselele kwisiphequluli sakho sewebhu. Siyakuhalalisela! Uma ungakuboni, kungadingeka ukuthi wenze izinguquko ezithile. Buyekeza ngokucophelela izilungiselelo kwiphrojekthi yakho, ukucushwa kwe-Apache, futhi uqiniseke ukuthi awunawo amaphutha, futhi uqhube imiyalo elandelayo ukubheka iphrojekthi ngamaphutha.

cd projectname
source venv/bin/activate
python manage.py check
Uma unamaphutha kuphrojekthi yakho yePython, yilandelela lapho zikhona futhi zilungise. Ungahle ungakwazi ukubona wonke amaphutha akho kuye ngokuthi akuphi, ngakho-ke uma unephutha elisho nje ukuthi "i-poppeate akulona ifayela elilandelayo endaweni ebonakalayo, irejista.Py, ukudalula Iphutha.

nano venv/lib/python3.12/site-packages/django/apps/registry.py
Skrolela ku-Line 83, lapho kwaphakanyiswa khona iphutha le-RuntiteTime (i-RunThereRorr ("i-Vope () ayikho i-Rentrant"), bese wengeza amazwana ngaphambi kwalomugqa, bese unezela, nge- Lokhu kubukeka kanjena:

            if self.loading:
                # Vimbela izingcingo ezihlanzekile ukugwema ukusebenzisa i-appconfig.ire ()
                # Izindlela kabili.
# Phakamisa i-RunTimeError ("i-Vope () ayilona i-Reentrant")
                self.app_configs = {}
            self.loading = True
Ungahlola iphrojekthi futhi futhi uveze iphutha.

python manage.py check
Ngemuva kwalokho ungabona iphutha bese ulilungisa. Uma usuhleliwe futhi ikhodi ihlanganisa ngaphandle kwamaphutha, qiniseka ukushintsha ifayela emuva ukuze kubukeke kanjena:

            if self.loading:
                # Vimbela izingcingo ezihlanzekile ukugwema ukusebenzisa i-appconfig.ire ()
                # Izindlela kabili.
                raise RuntimeError("populate() isn't reentrant")
# self.appApp = {{}
            self.loading = True
Inikezwe iseva ku-inthanethi, lapho senza ezinye izinguquko kukho, kudingeka sisebenzise umyalo olandelayo wokulayisha kabusha iseva:

sudo systemctl reload apache2
Kuhle! Kepha kuthiwani ngokuthumela imeyili? Ukuqala ukuthumela i-imeyili, sizodinga okokuqala ukuvuselela ukucushwa kwesizinda. Lokhu kufanele kube kuphaneli yakho ye-DNS e-squarespace, noma isiphi isaga segama lesizinda osikhethile. Sizodinga futhi ukufaka futhi singeze ukucushwa, futhi sigijime imiyalo embalwa. Okokuqala, ake uthole ikheli le-IPv6 leseva. Sizobe sesivula ama-DNS akho bese singeza amarekhodi. Ukuthola ikheli le-IPV6 leseva, sebenzisa lo myalo:

ip -6 addr
Manje, singangeza amarekhodi alandelayo ezilungiselelweni ze-DNS. Amarekhodi ami abukeka kanjena. Kodwa-ke, kumarekhodi akho, kufanele ungene esikhundleni sekheli le-IP nge-IP yakho (hhayi 75.147.182.214, lokho okwami). Also add your domain in place of femmebabe.com, as well as your IPV6 address found with the previous command (you can't use mine, fe80::725a:fff:fe49:3e02). Ungakhathazeki nge-DomainKy manje, lokhu kudaliwe lapho sisetha i-Postfix, iseva yemeyili, nge-OpenKim, bese iphrinta ukhiye. Sizolungiselela lokhu okokugcina. @ » A N / a 75.147.182.214 @ » I-MX Okuthenyalwayo femmebabe.com @ » Uhlobo lwenkezelo N / a femmebabe.com @ » Txt N / a Txt @ v = SPF1 MX IP75.147.182.21414.214141: FE80 :: FFF :: 725a: Fff: FF29: 3E02 ~ BONKE Okuzenzakalelayo._bimi Txt N / a v = bimi1; l = https: //femmebabe.com/Media/static/FEMMEBabe.svg _dmarc Txt N / a v = DMARC1; P = akukho Semonly._domainekey Txt N / aManje, sizodinga ukwengeza ukucushwa okuthile kokuphikelela kwe-postfix. Esikudingayo ukukwenza qiniseka ukuthi sifaka esikhundleni segama lesizinda, i-femmebabe.com, ngegama lesizinda olisebenzisayo. Ake sibheke wonke amafayela we-Config ngamunye ngamunye, bese uwafaka ku-Directory ebizwa nge-Config kuphrojekthi yethu, ukuze ufake ku-OS.

nano config/etc_postfix_main.cf
Faka lo mbhalo kufayela

# Bona /usr/share/postfix/main.cf.Dist for a amazwana, inguqulo ephelele ephelele


# Okucacisiwe Okucacisiwe: Ukucacisa igama lefayela kuzodala owokuqala
# umugqa walelo fayela elizosetshenziswa njengegama.  Okuzenzakalelayo kwe-Debian
# yi / njll / imeyli.
# myorigin = / njll / imeyli

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

# I-Apy .Dodon ngumsebenzi we-mua.
append_dot_mydomain = no

# Ukungangenwe umugqa olandelayo wokukhiqiza "izexwayiso imeyili ebambezelekile"
# I-Delay_Warning_Time = 4H

readme_directory = no

# Bona i-http: //www.postfix.org/compurible_areadme.html - Okuzenzakalelayo ku-3.6 on
# Ukufakwa okusha.
compatibility_level = 3.6



# Amapharamitha we-TLS
smtpd_tls_cert_file=/etc/letsencrypt/live/femmebabe.com/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/femmebabe.com/privkey.pem
smtpd_tls_security_level=may

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

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

# Ukucushwa kweMarter
milter_default_action = accept
milter_protocol = 6
smtpd_milters = local:/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters

smtp_tls_security_level = encrypt
smtp_tls_loglevel = 1

virtual_transport=lmtp:unix:private/dovecot-lmtp

smtpd_sasl_path = private/auth
I-Config elandelayo!

nano config/etc_postfix_master.cf
Faka le migqa:

# 
# Ifayela lokucushwa kwe-PostFix Master Port.  Ngemininingwane ngefomethi
# wefayela, bheka i-Master (5) Ikhasi Lezandla (Umyalo: "Indoda 5 Master" noma
# Ku-inthanethi: http://www.postfix.org/master.5.html).
# 
# Ungakhohlwa ukwenza i- "Postfix Layisha kabusha" ngemuva kokuhlela leli fayela.
# 
# ===================================================== ========================
# Uhlobo lwensiza yangasese i-UNrCRIV Chroot WakeUp MaxProc Command + Agars
# (Yebo) (Yebo) (cha) (never) (100)
# ===================================================== ========================
smtp      inet  n       -       y       -       -       smtpd
# I-SMTP INET N - Y - 1 Postscreen
# I-SMTPD Pass - - Y - - I-SMTPD
# DNSBLOG UNIX - - Y - 0 DNSBlog
# tlsproxy unix - - y - 0 tlspoxy
# Khetha eyodwa: Nika amandla ukuhanjiswa kwamakhasimende we-loopback kuphela, noma kunoma yiliphi iklayenti.
# 127.0.0.1.0.1:SUBUSIZO
submission inet n       -       y       -       -       smtpd
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_wrappermode=no
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
# -O syslog_name = postfix / ukuhanjiswa
# -O smpd_tls_secechel = encrypt
# -Ombd_sasl_auth_able = yebo
# -O smtpd_tls_auth_only = yebo
# -O smtpd_reject_unlisted_recipied = cha
# -Omsm_client_restrictions = $ mua_client_restriction
# -A-smtpd_helo_restrictions = $ mua_helo_rectrications
# -Omsm_sender_restrictions = $ mua_sendender_restriction
# -Ukugcina i-smtpd_recipiet_restrictions =
# -Uku-_rethay_restrictions = Imvume_Sasl_auuncentEd, yenqaba
# -O mpirre_macro_daemon_name = isuka
# Khetha eyodwa: Nika amandla ama-SMTPs amaklayenti we-loopback kuphela, noma kunoma yiliphi iklayenti.
# 127.0.0.1.1:SMTS INet N - Y - - I-SMTPD
# I-SMTPS INet N - Y - - I-SMTPD
# -O syslog_name = postfix / smtps
# -O mpwpd_tls_wrappermode = yebo
# -Ombd_sasl_auth_able = yebo
# -O smtpd_reject_unlisted_recipied = cha
# -Omsm_client_restrictions = $ mua_client_restriction
# -A-smtpd_helo_restrictions = $ mua_helo_rectrications
# -Omsm_sender_restrictions = $ mua_sendender_restriction
# -Ukuqala ukushiswa kwe-SMTPD_Recipont_Trastryns =
# -Uku-_rethay_restrictions = Imvume_Sasl_auuncentEd, yenqaba
# -O mpirre_macro_daemon_name = isuka
# I-628 inet n - y - - qmqpd
pickup    unix  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
# QMGRR UNIX n - N 300 1 OQMG
tlsmgr    unix  -       -       y       1000?   1       tlsmgr
rewrite   unix  -       -       y       -       -       trivial-rewrite
bounce    unix  -       -       y       -       0       bounce
defer     unix  -       -       y       -       0       bounce
trace     unix  -       -       y       -       0       bounce
verify    unix  -       -       y       -       1       verify
flush     unix  n       -       y       1000?   0       flush
proxymap  unix  -       -       n       -       -       proxymap
proxywrite unix -       -       n       -       1       proxymap
smtp      unix  -       -       y       -       -       smtp
relay     unix  -       -       y       -       -       smtp
        -o syslog_name=postfix/$service_name
# -O smtp_helo_timeout = 5 -O smtp_connect_TonTout = 5
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
postlog   unix-dgram n  -       n       -       1       postlogd
# 
# ===================================================== ===================
# I-interface ku-software engeyona eyethu. Qiniseka ukuthi uhlola le ncwadi
# Amakhasi e-software engeyona eye-postfix ukuthola ukuthi yiziphi izindlela ezifunayo.
# 
# Izinsizakalo eziningi ezilandelayo zisebenzisa ukulethwa kwePostfix Pipe (8)
# i-ejenti.  Bona ikhasi lamapayipi (8) lowesifazane ukuthola imininingwane mayelana ne- $ {emukeli}
# nezinye izinketho zemvilophu yemiyalezo.
# ===================================================== ===================
# 
# I-Maildrop. Bona ifayela le-postfix postdrop_readme ngemininingwane.
# Futhi chaza ku-Main.cf: I-Maildrop_Destination_reciit_Imifient_limit = 1
# 
maildrop  unix  -       n       n       -       -       pipe
  flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
# 
# ===================================================== ===================
# 
# Izinguqulo zakamuva zeKoresi zingasebenzisa ukungena kwe- "LMTP" Master.cf okukhona.
# 
# Cacisa ngeCyrus.conf:
# I-LMTP CMD = "LMTPD -A" Lalela = "Localhost: LMTP" proto = TCP4
# 
# Cacisa nge-Main.cf eyodwa noma ngaphezulu kokulandelayo:
# I-Mailbox_Transport = LMTP: Inettsha: I-Localhost
# Virtual_transport = LMTP: Inettsha: Localhost
# 
# ===================================================== ===================
# 
# UKores 2.1.5 (Amos Gouauaux)
# Futhi chaza ku-Main.cf: CYRUS_Destination_reciiPip_Imifient_limit = 1
# 
# CYRUS UNIX - N N - - Ipayipi
# Amafulegi = I-DRX USER = CYRUS ALG = / CYRUS / BIN / BIN / REPS -E -E-REP $ {Umthumeli} $ {Umsebenzisi}
# 
# ===================================================== ===================
# Isibonelo esidala sokulethwa nge-Cyrus.
# 
# Old -cyrus unix - n n - - ipayipi
# Amafulegi = R umsebenzisi = cyrus argv = / cyrus / bin / ukuletha -Ukuhambisa -M $ $ $} $ {umsebenzisi}
# 
# ===================================================== ===================
# 
# Bona ifayela le-Postfix UUCP_UCREDE ngemininingwane yokucushwa.
# 
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
# 
# Ezinye izindlela zokulethwa kwangaphandle.
# 
ifmail    unix  -       n       n       -       -       pipe
  flags=F user=ftn argv=/usr/lib/ifmail/ifmail -r $nexthop ($recipient)
bsmtp     unix  -       n       n       -       -       pipe
  flags=Fq. user=bsmtp argv=/usr/lib/bsmtp/bsmtp -t$nexthop -f$sender $recipient
scalemail-backend unix -       n       n       -       2       pipe
  flags=R user=scalemail argv=/usr/lib/scalemail/bin/scalemail-store ${nexthop} ${user} ${extension}
mailman   unix  -       n       n       -       -       pipe
  flags=FRX user=list argv=/usr/lib/mailman/bin/postfix-to-mailman.py ${nexthop} ${user}
Kanye nokucushwa kwe-OpendKim. I-OpenGKIM ikhomba amaseva we-imeyili anezinkinobho zesizinda ukubenza baphephe ngokwengeziwe. Ngaphandle kwawo, i-imeyili ayisayiniwe futhi kungenzeka ingakwenzi kubhokisi lokungenayo.

nano config/etc_default_opendkim
Faka le migqa:

# Qaphela: Leli yifayela lokucushwa lefa lefa. Ayisetshenziswa yi-Opendkim
# insizakalo ye-systemd. Sicela usebenzise amapharamitha wokucushwa ahambisanayo ku
# /etc/opendkim.conf esikhundleni.
# 
# Phambilini, umuntu angahlela izilungiselelo ezizenzakalelayo lapha, bese wenza
# /Lib/opendkim/opendkim.service.service.genice ukukhiqiza amafayela we-systemd override ku-
# /etc/systemd/system/opendkim.service.service.cconf kanye
# /etc/tmpfiles.d/opendkim.conf. Ngenkathi lokhu kusenokwenzeka, manje sekukhona
# Kunconywe ukuguqula izilungiselelo ngqo ku /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Shintshela ku / var / spool / runfix / run / opendkim ukusebenzisa i-Unix Socket nge
# postfix ku-chroot:
# Rundir = / var / spool / run / opendkim
RUNDIR=/run/opendkim
# 
# Ukungaguquki ukucacisa enye isokhethi
# Qaphela ukuthi ukusetha lokhu kuzokweqa inani lesokhethi ku- opendkim.conf
# Okuzenzakalelayo:
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
# Lalela kuzo zonke izikhala eziphakathi kwePort 54321:
# Isokhethi = inet: 54321
# Lalela ku-Loopback ePort 12345:
# Isokhethi = inet: 12345 @ Localhost
# Lalela u-192.0.2.1 yiPort 12345:
# Isokhethi = inet: 12345@192.0.2.1
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=

nano config/etc_dovecot_conf.d_10-master.conf
Faka le migqa:

0-master.conf 
# Okuzenzakalelayo_process_limit = 100
# Okuzenzakalelayo_client_limit = 1000

# Okuzenzakalelayo vsz (usayizi wememori ebonakalayo) umkhawulo wezinqubo zensiza. Lokhu ikakhulukazi
# ihlose ukubamba nokubulala izinqubo ezikhukhumezayo zenkumbulo ngaphambi kokuba zidle
# konke.
# Okuzenzakalelayo_vsz_limit = 256m

# Umsebenzisi we-Login usetshenziswa ngaphakathi ngezinqubo zokungena ngemvume. Lokhu kungalawulwa kakhulu
# umsebenzisi ohlelweni lwe-dovecot. Akufanele kube nokufinyelela kunoma yini.
# ezenzakalelayo_login_user = dovenull

# Umsebenzisi wangaphakathi usetshenziswa izinqubo ezingatholakali. Kufanele ihlukaniswe kusuka
# Umsebenzisi we-Login, ukuze izinqubo zokungena ngemvume azikwazi ukuphazamisa ezinye izinqubo.
# ezenzakalelayo_intnal_user = dovecot

service imap-login {
  inet_listener imap {
    # I-Port = 143
  }
  inet_listener imaps {
    # I-Port = 993
    # ssl = yebo
  }

  # Inani lokuxhuma okufanele lisingatha ngaphambi kokuqala inqubo entsha. Ngokuvamile
  # Amanani kuphela awusizo angu-0 (angenamkhawulo) noma 1. 1 aphephile kakhulu, kepha 0
  # Kuyashesha. <DOC / Wiki / LoginProcess.txt>
  # I-Service_Count = 1

  # Inani lezinqubo ukuze uhlale ulinde ukuxhumeka okuningi.
  # Inqubo_min_avail = 0

  # Uma usetha insiza_count = 0, kungenzeka ukuthi udinga ukukhulisa lokhu.
  # vsz_limit = $ ezenzakalelayo_vsz_limit
}

service pop3-login {
  inet_listener pop3 {
    # I-Port = 110
  }
  inet_listener pop3s {
    # I-Port = 995
    # ssl = yebo
  }
}

service submission-login {
  inet_listener submission {
    # I-Port = 587
  }
}

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

  # Dala isilaleli se-inet kuphela uma ungakwazi ukusebenzisa i-UNIX Socket engenhla
  # Inet_lister LMTP {
    # Gwema ukwenza i-LMTP ibonakale kuyo yonke i-Intanethi
    # Ikheli =
    # I-Port =
  # }
}

service imap {
  # Iningi lememori liya ku-MMAP () amafayela ange. Ungadinga ukwandisa lokhu
  # khawulela uma unebhokisi elikhulu leposi.
  # vsz_limit = $ ezenzakalelayo_vsz_limit

  # UMax. Inani lezinqubo ze-IMAP (ukuxhumana)
  # inqubo_limit = 1024
}

service pop3 {
  # UMax. Inani lezinqubo ze-POP3 (ukuxhumana)
  # Inqubo_limit = 1024
}

service submission {
  # UMax. Inani lezinqubo zokungenisa ze-SMTP (ukuxhumana)
  # Inqubo_limit = 1024
}

service auth {
  # I-Author_socket_pap ekhomba kulolu hlelo lokusebenza lweSocket ngokuzenzakalelayo. Ngokuvamile
  # esetshenziswa yiDoveCot-LDA, i-DOVEADM, okungenzeka ukuthi kungenzeka inqubo ye-IMAP, njll. Abasebenzisi abanayo
  # izimvume ezigcwele kule sokhethi ziyakwazi ukuthola uhlu lwawo wonke amagama abasebenzisi futhi
  # Thola imiphumela yokubheka komuntu wonke umuntu wonke.
  # 
  # Imodi yokuzenzakalelayo engu-0666 ivumela noma ngubani ukuthi axhumeke kwisokhethi, kepha
  # Ukubukeka kwe-userdb kuzophumelela kuphela uma umsebenzisi ebuyisela inkambu ye- "UID"
  # Iqondanisa i-UID yenqubo yokushayela ucingo. Futhi uma i-UID yomshayeli noma i-gid ifana
  # I-USID kasokhethi noma i-gid ukubheka okuphumelelayo. Noma yini enye ebangela ukwehluleka.
  # 
  # Ukunikeza umshayeli wemvume ephelele ukubheka bonke abasebenzisi, setha imodi ku-
  # okunye ngaphandle kwe-0666 ne-dovecot kuvumela i-kernel iphoqelele
  # Izimvume (e.g. 0777 ivumela wonke umuntu izimvume ezigcwele).
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

service auth-worker {
  # Inqubo yabasebenzi ye-Author iqhutshwa njengempande ngokuzenzakalelayo, ukuze ikwazi ukungena
  # / njll / isithunzi. Uma lokhu kungadingekile, umsebenzisi kufanele aguqulwe abe
  # $ Default_undal_user.
  # Umsebenzisi = izimpande
}

service dict {
  # Uma kusetshenziswa i-dict proxy, izinqubo zemeyili kufanele zikwazi ukufinyelela isokhethi zalo.
  # Isibonelo: Imodi = 0660, i-GROUP = I-VPLANE NE-MOLLE mail_access_groups = vmail
  unix_listener dict {
    # Imodi = 0600
    # Umsebenzisi =
    # iqembu =
  }
}
Nakulokhu futhi, qiniseka ukufaka isizinda kuwo wonke lawa mafayela, i-femmebabe.com, ngesizinda osikhethile. Hlela ifayela elilandelayo, i-devecot's Config,

nano config/etc_dovecot_dovecot
Bese ufaka le migqa

## Ifayela lokucushwa le-OveCot

# Uma ushesha, bheka i-http: //wiki2.dovecot.org/quickconfiguration

# I- "DOVECONF -N" umyalo unikeza umphumela ohlanzekile wezilungiselelo ezishintshiwe. Yisebenzise
# Esikhundleni sokukopisha & ukunamathisela amafayela lapho kuthunyelwa ohlwini lwamakheli e-dovecot.

# '# 'umlingiswa nakho konke ngemuva kokuthi kuphathwe njengokuphawula. Izikhala ezingeziwe
# futhi amathebhu awanakwa. Uma ufuna ukusebenzisa noma yikuphi kwalokhu ngokusobala, faka
# value inside quotes, eg.: key = "# UChar and Trailing Whitespace "

# Izilungiselelo eziningi (kodwa hhayi zonke) zingaphezulu kwezivumelwano ezihlukile kanye / noma
# Umthombo / I-IPS ukuphela ngokubeka izilungiselelo ngaphakathi kwezingxenye, ngokwesibonelo:
# I-Protocol IMAP {}, Local 127.0.0.1 {}, kude kude ne-10.0.0.0/8 {}

# Amanani Okuzenzakalelayo aboniswa ukulungiswa ngakunye, akudingekile ukuze kuncishiswe
# lezo. Lokhu kuhlukile kulokhu: Azikho izigaba (e.g.9Space {})
# noma izilungiselelo ze-plugin zengezwa ngokuzenzakalelayo, zibhalwe kuphela njengezibonelo.
# Izindlela futhi ziyizibonelo nje ezizenzakalelayo zangempela ezisuselwa ekuhlelweni
# Izinketho. Izindlela ezibalwe lapha zilungiselela i-cokulunging - Preefix = / USR
# -Sysysconfdir = / njll --LocalStatedir = / var

# Nika amandla amaphrothokholi afakiwe
!include_try /usr/share/dovecot/protocols.d/*.protocol

# Uhlu lwe-Comma oluhlukanisiwe lwama-IP noma ama-hostems lapho ungalalela khona ukuze uxhumane.
# "*" Kulalela kuzo zonke izindawo zokuxhumana ze-IPV4, "
# Uma ufuna ukucacisa amachweba angewona ama-angewona noma yini eyinkimbinkimbi,
# Hlela i-Confe.D / Master.Conf.
# Lalela = *, ::

# Isiqondisi esisesisekelo lapho ugcina khona idatha ye-Runtime.
# base_dir = / var / run / dovecot /

# Igama lalesi simo. Kwi-Multi-Instance Setup Doveadm neminye imiyalo
# ingasebenzisa -I <instance_name> Ukukhetha ukuthi yisiphi isibonelo esisetshenziswayo (enye indlela
# to -c <config_porpath>). Igama lesibonelo libuye lengezwe ezinqubweni ze-dovecot
# ekuphumeni kwe-PS.
# Isibonelo_name = i-dovecot

# Umyalezo wokubingelela wamakhasimende.
# I-Login_Greeting = I-Dovecot isilungile.

# Uhlu Oluhlukaniswe Somlomo Lwamabanga Wenethiwekhi Othembekile. Ukuxhumana okuvela kulezi
# Ama-IP avunyelwe ukweqa amakheli abo e-IP namachweba (ngokungena ngemvume futhi
# Okokuhlola ubuqiniso). khubaza_plaintaix_plauth_auth futhi ayinakwa
# Lawa manethiwekhi. Imvamisa ungacacisa amaseva wakho we-IMAP Proxy lapha.
# I-Login_trust_networks =

# Uhlu Oluhlukaniswe Somnyango Lokungena Ukungena Ukufinyelela Ama-Sockets (E.G. TCPWRAP)
# I-Login_Appss_sockets =

# Nge-proxy_maybe = yebo uma ukuphela kommeleli kufanele kufane nanoma yimiphi le ama-IPS, ungenzi
# Ukusondela. Lokhu akudingekile ngokujwayelekile, kepha kungasiza uma uya lapho uya khona
# IP yi-e.g. I-IP yomthwalo we-load.
# I-Author_Proxy_ELLE =

# Khombisa izihloko zenqubo ethe xaxa (ku-PS). Njengamanje kukhombisa igama lomsebenzisi futhi
# Ikheli le-IP. Iwusizo ekuboneni ukuthi angobani empeleni asebenzisa izinqubo ze-IMAP
# (isib. Amabhokisi eposi abelwe noma uma uid eid esetshenziselwa ama-akhawunti amaningi).
# verbose_proctitle = cha

# Kufanele zonke izinqubo zingabulawa lapho inqubo ye-DEVOCOT Master ivala phansi.
# Ukubeka lokhu ku- "cha" kusho ukuthi i-dovecot ingathuthukiswa ngaphandle
# ukuphoqa ukuxhumana okukhona kwamakhasimende ukuvala (yize lokho kungaba khona
# Inkinga uma ukuthuthukiswa yi-e.g. ngenxa yokulungiswa kwezokuphepha).
# Shutdown_clients = Yebo

# Uma kungenjalo zero, run imeyili imiyalo ngokusebenzisa lokhu ukuxhumana okuningi kwiseva ye-doveadm,
# esikhundleni sokuzigijimela ngqo kwinqubo efanayo.
# doveadm_worker_count = 0
# I-Unix Socket noma Umgcini: Imbobo esetshenziselwa ukuxhuma kwiseva ye-Doveadm
# doveadm_socket_path = i-doveadm-server

# Uhlu Oluhlukanisiwe Somnyango Lokuhlukahluka Kwezemvelo Okugciniwe ku-DOVECOT
# Ukuqalisa futhi kudlule kuzo zonke izinqubo zengane yayo. Ungasipha futhi
# Ukhiye = Amabili Amabili ukuze uhlele izilungiselelo ezithile.
# Ngenisa_environment = Tz

## 
## Izilungiselelo Zeseva ye-Dictionary
## 

# Isichazamazwi singasetshenziswa ukugcina ukhiye = Uhlu lwenani. Lokhu kusetshenziswa ngabaningana
# Ama-plugins. Isichazamazwi singafinyeleleka ngokuqondile noma yize a
# iseva ye-Dictionary. Amagama esichazamazwi alandelayo we-dict block amamephu ku-URIS
# lapho kuseva kusetshenziswa. Lokhu kungabhekiswa kusetshenziswa i-URIS ngefomethi
# "Proxy :: <amagama>".

dict {
  # Quota = MySQL: /etc/dovecot/DoVecot-DICT-SQL.CONFT-XT
}

# Iningi lokucushwa kwangempela lifakwa ngezansi. Amagama efayela
# Kuhlelwe okokuqala ngenani labo le-ASCII futhi kwafakwa kulowo myalo. Iziqalo ze-00-
# Kumagama wamafayela kuhloselwe ukwenza kube lula ukuqonda uku-oda.
!include conf.d/*.conf

# Ifayela lokuzilungiselela lingazama futhi ukufakwa ngaphandle kokunikeza iphutha uma
# Akutholakalanga:
!include_try local.conf

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

protocols = imap pop3

# Ivumela i-DOVECOT ukuthi ilalele konke ukuxhumeka kokufaka (IPv4 / IPV6)

listen = *, ::
Faka iphasiwedi yomsebenzisi we-dovecot:

nano config/etc_dovecot_passwd
Ingxenye yokuqala yefayela, ngaphambi kwekholoni, igama lomsebenzisi. Ingxenye yokugcina, "i-PassPassword", isho iphasiwedi ongathanda ukuyinika iseva yemeyili yakho.

team:{plain}yourpassword
Okulandelayo, i-OpendKim Config

nano config/etc_opendkim.conf
Bese ufaka le migqa:

# Lokhu kucushwa okuyisisekelo kokusayina nokuqinisekisa. Kungaba lula
# iguqulwe ukuze ihambisane nokufakwa okuyisisekelo. Bheka i-Opendkim.conf (5) no
# /Usr/share/doc/opendkim/opendkim.conf.S.S..S.SAMPLE YOKUGCINA
# imibhalo yamapharamitha wokucushwa atholakalayo.

Syslog			yes
SyslogSuccess		yes
# Logwhw cha

# Amapharamitha ajwayelekile wokusayina kanye nokuqinisekisa. E-Debian, i- "kusuka" unhlokweni
# Okuphindwe okweqile, ngoba imvamisa kungukhiye ongumazisi osetshenziswa amasistimu wedumela
# ngakho-ke ngokuphepha okuthile okuzwela.
Canonicalization	relaxed/simple
Mode			s
SubDomains		no
OversignHeaders		From

# Ukusayina isizinda, isikhethi, kanye nokhiye (kuyadingeka). Isibonelo, yenza ukusayina
# Ngesizinda "Isibonelo.com" nge-Selector "2020" (2020._domaimainkey.ex samp.com),
# Usebenzisa ukhiye wangasese ogcinwe ku /etc/dkimpkeys/ex samp.private. Gronular amaningi
# Izinketho zokusetha zingatholakala ku-/Usr/Share/Doc/Opendkim/Readme.opendkim.
# Exxer.com exanger.com
# Okhethiwe ngo-2020
# KeyFile /etc/dkimpkeys/ex samp.private

# E-Debian, u-OpenKim ugijima njengomsebenzisi "Openkim". I-UMask ye-007 iyadingeka lapho
# Kusetshenziswa isokhethi yendawo nge-MTAS efinyelela esokhethi njengelungelo elingelona iqiniso
# umsebenzisi (ngokwesibonelo, postfix). Ungadinga ukwengeza umsebenzisi "Postfix" eqenjini
# "Opendkim" kuleso simo.
UserID			opendkim
UMask			007

# Isokhethi ngokuxhumeka kwe-MTA (kuyadingeka). Uma i-MTA ingaphakathi kwejele le-chroot,
# Kufanele kuqinisekiswe ukuthi isokhethi liyatholakala. E-Debian, postfix isebenza ngaphakathi
# I-chroot in / var / spool / postfix, ngakho-ke kuzofanela isokhethi le-Unix
# ilungiselelwe njengoba kukhonjisiwe kulayini wokugcina ongezansi.
# Socket Local: /run/opendkim/opendkim.sock
# I-Socket Inet: 8891 @ yendawo yendawo
# I-Socket Inet: 8891
Socket			local:/var/spool/postfix/opendkim/opendkim.sock

PidFile			/run/opendkim/opendkim.pid

# Ama-hots ongasayina kuwo kunokuqinisekisa, okuzenzakalelayo kungu-127.0.0.1. Bona
# Isigaba sokusebenza se-Opendkim (8) ukuthola eminye imininingwane.
# Yangaphakathi 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12

# I-trust anchor inika amandla i-DNSSEC. E-Debian, kunikezwe ifayela le-trust anchor
# ngephakeji le-DNS-Root-data.
TrustAnchorFile		/usr/share/dns/root.key
# Ama-nameservers 127.0.0.1

# Imephu yezizinda kusuka kumakheli kuya okhiye abasetshenziselwa ukusayina imiyalezo
KeyTable           refile:/etc/opendkim/key.table
SigningTable       refile:/etc/opendkim/signing.table

# Iqoqo lama-Batters angaphakathi kufanele asayinwe
InternalHosts       /etc/opendkim/trusted.hosts

nano config/etc_default_opendkim
Bese ufaka le migqa

# Qaphela: Leli yifayela lokucushwa lefa lefa. Ayisetshenziswa yi-Opendkim
# insizakalo ye-systemd. Sicela usebenzise amapharamitha wokucushwa ahambisanayo ku
# /etc/opendkim.conf esikhundleni.
# 
# Phambilini, umuntu angahlela izilungiselelo ezizenzakalelayo lapha, bese wenza
# /Lib/opendkim/opendkim.service.service.genice ukukhiqiza amafayela we-systemd override ku-
# /etc/systemd/system/opendkim.service.service.cconf kanye
# /etc/tmpfiles.d/opendkim.conf. Ngenkathi lokhu kusenokwenzeka, manje sekukhona
# Kunconywe ukuguqula izilungiselelo ngqo ku /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Shintshela ku / var / spool / runfix / run / opendkim ukusebenzisa i-Unix Socket nge
# postfix ku-chroot:
# Rundir = / var / spool / run / opendkim
RUNDIR=/run/opendkim
# 
# Ukungaguquki ukucacisa enye isokhethi
# Qaphela ukuthi ukusetha lokhu kuzokweqa inani lesokhethi ku- opendkim.conf
# Okuzenzakalelayo:
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
# Lalela kuzo zonke izikhala eziphakathi kwePort 54321:
# Isokhethi = inet: 54321
# Lalela ku-Loopback ePort 12345:
# Isokhethi = inet: 12345 @ Localhost
# Lalela u-192.0.2.1 yiPort 12345:
# Isokhethi = inet: 12345@192.0.2.1
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=
Lapho sikulungele ukusetha iseva yethu ye-Postfix, sizosebenzisa ikhodi engezansi, negama lesizinda elifanele elishumekiwe. Qala ngokwakha umbhalo

touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Manje, eNano, umhleli wombhalo, hlela leli fayela ngakho-ke kufaka phakathi igama lakho lesizinda esikhundleni se-femmebabe.com.

# ! / BIN / Bash
# Setha Postfix Postfix
cd $DIR
echo "Mail services configuration"
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.backup
sudo cp config/etc_postfix_main.cf /etc/postfix/main.cf
sudo cp config/etc_postfix_master.cf /etc/postfix/master.cf
sudo cp config/etc_default_opendkim /etc/default/opendkim
sudo cp config/etc_dovecot_conf.d_10-auth.conf /etc/dovecot/conf.d/10-auth.conf
sudo cp config/etc_dovecot_conf.d_10-master.conf /etc/dovecot/conf.d/10-master.conf
sudo cp config/etc_dovecot_dovecot.conf /etc/dovecot/dovecot.conf
sudo cp config/etc_dovecot_passwd /etc/dovecot/passwd
sudo cp config/etc_opendkim.conf /etc/opendkim.conf
sudo cp config/etc_default_opendkim /etc/default/opendkim
sudo adduser postfix opendkim
sudo mkdir /etc/opendkim
sudo mkdir /etc/opendkim/keys
sudo mkdir /etc/opendkim/keys/femmebabe.com
sudo mkdir /var/spool/postfix/opendkim
sudo echo "*@femmebabe.com     sendonly._domainkey.femmebabe.com" | sudo tee -a /etc/opendkim/signing.table
sudo echo "sendonly._domainkey.femmebabe.com    femmebabe.com:sendonly:/etc/opendkim/keys/femmebabe.com/sendonly.private" | sudo tee -a /etc/opendkim/key.table
sudo echo "127.0.0.1" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "localhost" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "" | sudo tee -a /etc/opendkim/trusted.hosts
sudo echo "*.femmebabe.com" | sudo tee -a /etc/opendkim/trusted.hosts
sudo chown -R opendkim:opendkim /etc/opendkim
sudo opendkim-genkey -b 2048 -d femmebabe.com -D /etc/opendkim/keys/femmebabe.com -s sendonly -v
sudo chmod go-rw /etc/opendkim/keys
sudo chown opendkim:opendkim /etc/opendkim/keys/femmebabe.com/sendonly.private
sudo chown opendkim:postfix /var/spool/postfix/opendkim
cd $DIR
sudo cp mailbox/* /var/mail/
sudo chown :users /var/mail/*
sudo chmod -R a+rwx /var/mail/*
sudo systemctl restart opendkim postfix dovecot
sudo cat /etc/opendkim/keys/femmebabe.com/sendonly.txt | tr -d '\n' | sed 's/\s//g' | sed 's/""//g' | awk -F'[)(]' '{print $2}'
Manje, gijimisa umbhalo ogcwalisiwe ukuze ulungiselele i-Postfix, Opendkim neDovecot.

./scripts/postfixsetup
Lapho lo mbhalo usuqedile, kokopisha umugqa wokugcina kunyathelisa bese unamathisela ukucushwa kwakho kwe-DNS njengenani lokutholwa ._doinay. Lona ukhiye we-OpendKim osetshenziselwa ukukhomba isizinda sakho lapho uthumela imeyili ephephile. Kuhle! Ezinsukwini ezimbalwa, kufanele ukwazi ukuthumela imeyili kusuka kuseva enikele konke kulungiselelwe kahle. Uma usanda kumisa i-DNS yeseva yemeyili yakho, kufanele kuthathe amahora angaphansi kwama-72 amarekhodi okuvuselela. Ngokuvamile kushesha kakhulu. Ungahlola ukuthi ngabe iseva yakho isebenza ngokusebenzisa lo myalo, ihlinzeke nge-imeyili yakho:

echo “test” | mail -s “Test Email” youremail@gmail.com
Uma konke kubonakala kusebenza kahle, kufanele ukwazi ukuthumela i-imeyili ngeseva yakho. Uma kungasebenzi, zama ukubheka izingodo ukubona ukuthi yini leyo phutha.

tail –lines 150 /var/log/mail.log
Lokhu kuzonikeza imininingwane ye-verbose mayelana ne-imeyili ethunyelwe yiseva nokuthi isebenza kahle yini. Kufanele ukwazi ukubona i-imeyili kubhokisi lakho lokungenayo futhi, uma kungenjalo, hlola ifolda yakho egaxekile. Uzodinga futhi ukumisa izilungiselelo zakho kuzilungiselelo zakho.Phy ngakho-ke iseva yakho ye-imeyili ingakhuluma nohlelo lwakho lokusebenza lwe-Django, iphrojekthi. Faka noma buyisela le migqa kuzilungiselelo zakho

EMAIL_HOST = DOMAIN
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_ADDRESS = 'team@femmebabe.com'
EMAIL_HOST_USER = 'team' # 'Love@mamashele.com'
EMAIL_HOST_PASSWORD = config['EMAIL_HOST_PASSWORD']
DEFAULT_FROM_EMAIL = '{} <{}>'.format(SITE_NAME, EMAIL_HOST_USER)
Qaphela ukuthi sisebenzisa ifayela le-Config ukuthola iphasiwedi. Masilayisha leli fayela kuzilungiselelo ezinjengalezi, ekuqaleni kwefayela.:

import os
import json

# Vula bese ulayisha i-Config
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
Ake sakhe leli fayela bese sengeza ukhiye oyimfihlo kulo, kanye nephasiwedi ye-imeyili. Ukukhiqiza ukhiye oyimfihlo, sebenzisa lo myalo, nganoma yibuphi ubude obuthanda ekugcineni:

openssl rand -base64 64
Manje, ukopisha umbhalo okhiqizwayo owenziwe futhi uhlele /etc/config.json

sudo nano /etc/config.json
Faka imigqa elandelayo kufayela lakho, ngokhiye ongenziwa i-openSSL ekhiqizwa njengokhiye oyimfihlo.

{
	"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
	"EMAIL_HOST_PASSWORD": "yourpassword"
}
Ifomathi ye-JSON ilula futhi kulula ukuyisebenzisa, singakwazi ukumemezela ezinye izinkinobho esifuna ukuzisebenzisa kuphrojekthi yethu ngale ndlela, futhi uzigcine zihlukile kumkhombandlela wethu wephrojekthi ukuze abanye abasebenzisi abakwazi ukubabhalela ngakho-ke abakwazi ukufundwa kusuka kusikhombi sethu sephrojekthi kuphela. Lokhu kunconywa ukuzijwayeza izinkinobho ze-API, esizosebenzisa ngazo ezingaphezu kwabambalwa lapha. Uzofuna futhi ukwehlisa iphrojekthi yakho ukuze uqiniseke ukuthi konke kugcinwa futhi uzokwazi ukubuyisa umsebenzi wakho ngokuhamba kwesikhathi noma ngabe awusafisi ukuqasha iseva.

sudo backup
Manje, zama ukuthumela i-imeyili ye-HTML kusuka kuseva yeWebhu, kuhlinzekwe ukuthumela eyodwa kusuka kulayini womyalo kuyasebenza. Buza isibonelo sakho somsebenzisi egobolondweni, bese uthumela i-imeyili ye-HTML kulowo msebenzisi nge-Django. Shintsha igama lami kwikhodi, uCharlotte, igama lakho lomsebenzisi.

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()
Uma umyalo wokuqala ungasebenzi, qiniseka ukuthi usebenzisa

source venv/bin/activate
Kunikezwe konke kusethwe kahle, manje uzothola i-imeyili yokwamukela ebhokisini lakho leposi elithunyelwe ngohlelo lwakho lokusebenza lwewebhu. Umsebenzi omuhle! Ufike kude. Bengifuna ukungeza, uma uke wahlangabezana nanoma yimaphi amaphutha nakancane ngenkathi usebenza kwiphrojekthi enjengale, unganqikazi ukucinga izimpendulo ucele usizo. I-Google, phakathi kwezinye izinjini zokucinga, izinsiza ezinhle zokufuna usizo lwezinhlelo. Mane nje useshe iphutha olitholayo, futhi uzokwazi ukubona ukuthi abanye abantu bayixazulula kanjani inkinga. Futhi, wamukelekile ukuthi ungithinte, othisha bakho (othisha, oprofesa, othisha), noma yibaphi oxhumewe kwi-Intanethi abatholakala ngosizo lwezinhlelo, noma bethola izinsizakusebenza ukuthola izixazululo zezinkinga ohlangabezana nazo. Ngiyakuqonda ukuthi lokhu akulula, kepha noma ngabe ufundile kulokhu futhi ungabhalanga noma iyiphi ikhodi, ufunda okuningi ngokwakha uhlelo lokusebenza lwewebhu kusuka ekuqaleni. Photha emuva, wenza okukhuluuJobe. Siyabonga ngokuthatha isikhathi sokufunda lesi siqondisi sokuthuthukiswa kweWebhu yesithathu. Ezinhlelweni ezizayo, ngizofaka ezinye zezibonelo ezibalulekile okuxoxwe ngazo ekuqaleni kwedokhumenti futhi sizongena ngokujulile emhlabeni we-software kanye ne-Hardware Development. Hlala ubukele ukuthi yini ozayo, futhi ngilangazelela ukukufundisa ukuthi ungakha kanjani isoftware emangalisayo. Sizokubona ngokulandelayo






Ngokuminyanisa
Ikhasi 1
Gxuma
Bona i-athikili ephelele
Qhubeka ufunde

Thenga | Thenga nge-crypto



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


(Chofoza noma cindezela ukuze ulande isithombe)
Ukuzijabulisa okuphrofeshinali, izithombe, amavidiyo, okulalelwayo, ukusakazwa bukhoma nokudlalwa kwegeyimu okungajwayelekile, kanye nokuskena kwe-ID, ukuthuthukiswa kwewebhu kanye nezinsizakalo zokutholwa.

Ngishiyele ithiphu ku-Bitcoin usebenzisa leli kheli: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Imigomo Yesevisi