Praktické webové hloubkové učení a zabezpečení příkladem

DaisyProfilová fotka

Podle Daisy

Příkladem praktického hlubokého učení a zabezpečení založeného na webu Třetí vydání Charlotte Harper 3. července 2024 Předmluva: Bezpečnostní úvahy při vytváření softwaru pro web jsou důležitou součástí plánu a provádění jakéhokoli webového vývojáře a zároveň vytvoří prototyp, který je pro praktické účely spolehlivý, stabilní a užitečný. Označení DOM (Objekt dokumentu), s implementací HTML, Javascript a CSS a také backend software implementující Python, C/C ++, Java a Bash, dává webovým vývojářům svobodu a sílu vytvářet širokou škálu projektů, které vyjadřují širokou škálu projektů, které vyjadřují širokou škálu projektů, které vyjadřují Kreativita, poskytovat snadné použití a funkčnost, zobrazovat pokoru a charakter a poskytovat snadné použití, stejně jako pohodlí a důležité služby, které jsou všechny atraktivní pro průměrnou Joe, koncový uživatel, který chce zabít čas nebo něco udělat na internetu, Obvykle na dotykovém zařízení pro smartphone. Většina lidí by ani nevěděla, kde začít, kdy chtějí vytvořit web od nuly,Měli by mít tendenci začít na webových stránkách jiné osoby a budovat něco omezeného ve funkčnost, spolehlivosti, snadném použití a zejména kreativitě, když mohli mít všechny nejnovější výkonné nástroje, aby mohli vybudovat něco užitečného, ​​aniž by došlo k tlačítku s tlačítky času a Zejména plýtvání penězi za placení za drahé předplatné softwaru, které jen málo lidí chtělo použít, vzhledem k jeho omezením v snadnosti použití a flexibilitě. Máte -li několik minut na přečtení této knihy a dozvíte se, co vás chci naučit, nebo dokonce se mnou osobně mluvit o vašich cílech a získat nějaké pokyny správným směrem a jste motivováni naučit se kódovat a psát svůj vlastní software , vezměte si tuto knihu domů a vyčleněte nějaký čas, abyste se naučili budovat další vlivné, výkonné, efektivní a důležité webové aplikace, webovou stránku, která je na vás a dělá přesně to, co chcete, a vyhovuje potřebám publika. O mně: Jsem vývojář softwaru s širokýmAnge zkušeností s C/C ++, Java, Python, HTML, CSS a JavaScript. Stavět webové stránky, které lidé chtějí používat, chtějí navštívit a dokonce jsem závislý na používání, abych se naučil, znovu vytvořil a zabíjel čas, a co je nejdůležitější, prodávám software. Pokud jste měli představu o tom, jak přesně jste chtěli, aby web vypadal a fungoval, byli jste ochotni mě podpořit, abych mohl splnit své vlastní potřeby, když splním vaše, a jste ochotni pokrýt náklady na spuštění webu sami, Postavil bych vám další YouTube, Tiktok, Twitter, Google nebo dokonce high-tech zabezpečovací aplikaci, jen máte přístup. Místo toho, abych se vám snažil prodat svůj čas, snažím se koupit váš: Chci vás promluvit, abyste sami vytvořili aplikaci (web) s informacemi, které již existují, a naučím vás, co musíte být nezávislým vývojářem softwaru, Podnikatel, který vede úspěšnou kariéru v jakékoli oblasti, po které toužíte. A dovolte mi to vyjasnit, vzdělání, které vám dám, bude neformální. Mohli byste jít do školy a naučit se to s aRmal Education, nebo si dokonce přečíst tuto knihu ve škole, dokončete své úkoly a hodně odnesete z vašeho vzdělání, ale nebudu vás formálně dát na horké sedadlo a požádám vás o dokončení úkolů. Nejsem tvůj profesor, můžete na mě myslet jako na přítele, který vás chce vést k kariéře poháněné vaším vlastním osobním úspěchem. A ani vám neprodávám úspěch, budete si ho muset koupit s časem. Naučit se kódovat má strmou křivku učení a nikdy nebylo snadné, nebo dokonce nemělo být. Musíte pracovat tak tvrdě, jak jen můžete, a pokračovat ve snaze o selhání a zkusit to znovu, i když jste frustrovaní, abyste se mohli učit a vytvářet aplikace sami. To je v povaze samotného kódu. Kód je spuštěn kompilátorem, který je navržen tak, aby poskytoval chybové zprávy programátora, a ty vás naučí, jak kódovat, i když jednoduše kopírujete chybu do vyhledávače a čtete příklady ostatních lidí. A musím říct, že nemusíte být velmi bohatí, chytří, úspěšní,en detail orientovaný nebo organizovaný pro vytvoření aplikace. Počítač se o tuto organizaci postará. Musíte jen vytrvat prostřednictvím pokusu a omylů, udržovat zaměření a tvrdě pracovat na tom, co děláte, a budete mít velmi úspěšnou kariéru v celém tom, co děláte. Kdo jsem: Uvědomuji si, že poslední sekce se týkala více o učení a vašem výuce z této knihy. Kdo jsem přesně? To je složitá otázka. Sám jsem nejasný, protože trpím zdravotními stavy, které mi mohou ztěžovat občas i kódovat nebo psát tuto knihu, a zároveň předkládat problémy se socializací a problémy s identitou, které ztěžují můj život, pokud jde o zavedení sebe . Stručně řečeno, pokud čtete tuto knihu, přinesli jste ji domů, protože jste ji převrátili a mysleli jste si, že je to užitečné, nebo i když jste právě přečetli tak daleko, jsem vám jako smýšlející jedinec, který vás chce vidět, jak vás uspěje všechno, co děláte. Sám jsem inženýr, softwarevývojář a student a já píšu tuto knihu pro ostatní studenty, kteří chtějí usnadnit svůj život tím, že mají příručku o softwaru, který potřebují, usnadňují jejich životy tím , užitečná, velká, funkční, soudržná a poutavá aplikace, která může řídit úspěch bez ohledu na linii podnikání. To je to, co dělám: stavím aplikace, abych pomohl sobě a ostatním lidem uspět. Jsem také autorem, i když je to moje první publikace, kterou mám v úmyslu dokončit, abych mohl dát dohromady své portfolio do užitečného dokumentu, a jsem také umělec. Přiznám se vám to, jsem jakousi podivný člověk. Nejsem dokonalý, běžel jsem s právem, dokonce mě vedl k odchodu z vysokých škol a univerzit a opustil státy, abych se pokusil udělat pro sebe jméno s větším úspěchem. Jsem od narození žena, nosím make -up, fotím sebe sama, nosím šaty a další dámské oblečení a já si uvědomuji sebe jako aMuž od přírody. V minulosti jsem měl problémy s ostatními lidmi, které vedly k boji s psaním a budováním WebApps, a omlouvám se, že jsem nemohl tuto knihu dostat do vašich rukou dříve: Potřeboval jsi to. Budete chtít číst a psát kód, který vypadá jako můj a funguje jako moje a dělá to samé, ale ještě lépe, protože pokud si můžete dovolit koupit tuto knihu místo toho, abyste si šťouchali klávesnici, jako já jen proto, abyste si vytvořili knihu sami, žádáte peníze Za to máte zdroje, které musíte ve svém životě úspěšní. Měl jsem nejrůznější problémy s vyrůstáním rodiny, zdravotními stavy, lékaři, média a zákon a můj kód hluboce odráží boj, který je feminismus a ženská povaha v rozděleném a frustrovaném světě. Tato kniha je však něco, na čem mi hluboce záleží, moje dítě, moje portfolio a mé živobytí, takže si vážím vaší úvahy, když si vezmete text domů a pečlivě se nad ní pórujete, abyste se od mě poučili. Mějte prosím na paměti, že nejsem dokonalý,Kniha bude mít chyby, revize a nová vydání a budete muset myslet se svým logickým mozkem, jak nejlépe můžete, abyste měli úspěšný zážitek s mým psaním. Také pochopte, že pro vás myslím dobře, i když při psaní čelíte výzvám. Přemýšlejte o tom takto: Když si můžete pronajmout počítačový systém, abyste udělali cokoli, co si můžete představit v digitálním prostoru, uložte všechny informace, se kterými se setkáte, #$%! YZ Nevyhnutelně se setkávají s obtížemi s informacemi, které přijímáte a dokonce publikujete. Říkám vám to, protože se setkávám se stejnými obtížemi. Použijte tuto knihu na vlastní riziko, pracujte s vaší komunitou a komunitami, které máte k dispozici k budování softwaru v bezpečném prostředí, a neberte věci osobně, když selžete nebo dokonce uspějete špatně: Tak jsem se dostal tak daleko , a proč vám mohu přinést tento text a pomoci vám uspět, aniž byste se odvrátili na cestě šílenství, která odcházíZničil jsem, roztrhaný a roztřepen, zatímco se setkávám s běžnými problémy, které každý dělá v globálním měřítku díky paralelistickému globálnímu měřítku sítě, na které budeme pracovat, internet. Možná nebudete velmi dobře obeznámeni s tím, kým jsem jen pár slov, ale doporučuji vás, abyste si přečetli dál, budete mě poznat, když mě budete i nadále číst a porozumět při vytváření vlastních projektů, abyste dokončili svou práci. S touto knihou nebudou žádné domácí úkoly, pokud vám vaši profesoři nebo učitelé nepřidělují, ale velmi doporučuji, abyste sami vytvořili portfolio projektů, jak si přečtete, a také projekt Capstone, který představuje, jak můžete Použijte to, co jste se naučili. Můj projekt Capstone je základem většiny toho, co si v této knize přečtete, protože zahrnuje kód z mých předchozích projektů, kódu, který jsem vytvořil a naučil se napsat metodicky ručně, a širokou škálu nápadů a tipů, které mi pomohly uspět do bodu, kdy mohu roztočit jednoduchou aplikaci, která jeUlly představoval a vzhled a chová se jako populární aplikace, kterou můžete vidět svého přítele nebo rodinu používat na internetu, inzerované vám nebo ve zprávách. Co je tato kniha: Tato kniha je příkladem. Zde najdete kód, pokyny, jak se naučit kódovat, informace o ladicím kódu a opravit chyby, kroky řešení problémů, pokyny, jak zálohovat a uložit kód, znovu se rozkládat, pokud někdo poruší váš kód, zabezpečit váš kód, nasadit nasazení, nasazení Váš kód, vytvářet interaktivní webové stránky, které jsou zábavné, poutavé a návykové, a získáte představu o tom, kdo jsem, proč je to důležité a jak vykreslit sebe, vaši aplikaci a obrázek společnosti, jakož i software, který vytvoříte V absolutním nejlepším světle, které by bylo nejatraktivnější pro vaše koncové uživatele, návštěvníky vašeho webu. V této knize předvedu řadu příkladů softwarového designu se zaměřením na web jako platformu i zabezpečení. Zkušenosti učení zahájíme budováním základníhoECT využívající Shell UNIX s funkcemi zálohování a skriptování. Poté prozkoumáme základní webovou stránku blogů, upgradujeme náš blog pomocí funkcí fotografií a videa a také použijeme tyto funkce k používání bezpečnostních řešení pomocí svobodného softwaru a zabezpečení našeho serveru pomocí modulu pluggable ověřování (PAM). Poté zkontrolujeme zpracování a zpracování souborů, prozkoumáme úpravy videa, dárcovský...
Praktické webové hloubkové učení a zabezpečení příkladem

Příkladem praktického hlubokého učení a zabezpečení založeného na webu Třetí vydání Charlotte Harper 3. července 2024 Předmluva: Bezpečnostní úvahy při vytváření softwaru pro web jsou důležitou součástí plánu a provádění jakéhokoli webového vývojáře a zároveň vytvoří prototyp, který je pro praktické účely spolehlivý, stabilní a užitečný. Označení DOM (Objekt dokumentu), s implementací HTML, Javascript a CSS a také backend software implementující Python, C/C ++, Java a Bash, dává webovým vývojářům svobodu a sílu vytvářet širokou škálu projektů, které vyjadřují širokou škálu projektů, které vyjadřují širokou škálu projektů, které vyjadřují Kreativita, poskytovat snadné použití a funkčnost, zobrazovat pokoru a charakter a poskytovat snadné použití, stejně jako pohodlí a důležité služby, které jsou všechny atraktivní pro průměrnou Joe, koncový uživatel, který chce zabít čas nebo něco udělat na internetu, Obvykle na dotykovém zařízení pro smartphone. Většina lidí by ani nevěděla, odkud začít, kdy chtějí vytvořit webScratch, mají tendenci začít na webových stránkách jiné osoby a stavět něco omezeného ve funkčnost, spolehlivosti, snadném použití a zejména kreativitě, když mohli mít všechny nejnovější výkonné nástroje, které mají k dispozici, aby vytvořily něco užitečného bez ztráty stisknutí času , a zejména plýtvání penězi, které platí za drahé předplatné softwaru, jen málo lidí chtělo použít stejně vzhledem k jeho omezením v snadnosti použití a flexibilitě. Máte -li několik minut na přečtení této knihy a dozvíte se, co vás chci naučit, nebo dokonce se mnou osobně mluvit o vašich cílech a získat nějaké pokyny správným směrem a jste motivováni naučit se kódovat a psát svůj vlastní software , vezměte si tuto knihu domů a vyčleněte nějaký čas, abyste se naučili budovat další vlivné, výkonné, efektivní a důležité webové aplikace, webovou stránku, která je na vás a dělá přesně to, co chcete, a vyhovuje potřebám publika. O mně: Jsem vývojář softwaruRozsah zkušeností s C/C ++, Java, Python, HTML, CSS a JavaScript. Stavět webové stránky, které lidé chtějí používat, chtějí navštívit a dokonce jsem závislý na používání, abych se naučil, znovu vytvořil a zabíjel čas, a co je nejdůležitější, prodávám software. Pokud jste měli představu o tom, jak přesně jste chtěli, aby web vypadal a fungoval, byli jste ochotni mě podpořit, abych mohl splnit své vlastní potřeby, když splním vaše, a jste ochotni pokrýt náklady na spuštění webu sami, Postavil bych vám další YouTube, Tiktok, Twitter, Google nebo dokonce high-tech zabezpečovací aplikaci, jen máte přístup. Místo toho, abych se vám snažil prodat svůj čas, snažím se koupit váš: Chci vás promluvit, abyste sami vytvořili aplikaci (web) s informacemi, které již existují, a naučím vás, co musíte být nezávislým vývojářem softwaru, Podnikatel, který vede úspěšnou kariéru v jakékoli oblasti, po které toužíte. A dovolte mi to vyjasnit, vzdělání, které vám dám, bude neformální. Mohli byste jít do školy a naučit se to s aFormální vzdělání, nebo dokonce přečíst tuto knihu ve škole, dokončete své úkoly a vezměte hodně z vašeho vzdělání, ale formálně vás nebudu dát na horké křeslo a nepožádám vás o dokončení úkolů. Nejsem tvůj profesor, můžete na mě myslet jako na přítele, který vás chce vést k kariéře poháněné vaším vlastním osobním úspěchem. A ani vám neprodávám úspěch, budete si ho muset koupit s časem. Naučit se kódovat má strmou křivku učení a nikdy nebylo snadné, nebo dokonce nemělo být. Musíte pracovat tak tvrdě, jak jen můžete, a pokračovat ve snaze o selhání a zkusit to znovu, i když jste frustrovaní, abyste se mohli učit a vytvářet aplikace sami. To je v povaze samotného kódu. Kód je spuštěn kompilátorem, který je navržen tak, aby poskytoval chybové zprávy programátora, a ty vás naučí, jak kódovat, i když jednoduše kopírujete chybu do vyhledávače a čtete příklady ostatních lidí. A musím říct, že nemusíte být velmi bohatí, chytří,Essent nebo dokonce detail orientovaný nebo organizovaný pro vytvoření aplikace. Počítač se o tuto organizaci postará. Musíte jen vytrvat prostřednictvím pokusu a omylů, udržovat zaměření a tvrdě pracovat na tom, co děláte, a budete mít velmi úspěšnou kariéru v celém tom, co děláte. Kdo jsem: Uvědomuji si, že poslední sekce se týkala více o učení a vašem výuce z této knihy. Kdo jsem přesně? To je složitá otázka. Sám jsem nejasný, protože trpím zdravotními stavy, které mi mohou ztěžovat občas i kódovat nebo psát tuto knihu, a zároveň předkládat problémy se socializací a problémy s identitou, které ztěžují můj život, pokud jde o zavedení sebe . Stručně řečeno, pokud čtete tuto knihu, přinesli jste ji domů, protože jste ji převrátili a mysleli jste si, že je to užitečné, nebo i když jste právě přečetli tak daleko, jsem vám jako smýšlející jedinec, který vás chce vidět, jak vás uspěje všechno, co děláte. Sám jsem inženýr,vývojář a student a já píšu tuto knihu pro ostatní studenty, kteří chtějí usnadnit svůj život tím, že mají příručku o softwaru, který potřebují, usnadňují jejich životy tím , užitečná, velká, funkční, soudržná a poutavá aplikace, která může řídit úspěch bez ohledu na linii podnikání. To je to, co dělám: stavím aplikace, abych pomohl sobě a ostatním lidem uspět. Jsem také autorem, i když je to moje první publikace, kterou mám v úmyslu dokončit, abych mohl dát dohromady své portfolio do užitečného dokumentu, a jsem také umělec. Přiznám se vám to, jsem jakousi podivný člověk. Nejsem dokonalý, běžel jsem s právem, dokonce mě vedl k odchodu z vysokých škol a univerzit a opustil státy, abych se pokusil udělat pro sebe jméno s větším úspěchem. Jsem od narození žena, nosím make -up, fotím sebe sama, nosím šaty a další dámské oblečení a já si uvědomuji sebe jako ažena od přírody. V minulosti jsem měl problémy s ostatními lidmi, které vedly k boji s psaním a budováním WebApps, a omlouvám se, že jsem nemohl tuto knihu dostat do vašich rukou dříve: Potřeboval jsi to. Budete chtít číst a psát kód, který vypadá jako můj a funguje jako moje a dělá to samé, ale ještě lépe, protože pokud si můžete dovolit koupit tuto knihu místo toho, abyste si šťouchali klávesnici, jako já jen proto, abyste si vytvořili knihu sami, žádáte peníze Za to máte zdroje, které musíte ve svém životě úspěšní. Měl jsem nejrůznější problémy s vyrůstáním rodiny, zdravotními stavy, lékaři, média a zákon a můj kód hluboce odráží boj, který je feminismus a ženská povaha v rozděleném a frustrovaném světě. Tato kniha je však něco, na čem mi hluboce záleží, moje dítě, moje portfolio a mé živobytí, takže si vážím vaší úvahy, když si vezmete text domů a pečlivě se nad ní pórujete, abyste se od mě poučili. Prosím, mějte na paměti, že nejsemTato kniha bude mít chyby, revize a nová vydání a budete muset přemýšlet se svým logickým mozkem, jak nejlépe můžete, abyste měli úspěšný zážitek s mým psaním. Také pochopte, že pro vás myslím dobře, i když při psaní čelíte výzvám. Přemýšlejte o tom takto: Když si můžete pronajmout počítačový systém, abyste udělali cokoli, co si můžete představit v digitálním prostoru, uložte všechny informace, se kterými se setkáte, #$%! YZ Nevyhnutelně se setkávají s obtížemi s informacemi, které přijímáte a dokonce publikujete. Říkám vám to, protože se setkávám se stejnými obtížemi. Použijte tuto knihu na vlastní riziko, pracujte s vaší komunitou a komunitami, které máte k dispozici k budování softwaru v bezpečném prostředí, a neberte věci osobně, když selžete nebo dokonce uspějete špatně: Tak jsem se dostal tak daleko , a proč vám mohu přinést tento text a pomoci vám uspět, aniž byste se odvrátili na cestě šílenstvíAVES ME Zničil, roztrhal a roztřepil se, zatímco se setkám s běžnými problémy, které každý dělá v globálním měřítku díky paralelistickému globálnímu měřítku sítě, na které budeme pracovat, internet. Možná nebudete velmi dobře obeznámeni s tím, kým jsem jen pár slov, ale doporučuji vás, abyste si přečetli dál, budete mě poznat, když mě budete i nadále číst a porozumět při vytváření vlastních projektů, abyste dokončili svou práci. S touto knihou nebudou žádné domácí úkoly, pokud vám vaši profesoři nebo učitelé nepřidělují, ale velmi doporučuji, abyste sami vytvořili portfolio projektů, jak si přečtete, a také projekt Capstone, který představuje, jak můžete Použijte to, co jste se naučili. Můj projekt Capstone je základem většiny toho, co si v této knize přečtete, protože zahrnuje kód z mých předchozích projektů, kódu, který jsem vytvořil a naučil se napsat metodicky ručně, a širokou škálu nápadů a tipů, které mi pomohly uspět do bodu, kdy mohu roztočit jednoduchou aplikaci, kteráPlně vystupoval a vypadá a chová se jako populární aplikace, kterou můžete vidět svého přítele nebo rodinu používat, na internetu, inzerované vám nebo ve zprávách. Co je tato kniha: Tato kniha je příkladem. Zde najdete kód, pokyny, jak se naučit kódovat, informace o ladicím kódu a opravit chyby, kroky řešení problémů, pokyny, jak zálohovat a uložit kód, znovu se rozkládat, pokud někdo poruší váš kód, zabezpečit váš kód, nasadit nasazení, nasazení Váš kód, vytvářet interaktivní webové stránky, které jsou zábavné, poutavé a návykové, a získáte představu o tom, kdo jsem, proč je to důležité a jak vykreslit sebe, vaši aplikaci a obrázek společnosti, jakož i software, který vytvoříte V absolutním nejlepším světle, které by bylo nejatraktivnější pro vaše koncové uživatele, návštěvníky vašeho webu. V této knize předvedu řadu příkladů softwarového designu se zaměřením na web jako platformu i zabezpečení. Zkušenosti učení zahájíme budováním základníhooject pomocí shell unix s funkcemi zálohování a skriptování. Poté prozkoumáme základní webovou stránku blogů, upgradujeme náš blog pomocí funkcí fotografií a videa a také použijeme tyto funkce k používání bezpečnostních řešení pomocí svobodného softwaru a zabezpečení našeho serveru pomocí modulu pluggable ověřování (PAM). Poté zkontrolujeme zpracování a zpracování souborů, prozkoumáme úpravy videa, dárcovským hlasem, skenování čárových kódů a rozpoznávání optických znaků, mimo jiné. Po cestě prozkoumáme API, která nám pomůže, aby byl náš software užitečnější a zabezpečenější, s bezplatnými a placenými možnostmi. Po cestě prozkoumáme fyzické zabezpečení a militantní nástroje, jako jsou návrh a výroba střelných zbraní a munice, včetně designu barelu a opakovače, designu věže a dronů a dalších principů, budeme integrovat s naším softwarem, abychom chránili náš software a prokázat sebeobranu a odolnost. Uděláme přestávky na cestě k budování her, 2d a 3DOdeslání motorů a pracujte s vestavěným hardwarem v případové studii příklady základního rozměrového vykreslovacího softwaru a elektronického vibračního masáže odlitého v silikonové gumě. Po cestě budeme také používat řešení strojového učení, která jsou již k dispozici, abychom lépe zajistili náš software. Budeme také používat skladové nástroje dostupné pro web, abychom tento proces zefektivnili a zajistili. Tato kniha je průvodcem k vašemu úspěchu při vytváření webové aplikace a integraci s profesionální sítí počítačů a vloženými mechanickými systémy a celkově průvodce vytvářením softwaru a zabudovaného hardwaru bez základních znalostí nebo předchozích zkušeností. Co tato kniha není: Pokud opravdu chcete mít web, můžete pouze nastavit jednoduchý obchod a prodat to, co potřebujete, zveřejnit blog, zveřejňovat fotografie nebo videa nebo jinak, aniž byste nikdy psali jediný řádek kódu. Tato kniha není tak. Tato kniha vás naučí, jak stavět software, který je užitečnější, plněPředstavené, funkční a bezpečné než jakýkoli software, který již můžete najít, protože nasazuje nejnovější software, který je stále prototypy, může být nákladné na běh v měřítku starších společností, v nichž se obsluhují, a nepřitahují se dozadu, spletité společnosti založené na Vydělávejte peníze pro lidi, kteří opravdu nic nedělají. Pokud tuto knihu postupujete pečlivě, budete chtít psát kód, výzkumný kód, vytvořit si vlastní aplikace a vyděláte peníze z toho, co děláte. Z této knihy vydělám peníze, a to i v raných fázích, protože obsahuje informace, které lidé potřebují a chtějí číst, a již kupuji, když nakupují nebo používají mé aplikace. Tato kniha pro vás nebude vytvořit aplikaci, ale nasměruje vás správným směrem a vyzbrojí vás pomocí nástrojů, které potřebujete, a dovednostmi a tipy, které usnadní váš vlastní úspěch při vytváření softwaru pro web, s každým řádkem Kód, který budete muset napsat jako příklad, připraveni k tomu, abyste byli spojeni do softwaru vy a vaši příznivci, hosty, klientelu,Riends, rodina, návštěvníci, dodavatelé a lidé z internetu chtějí používat a podporovat. Co se naučíte: Tato kniha vás naučí, jak stavět a prodávat software, opravdu funkční, užitečný software, nahrávání médií, bezpečnostní funkce, jako je rozpoznávání obličeje, strojové čitelné skenování čárových kódů, webové API pro ověření, nahrávání a vykreslení videa a fotografií a výměnu zpráv, jako je Bluetooth a komunikace v blízkosti pole (NFC). Tato kniha vás naučí, jak používat síťový počítač se zaměřením na Debian Linux, jak vytvářet bash kód, aby byl instalace a zálohování softwaru plynulý, automatizovaný vánek, jak vytvářet Python Code jako backend, který slouží dynamickým zprávám, styl Věci pěkně využívající styly CSS s bootstrap, umožňují přihlášení uživatelů a interaktivitu prostřednictvím síťových zařízení, vytvářejí interaktivní média a síť s jinými weby, které nabízejí bezpečnostní funkce, jako jsou textové zprávy pro ověření nebo jiné účely, skenování ID, moderování obrázků a videa, data, data, data, data, data, data, dataVýkupky, které udržují váš software v bezpečí, zpracování plateb, obchodování s kryptoměnou, asynchronní úkoly a další. Naučíte se, jak si vytvořit vlastní zařízení Bluetooth, s bateriemi, nabíječkami, mikrokontroléry, obvody, motory a senzory pomocí pájky, drátu a 3D tištěných a litých materiálů. Ukážu 3D principy designu aplikovaných na výrobu aditivních výroby a výroby nástrojů a smrti, takže jste schopni vyrábět své vlastní vložené, hardwarové zařízení s integrovanými bateriemi, nabíječkami, elektronickými obvody a funkční výstupy. a propojte je pomocí Bluetooth a webu. Konkrétně prozkoumáme dvě případové studie, vibrační masáž a domácí střelnou zbraň, které jsou naprogramované v OpenSCAD, které je k dispozici jako grafické rozhraní nebo nástroj příkazového řádku a lze je integrovat do webu pro rychlejší výsledky. Naučíte se, jak vytvořit a nasadit web od základů bez předchozí zkušenosti, učinit jej funkční, bezpečný, krásný, užitečný a nejvíceprakticky praktické. Naučíte se, jak používat strojové učení a počítačové vidění, aby byl web zabezpečený a praktičtější, zaznamenávat video a zvuk z vašeho webu, darovat svůj hlas, vytvářet hudbu a modulovat zvuk pro vytváření užitečných vzorků a jak prorazit hluk podle Využití dalších webových stránek k vytvoření nejlepší možné sítě webových stránek, které můžete propojit přímo s vašimi, abyste mohli sdílet všechny užitečné informace, které musíte nabídnout, a ještě důležitější je přivést lidi k vašemu softwaru a podnikání. Tato kniha bude nejvíce zaměřena na média, zabezpečení a strojové učení, které jsou hlavními třemi komponenty, které vám pomohou vytvořit užitečný software pro web zapojením správných uživatelů a uvolněním nesprávných způsobem, který je realistický, praktický, ruce a poutavé a zároveň automatické a robustní. Tato kniha vyučuje Unix, konkrétně Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript a řadu užitečných softwarových balíčků pron jako požadavky, stejně jako užitečný software Bash, jako je Git a FFMPEG. Naučím vás také, jak automaticky obchodovat s kryptoměnou a provádět platby v kryptoměně nebo z běžných debetních karet, zatímco pokud se rozhodnete, že se vám rozhodnete, že vaše návštěvníky splácím podíl na vašich příjmech. Naučím vás, jak vydělat peníze z vašeho webu prostřednictvím reklamy, jak připravit aplikaci pro vyhledávače a udělat ji rychle, zařadit se do prvního hodnocení toho, co vaši zákazníci budou hledat, aby vás našli, a hodnocení v tolika společných vyhledávání. Naučím vás, jak prodat váš software, inzerovat jej, apelovat na klienty, kteří hledají vaše služby, a na internetu si vytvořit jméno prostřednictvím cest, které již existují, jsou levné a dobře fungují. Naučím vás, jak uložit vaše data o cloudových počítačích, které pro vás fungují, a levně ukládat vaše data, jak naplánovat a vytvořit web, který dělá to, co vaši uživatelé chtějí a co chcete, a jak udržet vaše uživatele zapojenéIn -ing web klepněte na jejich telefony s oznámeními, e -mailem, textovými zprávami, telefonními hovory a dalšími cesty, aby vaše uživatele přivedli zpět na váš web, který vám umožní kliknout pouze za kliknutím na tlačítko zabezpečené pouze. Tato kniha se zaměří na praktičnost publikování a distribuce médií ve velkém množství, od textu po fotografie po videa po zvuk, udělá dobrý dojem na koncové uživatele (vaše klientela) a prodává se jakýmkoli způsobem, který děláte za účelem vytvoření Web, aplikace, která je reprezentativní pro vás a pouze vás, a způsobuje, že váš software a vaše společnost vypadají dobře nejlepším možným způsobem. Také se ode mě naučíte několik tipů a triků, z kódovacích tipů, praktické marnosti, jako je make -up a fotografie, modelování a herectví a další, což bude důležité pro zobrazení sebe a vaší společnosti v nejlepším možném světle pomocí všech dostupných nástrojů Pro vás distribuujete tolik obsahu, kolik potřebujete na zdravé rovnováze platforem, abyste mohli přinéste na uskutečnění bez většího úsilí, práce nebo peněz, než je nutné. Tato kniha se z nějakého důvodu nazývá „Praktický hluboký učení a zabezpečení založeného na webu“: Zabývá se učením se kódovat, konkrétně pro web, konkrétně se zaměřením na zabezpečení, z praktického hlediska, s příklady pracovního kódu, který slouží, který slouží, který slouží praktické účely uvedené v textu. Komponenta učení tohoto textu také zahrnuje strojové učení, kód, který vám ukážu, jak běžet na web, který bude zpracovávat počítačové vidění, rozpoznávání obličeje, moderování obrázků a videa, vylepšení obrazu, vylepšení rozlišení, titulek obrazu a další úkoly jako další úkoly jako Metriky predikce pocházející z obrázků, jako je povaha obrázku jako autentický, počítačově přenosný obrázek nebo optická kopie (fotografie obrázku nebo tištěné fotografie). Strojové učení je velmi důležité, pokud jde o zabezpečení webu a zabezpečení softwaru, protože mohou předškolní úkoly, které byly jinak nemožné. Váš počítačPřihlaste se s přístupovým kódem, ale může být bezpečnější jej použít, pokud vás přihlásí do vaší tváře. Počítač serveru můžete vytvořit tento bezpečný, počítač, který by vás normálně požádal o uživatelské jméno a přihlášení a přihlášení vás, možná s potvrzovacím tokenem pro každou novou přihlašovací nebo novou IP adresu, ale pokud stavíte rozsáhlé, snadno, snadno Používání, zásadně bezpečné a výkonný software, to může stačit. Svázání softwaru příliš úzce s softwarem někoho jiného, ​​jako je e -mailová služba nebo služba textových zpráv, nestačí k zajištění zabezpečení softwaru nebo kohokoli (jakýkoli web, který používáte). Každý, kdo staví software, který je bezvadně bezpečný, má nějaký pocit, co to znamená. Software je ze své podstaty nejistý, protože zařízení a účty, které k němu používají, nejsou vždy k dispozici, mohli by být v rukou kohokoli, kdo má špatný záměr pro software, a proto mohou představovat riziko pro samotný software. To je něco zaměřeného na tuto knihu. Síťový počítač je ve výchozím nastaveníZajištěno dlouhým klíčovým tokenem, volaným a SSH nebo zabezpečeným klíčem Shell a je jinak nejlépe zabezpečen webovým serverem, protože webový server poskytuje otevřený přístup a stavěcí nástroje pro zabezpečení umění běžící na samotném serveru. Webový server má přístup k webovému prohlížeči uživatele, který je pravděpodobně nejvýkonnější součástí zařízení uživatele, protože je to místo, kde uživatel má přístup k síťovému softwaru. Tato sada nástrojů může vykreslit text, webové stránky, které vidíte, a může také zaznamenávat obrázky, zvuk a video (jako je fotografie obličeje nebo ID stavu), může číst a zapisovat do rozhlasových zařízení Bluetooth a může číst a zapisovat do pole blízké pole Transpondérské značky, levné klíčové karty, FOBS, nálepky, prsteny a dokonce i implantáty čipů s jedinečnými sériovými čísly, které lze číst a napsat s údaji generovanými a ověřenými webovým serverem vázaným na web. Pomocí všech nástrojů, které máte k dispozici, se s touto knihou vybavíte znalostmi k vytvoření zabezpečeného webu a celkově aUre síťový počítačový systém, který funguje pro vás, dělá vaše nabídky a vypadá a cítí se dobře. Kde začít: Jste vítáni, abyste přeskočili přes sekci, kterou začnu tuto knihu nebo jakoukoli sekci, na přesný kód, který potřebujete, zejména pokud máte zkušenosti s kódováním před nebo jakýmkoli z výše uvedených nástrojů, které budu podrobně popisovat v této knize jako jako stejně jako dokumentování případů použití a jejich praktických příkladů. Pokud nemáte zkušenosti s psaním kódu, vřele doporučuji, abyste si přečetli celou tuto knihu, a zejména doporučuji, abyste si přečetli předchozí sekce, abyste se ujistili, že je tato kniha pro vás pravá. Pokud tato kniha pro vás není pravá, zvažte ji na darování příteli nebo příbuznému, který by měl zájem dozvědět se o samotném vývoji webových stránek, a dokonce zvažte, zda si ji půjčíte zpět a naučíte se od nich, aby vyplnili mezery, kde jsem vás selhal jako a Učitel nebo jiní učitelé to udělali přede mnou. Začněte, kde chcete, každá část této knihy bude užitečná, pokud máte v úmyslu vybudovat užitečnéPP a zvažte, že nejlepší aplikace jsou vytvořeny s ohledem na koncový uživatel: Znáte svého zákazníka. Teď mě znáš, znáš tuto knihu a jste připraveni začít. Chcete -li začít, uchopte počítač (dokonce i nejlevnější notebook z obchodu s krabicí, Amazon nebo staré plochy a nastavte jej způsobem, který pro vás funguje. Jak číst tuto knihu: Text zvýrazněn, označuje, že text patří do příkazového řádku, kde napíšete kód, který spustí. Příkazový řád je silně zaměřen na klávesnici a vyžaduje jen málo kliknutí, zrychlení pracovního postupu a usnadnění věcí na vás. Začínáme: Pojďme se ponořit. Začneme stavebním kódem na místním počítači a začneme bez vytváření webových stránek připojených k internetu. To je bezpečnější začít, nic nestojí a je pro vás snadné. V závislosti na operačním systému bude dostat se do skořápky bash trochu odlišné. Pro Mac OS doporučuji nainstalovat virtuální stroj v tomto bodě, protože získáte největší kompatibilituvirtuální stroj. Různí poskytovatelé, jako jsou VirtualBox a Paralells, pro vás mohou spustit virtuální stroj, i když je také možné nainstalovat Ubuntu přímo na stroj, pokud dáváte přednost použití nativního prostředí, které se doporučuje k vytvoření rychlého a zefektivněného zážitku. Pokud používáte Linux nebo Windows, které doporučuji, mělo by být docela snadné vytvořit projekt. Otevřete svůj terminál, upravte velikost, jakmile vidíte za vhodné, a začněte po kroku 2.. Pokud používáte Windows, postupujte prosím na krok 1. Krok 1: - Pouze uživatelé Windows V systému Windows, otevřený příkazový řád jako administrátor a typ WSL --instalace Krok 2: - Pokračujte zde nebo přeskočte krok 1, pokud nepoužíváte Windows V otevřeném terminálu (v závislosti na vašem operaci, nazvaném Ubuntu ve Windows, terminál v Mac nebo Linuxu nebo podobném názvu), začněte vytvořením projektu. Děláme to s příkazem MKDIR, který vytváří adresář. Pokud potřebujete vytvořit adresář pro uložení vašeho projektu, který se doporučuje, použijtepříkaz CD pro změnu na adresář a a CD/PATH/TO/ADIGENTORY - Cesta je složky (soubory), které předcházejí vašemu cílovému adresáři, vaše výchozí cesta je ~ nebo/home/uživatelské jméno (kde uživatelské jméno je vaše uživatelské jméno). Chcete -li se změnit na výchozí adresář, zadejte CD nebo CD ~ Příklad Mkdir - Nahraďte „příklad“ názvem adresáře Nyní máte pracovní adresář pro svůj projekt. Být tak důležité, aby byl tento adresář uložen v případě, že musíte přepnout na jiný stroj nebo nasadit kód, který píšete, takže je připraven na web, vytvoříme skript, který zálohuje váš adresář v několika příštích krocích. Vytváření skriptu však vyžaduje trochu kódu a kód musí být automatizován, aby byl co nejužitečnější. Pojďme tedy nejprve vytvořit skript, abychom vytvořili skripty. Začněme vytvořením skriptu a jeho spuštění. K tomu použijeme sudo, chmod a dotek a zavoláme skript


sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Nyní jsme vytvořili skript, učinili ho spustitelný a jsme připraveni jej upravit. Nano je textový editor, který vám umožní upravit text bez kliknutí, což je mnohem snazší než použití grafického uživatelského rozhraní. Chcete -li upravit soubor s Nano, použijte Nano a poté cestu k souboru. Chcete -li vytvořit skript, který vytváří skript, je to docela podobné tomu, aby byl náš skript na prvním místě. Použijeme stejný kód jako výše a nahradíme název skriptu „Ascript“ parametrem argumentu, $ 1. To nám umožňuje zavolat skriptu zadáním jednoduše sudo ascript Newscript, kdy můžeme vytvořit jakýkoli nový skript nahrazením „Newscript“ názvem vašeho skriptu. Kód v Nano by měl vypadat jako:

sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
A pro uzavření Nano můžeme podržet kontrolní klíč a stisknout X, poté Y, abychom označili, že ukládáme soubor a stiskne návrat. Nyní místo zadání těchto tří příkazů k úpravě skriptu budeme moci zadat ascript sudo ascript, abychom znovu upravili skript. To funguje! A jakýkoli nový skript lze snadno spustit na volání do shell. Uložte naši práci hned teď: Pojďme napisovat záložní skript, abychom uložili náš nový skript a poté jej zálohovali do našeho adresáře projektu a zálohovali také záložní skript.

sudo ascript backup
Nyní v Nano:

sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Kde/PATH/TO/ARDECTORY je cesta k projektu, který jste vytvořili s MKDIR. Později se naučíme, jak zkopírovat opakované cesty, jako je tato, smyčkou a seznamem, což je méně kódu, ale prozatím to udržíme jednoduché a máme několik řádků. Chcete -li spustit tento skript a zálohovat kód, uložte soubor v Nano s ovládacím prvkem+x, y a vraťte se a do shell zadejte níže

backup
Pokud jste při čtení této knihy vůbec vyzváni k hesla a sledujete ve shellu, zadejte své uživatelské heslo správně, budete mít tři pokusy, než budete muset příkaz znovu spustit. Pokud budete potřebovat dvakrát, můžete použít šipky nahoru a dolů k opakování příkazů a úpravy. Jednoduché stiskněte nahoru a dolů přerušovaně a vyberte příkaz, před úpravou příkazu pravým, levými šipkami a smazat klíč i klávesnici a spuštěním s návratem. Gratuluji! Podařilo se vám vytvořit úžasný záložní skript, který zálohuje dva důležité skripty shellu ve vašem pracovním adresáři. Když se projekt zvětšuje, můžeme se věci pohybovat později, ale to prozatím funguje. Pojďme k zálohování v cloudu, použijeme k tomu GitHub (i když existuje řada dalších řešení pro zálohu, jsou to všechno asi stejné.) Git je verision Control Software, který vám umožní zálohovat úpravy vašim vašim úpravám software, když je uděláte na server, zatímcoTaké vám umožní stahovat celé kopie vašeho softwaru za heslo nebo klíč. Je to nápomocné při ukládání vašeho softwaru, zejména když migrujeme do zabezpečených instancí Linuxu, které se někdy zlomí, když selže jediný řádek kódu, a nechte vás uzamknout, zatímco váš kód nemusí být zálohován, pokud nemáte šanci jej podpořit automaticky nahoru, které pokryjeme. Pokud v tomto okamžiku již nepoužíváte virtuální stroj Ubuntu, v tomto bodě doporučuji virtuální stroj Ubuntu, protože to usnadní váš život při instalaci všech balíčků potřebných k vytvoření pracovního webu a hlubokého učení operace na vašem počítači. V blízké budoucnosti přesuneme kód na webový server, ale chceme se ujistit, že za naším webovým serverem je alespoň několik vrstev zabezpečení, které jsou odolné vůči phishingu, a zaměstnávat řadu linuxových balíčků, aby to bylo možné tento. Pokud stále chcete používat Mac OS, jste vítáni hledat a nainstalovatE online balíčky online, ale nemusí existovat alternativy pro každý balíček, který se tato kniha nebo série pokryje. Přidáme několik příkazů, abychom se dopustili naší práce se záložním skriptem spuštěním příkazu sudo ascript

# …
git add –all
git commit -m “backup”
git push -u origin master
Ještě jednou ovládejte X a uložte. Nyní musíme pro tento projekt udělat jednou jednorázovou konfiguraci. Protože to bude brzy projekt GIT, nemusíme psát každý příkaz pokaždé, když nasadíme z úložiště GIT, ale při psaní našich skriptů nasazení dostaneme zavěšení. Chcete -li začít, ujistěte se, že jsme ve správném adresáři a inicializujeme úložiště GIT a generujte klíče SSH.

cd /path/to/directory
git init
git branch -m master
ssh-keygen
Po zadání SSH-KEYGEN by měl být nový klíč uložen ve složce Home pod složkou nazvanou .SSH. Říká se tomu id_rsa.pub. Najdeme tento klíč a zkopírujeme jej. Vidět to,

cd ~
cat .ssh/id_rsa.pub
Zkopírujte text, který je vrácen posledním příkazem, a vytvořte si účet u vašeho poskytovatele GIT (ideálně GitHub), než přidáte klíč SSH k vašemu účtu. Poté, co máte účet, klikněte do pravého horního nabídky a zadejte nastavení, před přidáním klíče SSH do klíčů SSH a GPG v nabídce v nabídce. Před uložením a návratem do GitHubu vyberte přidat klávesu SSH a přidejte jej a přidejte jej do názvu a vytvořte nové úložiště. To je podobné pro ostatní poskytovatele GIT, budete si muset přečíst jejich dokumentaci. V nové konfiguraci úložiště uveďte své úložiště popisné jméno a rozhodněte se, zda jej chcete zveřejnit, a nezapomeňte dosud nakonfigurovat žádné soubory pro zahrnutí. Po vytvoření úložiště zkopírujte klon s URL SSH a vložte jej do následujícího příkazu.

git remote add git://… (your remote URL)
Nyní se můžete přesunout zpět do svého úložiště pomocí CD, budete s tím znát. Vyzkoušejte svůj záložní skript hned se zálohou Velký! Nyní můžeme opravdu získat kódování. Pojďme nainstalovat Django nyní, když máme dobré pochopení na bash a git. Django nám umožní automaticky zálohovat náš software, Bash to může také udělat, ale Django by měl mít jednodušší bezpečnější implementaci (může být deaktivován a snadněji nakonfigurován). Pro instalaci softwaru v Ubuntu použijeme příkaz sudo apt-get. Nejprve pojďme aktualizovat a upgradovat software, který jsme již měli. To lze provést pomocí aktualizace sudo apt-get a sudo apt-get upgrade -y. Dále nainstalujme Python a naše virtuální prostředí, domov našeho kódu, s následujícím příkazem: sudo apt-get instalace python-is-python3 python3-n-yinv To je vše, co potřebujete jít s Djangem, pokud jde o instalace softwaru v instanci Ubuntu. Pro Windows a Linux by to mělo být poměrně jednoduché, ale pro Mac možná budete chtít nainstalovat virtuální počítač aLinux na něm pomocí bezplatného nebo placeného virtuálního prostředí, jako je VirtualBox nebo Paralells Desktop, a znovu vytvořit výše uvedené kroky za účelem nastavení prostředí Ubuntu. Ubuntu je v tomto případě kritický, protože je to software, který webové stránky spustí, a umožňuje jim hostit webové stránky s veškerým výše uvedeným softwarem. Pojďme se kopat do Djanga. V našem adresáři znovu, s

python -m venv venv # Vytváří virtuální prostředí, kde je kód uložen
source venv/bin/activate # Aktivuje virtuální prostředí
pip install Django
django-admin startproject mysite . # Kde MySite je projekt, začínám ve svém aktuálním adresáři.
Django nás právě začíná, protože Django pořádá webový server a dělá vše, co potřebujeme, abychom získali základní místní web do provozu. Nyní, když máme nainstalovanou Django, upravte nastavení trochu, aby to fungovalo, jak potřebujeme. Nejprve vytvoříme novou aplikaci

python manage.py startapp feed
Všimnete si, že první aplikace se nazývá Feed. Aplikace by měla být volána cokoli, co se vám líbí, a my vytvoříme nové aplikace, ale název každé aplikace musí být konzistentní pokaždé, když je aplikace odkazována v kódu. Chcete -li přidat novou aplikaci, vždy upravíme nastavení.py v druhém adresáři vytvořenou aplikaci, pojmenovaná v startProject, dále. Používání nano,

nano app/settings.py
V nastavení najděte nainstalovanou_apps a oddělujte [] na 3 řádky. Pomocí čtyř mezer na prázdné středové lince přidejte „zdroj“ nebo název vaší aplikace. Tato část nastavení.py by měla vypadat jako:

INSTALLED_APPS = [
    'feed',
]
Než zapomeneme, vyzkoušejte, že Django pracuje. Pomocí příkazu Python Manage.py Runserver 0.0.0.0:8000 můžeme spustit server a poté navigovat ve webovém prohlížeči na počítači s kódem na http: // localhost: 8000 a podívejte se na příklad webové stránky (funguje to!) Opusťte server s ovládacím prvkem C, stejně jako jakýkoli jiný příkaz. Nyní se kopejme do psaní nějakého pythonového kódu. Django má tři hlavní komponenty, všechny z nich jsou zcela provozovány podle kódu. Komponenty se nazývají model, zobrazení a šablonu a každá je na vyšší a nižší úrovni před doručením webové stránky uživateli. Model je kód, který ukládá informace v databázi pro vyhledávání, třídění a vykreslování. Pohled rozhoduje o tom, jak je model vykreslen, manipulován a upraven, téměř každý pohled použije model přímo. Šablona je kód HTML s některými dalšími zvonky a píšťalky nazývanými jazyk šablony. Šablona je vykreslena podle pohledu, kde je naplněna Pythonovým kódem aKontext, jako jsou modely a informace (usuall řetězce a celá čísla) z pohledu. Django má také jiné komponenty, včetně, ale nejen na: Nastavení, která konfiguruje aplikaci, jak jsme diskutovali. URL, což jsou vzory, které uživatel sleduje, aby získal přístup ke konkrétním částem webové aplikace. Formuláře, které definují, jak se informace odesílají na server a jsou vykresleny do databáze i do uživatele. Toto jsou základem zpracování informací na straně serveru a mohou přijímat jakýkoli typ informací, které ukládají počítačové ukládání, zejména textové řetězce, čísla a true/false booleans (obvykle zaškrtávací políčka). Šablony, které jsou jazykem HTML kódu a šablony, a překlenují mezeru mezi Pythonem a HTML, což znamená, že informace Python lze sloužit jako HTML kód, ke kterému má kdokoli přístup, a může zabezpečit web s omezeným přístupem, přičemž zpřístupňuje Python kód a užitečným zpřístupňováním a užitečné pro různé účely na vzdáleném zařízení, které neeed být poblíž serveru. Statické soubory, které jsou obvykle JavaScript, a jsou to knihovny, které server slouží a jsou propojeny se šablonou. Mediální soubory, které server slouží nebo je externě hostován, nebo právě zapsán na server před zpracováním a vysláním na jiný server (kbelík) pro hostování. Middleware, což jsou kusy kódu, které jsou spuštěny ve stejnou dobu s každým pohledem a jsou považovány za „zahrnuty“ do pohledu. Kontextové procesory, které zpracovávají kontext každého pohledu a používají se k přidání dalšího kontextu. Testy, které ověřují, že uživatel nebo požadavek předá určité požadavky před vykreslením zobrazení. Spotřebitelé, kteří diktují, jak websockety zvládnou a reagují na komunikaci. Admin, který se používá k registraci modelů, takže je lze podrobně manipulovat na stránce Django Admin, kde lze databázi podávat pomocí grafického rozhraní. Celer, který definuje asynchronní úkoly, mohou začít části kódu Djangopřed okamžitým přechodem na další úkol nebo řádek kódu. Django může mít mnoho dalších komponent, o kterých zde budeme podrobně diskutovat. Existuje spousta způsobů, jak učinit Django funkčnější a přidávat webové procesy, které jsou rychlé, efektivní komunikační kanály, celer, které provádějí asynchronní úkoly a množství dalších kusů softwaru pro rozšíření Djanga, zejména ve funkcích pohledu, kde většina z nich většina Kód je spuštěn. Funkce zobrazení jsou klíčové, protože obvykle deklarují každý kus kódu, který je specifický pro konkrétní vzorec URL nebo část serveru. Nejprve prozkoumejme funkce Zobrazit. Funkce zobrazení začínají importy označujícím kód, který bude použit v pohledu, a jsou definovány pomocí pravidelných definic nebo tříd. Nejjednodušší pohledy jsou definovány definicí funkce DEF a vrátí HTTPResponse se základní šablonou. Začněme definováním základního pohledu na vrácení textu „Hello World“. Pamatujte, že pokaždé, když přidáteVytvoření příkazu jako DEF, pokud, i když, pro atd., Budete muset přidat 4 mezery pro každou z definic preceedingu, které byste chtěli použít na svou funkci. Brzy se dostaneme do toho, co každý z nich znamená. Z adresáře našeho webu upravte soubor zdroje/views.py pomocí nano a přidejte následující řádky na konec

from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world')
Django's HTTPResponse odpoví textovým řetězcem, označeným otevřením a uzavřením '. Pokaždé, když předáte informace do funkce nebo třídy, jako je požadavek nebo řetězec, budete muset použít závorku (otevření a uzavření). To zatím není vše, co musíme vidět náš pohled. Samozřejmě jsme neřekli serveru, kde je pohled přesně, stále musíme definovat cestu, kterou by měl pohled vykreslit. Začněme definováním základní cesty v App/urls.py a později se dostaneme do skupin cest. V App/urls.py přidejte řádek po příkazech importu po začátku importu pohledu, který jsme právě vytvořili.

from feed import views as feed_views
Nyní definujeme vzor pohledu. Vzory zobrazení mají tři komponenty, komponentu Path, která říká serveru, kde zobrazení existuje v rámci serveru (cesta URL, kterou uživatel zadá do navigační lišty pro vstup na webovou stránku), komponentu zobrazení, kde je zadán a a Přátelský název pro pohledu, takže je snadné načíst jeho vzor při práci se šablonou, zejména proto, že je to jméno, které lze v případě potřeby změnit a aktualizovat, aby se vytvořil prostor pro jiný pohled nebo zaujal logičtější jméno. Dává smysl dělat věci tímto způsobem a být flexibilní, protože vaše kódová základna bude neustále se měnícím prostředím, které vyžaduje flexibilitu a improvizaci, aby byla cenná a snadná práce. Zde je, jak bude váš pohled vypadat, můžete jej přidat do urlPatterns = [část App/urls.py. Vzor pohledu je definován pomocí výše popsaných tří složek a funkcí zvanou cesta. Vaše vzory URL jsou seznam, takže nezapomeňte vždy ukončit každou položku v nichs čárkou, protože to odděluje každý z nich. Každá položka by měla také jít na nový řádek, opět se čtyřmi mezerami před ní, stejně jako aplikace v nastavení.py. Definujeme první komponentu pohledu s funkcí prázdné řetězce, abychom vytvořili pohled, který běží v kořenovém adresáři webového serveru. Vaše urls.py by nyní měly vypadat

from feed import views as feed_views

urlpatterns = [
    path('', feed_views.hello, name='hello'),
]
Toto je základ pro vytvoření webu s Django, který je zcela statický. Abychom vytvořili dynamičtější web, kde můžeme začít s ukládáním informací o ukládání do mezipaměti, jako jsou obrázky, videa, zvuk a další, budeme muset používat modely, které prozkoumáme dále. Prozatím pojďme zkontrolovat náš kód a spustit server. Chcete -li zkontrolovat kód pro chyby, spusťte:

python manage.py check
Pokud existují nějaké chybové zprávy, měli byste pečlivě zkontrolovat změny, které jste provedli ve vaší aplikaci smazaný charakter nebo cokoli jiného. Čtení chybové zprávy (pokud ji máte), měli byste být schopni vidět cestu k vytvořenému souboru, který jste vytvořili nebo upravili spolu s číslem řádku, takže se podívejte do tohoto souboru a řádku a zjistěte, zda můžete opravit něco, co je tam . Pokud jste problém vyřešili, spusťte výše uvedený příkaz. Když je váš software připraven ke spuštění a funguje, uvidíte výstupní „kontrola systému identifikována žádné problémy“. Nyní jste připraveni jít. Spusťte server s:

python manage.py runserver 0.0.0.0:8000
Nyní otevřete webový prohlížeč a přejděte na http: // localhost: 8000. Měli byste vidět text vrácený v závorce a citace funkce HTTPResponse podle vašeho názoru. Toto je jen základní příklad, ale pokud jste to dosáhli tak daleko, rozumíte základám, jak Linux, Bash, Python a Django pracují. Podívejme se hlouběji do některého databázového modelování a prozkoumáme sílu třídy Python při ukládání informací. Poté začneme přilnavost k HTML a CSS, než vytvoříme naše stránky plně vystupující, flexibilní a zabezpečené pomocí JavaScriptu a strojového učení. Třídy jsou uloženy v modelech.py ​​vaší aplikace. Pomocí Nano, upravte aplikaci/models.py a přidejte novou třídu. Třída je definována s definicí třídy a je předána superclass, od které zdědí, v tomto případě modely.model. Název třídy přichází po definici třídy a po použité třídě A: (Colon) se před níže uvedením atributů a definic funkcí vázané na třídu jsou uvedeny níže. Naše třídaPotřebuje ID, které můžeme použít k jeho načtení a udržení jedinečného a také potřebuje textové pole pro uložení některých informací. Později můžeme přidat časové razítko, soubory, booleans (pravdivé nebo nepravdivé definice, které mohou pomoci našemu kódu přijímat rozhodnutí o tom, co s modelem dělat, a lze jej použít k jeho třídění), instance pro připojení modelu s přihlášeným uživatelem do serveru a další. Pojďme rozbalit kód

from django.db import models # Import, který se používá k definování naší třídy a je to atributy

class Post(models.Model): # Definice naší třídy samotné
    id = models.AutoField(primary_key=True) # ID našeho modelu, automaticky generovaného klíče, který nám umožní dotazovat model, udržovat jej jedinečný a je užitečný, když musíme s modelem po vytvoření interagovat.
    text = models.TextField(default='') # Atribut naše obchody třídy, v tomto případě nějaký text, výchozí k prázdnému řetězci.
Zavřete a uložte soubor jako předtím. Existuje mnoho dalších oblastí a možností, které prozkoumáme, když tuto třídu aktualizujeme, jak se naše aplikace vyvíjí, ale toto je základní potřeby vytvoření aplikace pro zveřejňování nějakého textu. Tento model však nebude fungovat sám. Jak je popsáno dříve, budeme potřebovat vlastní zobrazení a vlastní vzor URL, aby tento model fungoval, a také budeme potřebovat formulář spolu se šablonou. Pojďme nejprve prozkoumat formulář. Chcete -li definovat formulář, upravte aplikaci/forms.py s Nano a přidejte následující řádky. Budeme potřebovat dva dovozy, naši třídu formulářů, stejně jako model, který jsme vytvořili (Feed.Models.Post), definici třídy podobné modelu a pole spolu s podtřídou zvanou meta, která bude definovat model formulář interaguje s. Formulář může mít také inicializační funkci, která ji nastaví na základě informací v žádosti, modelu nebo jiném, prozkoumáme to později. Formuláře modelu jsou tak užitečné, protože mohou vytvořit model nebo také upravit model,Takže je použijeme pro oba. Pojďme definovat jeden ve formě.py

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',)
To je základy toho, jak vypadá forma a model. Tento modelový formulář lze použít k okamžitému nebo úpravě příspěvku a změnu textu, který obsahuje. Podíváme se na integraci tohoto formuláře do pohledu dále. Nejprve proveďte migraci a migrujeme databázi, aby náš kód mohl s modelem interagovat, když běží. Chcete -li to provést, spusťte následující příkazy:

python manage.py makemigrations
python manage.py migrate
Provedení to bude chvilku, ale jakmile to udělá, umožní vám přístup k modelu v pohledech, middlewaru nebo kdekoli jinde v softwaru. Pojďme pokračovat v pohledu, kde můžeme vidět náš model. Upravte zdroj/views.py a přidejte následující kód, jak je uvedeno. Po znamení # nebudete muset nic přidávat, tento kód je komentáře, které se používají k označení informací o kódu. Začneme importem našeho modelu do pohledu a přidáme jej do kontextu, kde jej můžeme vykreslit v šabloně jako seznam pro zobrazení. Dále přidáme šablonu, kde můžeme vykreslet formulář a model pomocí tlačítka a vytvořit nový objekt založený na modelu a zveřejnit jej na server. Zní to komplikovaně, takže to prostě vezměme krok za krokem. Než dokončíme pohled, vytvořme šablonu, která pouze vykresluje model a ujistěte se, že jej můžeme vidět vytvořením nového příspěvku ve shell. Zde je způsob, jak by měl tento pohled vypadat:

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

def feed(request):
    posts = Post.objects.all() # Dotazujte všechny příspěvky v databázi
    return render(request, 'feed/feed.html', {
        'posts': posts,
    })
To vše vypadá docela jednoduše, dokud se nedostaneme na dno. Vykreslení, hodnota vrácená funkcí namísto v odpovědi HTTP, jako je předchozí příklad, vždy přijímá žádost jako první vstup, přijímá kontext (v tomto případě příspěvky v databázi), který lze nyní vydávat v šabloně a vrátí šablonu definovanou ve funkci. Šablona bude dokument HTML s trochou jazyka s názvem Jinja2, který vykresluje Python informace do HTML. Chcete -li začít vytvářet šablony, vytvořte dva adresáře v krmivu.

mkdir feed/templates
mkdir feed/templates/feed
Dále upravte šablonu ve výše uvedeném adresáři, krmení/šablony/zdroje a přidejte kód pro tento příklad. Podívejme se na šablonu pro tento příklad.
 
<!doctype HTML>
<html>
<body>
<legend>Feed</legend>
<hr>
{% for post in posts %}
<p>{{ post.text }}</p>
{% endfor %}
</body>
</html>
 
Toto je velmi jednoduchá šablona. Definuje otevírání a zavírání značek HTML, značku typu dokumentu, značku těla s názvem legendy, značku přestávky, která přidává malý řádek přes obrazovku a pro smyčku, která vykresluje každý příspěvek v seznamu příspěvků jako odstavec v odstavci v Šablona. To je vše, co je zapotřebí k vykreslení příspěvků, ale v databázi zatím nejsou žádné. Pojďme vytvořit některé se skořápkou. Můžeme spustit shell s manage.py

python manage.py shell
Nyní pojďme importovat náš poštovní model

from feed.models import Post
Dále vytvoříme jednoduchý příspěvek s řetězcem a opustíme shell. Řetězec může být cokoli, pokud je to platný text.

Post.objects.create(text='hello world')
exit()
Nakonec budeme muset přidat do našeho krmiva vzorec URL. Protože naše aplikace Feed bude používat více URL a chceme udržovat velikosti souborů malé, vytvořme místní urls.py v naší aplikaci Feed, která vypadá takto:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.feed, name='feed'),
]
Budeme také muset upravit urls.py v základní aplikaci, ať už jsme se rozhodli to nazvat, byl to první adresář, který jsme vytvořili. Upravte aplikaci/app.py a přidejte následující do vzorů URL

from django.urls import include # nahoře

urlpatterns = [
    # ... předchozí kód zde
    path('feed/', include(('feed.urls'), namespace='feed')),
]
Nyní, když spustíme server s Python Manage.py Runserver, uvidíme stránku, kterou jsme vytvořili, protože máme model, zobrazení a šablonu i vzor URL spolu s položkami v databázi. Dále implementujeme formulář, který jsme vytvořili, a začneme vytvářet vlastní příspěvky. Než ale píšeme příliš mnoho kódu, provedeme zálohu pomocí skriptu, který jsme napsali dříve, zálohování. Spusťte tento skript ve shellu, počkejte několik okamžiků a veškerý kód bude zálohován do našeho úložiště GIT.

backup
Implementace formuláře je relativně jednoduchá. Na náš formulář importujeme náš formulář, přidáme do pohledu obslužný program žádosti a uložíme příspěvek do databáze před přesměrováním na stejný pohled. Můžeme použít funkci přesměrování, kterou jsme již importovali, a další funkce nazvaná Reverse pro získání URL pro vzor pohledu. Budeme to dotazovat pomocí řetězce „Feed: Feed“, protože jmenný prostor je podávání a pohled se také nazývá Feed.

from feed.forms import PostForm

def feed(request):
    posts = Post.objects.all() # Dotazujte všechny příspěvky v databázi
    if request.method == 'POST': # Zpracovat požadavek na příspěvek
        form = PostForm(request.POST) # Vytvořte instanci formuláře a uložte do něj data
        if form.is_valid(): # Ověřit formulář
            form.save() # Uložte nový objekt
        return redirect(reverse('feed:feed')) # Přesměrovat na stejnou adresu URL s požadavkem GET
    return render(request, 'feed/feed.html', {
        'form': PostForm(), # Nezapomeňte předat formulář do kontextu, abychom jej mohli vykreslit.
        'posts': posts,
    })
Nyní budeme muset aktualizovat šablonu tak, aby zodpovídala nový formulář. Můžeme to udělat pomocí pomocí
Označte v HTML a vykreslete formulář v šabloně HTML pomocí tlačítka Odeslat. Budeme také potřebovat token CSRF, token, který zabraňuje externím webům v odesílání do formuláře bez prvního načtení stránky.
 
<!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>
 
Pojďme to rozebrat. K dispozici je nová třída formulářů, token, samotný formulář a tlačítko Odeslat. Docela jednoduché, ale když se na to podíváme, možná bude chtít, aby to vypadalo lépe. Funguje to, můžeme zveřejňovat nové příspěvky s formulářem a nyní jsou uloženy v databázi. Děje se tu několik věcí. Používáme značky HTML k prohlášení, že dokument je dokument HTML, k vykreslení tokenu pro formulář používáme značku šablony ({ %… %}) k vykreslení formuláře. Máme také smyčku pro vykreslení textu pomocí značek bloků a značky šablony. Blokové značky jsou opravdu důležité, protože můžeme definovat, jak jsou s nimi vykresleny části šablony, a značky šablon jsou základem toho, jak do našeho kódu vkládáme proměnné. Nyní musíme, aby naše aplikace vypadala lépe, protože prozatím to vypadá opravdu základní. Můžeme to udělat pomocí CSS, buď inline, nebo ve třídách vázaných na každý objekt v dokumentu. CSS je opravdu pěkný, protože to říká vše na stránce, jak by to mělo vypadat,a může to vypadat opravdu dobře. Existuje několik knihoven, které to dokážou, ale moje osobní jít je Bootstrap. Bootstrap si můžete stáhnout z jejich webových stránek,getbootstrap.com/. Poté, co je tam, stisknutím tlačítka si přečtěte instalační dokumenty a zkopírujte kód z části zahrnující sekci CDN. Tento kód budete potřebovat v horní části dokumentu HTML ve značce s názvem Head. Pojďme také pokračovat a vytvořit základní šablonu, takže tyto odkazy nemusíme znovu vytvářet v každé šabloně. Vytvořte nový adresář s názvem šablony pomocí šablon Mkdir a poté upravte šablony/base.html. Mělo by to vypadat takto:
 
<!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>
 
Nezapomeňte zkopírovat soubory CSS a JavaScript,. Nyní se vraťme ke skořápce bash a spustíme rychlý příkaz. Nezapomeňte, že pokud někdy potřebujete přístup k virtuálnímu prostředí, zadejte zdroj Venv/Bin/Active. To vám umožní nainstalovat balíčky Pythonu lokálně tak, aby django přístup k nim. Abychom poskytli naše formuláře generované třídami Django Bootstrap, použijeme balíček Python s názvem Crispy Forms. Můžeme si to stáhnout s následujícím příkazem

pip install django-crispy-forms
Jakmile je to nainstalováno, přidejte jej do nastavení.py

INSTALLED_APPS = [
    # … Předchozí kód zde
    'crispy_forms',
]
Nyní, zpět v naší šabloně krmiva, můžeme některé věci odstranit. Odstraňme začátek a konec dokumentu a nahradíme jej dědičností z naší základní šablony pomocí rozšíření a definice bloku. Do formuláře také přidáme import filtru šablony se zatížením a filtrem šablony. Nakonec pojďme přidat třídu bootstrapu k tlačítku na formuláři, aby vypadala spíše jako tlačítko. To by mělo vypadat takto:
 
{% 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 %}
 
Krásný! To je už docela trochu kódu. Dále bychom to měli vyzkoušet a ujistit se, že můžeme vidět, že všechno vypadá hezky, a také se ujistěte, že všechno funguje správně. Spusťte server podle předchozích pokynů a ujistěte se, že web vypadá a funguje dobře. Skvělá práce! Jste připraveni přejít k dalšímu kroku, ve kterém přidáme funkce přihlášení uživatele pomocí podobných URL, formulářů, pohledů a šablon. Základní šablona je důležitá a budeme ji nadále upravovat a provést změny podle potřeby, ale prozatím se zaměřme na zajištění našich stránek tím, že umožňujeme uživatelům přihlásit se pomocí uživatelského jména a přístupového kódu a nakonec ještě důležitější informace, které, které jsou ještě důležitější informace, které pomůže udržet vaši aplikaci zabezpečenou a váš vlastní účet přístupný pouze vy. K tomu budeme muset použít model uživatelů zabudovaný do Djanga. Uživatelský model je model databáze, jako je náš příspěvek, který lze vykreslit pro přihlášení uživatele na web. V budoucnu, než nasadíme web na internet, budemeRozšiřte tento model s jinými modely připisovanými mu a vytvořte další bezpečnostní opatření pro přihlášení, která jsou odolná vůči phishingu. Začneme použitím některých vestavěných přihlašovacích formulářů, které Django poskytuje. Nejprve vytvoříme novou aplikaci, kterou použijeme k vykreslení šablon a zobrazení pro základní přihlašovací stránku. Vytvoříme také další aplikace, které budou reprezentovat pokračující výzvy v oblasti přihlášení, abychom zabezpečili aplikaci, včetně pincode, rozpoznávání obličeje, polní komunikace, externích zařízení, ověřování více faktorů a rozpoznávání otisků prstů. Už jsme mluvili o spuštění aplikace. Z našeho adresáře, uvnitř virtuálního prostředí, průsmyk

python manage.py startapp users
Nyní bychom měli mít adresář pro novou aplikaci. Začněme vytvořením zobrazení v tomto adresáři, který odpovídá přihlášení uživatele. Django má zabudované zobrazení pro přihlášení uživatelů, ale ty nebude pro nás vhodné, protože potřebujeme vlastní pohled, který se nejlépe provádí s definicí. V tomto pohledu začneme kontrolou žádosti o příspěvek, předáním požadavku.POST na přihlašovací formulář importovaný z Djanga, ověřte uživatelský účet a přihlaste se před přesměrováním do naší aplikace Feed. V uživatelů/views.py přidejte následující kód

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'] # Získejte uživatelské jméno a heslo z žádosti o příspěvek
        password = request.POST['password'] # Ověřte uživatele
        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()})
To je vše, co potřebujete pro základní přihlášení. Nyní vytvoříme formulář pro pohled rozšířením základní šablony. Začneme vytvořením nového adresáře pro šablony ve složce uživatelů.

mkdir users/templates
mkdir users/templates/users
Nyní bychom měli být schopni upravovat uživatele/šablony/uživatele/přihlášení.html. Když jsme u toho, vytvoříme šablonu, která umožní uživateli také přihlásit se.

nano users/templates/users/login.html
Nyní v šabloně,
 
{% 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 %}
 
Toto je základy přihlašovací šablony. Je to opravdu stejně jako druhá šablona ve struktuře, ale když je vykreslena, vypadá to trochu jinak. Můžeme zkopírovat tento kód a vytvořit další velmi podobnou šablonu s názvem Register.html, kde změníme znění a použijeme nový formulář, který vytvoříme. Pojďme nejprve udělat šablonu. Upravte uživatele/šablony/uživatele/registr.html a přidejte následující kód:
 
{% 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 %}
 
Nyní vytvoříme formulář pro registraci našeho uživatele a kroužíme zpět k zobrazením, než upgradujeme přihlášení našich uživatelů pomocí modelu. Uděláme tento formulář základní, ale v budoucnu zahrnujeme další podrobnosti a bezpečnostní funkce, jako jsou dohody a Captcha. Upravte formuláře pomocí uživatelů Nano/Forms.py a přidejte následující kód.

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']
Takže zde máme další formu, která funguje docela jednoduše. Jedná se o formulář uživatelského registru s uživatelským jménem, ​​e -mailem a heslem, jakož i polem potvrzovacího hesla. Všimněte si, že tento formulář nerozšiřuje běžnou třídu. Jedno pole je definováno stejné a třída meta definuje model, který formulář odpovídá zbytku informací, které budou zapsány do formuláře. Většina z toho již existuje ve vestavěné Django vestavěné uživatelské formě, takže to použijeme jako základ pro třídu (předán v závorce). Dále prozkoumáme pohled na registraci uživatele, nyní, když máme formulář a šablonu. Toto je modelform, stejně jako ten v novém pohledu příspěvku. Upravte uživatele/views.py a přidejte následující kód:

# … Částky
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})
To je vše, co musíme zaregistrovat uživatele, ale měli bychom mít více informací. Chceme znát čas, kdy se uživatel zaregistroval, kolik je na posledních stránkách, některé informace o nich, jako je biografie, časová pásmo atd. Model a atributy příspěvkům každému uživateli. Za tímto účelem aktualizujeme modely.py v obou aplikacích. Začněme úpravou modelu krmiva. Teď by to mělo vypadat takto:

from django.db import models # … Částky
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') # Přidejte do tohoto řádku
    text = models.TextField(default='')
Věnujte pozornost druhému řádku, který byl přidán do souboru. Jedná se o cizí klíč, který připisuje každý příspěvek jednomu uživateli na příspěvek, takže se můžeme ujistit, že uložíme příspěvky na základě uživatele na uživatele a žádný příspěvek nelze provést bez přiřazení uživateli. Definujeme tento cizí klíč s třídou, kterou představuje, argument smazání, který zajistí, že příspěvky jsou smazány s uživateli, null a prázdné argumenty, abychom se ujistili, že v případě potřeby můžeme odstranit uživatele, a přizpůsobit se nedostatku uživatele na příspěvcích, které již jsme již, jsme již vytvořené a související jméno, které můžeme použít k odkazování na post objekty, které uživatel vytvoří. Toto související jméno, na rozdíl od Post.Author, autor příspěvku, nám dává uživateli, který zveřejnil příspěvek samotný. Nyní můžeme získat příspěvky uživatele vytvořeného pomocí spuštění user.Posts.all () nebo autor.posts.all (). Nyní udělejme naše přihlášení odolnější. Naše stránky již můžeme mnohem méně zranitelnou vůči phishingu jednoduše omezením počtu, kolikrát umožníme přihlášení kweb, to je docela snadné. Začněme také ukládat některé informace o každém uživateli dříve, když budeme pokračovat ve vývoji naší aplikace. Úpravy uživatelů/model.py, přidejte následující

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='')
Všimněte si, že tento model je poměrně podobný modelu Post. Máme další import, TimeZone, který nám umožní nastavit výchozí hodnoty na polích DateTime, a máme také znak a textfield jako příspěvek. Použití všech těchto časových razítka nám pomáhá zabezpečit web a porozumět jeho použití a textová pole nám umožňuje vykreslit informace o každém uživateli nebo autorovi na webu. OneToOnefield by měl být jediným drobným zvážením, chová se přesně stejně jako předem, ale pouze s jedním na následující model. Tímto způsobem má uživatel pouze jeden profil, zatímco může mít mnoho příspěvků. Nyní vylepšeme naše přihlášení a zaregistrujeme zobrazení pro profil. Nejprve upravte uživatele/views.py a zaměřte se na zobrazení registru:

# … Částky
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) # Nezapomeňte přidat tento řádek a vytvořit profil pro uživatele
            messages.success(request, 'Welcome to the app, {}.'.format(user.username))
    return render(request, 'users/register.html', {'form': UserRegisterForm})
To jednoduše vytvoří profil pro uživatele, aniž by vyplnilo některou z informací. Nyní se chceme ujistit, že uživatelský účet nelze přihlásit příliš často, nebo alespoň hesla nelze vyzkoušet příliš často, takže pojďme aktualizovat přihlašovací zobrazení.

# … Částky
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(): # Všimněte si, že nyní zkontrolujeme, zda se uživatel může přihlásit
            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: # Pokud nebylo přihlášení úspěšné,
            messages.warning(request, 'Username or password incorrect. Please try again.')
            user = User.objects.filter(username=username).first() # To je část, kde aktualizujeme profil uživatelů
            if user: 
                profile = user.profile
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Takže se nemohou znovu přihlásit na několik sekund
                profile.save()
    return render(request, 'users/login.html', {'form': AuthenticationForm()})
To je základní základní bezpečnost. Ujistěte se, že web není zranitelný pro někoho, kdo jednoduše zkouší každou možnou kombinaci hesel, nebo dokonce několik z nich současně. To nebude frustrující pro obyčejného uživatele, který zná jejich přístupový kód a jen se přihlásí na několik zařízení, ale z aplikace udržuje řadu phishingových robotů. Všimněte si, že jsme přidali příkaz IF s proměnnou CAN_LOGIN, který by měl být v minulosti čas, a aktualizovat jej s každým neúspěšným přihlášením pomocí stejného uživatelského jména. Tímto způsobem škodlivý uživatel nebude schopen uhodnout heslo kdekoli poblíž. Počet sekund v datetime.timedelta () lze také aktualizovat a web bude odolnější, ale o něco méně použitelný s více sekundy. Doporučuji začít 15. Pamatujte, že jsme vytvořili záložní skript, abychom zachránili naši práci, takže pokračujme a záložníme, co máme, abychom se ujistili, že máme vše uloženo. Spusťte příkaz:

sudo backup
Opět to zachrání vaši práci. Doporučuji spustit časté zálohy, abyste ušetřili práci, a možná budete chtít automaticky spustit záložní úlohu. Můžete to udělat pomocí nástroje UNIX s názvem Cron. Chcete -li aktivovat tento nástroj, spusťte následující příkaz a zadejte heslo:

sudo crontab -e
Pokud ještě nevyberete možnost 1 pro NaNo, textový editor, který byste již měli být obeznámeni, a přejděte na spodní část souboru pomocí kláves se šipkami. Přidejte následující řádek:

0 * * * * sudo backup
Cron používá formát minutu, hodinu, den v měsíci, měsíc, den v týdnu, kde * nebo číslo představuje, kdy spustit příkaz. Použitím 0 na minutu a * pro zbytek možností můžeme spustit příkaz v první minutě každé hodiny na začátku minuty. To nám umožňuje zálohovat kód automaticky. Všechna Cronova práce, když se provádí s sudo spuštěním jako root, takže nebudeme muset každou hodinu psát heslo. Chcete -li usnadnit zálohování našeho kódu bez použití hesla, deaktirujme heslo pro náš příkaz zálohování. Uděláme to provedením následujícího příkazu a zadáním hesla:

sudo visudo
Nyní pojďme přejděte na spodní část souboru a přidejte další řádek:

ALL ALL=NOPASSWD: /bin/backup
To nám umožňuje spustit příkaz „Zálohování“ jako jakýkoli uživatel, bez hesla. Formát pro toto je snadný, stačí předponu řádek s „Všechny = nopasswd:/bin/” a končí příkazem, například/bin/zálohování, která existuje v/usr/bin/. Nyní začněme pracovat s e -mailem. E -mail je opravdu důležitý pro webové stránky, protože je to způsob, jak udržet web bezpečnější, ověřte, že uživatelé jsou skuteční lidé a dokonce i tržní produkty nebo služby pro zákazníky. Mnoho lidí, kteří často navštěvují internet, kontrolují svůj e -mail denně a obdrží nejrůznější marketingové e -mail o produktech a službách, o které se zajímají. Existuje několik možností, pokud jde o povolení e -mailu na webových stránkách Django a jste vítáni si vybrat které pro vás funguje nejlépe. Nejprve můžete zaplatit za e -mailovou službu, která vám umožní odesílat e -mail z vaší domény a vyžaduje minimální kód. Existuje mnoho služeb, které to nabízejí, například Google Workspace, SendinBlue, Mailgun a další. Jinak jste dobře stavěníVaše vlastní e -mailová služba na vašem serveru od nuly. Tuto možnost doporučuji, i když je to více kódu a může vyžadovat speciální hosting. S největší pravděpodobností nebudete moci spustit poštovní server z domácího počítače, takže pokračujme a prozkoumejte konfiguraci a kód, který odešle e -mail, než začneme server v cloudu a vytvoříme vlastní poštovní server uvnitř. Nejprve upravte nastavení.py s následujícím

nano app/settings.py
Kde je aplikace název aplikace, kterou jste vytvořili pomocí StartApp. Přidejte následující řádky:

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)
Nezapomeňte je změnit, až budete připraveni nasadit aplikaci, to později znovu prohlédneme. Nastavení e -mail_address by mělo být e -mailem, ze kterého byste chtěli odeslat, a heslo (email_host_password) by mělo být nastaveno na heslo, které pro server vygenerujete. Načíst heslo z konfiguračního souboru, abych jej zabránil mimo kód pomocí následující logiky, nad těmito řádky v nastavení.py:

import os
import json
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
Poté jsem nastavil soubor JSON s konfigurací v /etc/config.json pomocí nano následujícím způsobem. K úpravě souboru:

sudo nano /etc/config.json
Přidejte následující řádky:

{
	“EMAIL_HOST_PASSWORD”: “<some password here>”
}
Budeme i nadále upravovat konfigurační soubor a přidat všechna hesla a klíče, které v aplikaci použijeme. Prozatím pojďme rychle prozkoumat, jak poslat e -mail pomocí Pythonu. Nejprve vytvoříme šablonu pro ověřovací e -mail, který můžeme poslat našim uživatelům, a vložit jej do adresáře šablon uživatelů. Tato šablona bude zapsána v 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>
 
Tento e -mail je poměrně jednoduchý. Má kontext uživatele, základní adresy URL pro web a ID uživatele a token, které se používají k ověření e -mailu uživatele. Než zapíšeme nějaký kód Pythonu, aby se šablona vyvinula, definujte základní adresu URL v Settings.py. Pokračujte a přidejte následující řádky do App/Settings.py, na začátku.

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

BASE_URL = PROTOCOL + '://' + DOMAIN
Nakonec, když je váš web připraven na internet a nasadíte jej, budete chtít definovat svou doménu jako název domény, který si zakoupíte, pro reprezentaci webu. Toto je název, který zadáte do NavBar, abyste získali přístup k vašemu webu. Prozatím můžete nechat doménu prázdnou nebo použít zástupný symbol. Budete také chtít změnit název Site_name na jméno, které chcete poskytnout svůj web, podle vašeho výběru. Než pošleme e -mail, vytvořme generátor tokenů, abychom mohli mít token aktivace účtu, který nikdy vyprší. Můžeme to udělat vytvořením a importem tokenu aktivace účtu, který vypadá jako následující. Upravit soubor:

nano users/tokens.py
Přidejte následující kód:

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()
Tento generátor základního tokenu generuje token, který můžeme uživateli poslat do adresy URL a uživatel může použít k ověření jejich e -mailu a aktivaci jejich účtu. Dále se podívejme, jak poslat e -mail. Pomocí nano, upravte uživatele/email.py.

nano users/email.py
Odeslání ověřovacího e -mailu HTML bude vypadat takto:

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)
To je poměrně jednoduché. Importujeme funkce, které musíme poslat e -mail, vykreslit e -mail pomocí šablon a naše nastavení a poté e -mail definujeme názvem šablony a pošleme jej uživateli pomocí funkce. Všimnete si, že jsme tuto funkci nedefinovali pro odeslání pošty, send_html_email, takže to napište pod kódem, který jsme již přidali uživatelům/email.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()
To je o něco složitější a zatím nejsme připraveni spustit celý tento kód. Všimněte si, že definujeme unsub_link, odkaz, který může uživatel použít k odhlášení z našich e -mailů. To je důležité, protože uživatelé budou muset být schopni odhlásit se z našich e -mailů, pokud je nechtějí vidět, kdykoli. Přidáme také textovou alternativu k naší zprávě, která je zpráva HTML spuštěná značkami HTML. Nakonec zkontrolujeme, zda e -mail byl odeslán, a zda ne, označujeme profil uživatele, že jejich e -mail není platný. Pojďme se vrátit zpět k uživatelským modelům, abychom to mohli udělat vše. Musíme definovat funkci pro vygenerování odkazu na odhlášení a definovat booleovské pole označit, že e -mail uživatele není platný. Nejprve přidejte následující import do horní části uživatelů/modelů.py

nano users/models.py

# …
from django.core.signing import TimestampSigner, BadSignature, SignatureExpired
from django.urls import reverse
Dále pojďme přidat funkce do modelu uživatele, abychom vytvořili token a zkontrolovali token použitý k aktivaci e -mailu, jakož i pole, abychom uložili, zda uživatel úspěšně obdrží svou poštu. V uživatelích/models.py opět přidejte následující kód na konec modelu (odsazený kód)

# …
    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) # Platí po dobu 30 dnů
        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,})
To je poměrně jednoduché, použijeme časový razítko, který je základní kryptografický nástroj, k vytvoření tokenu, který vyprší po určitém čase, a také pomocí jiné funkce zkontrolujeme, zda je platný. Tyto žetony používáme dvakrát, jednou k ověření e -mailu a jednou pro odkaz odhlášení. Nyní, když je máme, poslední z práce, kterou budeme muset udělat, je v názorech. V rámci uživatelů/views.py pojďme přidat zhlédnutí k ověření e -mailové adresy a odhlášení.

nano users/views.py
Nejprve přidejte následující import. Hodil jsem několik navíc, takže nebudeme muset později importovat více položek.

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 # Nezapomeňte importovat funkci odesílání e -mailu ověření
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
Možná již máte některé z těchto dovozů, ale nesiluje je opakovat. Budete muset importovat funkci odesílání e -mailů ověřování e -mailů a také account_activation_token od Users.Tokens, mimo jiné importy. Nyní ve spodní části souboru přidejte následující kód:

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)):
        # odhlásit je
        profile = user.profile
        profile.subscribed = False
        profile.save()
        return render(request, 'users/unsubscribe.html')
    # Jinak přesměrujte na přihlašovací stránku
    messages.warning(request,f'Your unsubscribe link has expired. Please log in to unsubscribe.')
    next_url = reverse('users:unsubscribe', kwargs={'username': username, 'token': token,})
    return HttpResponseRedirect('%s?next=%s' % (reverse('login'), next_url))

def activate(request, uidb64, token):
    try:
        uid = force_str(urlsafe_base64_decode(uidb64))
        user = User.objects.get(pk=uid)
    except(TypeError, ValueError, OverflowError, User.DoesNotExist):
        user = None
    ip = get_client_ip(request)
    if user is not None and account_activation_token.check_token(user, token):
        user.profile.email_verified = True
        user.profile.save()
        user.save()
# SendWelcomeEmail (požadavek, uživatel)
        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})
Toto je hodně kódu. Pojďme to rozebrat. První funkce, čistá a jednoduchá, odhlásí uživatele ze seznamu adresátů. Druhá funkce aktivuje jejich e -mail a všimnete si, že jsem přidal komentovanou funkci, sendWelcomeEmail. Můžete použít e -mailovou šablonu a definici funkce k odeslání uvítacího e -mailu, prostě jsem ještě ne. Poslední funkce, kterou jsem hodil, je důležitá, protože vyprší aktivační e -maily. Proto budeme muset znovu předat aktivační e -mail. K tomu můžeme použít základní formulář a zavolat funkci k odeslání ověřovacího e -mailu. Než to uděláme, ujistěte se, že je odeslán na prvním místě, přidáním funkčního volání do zobrazení registru. Přidejte tento řádek těsně před přesměrováním v zobrazení registru, def registr, do uživatelů/views.py.

nano users/views.py

# … (Po) Def Register (žádost):
            send_verification_email(user)
# … (Před) přesměrováním (
Nemusíte přidávat první a poslední řádky v tomto úryvku kódu, jen se ujistěte, že zobrazení registru odešle e -mail ověření uživateli. Mělo by to vypadat takto:

# … Dovoz
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) # Nezapomeňte přidat tento řádek!
            messages.success(request, 'Welcome to the app, {}.'.format(user.username))
    return render(request, 'users/register.html', {'form': UserRegisterForm})
Nyní budeme muset přidat formulář k odeslání aktivačního e -mailu. V uživatelích/forms.py přidejte následující formulář:

# … (Částky)
class ResendActivationEmailForm(forms.Form):
    email = forms.EmailField(required=True)
Budeme také potřebovat šablonu odpovídající tomuto formuláři E -mailu Resendu. Přidejte tuto šablonu do. Upravte soubor:

nano users/templates/users/resend_activation.html
Dále přidejte do souboru následující kód.

{% 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, to je hodně! Nyní, když nasadíme kód na náš server, budeme moci odeslat e -mail HTML a aktivovat uživatelské účty kliknutím na e -mail. Možná bychom také chtěli poslat jednoduchý uvítací e -mail, takže se podívejme, jak to udělat. Zpět v uživatelích/email.py, přidejte následující kód:

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)
Budeme také potřebovat šablonu k vykreslení všech těchto informací. Na mém webu vypadá šablona jako níže, ale jste vítáni k naformátování, jak se vám líbí.
 
<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>
 
Všimněte si, že nemáme závěrečné nebo HTML značky, protože je přidáme, když přidáme odkaz HTML odhlášení. To jsou důležité, ale nechceme je definovat dvakrát. Co bude dál? Prošli jsme dlouhou cestu. Opravdu bychom měli být připraveni nasadit web na server. Můžeme přidat dekoratér @Login_Required a zajistit naše názory, přijímat uživatelské registrace, odesílat e -maily a informace o mezipaměti, což je základ toho, co web musí udělat, aby zůstal relevantní. Přidáme několik více užitečných funkcí a poté vytvoříme základ pro nasazení našeho kódu na vzdálený server, nastavení poštovního serveru, konfigurace domény a filtry, aby byl náš web bezpečný a vhodný. Budeme také potřebovat zobrazení resetování hesla, takže to přidejte opravdu rychle. V některých funkcích je narušen vestavěný zobrazení Django vestavěné resetování hesla, ale podíváme se na to, jak napsat vlastní zobrazení, e -mailovou šablonu, formuláře a vzory URL. Zde je to, jak vypadá pohled, v uživatelích/views.py

# ... import
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)
Tento formulář je zabudován do Djanga, ale budeme potřebovat šablonu k potvrzení resetu hesla, uživatelů/šablon/uživatelů/hesla_reset_confirm.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 %}
 
Máme také šablonu pro odeslání e -mailu pro resetování hesla s jednoduchým formou v uživatelích/šablonách/uživatelů/heslem_reset.html
 
{% extends 'base.html' %}
{% load crispy_forms_tags %}
{% block content %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Reset Password</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-info" type="submit">Request Password Reset</button>
            </div>
        </form>
{% endblock content %}
 
Šablona samotného e -mailu je jednoduchá, jedná se o základní soubor HTML, který vykreslí odkaz pro resetování hesla, v uživatelích/šablonách/uživatelů/heslem_reset_email.html. Django tento soubor automaticky interpretuje.
 
<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>
 
Budeme také potřebovat další dvě šablony. Prvním je potvrzení, že e -mail byl odeslán. Názory na tyto jsou již v Djangu, takže je musíme pouze oslovit v URLS.PY. Tato šablona se nachází u uživatelů/šablon/uživatelů/hesla_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 %}
 
A konečně, pro potvrzení, že reset hesla je dokončen, uživatelé/šablony/uživatelé/heslo_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 %}
 
Nyní potřebujeme vzory URL pro tyto názory. U uživatelů/urls.py přidejte následující vzory URL:

urlpatterns = [
    # ... Předchozí adresy URL zde
    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'),
]
Čtyři šablony, to je hodně! Nyní však můžeme být jisti, že budeme moci resetovat heslo uživatele, kdykoli potřebujeme, vše z webového prohlížeče. Chápu, že se jedná o hodně kódu. Pokud se to zdá trochu nad hlavou, je to v pořádku. Zlepšíte se, vaše porozumění se zlepší a velmi brzy se stanete mnohem kompetentnějším s kódem. Pokud jste úplně ztraceni, doporučuji vrátit se k tomuto softwaru později po práci na samostatném kurzu naučit se kódovat online. Ty jsou obvykle zdarma pro začátek a provedou vás vše, co musíte být úspěšní, když se vrátíte k tomuto projektu. Pokud máte pocit, že jste připraveni pokračovat, přečtěte si dále, zakryjeme nasazení kódu na vzdálený server a nastavení poštovního serveru a automatizujte své nasazení pomocí bash, takže můžete vždy nastavit nový projekt s Několik jednoduchých příkazů. Poslední věcí, kterou musíme udělat před nasazením na vzdálený server, je učinit náš web o něco bezpečnější. TyVšimněte si, že přihlašovací zobrazení bere pouze uživatelské jméno a heslo a neexistuje ověřování multi faktorů nebo jednorázový kód. Toto je snadná oprava a se stejným kódem můžeme vytvořit textové zprávy o odesílání našich stránek a dokonce reagovat na textové zprávy odeslané na server. Nejprve se vrátíme do uživatelských modelů a přidáme signatář časového razítka, který bude představovat každé přihlášení. K modelu uživatele také přidáme jedinečný, rotující identifikátor, který bude použit k přidání dalšího zabezpečení k našemu přihlášení. Úpravy uživatelských modelů, uživatelů/model.py, přidejte následující

from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone
# Ujistěte se, že importujte UUID, Timestamp Signant a generátor URL (reverzní)
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='')
    # Přidejte tento kód sem
    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)

    # A přidejte tuto funkci
    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) # Platí po dobu 3 minut
        except (BadSignature, SignatureExpired):
            return False
        return True
Ujistěte se, že vaši uživatelé/models.py vypadá takto, kromě komentářů (kód na řádcích s #). Rozbijte to, je to jednoduché. Máme několik importů, časový razítko, což je kryptografický nástroj, který může vygenerovat zabezpečený kód a ověřit jej, aby se zajistilo, že je platný, byl použit pouze jednou a ne starší než určitý počet sekund. Používáme také UUID, což je jedinečný identifikátor, který identifikuje našeho uživatele při podpisu tokenu, a v adrese URL, kde je token odeslán uživateli. Tuto základní kryptografii použijeme k vytvoření dvou faktorových ověřovacích pohledu. Než uděláme cokoli jiného, ​​spustíme migraci, aby byly naše uživatelské modely aktualizovány. V adresáři s manage.py spusťte následující příkazy a proveďte migraci.

source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
To je důležité, protože pokaždé, když provádíme změny v modelech, budeme muset vytvořit tabulky a aktualizovat databázi pomocí výchozí hodnoty, než budeme moci skutečně použít. Dále improvizujeme náš přihlašovací pohled na přesměrování na zobrazení sekundární autentizace. U uživatelů/views.py odstraňte funkci přihlášení a přesměrujte na adresu URL, kterou jsme právě vygenerovali v uživatelských modelech.

# … Částky

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(): # Všimněte si, že nyní zkontrolujeme, zda se uživatel může přihlásit
            # Odstraňte funkci Auth_Login, která byla zde
            messages.success(request, 'Your password was accepted. Please continue.')
            if user.profile.mfa_enabled:
                return redirect(user.profile.create_auth_url()) # Všimněte si, že zde přesměrujeme novou adresu URL
            else: # Pokud uživatel nepoužívá vícefaktorovou ověřování, stačí je přihlaste.
                auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend')
                return redirect('feed:feed')
        else: # Pokud nebylo přihlášení úspěšné,
            messages.warning(request, 'Username or password incorrect. Please try again.')
            user = User.objects.filter(username=username).first() # To je část, kde aktualizujeme profil uživatelů
            if user: 
                profile = user.profile
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Takže se nemohou znovu přihlásit na několik sekund
                profile.save()
    return render(request, 'users/login.html', {'form': AuthenticationForm()})
To je tedy docela jednoduché, nyní máme způsob, jak přesměrovat na dva faktorové autentizační pohled, když jej vytvoříme. Máme také zálohu pro případ, že uživatel nepřidal telefonní číslo. Brzy přidáme základní pohled, abychom přidali telefonní číslo a brzy se přihlásí s textovou zprávou. Nejprve potřebujeme snadný způsob odeslání textové zprávy z našeho kódu. Za tímto účelem si můžeme vybrat z řady API, ale podle mého názoru je nejjednodušší Twilio. Nabízejí také dobré ceny pro menší projekty a také objemné slevy. Vytvořte si účet na Twilio.com, vyplňte některé podrobnosti o vašem projektu, zakupte telefonní číslo a zkopírujte klíče API do nastavení.py. Poté přidejte tento kód do nového souboru, uživatele/SMS.Py.

nano users/sms.py

# Importujte všechny potřebné balíčky
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

# Tento kód odešle text s 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())

# Funkce pomocníka pro získání čísla s tolika číslicemi
def get_num_length(num, length):
    n = ''
    for x in range(length):
        n = n + str(num)
    return int(n)

# Pošlete text a ověřte uživatele
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)))

# Pošlete uživateli jakýkoli text s touto funkcí
def send_user_text(user, text):
    send_text(user.profile.phone_number, text)

# Ověřte kód s touto funkcí
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

# Ověřit čas
def check_verification_time(user):
    result = user.profile.mfa_code_expires > timezone.now()
    return result
Nezapomeňte náležitě změnit nastavení a přidat tyto řádky pomocí klíčů:

# Ujistěte se, že je zkopírujte z palubní desky Twilio
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 # Počet minut, kdy je stránka TFA aktivní po instanci
Nejprve budeme potřebovat formuláře pro naše dva faktorové pohledy. Úpravy uživatelů/formulářů, přidejte následující kód.

# … Částky
from django import forms

# Formulář pro vstup do našeho telefonního čísla
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

# Formulář pro ověření
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.'
    }
Dále vytvoříme pohledy na uživatele/views.py

# … Částky
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})
Pro oba tyto názory budeme také potřebovat šablony. Pojďme nejprve přidat šablonu MFA.

nano users/templates/users/mfa.html
Přidejte tento kód HTML do šablony
 
{% 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 %}
 
To je docela samostatné vysvětlující. Formulář odešle buď kód nebo prázdný kód a v pohledu si všimnete kódu, pokud obdržíme prázdný kód. Pak máme pouze dvě tlačítka odeslání, a tak můžeme odeslat kód jedním tlačítkem. Dále přidáme jednoduchý formulář pro přidání telefonního čísla.

nano users/templates/users/mfa_onboarding.html
Přidejte následující HTML:
 
{% extends 'base.html' %}
{% block content %}
{% load crispy_forms_tags %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Set Up Two Factor Authentication</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-secondary" type="submit">Add phone number</button>
            </div>
        </form>
{% endblock %}
 
Tento formulář je mnohem jednodušší, pouze vykresluje formulář telefonního čísla, který jsme vytvořili, a umožňuje uživateli přidat telefonní číslo. Vypadá to opravdu dobře! Dokud je vše správně nastaveno, měli bychom být schopni odesílat zprávy a přihlásit uživatele s jejich telefonním číslem, jakmile přidáme vzory URL. Poslední věc, kterou musíme nastavit, je pohled profilu, abychom se ujistili, že uživatel může změnit své telefonní číslo, aniž by byl přihlášen. „Přestaňte“ odhlásit se z budoucích textových zpráv. Přidáme zobrazení profilu uživatelům/views.py. Tento pohled bude aktualizovat bio, e -mail, uživatelské jméno a telefonní číslo uživatele a umožní nám umožnit ověřování více faktorů. Nejprve budeme potřebovat další dva formuláře v uživatelích/formách.

# ... částky
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']
Dále můžeme vytvořit pohled na použití obou těchto formulářů. Upravte uživatele/views.py a přidejte do pohledu.

# Přidejte tyto dovozy
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)
Pro tento pohled budeme také potřebovat šablonu.

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 %}
 
Všimnete si, že se jedná o poměrně jednoduchý formulář, ale má v něm nějaký javascript, který automaticky zveřejňuje obsah formuláře při aktualizaci. To je užitečné, takže jste schopni provádět úpravy, aniž byste museli pokaždé stisknout odeslání. Dále potřebujeme adresy URL představujících všechny tyto názory v Userl Patters. Upravte uživatele/urls.py a přidejte tento kód:

# … Předchozí kód, import
from django.urls import path
from . import views

app_name='users'

urlpatterns = [
# … Vzory URL, které jsme dříve zadali, přidejte další tři řádky
    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'),
]
Nyní je vhodný čas na vyzkoušení našeho projektu. Nejprve však spustíme další zálohu.

backup
A spusťte server. Než nasadíme na server Linux, je dobré povolit ověřování dvou faktorů na účtu. Uděláme to do našeho profilu URL,/uživatele/profil/, a zaškrtnutím políčka povolit ověřování po zadání našeho telefonního čísla a poté odeslání formuláře.

python manage.py runserver localhost:8000
Navštivte webovou stránku tím, že půjdu do webového prohlížeče, v tomto příkladu používám Google Chrome a zadávám URL https: // localhost: 8000/účty/profil/ V případě potřeby se budete moci přihlásit a povolit ověřování dvou faktorů. Tento projekt potřebuje server, aby mohl spustit, aby mohl opravdu poslat poštu. Nejprve však potřebujeme způsob, jak vidět chyby. Všimnete si, že pokud spustíte server v režimu Debug, s nastavením.Debug rovný true, server automaticky zobrazuje chyby. Abychom ukázali chyby bez použití režimu debug, který je nebezpečný na produkčním serveru, měli bychom přidat pohled na něj. Nejdůležitější chyby, které musíme být schopni zvládnout, jsou: Chyba 500 - Problém s naším kódem Chyba 404 - Stránka, která nebyla nalezena (Broken URL) Chyba 403 - Oprávnění zamítnuto chyby Pojďme přidat novou aplikaci pro zpracování těchto chyb, nazývaných chyby.

python manage.py startapp errors
Přidejte toto do nastavení.py, jak jsme to udělali dříve, v nastavení instalovaných_apps a začněte přidáním odkazů na některé zhlédnutí v aplikaci/urls.py, kde je aplikace název vašeho projektu Django.

handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
To je vše, co potřebujeme kromě chyb, šablon a trochu middlewaru. Definujme ty tak:

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

# Vytvořte své názory zde.
@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.'})
Dále definujeme middleware tak, aby tyto chyby zvládl. Uděláme to nejprve přidáním do middleware_classes v nastavení.py, s názvem našeho middlewaru.

MIDDLEWARE_CLASSES = [
    # ... Předchozí middleware
    'errors.middleware.ExceptionVerboseMiddleware,
]
Dále přidejte 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.')
Přidáme funkci, která získá aktuální výjimka pomocí lokálního závitu, což nám pomáhá sledovat jakékoli chyby v našem kódu. Pokud jde o šablony, potřebujeme pouze jeden, protože dynamicky definujeme název v pohledu. Šablona musí pouze vykreslit název a „Trace“, naše chyby Traceback z kontextu.

nano errors/templates/errors/error.html
 
{% extends 'base.html' %}
{% block content %}
<h1>{{ pagetitle }}</h1>
<p>{{ trace }}</p>
{% endblock %}
 
Toto je zatím naše nejjednodušší šablona, ​​ale tak je snadné vidět chyby v našem projektu. Dále deaktirujme ladění v nastavení.

nano app/settings.py
Najděte tuto řádek, kde je nastavena na pravdu, a změňte ji na false

DEBUG = False
Pokračujte a zálohujte aplikaci hned. Jsme připraveni nasadit na vzdálený server Linux a odtud pokračovat v přidávání funkcí.

sudo backup
Než zveřejníme tento kód na server, měli bychom se domnívat, že s kódem mohou existovat nějaké problémy. V závislosti na případu budou mít weby, které přijímají informace, které jim byly zveřejněny, problémy s zveřejněním spamu a potížemi s odstraněním spamu. To by se nemělo stát okamžitě, ale pokud se to stane, později prozkoumáme, jak automaticky mírný spam na webu a ztěžovat pro roboty přístup k webu spolu s tím, jak deaktivovat uživatelské účty a ověřit identitu uživatele s uživatelem s uživatelem s identitou uživatele Skenování jejich ID nebo biometrického skenování, jako je rozpoznávání otisku prstu nebo obličeje. Při pohledu na příklad autentizace s více faktory jsme zkoumali, ve výrobě se věci mohou lišit. Všimněte si, jak omezujeme přihlášení sazby a vypršíme tokeny. Pokud roboti přistupují k webu, může být ověřování dvou faktorů obtížnější, protože mohou zadat kódy současně, kdy je uživatel. Abychom tomu bojovali, použijeme model v uživatelských modelech a prohlašujeme, jak komunikujeme s webem, když jsmeOvěřování pomocí ověřování multifaktorů pomocí telefonního čísla. Přidáme také možnost ověřit pomocí e -mailu. Začněte úpravou uživatelských modelů s

nano users/models.py
Tak by měl vypadat model, který přidáváme. Nepotřebujeme žádné metody, pouze proměnné pro uložení ID, uživatele, časové razítko, vypršení, délka a pokusy proti jakémukoli ověření více faktorů (kód jako 123456 odeslán do telefonu nebo e -mailu).

# Základní token používaný k přihlášení na web
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)
Pojďme také přidat privilegium našemu uživateli a my jsme jej prozatím nastavili ručně, než nakonec automaticky migrujeme na zařazení privilegovaných uživatelů. V uživatelských modelech přidejte tento řádek do profilu:

    vendor = models.BooleanField(default=False)
Stejně jako u jakýchkoli změn v databázi musíme provést migraci a migrovat databázi kdykoli upravujeme soubor modelů v Djangu. Nezapomeňte, že k tomu použijeme zdroj jako první (pokud již nebyl použit od otevření terminálu) a poté Python Manage.py pro provedení migrace a migrace.

cd project-directory-you-named # (V případě potřeby)
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Prozatím můžete získat jakékoli účty, které jste vytvořili jako prodejci, pomocí shell.

python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Nyní si vyvineme náš více faktorový ověřovací pohled na použití tohoto tokenu. Nejprve musíme upravit naše pomocné nástroje MFA. Používání 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

# Ověřte uživatele pomocí svého e -mailu nebo telefonního čísla
def mfa(request, username, usertoken):
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filtrujte token o hodnotu předanou v adrese URL (UUID)
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Pokud tato relace nebyla vytvořena, vytvořte ji
    user = User.objects.filter(id=token.user.id).first() # Získejte uživatele z tokenu
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Pokud jsou již ověřeny, přihlaste se
    if not user: raise PermissionDenied() # Popírejte, zda nebyl nalezen žádný uživatel
    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): # Zkontrolujte autorský žeton
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Přihlaste se uživatele, pokud již nejsou přihlášeni
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Nastavte vypršení ověřování jejich více faktorů
        user.profile.save()
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Přesměrovat uživatele na další stránku
    if not user.profile.mfa_enabled: # Zkontrolujte, zda je MFA povoleno
        if not check_verification_time(user, token): # Zkontrolujte čas
            user.profile.mfa_enabled = False # Vymažte telefonní číslo
            user.profile.enable_two_factor_authentication = True # Povolit MFA
            user.profile.phone_number = '+1' # Zakázat telefonní číslo
            user.profile.save() # Uložit profil
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Přihlaste se uživatele, pokud jejich MFA není povoleno
            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): # Pokud je požadavek žádost o příspěvek
        form = TfaForm(request.POST) # Nastavit formulář
        code = str(form.data.get('code', None)) # Získejte kód
        if code and code != '' and code != None: # Ujistěte se, že to není prázdné
            token_validated = user.profile.check_auth_token(usertoken) # Zkontrolujte autorský žeton
            p = user.profile
            is_verified = check_verification_code(user, token, code) # Zkontrolujte kód
            p.mfa_authenticated = is_verified
            if token_validated: # Pokud všechno
                if is_verified: # Je v pořádku
                    user.profile.mfa_enabled = True # Povolit MFA (pokud již není povoleno)
                    user.profile.save()
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Přihlaste se uživatele
                    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(): # Vytvořte querystring pro další parametr (pokud existuje)
                        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) # Přesměrovat
                    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: # Pokud byl token neplatný
                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: # Pokud došlo k příliš mnoho pokusů
                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): # Pošlete e -mail (nebo text)
                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('/'))
    # Vykreslete formulář (pro získání požadavků)
    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'})
Když přidáme tento kód, nezapomeňte importovat funkci a odeslat e -mail. V horní části souboru, zobrazení uživatele (s jinými importy), přidejte

from .mfa import send_verification_email as send_mfa_verification_email
Nyní musíme tuto funkci napsat, než bude něco z toho fungovat. Měl by rozšířit naši e -mailovou funkci Odeslat a jednoduše odeslat e -mailem uživateli pomocí ověřovacího kódu.

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))
Takže to vše funguje skvěle, nyní máme systém ověřování více faktorů, který závisí na telefonním čísle nebo e -mailu. Mohly by to být spammery, roboti nebo kdokoli, kdo neznamená dobře pro naši práci. Podívejte se na názor, který mám pro monitorování uživatelů na svém webu:

# částky
from django.contrib.auth.decorators import login_required
from django.contrib.auth.decorators import user_passes_test
from .tests import is_superuser_or_vendor # Tento test budeme muset vytvořit

@login_required
@user_passes_test(is_superuser_or_vendor)
def users(request):
    # Získejte seznam uživatelů
    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', { # Vráť uživatele v šabloně
        'title': 'All Accounts',
        'users': User.objects.all(),
        'new_today': new_today,
        'new_this_month': new_this_month,
        'subscribers': subscribers
    })
Všimněte si, že tento kód používá test, budeme muset tento test vyhlásit v souboru tests.py a importovat jej. Úpravy uživatelů/tests.py, vytvoříme test.

def is_superuser_or_vendor(user):
    return user.profile.vendor or user.is_superuser
To je ve spojení se šablonou uživatelů/uživatelů.html, která vypadá něco takového:
 
{% 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 %}
 
Všimněte si, že šablona obsahuje další šablonu, uživatele/_user.html. Při použití šablony, která má subtemplate a nepoužívá se rozšíření, je to dobrý nápad přidat podtržení (_) před názvem souboru, který se má rozšířit, aby se rozlišilo šablony. Všimněte si, že se jedná o hodně Jinja, nemusíte mít všechny tyto proměnné definovány. Ale tak vypadá můj kód.
 
{% 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}} </mall>
      <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>
 
Potřebujeme také další subtetemplate, Toggle_Active.html. Tato šablona by měla být forma, která nám umožňuje přepínat, zda je uživatel aktivní.
 
<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>
 
Budeme také muset přidat pohled na přepínání aktivity uživatele a vhodné vzory URL. Když jsme u toho, přidejte pohled na odstranění uživatele pro případ, že to potřebujeme.

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>')


# Částky
from django.contrib.auth.mixins import LoginRequiredMixin, UserPassesTestMixin
from django.views.generic import DeleteView

class UserDeleteView(LoginRequiredMixin, UserPassesTestMixin, DeleteView):
    model = User
    success_url = '/' # Přesměrování na URL úspěchu
    def get_context_data(self, **kwargs):
        context = super().get_context_data(**kwargs)
        return context

    def test_func(self): # Vyzkoušejte, zda je uživatel superuživatel a má povolení k odstranění
        user = self.get_object()
        if self.request.user != user and self.request.user.is_superuser:
            return True
        return False
I když je to praktické v případě potřeby, vymazání uživatele by nemělo být nutné po většinu času, můžeme jen přepínat viditelnost uživatelů, kteří navštíví web, pokud je potřebujeme zamítnout. Vzory URL, které jsme přidali, vypadají takto. S Nano, upravte uživatele/urls.py a přidejte tyto řádky:

nano users/urls.py
Řádky by měly jít do seznamu cest v uživatelských zobrazeních, před koncem „]“, ale po začátku „[“.

# …
    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'),
# …
Nyní se ujistěte, že web zálohuje, abyste si jej mohli stáhnout na webovém serveru, na kterém budeme pokračovat v práci. Z příkazového řádku,

sudo backup
Nyní je náš web zálohován. Takže nyní máme několik užitečných funkcí. Ale co tu velký obrázek? Tento kód stále není přístupný z internetu, zatím nemáme žádný poštovní server a musíme rozšířit naši aplikaci tak, aby zahrnovala komplexní proces ověření a hladká rozvržení, která nám pomůže prozkoumat web, spolu s zabezpečenými protokoly pro ověření privilegovaných uživatelů . Dostaneme se k tomu všemu. Nejdůležitější věcí prozatím bude jen získání tohoto kódu online, což můžeme udělat s několika řádky bash na serveru Ubuntu. Budete si však muset pronajmout server, pokud nemáte doma server a předplatné obchodního internetu, které vám umožní otevírat porty. Osobně spustím svůj web na HP Z440, který je nainstalován v mém bytě, ale obvykle je to mnohem levnější pro základní potřeby pronajmout si virtuální soukromý server (VPS). Mějte na paměti, že kód, který nyní běžíme, je relativně tenký, bude muset být udržován a vylepšen dřívePřipraveno k použití toho, co musíme vytvořit produkt. Ujistěte se, že buďte opatrní, co děláte s internetem, ujistěte se, že pokud tento web nasadíte na web na serveru Linux, máte plán blokovat nežádoucí interakce s vaším webem. Pravděpodobně to nebude problém zpočátku, ale podíváme se na řadu řešení, která bude bojovat proti tomu, včetně strojového učení, umělé inteligence a počítačového vidění. Když se stane problémem, podívejte se dále v tomto textu pro řešení. Pokud jde o pronájem VPS, existuje mnoho míst, kam můžete jít. Google Cloud má servery VPS, IONOS, Kamatera, Amazon AWS a další poskytovatelé nabízejí řešení cloudových serverů, která budou vyhovovat našim potřebám. Budete muset kliknout na jejich formuláře a vybrat plán, jak začít. S jakýmkoli poskytovatelem můžete jít se základním plánem, ale ujistěte se, že poskytovatel umožňuje otevřít porty serveru Port Mail Server k odeslání e -mailu (to by měl být port 587 a port 25), někteří poskytovatelé tyto porty blokují. Zatím jsem mělZkušenosti EST s Ionos a Kamaterou mi obě umožní poslat neomezený e -mail a jejich ceny jsou docela levné. Připojíte se k novému serveru přes protokol s názvem SSH nebo Secure Shell, který vám umožní vzdáleně propojit se serverem přesně jako váš osobní počítač, z osobního počítače. Když nastavíte server, poskytovatel hostingu vás pravděpodobně požádá o přidání klíče SSH, nebo vám poskytne uživatelské jméno a heslo. Klíč SSH je, jak se přihlásíte k serveru z příkazového řádku k úpravě kódu. Pomocí níže uvedených možností SSH-Keygen vygenerujte SSH

ssh-keygen
Uložte soubor a přepsáte jej, pokud potřebujete, je dobré otočit klíče SSH, pokud jste to tak ještě neučinili. Nyní můžete použít následující příkaz k zobrazení klíče SSH. Budete chtít zkopírovat na svůj vzdálený server, abyste jej mohli použít k ověření.

cat ~/.ssh/id_rsa.pub
Pokud jste nebyli schopni vidět klíč SSH při psaní tohoto příkazu (dlouhý řetězec číslic a písmen začínajících „SSH-RSA AAA“), zkuste vygenerovat klíč RSA (jsou bezpečnější, takže je doporučuji je používat používat .) Následující kód vygeneruje klíč 4096 bitu RSA SSH.

ssh-keygen -t rsa -b 4096
Vytvořte VPS spuštěnou Ubuntu, ale plánujete to. Jakmile vytvoříte VPS kliknutím na formuláře na webových stránkách poskytovatelů (Kamatera.com, ionos.com nebo podobně), budete se chtít přihlásit. Chcete -li to provést, použijte příkaz SSH s vaší IP adresou (adresa adresa (adresa adresa (adresa adresa (adresa adresa (adresa adresa (adresa To vypadá jako xx.xx.xx.xx). Musíte být také citliví na výchozí uživatelské jméno na serveru, který jsme vytvořili, například Ubuntu.

ssh ubuntu@XX.XX.XX.XX
Můžete být požádáni o heslo, pokud budete požádáni o heslo, zadejte jej. Nebudeme používat výchozí uživatelské jméno, takže začněme vytvořením nového uživatele a přidáme klíč SSH k jejich účtu. Začněme přidáním nového souboru SSHD_Config, který řekne serveru, jak používat SSH.

nano sshd_config

# Toto je konfigurační soubor SSSHD serveru na celém serveru.  Vidět
# SSHD_CONFIG (5) pro více informací.

# Tento SSHD byl sestaven s Path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/hry/hry

# Strategie použitá pro možnosti ve výchozím sshd_config odesláno s
# OpenSSH má určit možnosti s jejich výchozí hodnotou, kde
# možné, ale nechte je komentovat.  Neochvějné možnosti potlačují
# Výchozí hodnota.

# Port 22
# Addressfamily Any
# Seznam adresa 0.0.0.0
# Poslouchejte adresu ::

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

# Šifry a klíčování
# Rekeylimit výchozí žádné

# Protokolování
# SYSLOGFACILILY AUTH
# Info leglevel

# Ověřování:

# Logringracetime 2m
# PermitrootLogin zakázán-password
# Strictmodes ano
# Maxauthtries 6
# Maxessions 10

PubkeyAuthentication yes

# Očekávejte, že .SSH/AUTORIZED_KEYS2 bude v budoucnu ignorováno.
AuthorizedKeysFile	.ssh/authorized_keys .ssh/authorized_keys2

# Autorizovaný principalsfile žádný

# AutorizovanýKeysCommand žádný
# AutorizovanýkeysCommandUser nikdo

# Aby to fungovalo, budete také potřebovat hostitelské klíče v/etc/ssh/ssh_ známé_hosts
# HOSTBASEDAUTHENTICE NO
# Změňte na ano, pokud nedůvěřujete ~/.ssh/známém_Hosts pro
# Hostbasedauthentication
# Ignoreusers známéHosts č
# Nečtete soubory uživatele ~/.rhosts a ~/.shosts
# Ignorerhosts ano

# Chcete -li deaktivovat tunelovaná čistá textová hesla, změňte na ne!
PasswordAuthentication no
# PersonalEmpTyPasswords č

# Změňte na ANO, abyste povolili hesla pro odpověď na výzvu (problémy s pohledem
# Některé moduly a vlákna PAM)
KbdInteractiveAuthentication no

# Kerberos možnosti
# Kerberosauthentication no
# Kerberosorlocalpasswd Ano
# Kerberosticketcleanup Ano
# Kerberoscotted prut č

# Možnosti GSSAPI
# GSSAPIAUTHENTIKACE NO
# GssapicleanupCredentials ANO
# GSSAPISTRICTICTHCEPTORCECK ANO
# GSSAPIKEYEXCHANGE NO

# Nastavte to na „Ano“, aby povolila ověřování PAM, zpracování účtu,
# a zpracování relací. Pokud je to povoleno, ověřování PAM bude
# být povolen prostřednictvím KBDinteractiveAuthentication a
# PasswordAuthentication.  V závislosti na konfiguraci PAM,
# Ověřování PAM prostřednictvím KBDinteractiveAuthentication může být obtok
# Nastavení „PermitrootLogin bez pasáže“.
# Pokud chcete pouze spustit účet PAM a kontroly relací
# Ověřování PAM, poté to povolte, ale nastavte hesloauthentication
# a kbdinteractiveauthentication na „ne“.
UsePAM yes

# Dovolená profilding ano
# Povolit ANO
# Gatewayports č
X11Forwarding yes
# X11DISPLAYOFFSET 10
# X11uselocalhost ano
# Povolení ano
PrintMotd no
# PrintLastLog Ano
# Tcpkeepalive ano
# Permittuenvironment in
# Zpožděné komprese
# Interval klientaive 0
# CLENTALIVECOUNTMAX 3
# Použité v
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Pemittunl ne
# CHROOTDIRECTORY ŽÁDNÝ
# Dodatek verze Žádná

# Žádná výchozí cesta banneru
Banner /etc/banner

# Umožněte zákazníkovi předat proměnné místní proměnné
AcceptEnv LANG LC_*

# Přepíše výchozí hodnoty bez subsystémů
Subsystem	sftp	/usr/lib/openssh/sftp-server

# Příklad převažujícího nastavení na základě uživatele
# Odpovídat uživatelům anoncvs
# X11 forwarding ne
# Povolení, které jsou ne
# Povolit
# Server CVS ForCECOMMAND
PermitRootLogin no
Nezapomeňte, že soubor uloží Ctrl+X a Y. Dále napíšeme základní skript s názvem Initialize (vše ve výchozím domácím adresáři našeho uživatele).

nano initialize
Přidejte tyto řádky do souboru a nahraďteS klíčem SSH jste našli pomocí CAT. (.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
Abychom vás procházeli tímto souborem, pojďme spustit řádek po řádku. První řádek říká kompilátoru, že se jedná o skript bash. Poté instalujeme závislosti, zkopírujeme SSHD_CONFIG do správného adresáře, restartujeme SSH, generujeme klíče SSH pro kořen, přidáme uživatelský „tým“ (můžete si vybrat jméno, které se vám líbí, použít příkaz přídavců s jejich jménem a pro deaktivované heslo pro teď). Přidáváme také tým do skupiny sudo, generujeme svůj klíč SSH, přidáme náš klíč k autorizovaným klíčům a jejich také jejich klíčem. Tento nový uživatel bude tak, jak se přihlásíme na web. V novém terminálu pokračujte a znovu otevřete server.

ssh team@XX.XX.XX.XX
Tentokrát byste neměli potřebovat heslo, protože máte klíč SSH. Také jsme zakázali přihlášení pomocí hesla, aby byl web bezpečnější. Nyní tento server spustí zcela prázdné bez informací. Začněme klonováním našeho projektu z Git, abychom si jej mohli stáhnout a spustit na vzdáleném počítači. Na vzdáleném serveru připojeném přes SSH nejprve vytiskněte klíč SSH:

cat ~/.ssh/id_rsa.pub
Dále vložte tento klíč do nastavení GIT, jako jsme to udělali dříve, abyste nastavili naše úložiště GIT. Nyní můžeme klonovat náš projekt přímo na server. Ujistěte se, že jste nejprve zálohovali projekt lokálně, takže je na serveru GIT ke stažení.

git clone git://github.com/you/yourproject.git
Perfektní. Nyní jsou všechny soubory zde. Můžeme je vidět s LS

ls
Nyní začneme nastavovat server. Nejprve zkopírujte svůj adresář projektu do jednoduchého, nezapomenutelného názvu, který použijeme pro projekt.

cp -r yourproject whatyoucalledit
Kde je „WhatyOUCalLedit“ nový název vašeho projektu. Dále budeme muset vytvořit základní nástroj pro nastavení serveru. Uložíme tento nástroj a použijeme jej v budoucnu. Chcete -li vytvořit tento obslužný program, vytvořme uživatelský binární, abychom definovali, jak upravujeme skript. Pomocí bash, úpravy/usr/bin/ascript

sudo nano /usr/bin/ascript
Nezapomeňte tam použít sudo, abyste měli k úpravě souboru oprávnění. Do souboru přidejte tyto řádky:

# ! / 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
Pamatujte, že tento skript má argument, název skriptu, jako $ 1. Nejprve zkontroluje, zda soubor existuje, nebo jej jinak vytvoří, přidává první řádek, který prohlásí, že skript je bash, změní jeho oprávnění, upravuje jej a přidává své jméno do /etc /ascripts, což nám umožňuje ukládat jména skriptů We We vytvářejí. Pokud soubor již existuje, jednoduše změňte oprávnění a upravte jej. Uložte soubor a dále změníme jeho oprávnění. Pokud tento skript používáme, nebudeme to muset dělat znovu.

sudo chmod a+x /usr/bin/ascript
Perfektní. Nyní vytvoříme skript s názvem Nastavení. Nejprve vás nepřekoná, ale podívejte se, jak vypadá můj scénář nastavení. Projdeme, jak by měl tento skript vypadat ve vašem projektu, nebudete potřebovat všechno v mém skriptu, abyste mohli začít.

# ! / bin / bash
SECONDS=0
PYTHON_VERSION=3.12
echo "femmebabe installer initialized."
# sudo chmod a+x skripty/userseTup
# ./Scripts/UserSetup
# Ssh-keyen
# Directory projektu
DIR="/home/team/femmebabe"
USER="team"
# Protokol příkazů
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
# 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
# Aktualizace a instalace
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
# Povolit Clamav antivirus
echo "Starting antivirus"
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
# Nastavit jméno hostitele
echo "127.0.0.1 femmebabe" | sudo tee -a /etc/hosts
sudo hostnamectl set-hostname localhost
# Nastavení 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;"
# Nastavení záložní databáze
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
# Deaktivované ipatably
echo "Configuring firewall"
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
sudo iptables-save
# Nainstalujte 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
# Nastavení postfixu
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
# Vytvořte dirs
cd $DIR
mkdir media/audio
mkdir media/audio/fingerprints
mkdir media/security
mkdir media/secure
mkdir media/secure/media
mkdir media/secure/video
mkdir media/secure/profile
mkdir media/secure/face
mkdir media/images
mkdir media/live
mkdir media/live/files
mkdir media/live/stills
mkdir media/files
mkdir temp
mkdir temp/data
mkdir temp/gfpgan
mkdir mail/inbox
mkdir mailbox
# Nastavení virtuealenv
cd $DIR
echo "Creating virtual environment"
python -m venv venv
source venv/bin/activate
# Získejte a buďte závislosti
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
# Nastavit pravidla brány firewall
cd $DIR
# Nainstalujte závislosti PYPI
echo "Installing remaining python dependencies (this may take a while)"
sudo systemctl mask tmp.mount
cd $DIR
source venv/bin/activate
pip3 install -U "celery[redis]"
pip3 install -r requirements.txt --use-deprecated=legacy-resolver --use-pep517
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP nainstalujte OpenCV-PYTHON == 4.5.5.64
# PIP nainstalujte OpenCV-Contrib-Python == 4.5.5.64
pip3 install --upgrade opencv-python-headless
pip3 uninstall channels
pip3 uninstall daphne
pip3 install channels["daphne"]
pip3 install Pillow==9.5.0
pip3 install librosa
pip3 install -U 'Twisted[tls,http2]'
pip3 install --upgrade certifi requests urllib3 numpy oauthlib twisted pyjwt sqlparse cryptography astral webauthn docbarcodes pdf417 deepface --no-cache-dir
pip3 install tensorflow==2.15.1
# Nainstalujte Certbot
echo "Installing certificates"
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo snap install redis
sudo systemctl enable apache2
sudo systemctl start apache2
# Spusťte Certbot
sudo certbot --apache --non-interactive --agree-tos --domains femmebabe.com --email jasper.camber.holton@gmail.com
# Obnovení poštovního serveru
sudo systemctl restart opendkim postfix dovecot
# Kopírovat certifikáty
# sudo cp /etc/letsensencrypt/live/femmebabe.com/privkey.tem privkey.pem
# sudo cp /etc/lettescrypt/live/femmebabe.com/cert.pem cert.pem
#  Patch venv
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"
# Nastavit nastavení uživatele
sudo gpasswd -a www-data users
# Nastavit oprávnění
echo "Setting permissions"
sudo chown -R team:users cache/
sudo chmod a+rwx -R cache/
# Sudo Chown -r Team: Uživatelé/var/běh/
# Sudo Chown Root: Root/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
# Sudo Chown www-dat: Uživatelé 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
# Zkopírujte a nastavte oprávnění
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
# Nastavení databáze
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"
# Injekční konfiguraci PAM a odstraňte vadnou konfiguraci SSH
# Sudo sed -i '' -and $ d '/etc/pam.d/sshd
# Sudo sed -i '' -and $ d ' /etc /profil
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
# Zkopírujte skripty a nastavte oprávnění
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
# Obnovit a povolte služby
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
# Povolit moduly Apache
echo "Enabling apache2"
sudo a2enmod rewrite
sudo a2enmod wsgi
sudo a2enmod headers
sudo a2enmod ssl
sudo a2enmod proxy
sudo a2enmod proxy_balancer
sudo a2enmod proxy_http
sudo a2enmod proxy_wstunnel
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Zakázat výchozí web
sudo a2dissite 000-default
sudo a2dissite 000-default-le-ssl
# Povolit web
sudo a2ensite femmebabe-le-ssl
# Obnovit démona a restartujte Apache, postfix a Opendkim
sudo systemctl daemon-reload
sudo systemctl restart apache2
sudo systemctl restart opendkim postfix
sudo systemctl start daphne
# Nastavit oprávnění
sudo chown -R :www-data /var/www/
sudo chown -R :www-data /var/www/.deepface
# Konfigurace swapu
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
# INIT TACTION Engine
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
# Nastavení 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
# Zobrazit IPv6 a OpenDKIM pro konfiguraci domény
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}'
# Nastavení dokončeno
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."
To je hodně nastavení! Stručně řečeno, tyto kódové protokoly příkazů, konfiguruje Nano a GIT, kopie přes soubory, stahování a instalace Ubuntu Apt Packages, Python závislosti, konfiguruje postfix, konfiguruje postgresql (databázový server) a načte databázi, konfiguruje UFW (nekomplikovaný firewall), Zakáže iptables, stahuje antivirus, vytváří adresáře, závislosti na klonech, instaluje certifikáty a nastavuje server, instaluje konfiguraci, spustí a umožňuje rozhraní, přiděluje swap, nastavuje oprávnění a vytiskne adresu IP, IPV6 a opendkim klíč. Poměrně jednoduché, ale vypadá to jako hodně kódu. Nebudeme toho hodně potřebovat, protože nemáme závislosti, nepoužíváme celer, celerybeat nebo daphne, ale některé z nich stejně nainstalujeme, abychom mohli začít. Všimněte si, že tento kód má doménu několikrát vyhlášenou. Budeme také muset zakoupit název domény (což je malý roční poplatek). Doporučuji Squarespace k nákupu domény, jejich rozložení jeIntuitivní a snadno použitelný. Můžete si koupit jakoukoli doménu podle vašeho výběru, ale v tomto příkladu používám doménu femmebabe.com. Jakmile si zakoupíte doménu, přejděte na konfigurační panel DNS Squarespace a přidejte záznam a záznam směřující doménu na server pomocí IP adresy. Mělo by to vypadat takto: @ A xx.xx.xx.xx S operátorem @ jako hostitele, což znamená všechny subdomény v této doméně a kořenová doména přesměrují na server. Existuje více záznamů, které je třeba prohlásit, ale můžeme se k nim přesunout, až budeme připraveni poslat poštu. Mějte na paměti, že to může trvat několik dní, než budete moci úspěšně odeslat poštu ze serveru. Záznamy DNS, které nastavujeme, budou mít čas na šíření. Každopádně jediný záznam, který musíme začít, je záznam A. Takže nyní můžeme vyplnit níže uvedený skript podle našeho projektu a spustit jej. Začněme s menším nastavením skriptu, abychom nainstalovali, co potřebujeme pro základní pokrok. Zatím nebudeme používat tolik závislostí nebo postgresql, prostě budemeNahoru na základní server HTTP a starosti s jeho certifikací, když je to hotovo. Nezapomeňte, abychom získali certifikát HTTPS a bezpečně spustil server, musíme si koupit doménu spolu s nájemným serverem. Prozatím nahraďte „tým“ v tomto souboru názvem vašeho uživatele, „dir“ s adresářem projektu a do značek <> dodejte svůj e -mail a doménu. Navíc před spuštěním tohoto kódu musíme změnit nastavení na firewall, který poskytovatel hostingu podporuje, pokud existuje. Obvykle je to na kartě „Sítě“ vašeho hostingového poskytovatele, nebo pokud jste samostatně hostování, je to v části „Portwording“ routeru. Pokud používáte samoobslužné hosting, budete také chtít nastavit statickou IP prostřednictvím routeru pomocí adresy vašeho serverového počítače. Pro přístup ke čtení/zápisu budete muset otevřít následující porty. 22 (ssh) 25 (pošta) 587 (pošta) 110 (poštovní klient) 80 (http) 443

# ! / bin / bash
SECONDS=0
PYTHON_VERSION=3.12
echo "femmebabe installer initialized."
DIR="/home/team/<yourproject>"
USER="team"
# Protokol příkazů
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
# 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
# Aktualizace a instalace
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
# Povolit Clamav antivirus
echo "Starting antivirus"
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
# Nastavit jméno hostitele
echo "127.0.0.1 femmebabe" | sudo tee -a /etc/hosts
sudo hostnamectl set-hostname femmebabe
# Nastavení záložní databáze
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
# Deaktivované ipatably
echo "Configuring firewall"
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -F
sudo iptables-save
# Nastavení virtuealenv
cd $DIR
echo "Creating virtual environment"
python -m venv venv
source venv/bin/activate
pip3 install -r requirements.txt
# Nainstalujte Certbot
echo "Installing certificates"
sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
sudo snap install redis
sudo systemctl enable apache2
sudo systemctl start apache2
# Spusťte Certbot
sudo certbot --apache --non-interactive --agree-tos --domains femmebabe.com --email <youremail>@gmail.com
# Nastavit nastavení uživatele
sudo gpasswd -a www-data users
# Nastavit oprávnění
echo "Setting permissions"
sudo chown -R team:users cache/
sudo chmod a+rwx -R cache/
# Sudo Chown -r Team: Uživatelé/var/běh/
# Sudo Chown Root: Root/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 ./
# Obnovit a povolte služby
echo "Enabling services"
sudo systemctl daemon-reload
sudo systemctl enable clamav-daemon
sudo systemctl start clamav-daemon
# Povolit moduly 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
# Obnovit démona a restartujte Apache, postfix a Opendkim
sudo systemctl daemon-reload
sudo systemctl restart apache2
sudo systemctl restart opendkim postfix
# Zobrazit IPv6 a OpenDKIM pro konfiguraci domény
echo "COPY the below information to domain configuration."
hostname -I
ip a | grep inet
ip -6 addr | grep "scope link"
Před spuštěním tohoto kódu se ujistěte, že doména, kterou jste zakoupili, je připojena k serveru. Chcete -li to provést, otevřete terminál na místním počítači a spusťte tento příkaz s vaší doménou:

ping femmebabe.com # Vložte doménu zde, po pingu
Pokud všechno vypadá dobře a server odesílá odpovědi, jsme připraveni spustit skript a nainstalovat balíčky a začít, povolit a certifikovat náš server Apache. Toto není všechno nastavení potřebné k konfiguraci postfixu, podíváme se na toto nastavení později později. Prozatím spusťte tento nastavený kód a instalace a certifikace serveru by měla trvat několik minut. Ještě jednou nezapomeňte ve skriptu vyměnit jméno, e -mail a doménové jméno podle zakoupeného názvu. Nyní, když je server zajištěn, můžete přejít do URL v jakémkoli webovém prohlížeči a zkontrolovat, zda je server spuštěn HTTPS. Pokud tomu tak není, zkuste chvíli čekat na záznamy DNS, aby dohnaly a spustily následující příkaz, aby se opakoval certifikaci Certbot:

sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Dokud jste vše správně nakonfigurovali, měli byste mít přístup k výchozí stránce Apache, abyste věděli, že váš kód funguje a zobrazuje živou webovou stránku. Dále upravte nastavení.py a změňte náš výchozí režim ladění na výrobu. Konfigurujeme také doménu v nastavení a interní IPS.

nano yourproject/settings.py
V nastavení změňte/přidejte tyto řádky.

DEBUG = False

# Konfigurace webu
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',
]
Nyní budeme muset nakonfigurovat apache2. Upravte konfigurační soubor, který nasadíme s tímto řádkem:

sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Tento soubor konfigurace by měl mít v sobě náš název domény a název uživatele a projektu. Používám název domény femmebabe.com, tým uživatelského jména a název projektu 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>
Při konfiguraci serveru nezapomeňte vyměnit název projektu, adresáře a domény v tomto příkladu. Nyní budeme muset deaktivovat výchozí web. To lze provést pomocí bash.

sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Dále můžeme povolit výchozí web a znovu načíst apache2, také pomocí Bash. Nezapomeňte nahradit FemmeBabe názvem souboru, který jste deklarovali při úpravách v/etc/apache2/weby, dostupné/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Vraťte se do své domény v Navbar. Měli byste vidět web, který jste nakonfigurovali ve vašem webovém prohlížeči. Gratuluji! Pokud to nevidíte, možná budete muset provést nějaké změny. Pečlivě zkontrolujte nastavení ve vašem projektu, konfiguraci Apache a ujistěte se, že nemáte žádné chyby, a spusťte následující příkazy a zkontrolujte projekt z hlediska chyb.

cd projectname
source venv/bin/activate
python manage.py check
Pokud máte ve svém projektu Python chyby, sledujte je tam, kde jsou, a opravte je. Možná nebudete moci vidět všechny své chyby v závislosti na tom, kde jsou, takže pokud máte chybu, která jednoduše říká „osídlit není reentranta“, upravte následující soubor ve virtuálním prostředí, registru.py, odhalit chyba.

nano venv/lib/python3.12/site-packages/django/apps/registry.py
Přejděte na řádek 83, kde je tato chyba runtime zvednuta (Raise RuntimeError („Populate () není reentrant“))) a přidejte komentář před tímto řádkem a poté přidejte, se stejným odsazením, self.app_configs = {}. Vypadá to takto:

            if self.loading:
                # Zabránit reentrantským hovorům, abyste se vyhnuli spuštění appconfig.ready ()
                # metody dvakrát.
# Raise RuntimeError ("Populate () není reentrant")
                self.app_configs = {}
            self.loading = True
Poté můžete projekt znovu zkontrolovat a vystavit chybu.

python manage.py check
Pak můžete vidět chybu a opravit ji. Když ji máte opravené a kód se zkompiluje bez chyb, nezapomeňte soubor změnit, aby to vypadalo takto:

            if self.loading:
                # Zabránit reentrantským hovorům, abyste se vyhnuli spuštění appconfig.ready ()
                # metody dvakrát.
                raise RuntimeError("populate() isn't reentrant")
# self.app_configs = {}
            self.loading = True
Pokud je server online, když v něm provedeme jakékoli další změny, musíme k opětovnému načtení serveru použít následující příkaz:

sudo systemctl reload apache2
Děsivý! Ale co odeslání pošty? Chcete -li začít odesílat e -mail, budeme nejprve muset aktualizovat konfiguraci domény. To by mělo být na panelu DNS v Squarespace nebo jakémkoli registrátorovi domény, který jste si vybrali. Budeme také muset nainstalovat a přidat konfiguraci a spustit několik příkazů. Nejprve pojďme získat adresu IPv6 serveru. Poté otevřeme vaše DNS a přidáme záznamy. Chcete -li získat adresu IPv6 serveru, použijte tento příkaz:

ip -6 addr
Nyní můžeme přidat následující záznamy do nastavení DNS. Moje záznamy vypadají takto. Pro vaše záznamy byste však měli nahradit IP adresu svou IP (ne 75.147.182.214, to je moje). Také přidejte svou doménu namísto femmebabe.com, jakož i adresu IPv6 nalezenou u předchozího příkazu (nelze použít důl, Fe80 :: 725a: FFF: Fe49: 3E02). Nedělejte si starosti s doménou, toto je vytvořeno, když jsme nastavili postfix, poštovní server, s Opendkim, a vytiskněte klíč. Nakonfigurujeme to poslední. @ A N/a 75.147.182.214 @ MX 10 femmebabe.com @ Ptr N/a femmebabe.com @ Txt N/a Txt @ v = SPF1 MX IP75.147.182.214IP6: Fe80 :: 725a: FFF: Fe49: 3E02 ~ ALL výchozí._bimi Txt N/a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg _dmarc Txt N/a v = dmarc1; P = Žádný Sendonly._domainkey Txt N/aNyní budeme muset přidat nějakou přetrvávající konfiguraci pro postfix. Vše, co musíme udělat, je ujistit se, že nahradíme název domény, femmebabe.com, s názvem domény, který používáte. Podívejme se na všechny konfigurační soubory jeden po druhém a nainstalujte je do adresáře s názvem Config v našem projektu pro instalaci do operačního systému.

nano config/etc_postfix_main.cf
Přidejte tento text do souboru

# Viz /usr/share/postfix/main.cf.dist pro komentovanou a úplnější verzi


# Debian Specific: Zadání názvu souboru způsobí první
# řádek tohoto souboru, který má být použit jako název.  Defian Default
# IS /ETC /MAILNAME.
# Myorigine = /etc /poštovní jméno

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

# Appening .domain je práce MUA.
append_dot_mydomain = no

# Unlicment Další řádek pro generování varování „zpožděná pošta“
# delay_warning_time = 4H

readme_directory = no

# Viz http://www.postfix.org/compatibility_readme.html - výchozí na 3.6 ON
# čerstvé instalace.
compatibility_level = 3.6



# Parametry 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

# Milterová konfigurace
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
Další konfigurace!

nano config/etc_postfix_master.cf
Přidejte tyto řádky:

# 
# Konfigurační soubor Master Process Postfix.  Podrobnosti o formátu
# souboru viz manuální stránka Master (5) (příkaz: „Man 5 Master“ nebo
# On-line: http://www.postfix.org/master.5.html).
# 
# Po úpravě tohoto souboru nezapomeňte provést „Postfix Reload“.
# 
# ============================================== =================================================
# Typ služby Private UNSIV CHROOT Wakeup MaxProc Command + Args
# (Ano) (ano) (ne) (nikdy) (100)
# ============================================== =================================================
smtp      inet  n       -       y       -       -       smtpd
# SMTP INET N - Y - 1 POSTSCREEN
# SMTPD PASS - - Y - - SMTPD
# DNSBlog UNIX - - Y - 0 DNSBlog
# TLSProxy UNIX - - Y - 0 TLSProxy
# Vyberte jeden: Povolte pouze odeslání pro klienty Loopback nebo pro každého klienta.
# 127.0.0.1:1:submission INET N - Y - - SMTPD
submission inet n       -       y       -       -       smtpd
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_tls_wrappermode=no
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
# -O syslog_name = postfix/odeslání
# -O smtpd_tls_security_level = Encrypt
# -O smtpd_sasl_auth_enable = ano
# -O smtpd_tls_auth_only = ano
# -O smtpd_reject_unlisted_recipient = no
# -O smtpd_client_restrictions = $ mua_client_restrictions
# -O smtpd_helo_restrictions = $ mua_helo_restrictions
# -O smtpd_sender_restrictions = $ mua_sender_restrictions
# -O SMTPD_RECIPIENT_TRASTRICTIONS =
# -O smtpd_relay_restrictions = povolení_sasl_authenticated, odmítnout
# -O milter_macro_daemon_name = původ
# Vyberte jeden: Povolit SMTPS pouze pro klienty smyčky nebo pro každého klienta.
# 127.0.0.1:SMTPS INET N - Y - - SMTPD
# SMTPS INET N - Y - - SMTPD
# -O syslog_name = postfix/smtps
# -O smtpd_tls_wrappermode = ano
# -O smtpd_sasl_auth_enable = ano
# -O smtpd_reject_unlisted_recipient = no
# -O smtpd_client_restrictions = $ mua_client_restrictions
# -O smtpd_helo_restrictions = $ mua_helo_restrictions
# -O smtpd_sender_restrictions = $ mua_sender_restrictions
# -O SMTPD_RECIPIENT_TRASTRICTIONS =
# -O smtpd_relay_restrictions = povolení_sasl_authenticated, odmítnout
# -O milter_macro_daemon_name = původ
# 628 INET N - Y - - QMQPD
pickup    unix  n       -       y       60      1       pickup
cleanup   unix  n       -       y       -       0       cleanup
qmgr      unix  n       -       n       300     1       qmgr
# QMGR UNIX N - N 300 1 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_timeout = 5
showq     unix  n       -       y       -       -       showq
error     unix  -       -       y       -       -       error
retry     unix  -       -       y       -       -       error
discard   unix  -       -       y       -       -       discard
local     unix  -       n       n       -       -       local
virtual   unix  -       n       n       -       -       virtual
lmtp      unix  -       -       y       -       -       lmtp
anvil     unix  -       -       y       -       1       anvil
scache    unix  -       -       y       -       1       scache
postlog   unix-dgram n  -       n       -       1       postlogd
# 
# ============================================== ============================================
# Rozhraní k softwaru bez postfixu. Nezapomeňte prozkoumat příručku
# Stránky softwaru, který není postfix, aby zjistili, jaké možnosti chce.
# 
# Mnoho z následujících služeb používá doručení postfixu (8)
# činidlo.  Informace o stránce Pipe (8) Woman About $ {příjemce}
# a další možnosti obálky zpráv.
# ============================================== ============================================
# 
# Maildrop. Podrobnosti naleznete v souboru Postfix Maildrop_readme.
# Také určete v Main.CF: Maildrop_destination_RecipienT_limit = 1
# 
maildrop  unix  -       n       n       -       -       pipe
  flags=DRXhu user=vmail argv=/usr/bin/maildrop -d ${recipient}
# 
# ============================================== ============================================
# 
# Nedávné verze Cyrus mohou používat stávající položku „LMTP“ Master.CF.
# 
# Určete v Cyrus.conf:
# lmtp cmd = "lmtpd -a" poslouchal = "localhost: lmtp" proto = tcp4
# 
# Určete v main.cf jeden nebo více z následujících:
# Mailbox_Transport = LMTP: INET: LocalHost
# Virtual_Transport = lmtp: inet: localhost
# 
# ============================================== ============================================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Také určete v Main.CF: Cyrus_destination_RecipienT_limit = 1
# 
# Cyrus Unix - N n - - trubka
# FLAGS = DRX User = Cyrus arg =/Cyrus/bin/doručování -e -r $ {Sender} -m $ {Extension} $ {user}
# 
# ============================================== ============================================
# Starý příklad doručení přes Cyrus.
# 
# Old -Cyrus Unix - N n - - trubka
# FLAGS = R User = Cyrus argv =/Cyrus/bin/doručování -e -m $ {Extension} $ {user}
# 
# ============================================== ============================================
# 
# Podrobnosti o konfiguraci naleznete v souboru Postfix UUCP_README.
# 
uucp      unix  -       n       n       -       -       pipe
  flags=Fqhu user=uucp argv=uux -r -n -z -a$sender - $nexthop!rmail ($recipient)
# 
# Další metody externího doručení.
# 
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}
A konfigurace Opendkim. OpendKim identifikuje e -mailové servery s klíči domény, aby byly bezpečnější. Bez něj není pošta podepsána a nemusí se dostat do doručené pošty.

nano config/etc_default_opendkim
Přidejte tyto řádky:

# Poznámka: Toto je starý konfigurační soubor. Opendkim to nepoužívá
# Systémová služba. Použijte odpovídající konfigurační parametry v
# /etc/opendkim.conf místo toho.
# 
# Dříve by se zde dalo upravit výchozí nastavení a poté provést
# /lib/opendkim/opendkim.service.generate pro generování souborů přepsání Systemd na
# /etc/systemd/system/opendkim.service.d/override.conf a
# /etc/tmpfiles.d/opendkim.conf. I když je to stále možné, je to nyní
# Doporučuje se upravit nastavení přímo v /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Změna na/var/cívky/postfix/run/opendkim k použití zásuvky Unix s
# postfix v chrootu:
# Rundir =/var/cívka/postfix/run/opendkim
RUNDIR=/run/opendkim
# 
# Nekonečné zařazení alternativní zásuvky
# Všimněte si, že nastavení přepíše jakoukoli hodnotu zásuvky v Opendkim.Conf
# výchozí:
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
# Poslouchejte všechna rozhraní na portu 54321:
# Socket = inet: 54321
# Poslouchejte na smyčku na portu 12345:
# Socket = inet: 12345@localhost
# Poslouchejte je 192.0.2.1 je port 12345:
# Socket = inet: 12345@192.0.2.1
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=

nano config/etc_dovecot_conf.d_10-master.conf
Přidejte tyto řádky:

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

# Výchozí limit VSZ (velikost virtuální paměti) pro servisní procesy. To je hlavně
# určené k zachycení a zabíjení procesů, které prosakují paměť před tím, než se sníží
# všechno.
# default_vsz_limit = 256m

# Přihlašovací uživatel je interně používán pomocí přihlašovacích procesů. Toto je nejvíce nedůvěryhodné
# Uživatel v systému Dovecot. Nemělo by to mít přístup k ničemu.
# default_login_user = dovell

# Interní uživatel používá nepruvilegové procesy. Mělo by to být oddělené od
# Přihlaste se uživatel, aby se přihlašovací procesy nemohly rušit jiné procesy.
# default_internal_user = dovecot

service imap-login {
  inet_listener imap {
    # Port = 143
  }
  inet_listener imaps {
    # Port = 993
    # SSL = ano
  }

  # Počet připojení k zpracování před zahájením nového procesu. Obvykle
  # Jediné užitečné hodnoty jsou 0 (neomezené) nebo 1. 1 je bezpečnější, ale 0
  # je rychlejší. <DOC/Wiki/LoginProcess.txt>
  # servis_count = 1

  # Počet procesů, které vždy čekají na další spojení.
  # Process_min_avail = 0

  # Pokud nastavíte servis_count = 0, pravděpodobně to musíte růst.
  # Vsz_limi = $ default_vsz_limit
}

service pop3-login {
  inet_listener pop3 {
    # Port = 110
  }
  inet_listener pop3s {
    # Port = 995
    # SSL = ano
  }
}

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

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

  # Vytvořte posluchače INET, pouze pokud nemůžete použít výše uvedenou zásuvku UNIX
  # inet_lister lmtp {
    # Vyvarujte se zviditelnění LMTP pro celý internet
    # Adresa =
    # Port =
  # }
}

service imap {
  # Většina paměti jde do souborů MMAP (). Možná to budete muset zvýšit
  # Omezte, pokud máte obrovské poštovní schránky.
  # vsz_limit = $ default_vsz_limit

  # Max. Počet procesů IMAP (připojení)
  # Process_limit = 1024
}

service pop3 {
  # Max. Počet procesů POP3 (připojení)
  # Process_limit = 1024
}

service submission {
  # Max. Počet procesů odesílání SMTP (připojení)
  # Process_limit = 1024
}

service auth {
  # Auth_Socket_Path ve výchozím nastavení ukazuje na tuto zásuvku UserDB. Obvykle je to
  # používají Dovecot-Lda, Doveadm, možná proces IMAP atd. Uživatelé, kteří mají
  # Úplná oprávnění k této zásuvce jsou schopna získat seznam všech uživatelských jmen a
  # Získejte výsledky vyhledávání userdb každého.
  # 
  # Výchozí režim 0666 umožňuje komukoli připojit se k zásuvce, ale
  # vyhledávání userdb uspěje pouze v případě, že UserDB vrátí pole „UID“, které
  # odpovídá UID procesu volajícího. Také pokud se shoduje s volajícím UID nebo GID
  # Socket je uid nebo gid vyhledávání uspěje. Cokoli jiného způsobuje selhání.
  # 
  # Chcete -li dát volajícímu plná oprávnění k vyhledávání všech uživatelů, nastavte režim na
  # Něco jiného než 0666 a Dovecot umožňuje jádru vynutit
  # Oprávnění (např. 0777 umožňuje všem plná oprávnění).
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }
}

service auth-worker {
  # Proces Auth Worker je ve výchozím nastavení spuštěn jako root, aby měl přístup
  # /atd./stín. Pokud to není nutné, měl by se uživatel změnit na
  # $ default_interal_user.
  # Uživatel = root
}

service dict {
  # Pokud je použit DICT proxy, měly by e -mailové procesy mít přístup k jeho zásuvce.
  # Například: Mode = 0660, Group = VMail a Global Mail_access_Groups = VMail
  unix_listener dict {
    # Režim = 0600
    # Uživatel =
    # skupina =
  }
}
Ještě jednou nezapomeňte vyměnit doménu ve všech těchto souborech, FemmeBabe.com, s vybranou doménou. Upravte další soubor, konfiguraci Dovecot,

nano config/etc_dovecot_dovecot
A přidejte tyto řádky

## Konfigurační soubor Dovecot

# Pokud spěcháte, podívejte se na http://wiki2.dovecot.org/quickconfiguration

# Příkaz "DoveConf -n" poskytuje čistý výstup změněného nastavení. Použijte to
# Místo kopírování a vložení souborů při zveřejňování příspěvku do seznamu adresátů DoveCot.

# '# „Postava a všechno poté, co se zachází jako s komentářemi. Extra prostory
# a karty jsou ignorovány. Pokud chcete použít některou z nich explicitně, dejte
# value inside quotes, eg.: key = "# char a koncový mezera "

# Většina (ale ne všech) nastavení může být přepsána různými protokoly a/nebo
# Zdroj/cíl IPS umístěním nastavení uvnitř sekcí, například:
# Protocol IMAP {}, Local 127.0.0.1 {}, Remote 10.0.0.0/8 {}

# Výchozí hodnoty jsou zobrazeny pro každé nastavení, není nutné se uvolnit
# ty. To však jsou výjimky: žádné sekce (např. Namespace {})
# nebo nastavení pluginu jsou ve výchozím nastavení přidány pouze jako příklady.
# Cesty jsou také pouze příklady, kdy skutečné výchozí hodnoty jsou založeny na konfiguraci
# Možnosti. Zde uvedené cesty jsou pro konfiguraci -prefix =/usr
# -SysConfdir =/atd-localstatedir =/var

# Povolit nainstalované protokoly
!include_try /usr/share/dovecot/protocols.d/*.protocol

# Kolma oddělený seznam IPS nebo hostitelů, kde naslouchat pro připojení.
# "*" poslouchá ve všech rozhraních IPv4, "::" Poslouchá ve všech rozhraních IPv6.
# Pokud chcete zadat nedefinované porty nebo něco složitějšího,
# Upravit conf.d/master.conf.
# Poslouchejte = *, ::

# Základní adresář, kde ukládat data runtime.
# base_dir =/var/běh/dovecot/

# Název této instance. V nastavení multiinstance Doveadm a další příkazy
# můžete použít -i <instance_name> k výběru, který instance se používá (alternativa
# to -c <config_path>). Název instance je také přidán do procesů Dovecot
# ve výstupu PS.
# instance_name = dovecot

# Pozdrav pro klienty.
# login_greeting = Dovecot připraven.

# Space oddělený seznam důvěryhodných síťových rozsahů. Spojení z nich
# IP mohou přepsat své IP adresy a porty (pro protokolování a
# pro kontroly ověřování). Disable_plaintext_auth je také ignorován pro
# tyto sítě. Obvykle byste zde zadali servery IMAP proxy.
# login_trusted_networks =

# Space oddělený seznam zásuvných přístupu k přihlášení (např. TCPWRAP)
# login_access_sockets =

# S proxy_maybe = ano, pokud proxy cíl odpovídá některému z těchto IP, nedělejte
# proxying. To není nutné normálně, ale může být užitečné, pokud cíl
# IP je např. Ip balancera zatížení.
# auth_proxy_self =

# Zobrazit více podrostných procesů procesu (v PS). V současné době ukazuje uživatelské jméno a
# IP adresa. Užitečné vidět, kdo skutečně používá procesy IMAP
# (např. Sdílené poštovní schránky nebo pokud se pro více účtů používá stejné UID).
# verbose_proctle = ne

# Pokud by se zabily všechny procesy, když se uzavírá hlavní proces Dovecot.
# Nastavení na „ne“ znamená, že Dovecot lze upgradovat bez
# nutí uzavření stávajících klientských připojení (i když by to mohlo být také
# problém, pokud je upgrade např. kvůli opravě zabezpečení).
# Shutdown_Clients = ANO

# Pokud nenulové, spusťte poštovní příkazy prostřednictvím tohoto mnoha připojení k serveru Doveadm,
# Místo toho, aby je spustili přímo ve stejném procesu.
# doveadm_worker_count = 0
# Socket nebo hostitel UNIX: Port používaný pro připojení k serveru Doveadm
# doveadm_socket_path = doveadm-server

# Space oddělený seznam proměnných prostředí, které jsou zachovány na Dovecot
# Spuštění a předávání všech svých dětských procesů. Můžete také dát
# klíč = páry hodnot pro vždy nastavení konkrétních nastavení.
# Import_environment = tz

## 
## Nastavení serveru slovníku
## 

# Slovník lze použít k ukládání seznamů klíčů = hodnoty. Toto je používáno několika
# pluginy. K slovníku lze přistupovat přímo nebo ačkoli a
# Slovní server. Následující názvy slovníků dict bloků pro URIS
# Po použití serveru. Poté lze na ně odkazovat pomocí URI ve formátu
# "Proxy :: <name>".

dict {
  # Kvóta = mysql: /andc/dovecot/dovecot-dic-sql.conf.ext
}

# Většina skutečné konfigurace je zahrnuta níže. Názvy souborů jsou
# nejprve tříděn podle jejich hodnoty ASCII a analyzován v tomto pořadí. 00-prefixy
# V názvech je určen k usnadnění porozumění uspořádání.
!include conf.d/*.conf

# Konfigurační soubor se může také pokusit být zahrnut bez chyby, pokud
# není to nalezeno:
!include_try local.conf

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

protocols = imap pop3

# Umožňuje Dovecot poslouchat všechna vstupní připojení (IPv4 / IPv6)

listen = *, ::
Přidejte heslo pro uživatele DoveCot:

nano config/etc_dovecot_passwd
První část souboru před tlustým střevem je uživatelské jméno. Poslední část „YourPassword“ označuje heslo, které chcete poskytnout poštovnímu serveru.

team:{plain}yourpassword
Dále konfigurace Opendkim

nano config/etc_opendkim.conf
A přidat tyto řádky:

# Toto je základní konfigurace pro podepisování a ověření. Může to být snadno
# upraveno tak, aby vyhovovalo základní instalaci. Viz Opendkim.Conf (5) a
# /usr/share/doc/opendkim/examples/opendkim.conf.Sample pro dokončení
# Dokumentace dostupných konfiguračních parametrů.

Syslog			yes
SyslogSuccess		yes
# Logwhy ne

# Běžné parametry podpisu a ověřování. V Debianu je záhlaví „z“
# převrácené, protože je to často klíč identity používaného systémy reputace
# A tak poněkud citlivá na bezpečnost.
Canonicalization	relaxed/simple
Mode			s
SubDomains		no
OversignHeaders		From

# Podepisování domény, voliče a klíče (požadované). Například proveďte podpis
# pro doménu "example.com" s selektorem "2020" (2020._domainkey.example.com),
# Použití soukromého klíče uloženého v /etc/dkimkeys/example.private. Více granulované
# Možnosti nastavení najdete v /usr/share/doc/opendkim/readme.opendkim.
# Doména příkladem.com
# Selector 2020
# Keyfile /etc/dkimkeys/example.private

# V Debianu běží Opendkim jako uživatel „Opendkim“. Je vyžadován umask 007
# Použití místní zásuvky s MTA, která přistupuje k zásuvce jako nerivilegové
# Uživatel (například postfix). Možná budete muset do skupiny přidat uživatele „postfix“
# "Opendkim" v tom případě.
UserID			opendkim
UMask			007

# Soket pro připojení MTA (vyžadováno). Pokud je MTA uvnitř vězení Chroot,
# Je třeba zajistit, aby byla zásuvka přístupná. V Debianu pobíhá Postfix
# chroot in/var/cívka/postfix, proto by musela být zásuvka Unix
# Nakonfigurováno, jak je uvedeno na posledním řádku níže.
# Socket Local: /run/opendkim/opendkim.sock
# Socket Inet: 8891@localhost
# Socket Inet: 8891
Socket			local:/var/spool/postfix/opendkim/opendkim.sock

PidFile			/run/opendkim/opendkim.pid

# Hostitelé, pro které se mají podepisovat spíše než ověřit, je výchozí hodnota 127.0.0.1. Viz
# Operační část Opendkim (8) pro více informací.
# Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12

# Trust Anchor umožňuje DNSSEC. V Debianu je poskytnut soubor důvěryhodnosti
# balíčkem dns-root-data.
TrustAnchorFile		/usr/share/dns/root.key
# NasideServers 127.0.0.1

# Mapujte domény z adres do klíčů používaných k podepisování zpráv
KeyTable           refile:/etc/opendkim/key.table
SigningTable       refile:/etc/opendkim/signing.table

# Sada interních hostitelů, jejichž pošta by měla být podepsána
InternalHosts       /etc/opendkim/trusted.hosts

nano config/etc_default_opendkim
A přidejte tyto řádky

# Poznámka: Toto je starý konfigurační soubor. Opendkim to nepoužívá
# Systémová služba. Použijte odpovídající konfigurační parametry v
# /etc/opendkim.conf místo toho.
# 
# Dříve by se zde dalo upravit výchozí nastavení a poté provést
# /lib/opendkim/opendkim.service.generate pro generování souborů přepsání Systemd na
# /etc/systemd/system/opendkim.service.d/override.conf a
# /etc/tmpfiles.d/opendkim.conf. I když je to stále možné, je to nyní
# Doporučuje se upravit nastavení přímo v /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Změna na/var/cívky/postfix/run/opendkim k použití zásuvky Unix s
# postfix v chrootu:
# Rundir =/WAS/SPOOL/POSTFIX/RUN/OpenDKIM
RUNDIR=/run/opendkim
# 
# Nekonečné zařazení alternativní zásuvky
# Všimněte si, že nastavení přepíše jakoukoli hodnotu zásuvky v Opendkim.Conf
# výchozí:
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
# Poslouchejte všechna rozhraní na portu 54321:
# Socket = inet: 54321
# Poslouchejte na smyčku na portu 12345:
# Socket = inet: 12345@localhost
# Poslouchejte je 192.0.2.1 je port 12345:
# Socket = inet: 12345@192.0.2.1
USER=opendkim
GROUP=opendkim
PIDFILE=$RUNDIR/$NAME.pid
EXTRAAFTER=
Až budeme připraveni nastavit náš server PostFix, spustíme níže uvedený kód s příslušným vloženým názvem domény. Začněte vytvořením skriptu

touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Nyní, v Nano, textový editor, upravte tento soubor tak, aby místo FemmeBabe.com obsahoval název domény.

# ! / bin / bash
# Nastavení postfixu
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}'
Nyní spusťte dokončený skript a nakonfigurujete postfix, Opendkim a Dovecot.

./scripts/postfixsetup
Jakmile tento skript spustí, zkopírujte poslední řádek, který vytiskne a vložte jej do konfigurace DNS jako hodnotu pro Sendonly._domainkey. Toto je klíč OpendKim používaný k identifikaci vaší domény při odesílání zabezpečené pošty. Děsivý! Během několika dnů byste měli být schopni odeslat poštu ze serveru za předpokladu, že je vše správně nakonfigurováno. Pokud jste právě nakonfigurovali DNS pro svůj poštovní server, mělo by to trvat méně než 72 hodin, než se záznamy aktualizují. Obvykle je to mnohem rychlejší. Můžete zkontrolovat, zda váš server funguje pomocí tohoto příkazu, dodal váš e -mail:

echo “test” | mail -s “Test Email” youremail@gmail.com
Pokud se zdá, že vše funguje správně, měli byste být schopni odesílat e -mail s vaším serverem. Pokud to nefunguje, zkuste se podívat na protokoly a zjistit, jaká by mohla být chyba.

tail –lines 150 /var/log/mail.log
To nabídne podrobné informace o poště, která je odesílána serverem a zda funguje správně. Měli byste být schopni vidět také e -mail ve vaší doručené poště, pokud to není, zkontrolujte složku spamu. Budete také muset nakonfigurovat nastavení ve svém nastavení.py, aby váš e -mailový server mohl mluvit s vaší aplikací Django, projektem. Přidejte nebo vyměňte tyto řádky do svého nastavení

EMAIL_HOST = DOMAIN
EMAIL_PORT = 587
EMAIL_USE_TLS = True
EMAIL_ADDRESS = 'team@femmebabe.com'
EMAIL_HOST_USER = 'team' # 'Love@mamasheen.com'
EMAIL_HOST_PASSWORD = config['EMAIL_HOST_PASSWORD']
DEFAULT_FROM_EMAIL = '{} <{}>'.format(SITE_NAME, EMAIL_HOST_USER)
Všimněte si, že k získání hesla používáme konfigurační soubor. Načtěte tento soubor do nastavení tak, na samém začátku souboru.:

import os
import json

# Otevřete a načtěte konfiguraci
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
Vytvořme tento soubor a přidejte k němu tajný klíč, jakož i heslo pošty. Chcete -li vygenerovat tajný klíč, použijte tento příkaz a na konci se vám líbí jakoukoli délku:

openssl rand -base64 64
Nyní zkopírujte text, který OpenSSL vygeneroval a upravte /etc/config.json

sudo nano /etc/config.json
Přidejte do svého souboru následující řádky s klíčem, který je generován jako tajný klíč.

{
	"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
	"EMAIL_HOST_PASSWORD": "yourpassword"
}
Formát JSON je jednoduchý a snadno použitelný, můžeme také prohlásit další klíče, které chceme použít v našem projektu pouze z našeho adresáře projektu. Toto je doporučená praxe pro klíče API, z nichž zde použijeme více než několik. Budete také chtít zálohovat svůj projekt, abyste se ujistili, že je vše uloženo, a budete moci svou práci obnovit později, i když si již nepřejete pronajmout server.

sudo backup
Nyní zkuste odeslat e -mail HTML z webového serveru za předpokladu, že odeslání jednoho z příkazového řádku funguje. Dotazujte instanci uživatele do shell a odešlete e -mailu HTML tomuto uživateli prostřednictvím Djanga. Změňte mé jméno v kódu, Charlotte, na vaše uživatelské jméno.

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()
Pokud první příkaz nefunguje, nezapomeňte použít

source venv/bin/activate
Pokud je vše nastaveno správně, nyní získáte uvítací e -mail ve své poštovní schránce odeslané vaší webovou aplikací. Dobrá práce! Prošel jsi dlouhou cestu. Chtěl jsem dodat, že pokud se někdy potýkáte s jakýmikoli chybami při práci na takovém projektu, neváhejte hledat odpovědi a požádat o pomoc. Google, mimo jiné vyhledávače, jsou skvělými zdroji pro vyhledávání nápovědy pro programování. Jednoduše vyhledejte chybu, kterou získáte, a budete moci vidět, jak ostatní lidé vyřeší problém. Také jste vítáni, abyste mě kontaktovali, vaše pedagogy (učitelé, profesoři, lektoři), všechny vrstevníky na internetu, kteří jsou k dispozici pro programování nápovědy, nebo se opět poraďte s touto knihou nebo jinými zdroji, abyste našli řešení problémů, které máte. Chápu, že to není snadné, ale i když jste si přečetli v této daleko a nepíšu žádný kód, hodně se dozvíte o vytváření webové aplikace od nuly. Poklepte se na záda, děláte skvělepráce. Děkujeme, že jste si udělali čas na přečtení tohoto příručky pro vývoj webových stránek třetího vydání. V budoucích vydáních budu zahrnovat více důležitých příkladů diskutovaných na začátku dokumentu a budeme se ponořit mnohem hlouběji do světa vývoje softwaru a hardwaru. Zůstaňte naladěni na to, co má přijít, a těším se, až vás naučím, jak budovat neuvěřitelný software. Uvidíme se v příštím






Blízko
Strana 1
Skok
Viz celý článek
Pokračujte ve čtení

Nakoupit | Nakupujte pomocí kryptoměny



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


(Kliknutím nebo klepnutím stáhněte obrázek)
Profesionální zábava, fotografie, videa, zvuk, živá a příležitostná hraní, stejně jako skenování ID, vývoj webových stránek a náhradní služby.

Zanechte mi tip v bitcoinech pomocí této adresy: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Podmínky služby