Příkladem praktického hlubokého učení a zabezpečení založeného na webu

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 Aktualizováno/převedeno 3. června 2025 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ý. The DOM (Document Object Markup), with it's implementation of HTML, JavaScript, and CSS as well as backend software implementing Python, C/C++, Java and bash, give web developers the freedom and power to create a wide variety of projects that express creativity, provide ease of use and functionality, portray humility and character, and provide ease of use as well as convenience and important services that are all attractive to the average Joe, the end user looking to Zabijte čas nebo něco udělejte na internetu, obvykle na dotykové obrazovce smartphone. Most people wouldn't even know where to start when they want to build a website from scratch, they would tend to start on another person's website and build something limited in functionality, dependability, ease of use and especially creativity when they could have had all the latest powerful tools at their disposal in order to build something useful without wasting time pressing buttons, and especially wasting money paying for expensive subscriptions to software few people wanted to use anyway given it's limitations in ease of use and flexibility. 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 jsou motivováni k tomu, abyste se naučili kódovat a psát svůj vlastní software, vzít tuto knihu domů a vyčlenit nějakou dobu, aby se naučil budovat další vlivné, výkonné, výkonné a důležité webové aplikace, web, který je na vás a je na vás, který chcete, a vyhodnotit potřeby. O mně: Jsem vývojář softwaru se širokou škálou 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 vyhovět svým vlastním potřebám, zatímco splním vaše, a jste ochotni pokrýt náklady na provoz webové stránky sami, postavil bych vám další YouTube, Tiktok, Twitter, Google nebo dokonce high-tech zabezpečovací aplikaci, jen můžete získat přístup. Místo toho, abych se vám pokusil prodat svůj čas, snažím se koupit váš: Chci vás promluvit o vytvoření aplikace (webové stránky) s informacemi, které již existují, a naučím vás, co potřebujete, abyste byli nezávislým vývojářem softwaru, podnikatel, což vede úspěšnou kariéru v jakékoli oblasti. 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 vše s formálním vzděláváním, nebo si tuto knihu přečíst ve škole, dokončit své úkoly a odvést hodně z vašeho vzdělání, ale nebudu vás formálně dát na horké sedadlo a požádat 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 čtení příkladů ostatních lidí. A musím říci, že nemusíte být extrémně bohatí, inteligentní, úspěšní nebo dokonce detailně orientovaní nebo organizovaní, abyste vytvořili aplikaci. 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 výzvy 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 otočili 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ý chce vidět, že vás uspěje ve všem, co děláte. JsemEngineer sám, vývojář softwaru 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, že uvedou příklady, které se hodí dohromady jako velká puzzle do fungujícího, velkého, funkčního, soudržného a poutavého aplikace, která může vést k úspěchu bez ohledu na řadu 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ý, měl jsem zákon, který mě vedl k tomu, abych opustil vysoké školy a univerzity 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, fotografuji sám sebe, nosím šaty a další dámské oblečení a já si zůstávám přirozený jako ženu 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, abyste o ni požádali, máte zdroje, které ve svém životě musíte být ú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ě, mé portfolio a mé živobytí, takže si vážím vašeho úvahy, když si vezmete text domů a pečlivě se nad ní pórujete, abyste se od mě poučili. Mějte na paměti, že nejsem dokonalý, tato kniha bude mít chyby, revize a nová vydání a budete muset myslet na svůj logický mozek, 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, analyzujete a organizujete, a pochopíte je, nevyhnutelně narazíte na obtíže 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, spolupracujte s vaší komunitou a komunitami, které máte k dispozici, abyste stavěli software v bezpečném prostředí, a neberte věci osobně, když selžete nebo dokonce uspějete nesprávným způsobem: Takto jsem se dostal tak daleko, a proč vám mohu přinést tento text a pomáhat vám uspět, aniž byste se odchylovali na cestě mad. Práce, 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 aplikovat to, co jste se naučili. Můj projekt Capstone je základem pro většinu toho, co si přečtete v této knize, protože zahrnuje kód z mých předchozích projektů, kód, 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 v místě, kde mohu roztočit jednoduchou aplikaci, která je plně vystupována a vypadá jako populární aplikace, kterou můžete vidět, na internetu, nebo ve zprávách, nebo ve zprávách, nebo ve zprávách. Co je tato kniha: Tato kniha je příkladem. Kód najdete zde, 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 váš kód, znovu se rozkládat, pokud někdo poruší váš kód, zabezpečit váš kód, nasazovat váš kód, vybudovat interaktivní webové stránky, které jsou zábavné, a přijímají a přijímají, a jak se vám zobrazovat, a jak je to software a jak je to, jak je to software a firemní, a to, jak se vynořuje, a jak je to, jak je to software a firemní, a to, jak se vám podaří, a jak se vám podaří, a to, jak se vám podaří, a jak se vám podaří, a to, jak se staví a vykreslují, a jak se vystavit a vykreslit, a to, jak se stavět a nasazovat, a jak se vyvíjet, a jak se stavět, a to, jak se staví, a to, jak se staví software a jak se staví. Stavíte absolutně nejlepší světlo, abyste byli 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í. Zahájíme učenílikvidacePříkladem praktického hlubokého učení a zabezpečení založeného na webu Třetí vydání Charlotte Harper 3. července 2024 Aktualizováno/převedeno 3. června 2025
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ý. The DOM (Document Object Markup), with it's implementation of HTML, JavaScript, and CSS as well as backend software implementing Python, C/C++, Java and bash, give web developers the freedom and power to create a wide variety of projects that express creativity, provide ease of use and functionality, portray humility and character, and provide ease of use as well as convenience and important services that are all attractive to the average Joe, the end user looking to Zabijte čas nebo něco udělejte na internetu, obvykle na dotykové obrazovce smartphone. Most people wouldn't even know where to start when they want to build a website from scratch, they would tend to start on another person's website and build something limited in functionality, dependability, ease of use and especially creativity when they could have had all the latest powerful tools at their disposal in order to build something useful without wasting time pressing buttons, and especially wasting money paying for expensive subscriptions to software few people wanted to use anyway given it's limitations in ease of use and flexibility. 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 jsou motivováni k tomu, abyste se naučili kódovat a psát svůj vlastní software, vzít tuto knihu domů a vyčlenit nějakou dobu, aby se naučil budovat další vlivné, výkonné, výkonné a důležité webové aplikace, web, který je na vás a je na vás, který chcete, a vyhodnotit potřeby.O mně: Jsem vývojář softwaru se širokou škálou 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 vyhovět svým vlastním potřebám, zatímco splním vaše, a jste ochotni pokrýt náklady na provoz webové stránky sami, postavil bych vám další YouTube, Tiktok, Twitter, Google nebo dokonce high-tech zabezpečovací aplikaci, jen můžete získat přístup. Místo toho, abych se vám pokusil prodat svůj čas, snažím se koupit váš: Chci vás promluvit o vytvoření aplikace (webové stránky) s informacemi, které již existují, a naučím vás, co potřebujete, abyste byli nezávislým vývojářem softwaru, podnikatel, což vede úspěšnou kariéru v jakékoli oblasti. 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 vše s formálním vzděláváním, nebo si tuto knihu přečíst ve škole, dokončit své úkoly a odvést hodně z vašeho vzdělání, ale nebudu vás formálně dát na horké sedadlo a požádat 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 čtení příkladů ostatních lidí. A musím říci, že nemusíte být extrémně bohatí, inteligentní, úspěšní nebo dokonce detailně orientovaní nebo organizovaní, abyste vytvořili aplikaci. 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 výzvy 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 otočili 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ý chce vidět, že vás uspěje ve všem, co děláte. Sám jsem inženýr, vývojář softwaru a student a píšu tuto knihu pro ostatní studenty, kteří chtějí usnadnit život tím, že mají příručku o softwaru, který potřebují usnadnit jejich životy tím, že uvedou příklady, které se hodí jako velká puzzle do fungujícího, užitečného, funkčního, soudržného a zapojeného aplikace, která může řídit úspěch bez ohledu na řadu 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ý, měl jsem zákon, který mě vedl k tomu, abych opustil vysoké školy a univerzity 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, fotografuji sám sebe, nosím šaty a další dámské oblečení a já si zůstávám přirozený jako ženu 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, abyste o ni požádali, máte zdroje, které ve svém životě musíte být ú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ě, mé portfolio a mé živobytí, takže si vážím vašeho úvahy, když si vezmete text domů a pečlivě se nad ní pórujete, abyste se od mě poučili. Mějte na paměti, že nejsem dokonalý, tato kniha bude mít chyby, revize a nová vydání a budete muset myslet na svůj logický mozek, 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, analyzujete a organizujete, a pochopíte je, nevyhnutelně narazíte na obtíže 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, spolupracujte s vaší komunitou a komunitami, které máte k dispozici, abyste stavěli software v bezpečném prostředí, a neberte věci osobně, když selžete nebo dokonce uspějete nesprávným způsobem: Takto jsem se dostal tak daleko, a proč vám mohu přinést tento text a pomáhat vám uspět, aniž byste se odchylovali na cestě mad. Práce, 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 aplikovat to, co jste se naučili. Můj projekt Capstone je základem pro většinu toho, co si přečtete v této knize, protože zahrnuje kód z mých předchozích projektů, kód, 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 v místě, kde mohu roztočit jednoduchou aplikaci, která je plně vystupována a vypadá jako populární aplikace, kterou můžete vidět, na internetu, nebo ve zprávách, nebo ve zprávách, nebo ve zprávách.Co je tato kniha: Tato kniha je příkladem. Kód najdete zde, 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 váš kód, znovu se rozkládat, pokud někdo poruší váš kód, zabezpečit váš kód, nasazovat váš kód, vybudovat interaktivní webové stránky, které jsou zábavné, a přijímají a přijímají, a jak se vám zobrazovat, a jak je to software a jak je to, jak je to software a firemní, a to, jak se vynořuje, a jak je to, jak je to software a firemní, a to, jak se vám podaří, a jak se vám podaří, a to, jak se vám podaří, a jak se vám podaří, a to, jak se staví a vykreslují, a jak se vystavit a vykreslit, a to, jak se stavět a nasazovat, a jak se vyvíjet, a jak se stavět, a to, jak se staví, a to, jak se staví software a jak se staví. Stavíte absolutně nejlepší světlo, abyste byli 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í. Zahájíme zkušenosti s učením vytvořením základního projektu 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 je návrh a výroba střelných zbraní a munice, včetně designu barelu a opakování, navrhování věže a dronů a dalších principů, budeme integrovat s naším softwarem do stávající sítě, abychom chránili náš software a prokázali sebeobranu a odolnost. Vezmeme si přestávky na cestě k budování her, 2D a 3D vykreslovacích motorů a pracujeme s vloženým hardwarem v případové studii příklady základního dimenzionální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 jen 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ě vystupovaný, funkční a bezpečnější 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é provozovat v měřítku starších společností, v nichž pracují, a nepřitahují se dozadu, spletité společnosti, které vydělávají 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 vytvářet aplikaci, ale nasměruje vás správným směrem a vyzbrojí vás pomocí potřebných nástrojů a dovednostmi a tipy, které usnadní váš vlastní úspěch při vytváření softwaru pro web, s každým řádkem kódu, které budete muset napsat jako příklad, připraveni k tomu, abyste byli spolu s softwarem a vašimi příznivci, návštěvníci, návštěvníci a lidé a podporovali.Co se naučíte: Tato kniha vás naučí, jak vytvářet 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é zóny čárových kódů, webové API pro ověření, zaznamenávání a vykreslení videa a fotografií a výměnu zpráv, jako je Bluetooth a NFC) komunikace. This book will teach you how to use a networked computer, focusing on debian linux, how to build bash code to make installing and backing up your software a seamless, automated breeze, how to build python code as a backend to serve dynamic messages, style things nicely using CSS styles with Bootstrap, enable user logins and interactivity through networked devices, build interactive media and network with other websites to offer security features like text messages for verification or other účely, skenování ID, moderování obrázků a videa, datové mikrotrankce, 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 vytvářet a nasazovat web od základů bez předchozí zkušenosti, učinit jej funkční, bezpečný, krásný, užitečný a hlavně 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, aby vytvořil užitečné vzorky a jak prolomit hluk, aby se vytvořili další weby, aby vytvořili lidi k vytvoření ostatních webových stránek k vytvoření ostatních webových stránek k vytvoření lidí do svého softwaru a podniků. 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 také 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ů pro požadavky Python, jakož i užitečný software Bash jako 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 rychle ji zařadit do prvního hodnocení toho, co vaši zákazníci budou hledat, aby vás našli, a v souladu s co nejvíce běž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ě uložit 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 uživatele zapojené na vaše stránky klepnutím na jejich telefony, e -mailem, textovými zprávami, telefonními hovory a dalšími cestami, aby přivedli své uživatele zpět k vaší webové stránce pouze za kliknutím na kliknutí na tlačítko s tahem pouze pro vás. 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, abyste vytvořili web, aplikaci, která je reprezentativní pro vás a vás, a pouze vás, vaše 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ů, které vám bude distribuovat tolik obsahu, jak potřebujete, v rámci zdravého vyvážení platforem, aby se přivedly k více úsilí, práci, než je nutné. Tato kniha se nazývá „praktickáPříkladem „z nějakého důvodu„ z nějakého důvodu: 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ží praktickému účelům nastíněné v textu. Vylepšení, titulky obrázků a další úkoly, jako je metrika predikce pocházející z obrázků, jako je povaha obrazu jako autentická, počítačově přenosná obraz nebo optická kopie (fotografie obrázku nebo tištěné fotografie), protože je to možné, že je to možné, pokud jde o to, aby to bylo možné. Vaše tvář. použití). 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 samotného softwaru. To je něco zaměřeného na tuto knihu. Síťový počítač je ve výchozím nastavení zabezpečen dlouhým klíčovým tokenem, nazývaným a SSH nebo zabezpečeným klíčem Shell a jinak je nejlépe zabezpečen webovým serverem, protože webový server poskytuje otevřený přístup a také stavěcí nástroje pro zabezpečení umění spuštěné 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 psát do Bluetooth rádiových zařízení a může si číst a psát na polní transpondér Transpondér, levné klíčové karty, na webu a valitelé na webu a valitelé na webu a valitelé a valiba na web a psát pomocí datových dat. 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ě zabezpečený počítačový systém, který pro vás funguje, dělá vaše nabídky a vypadá a cítí se a cítí
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, a dokumentovat případy použití a její praktické příklady. 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í správná, zvažte ji na darování příteli nebo příbuznému, který by se mohl zajímat o samotný vývoj webu, a dokonce zvažte, zda si ji půjčíme zpět a naučíte se od nich, aby vyplnili mezery, kde jsem vás před mnou selhal jako učitele nebo jiné učitele. Začněte, kde chcete, každá část této knihy bude užitečná, pokud máte v úmyslu vytvořit užitečnou aplikaci, 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 boxem, 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 v tomto bodě nainstalovat virtuální počítač, protože s virtuálním počítačem získáte compatibilitu. Různí poskytovatelé, jako je 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žijte příkaz CD ke změně na adresář a a aCD/PATH/TO/ADIGRECORY - 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 je třeba 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 příštích několika 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 dotyk a zavoláme skript „ascript".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ě. Stejný kód použijeme jako výše, nahradíme název skriptu „ascript" parametrem argumentu, $ 1. To nám umožňuje volat skript zadáním jednoduše sudo ascript Newscript, v tomto okamžiku 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 soubor ukládáme 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 tím, že jej voláte ve shellu. 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.zálohování sudo ascript
Nyní v Nano:sudo CP/usr/bin/zálohování/cesta/do/adresář/ sudo CP/usr/bin/ascript/cesta/do/adresář/
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ížezálohování
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 spustit, 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 (ačkoli existuje řada dalších řešení pro zálohování, jsou všechny přibližně stejné.) Git je software pro řízení Verision, který vám umožní zálohovat úpravy vašeho softwaru, když je vyrábíte na server, a zároveň vám umožní stáhnout celé kopie vašeho softwaru nebo klíče. Je 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 automaticky zálohovat, které pokryjeme.
Pokud v tomto bodě 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ů nezbytných k vytvoření pracovního webu a předškolních operací v 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 k tomu použijí řadu balíčků Linux. Pokud stále chcete používat Mac OS, jste vítáni hledat a nainstalovat potřebné balíčky online, ale nemusí existovat alternativy pro každý balíček, který bude tato kniha nebo série pokrýt.Pojďme přidat několik příkazů, abychom spáchali naši práci se záložním skriptem spuštěním zálohování příkazu sudo ascript.
#… Git Add - ALL git commit -m "zálohování" Git Push -U Origin Master…
Ještě jednou ovládejte X a uložte.sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
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/ADIGRECTORY 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,sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
CD ~
CAT .SSH/ID_RSA.PUBZkopí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 zařazení. 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 Přidat git: //… (vaše vzdálená adresa URL)sudo ascript backup
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álohouVelký! 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-yinvsudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
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í stroj a Linux 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, abyste mohli nastavit 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 CD:backup
Python -M Venv Venv # vytváří virtuální prostředí, kde je uložen kód
Zdroj Venv/Bin/Active # Aktivuje virtuální prostředí
PIP nainstalujte django
django-admin startproject mysite. # Kde MySite je projekt, který začínám ve svém aktuálním adresáři.Vytváří virtuální prostředí, kde je kód uložen
Aktivuje virtuální prostředí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 aplikaciPython 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:# Nainstalované_apps = [
'krmivo',
]
Než zapomeneme, vyzkoušejte, že Django pracuje. Pomocí příkazu Python Manage.py Runserver 0.0.0.0:8000 můžeme server spustit a poté navigovat ve webovém prohlížeči na počítači s kódem na http: // localhost: 8000 a viz příklad webové stránky (funguje to!) Ukončeno serverem s ovládacím prvkem C, to samé 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 pohledem, kde je naplněna Python kódem a kontextem, jako jsou modely a informace (řetězce a celá čísla usuall) z pohledu.cd /path/to/directory
git init
git branch -m master
ssh-keygen
Django má také jiné komponenty, včetně, ale nejen na:Nastavení, která nakonfiguruje aplikaci, jak jsme diskutovali.
URL, což jsou vzory, které uživatel sleduje, aby získal přístup ke konkrétním částem webové aplikace.cd ~
cat .ssh/id_rsa.pub
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 Python 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 je přístupný webu a užitečný pro různé účely na odlehlém zařízení, které nemusí být blízko serveru.
Statické soubory, které jsou obvykle JavaScript, a jsou to knihovny, které server slouží a jsou propojeny se šablonou.git remote add git://… (your remote URL)
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ž je kousky 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í.
Celery, který definuje asynchronní úkoly Části kódu Django, mohou začít spuštěny před okamžitým přechodem na další úlohu 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šími 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í Django, zejména v pohledu, kde je většina kódu prováděna. 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". Nezapomeňte, že pokaždé, když přidáte kód po příkazu, jako je DEF, pokud, zatímco, pro atd., Budete muset přidat 4 mezery pro každou z definic preceedingu, které byste chtěli použít pro 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 souboru.
Z django.http importu httpresse def Hello (žádost): Návrat 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 ještě 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.python -m venv venv # V App/urls.py přidejte řádek po příkazech importu po začátku importu pohledu, který jsme právě vytvořili.
source venv/bin/activate # Z pohledu importu krmiva jako Feed_views
django-admin startproject mysite . # Nyní definujeme vzor pohledu. Vzory zobrazení mají tři komponenty, komponentu cesty, která sděluje serveru, kde pohled existuje v rámci serveru (cesta URL, kterou uživatel zadá do navigační lišty, aby vstoupil na webovou stránku), komponenta pohledu, kde je pohled zadán, a přátelský název pro zobrazení, takže je možné, aby se objevil další název nebo je třeba provést další místo pro další lognózu. 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 nich pomocí čárky, protože to odděluje každou 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 takto:
Z pohledu importu krmiva jako 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 Checkpython manage.py startapp feed
Pokud existují nějaké chybové zprávy, měli byste pečlivě zkontrolovat změny, které jste provedli ve vaší aplikaci, a zjistit, zda existuje něco, co je třeba opravit, jako je cizí nebo postrádající prostor, další znak, nezachycený řetězec, jakýkoli překlep, jakýkoli náhodně odstraněný znak nebo cokoli jiného. Přečtení chybové zprávy (pokud ji máte), měli byste být schopni vidět cestu k vytvořenému souboru nebo upravovaní spolu s číslem řádku, takže se podívejte do tohoto souboru a řádku a zjistěte, zda můžete opravit něco, co tam je. 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 pracuje, uvidíte výstupní „kontrolu systému identifikované žá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í.nano app/settings.py
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 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řída potř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 náš kód pomoci při rozhodování o tom, co s modelem dělat, a lze jej použít k jeho třídění), instance pro připojení modelu s uživatelem přihlášeným do serveru a další. Pojďme rozbalit kód níže:Z Django.DB Import Models # import, který se používá k definování naší třídy a jeho atributy Třída Post (Models.Model): # Definice naší třídy samotné id = models.autofield (primární_key = true) # ID našeho modelu, automaticky vygenerovaný klíč, který nám umožní dotazovat model, udržovat jej jedinečný a je užitečný, když potřebujeme interagovat s modelem po jeho vytvoření. text = models.textfield (default = '') # Atribut naše úlohy třídy, v tomto případě nějaký text, výchozí do prázdného řetězce.
Import, který se používá k definování naší třídy a je to atributyINSTALLED_APPS = [
'feed',
]
Definice naší třídy samotnéID našeho modelu, automaticky generovaného klíče, který nám umožní dotazovat model, udržet jej jedinečný a je užitečný, když musíme s modelem po vytvoření interagovat.
Atribut naše 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 importy, naši třídu formulářů, jakož i model, který jsme vytvořili (Feed.Models.Post), definici třídy podobné modelu a pole spolu s podtřídou s názvem Meta, která bude definovat model, se kterým formulář interaguje. 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 formulářích.py níže.Z Django Import Forms z krmiva.models import příspěvku třída postform (forms.moDellOrm): text = forms.charfield (widget = forms.textarea) třída 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 provedeme 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 migruje
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:z krmiva.models import příspěvku Z django.shortcuts import render, přesměrování z django.urls import reverse Def Feed (Request): Post = Post.Objects.all () # dotazujte všechny příspěvky v databázi return render (požadavek, 'Feed/Feed.html', { „Příspěvky": Příspěvky, })
Dotazujte všechny příspěvky v databáziTo 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 svůj první vstup, přijímá kontext (v tomto případě příspěvky v databázi), který lze nyní vykreslet v šabloně a vrací š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/šablony 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.Krmivo { % pro příspěvek v příspěvcích %} {{post.text}} { % endfor %}
Toto je velmi jednoduchá šablona. Definuje otevírání a uzaví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 šabloně. 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.pyPython Manage.py Shell
Nyní pojďme importovat náš poštovní modelz krmiva.models import příspěvku
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') výstup()
Nakonec budeme muset do našeho krmiva přidat vzor URL. Protože naše aplikace Feed bude používat více URL a chceme udržovat velikosti souborů malý, vytvořme místní adresy URLS.py v naší aplikaci Feed, která vypadá takto:z django.urls import cesty od. Import zobrazení urlPatterns = [ Path ('', Views.Feed, name = 'Feed'), ]
Budeme také muset upravit urls.py v základní aplikaci, ať už jsme se rozhodli nazvat, byl to první adresář, který jsme vytvořili. Upravte aplikaci/app.py a přidejte následující do vzorů URLZ django.urls import zahrnuje # nahoře urlPatterns = [ #... předchozí kód zde Path ('Feed/', Include (('Feed.urls'), namespace = 'Feed')), ]
nahoře... předchozí kód zde
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.zálohování
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.z krmiva. Def Feed (Request): Post = Post.Objects.all () # dotazujte všechny příspěvky v databázi Pokud žádost.Method == 'Post': # Zpracovat požadavek na příspěvek Form = postform (request.post) # Vytvořte instanci formuláře a uložte na něj data if form.is_valid (): # ověřte formulář Form.Save () # Uložit nový objekt REDING RESEMENT (Reverse ('Feed: Feed')) # Přesměrování na stejnou adresu URL s požadavkem GET return render (požadavek, 'Feed/Feed.html', { 'Form': postform (), # Nezapomeňte formulář předat do kontextu, abychom jej mohli vykreslit. „Příspěvky": Příspěvky, })
Dotazujte všechny příspěvky v databáziZpracovat požadavek na příspěvek
Vytvořte instanci formuláře a uložte do něj dataOvěřit formulář
Uložte nový objektPřesměrovat na stejnou adresu URL s požadavkem GET
Nezapomeňte předat formulář do kontextu, abychom jej mohli vykreslit.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.
Krmivo { % csrf_token %} {{Form}} Nový příspěvek { % pro příspěvek v příspěvcích %} {{post.text}} { % endfor %}from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
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í. K vykreslení tokenu pro formulář a další, {{{… {… {… {{…}} k vykreslení formuláře, používáme značky HTML k prohlášení, že dokument je dokument HTML. 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.
getbootstrap.com/Vytvořte nový adresář s názvem šablony pomocí šablon Mkdir a poté upravte šablony/base.html.
Mělo by to vypadat takto:{ % Block Body %} { % endblock %}
Nezapomeňte zkopírovat soubory CSS a JavaScript,.from feed import views as feed_views
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říkazemPIP nainstalujte Django-Crispy-Forms
Jakmile je to nainstalováno, přidejte jej do nastavení.pyfrom feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
Nainstalované_apps = [
#… Předchozí kód zde
'Crispy_Forms',
]… Předchozí kód zde
Nyní, zpět v naší šabloně krmiva, můžeme některé věci odstranit. Odstraňujme 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:python manage.py check
{ % rozšiřuje 'base.html' %}
{ % Block Body %}
{ % LOAD CRISPY_FORMS_TAGS %}
{ % csrf_token %}
{{Form | crispy}}
Nový příspěvek
{ % pro příspěvek v příspěvcích %}
{{post.text}}
{ % 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 i 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 uživatelům umožníme 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é vám pomohou udržet vaši aplikaci zabezpečenou a vlastní účet přístupný pouze u vás.
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, rozšíříme tento model s dalšími modely připisovanými mu a vytvoříme další bezpečnostní opatření pro přihlášení, která jsou odolná vůči phishingu. Začneme pomocí 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ů.python manage.py runserver 0.0.0.0:8000
Už jsme mluvili o spuštění aplikace. Z našeho adresáře, uvnitř virtuálního prostředí, Pass Manage.py tyto argumentyPython Manage.py StartApp Uživatelé
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ódfrom django.db import models # Z django.shortcuts import render, přesměrování
z django.urls import reverse
Z django.contrib.auth.forms import AuthenticationForm, setPasswordForm
Z django.contrib.auth import Authenticate, odhlášení
Z django.contrib.auth import přihlášení jako auth_login
Z django.contrib import zprávy
def přihlášení (požadavek):
if request.method == "Post":
username = request.post ['username'] # Získejte uživatelské jméno a heslo z žádosti o příspěvek
heslo = request.post ['heslo'] # ověřte uživatele
User = Authenticate (username = uživatelské jméno, heslo = heslo)
Pokud uživatel:
auth_login (požadavek, uživatel, backend = 'django.contrib.auth.backends.modelbackend')
Messages.Success (žádost, „Vaše heslo bylo přijato. Pokračujte")
RESION RESEMENT (Reverse ('Feed: Feed'))
Else: Messages.Warning (požadavek, „Uživatelské jméno nebo heslo nesprávné. Zkuste to prosím znovu")
return render (požadavek, 'Users/Login.html', {'Form': AuthenticationForm ()})
class Post(models.Model): # Získejte uživatelské jméno a heslo z žádosti o příspěvek
id = models.AutoField(primary_key=True) # Ověřte uživatele
text = models.TextField(default='') # 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ů.
Uživatelé/šablony Mkdir
Uživatelé/šablony/uživatelé MKDIRNyní bychom měli být schopni upravovat uživatele/šablony/uživatele/přihlášení.html. Zatímco jsme u toho, vytvoříme šablonu, která umožní uživateli také přihlásit se.
Uživatelé/šablony/šablony nano/přihlášení.htmlNyní v šabloně,
{ % rozšiřuje 'base.html' %} { % LOAD CRISPY_FORMS_TAGS %} { % blok obsah %} { % csrf_token %} Přihlaste se {{Form | crispy}} Přihlášení { % 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:
{ % rozšiřuje 'base.html' %} { % LOAD CRISPY_FORMS_TAGS %} { % blok obsah %} { % csrf_token %} Vytvořit účet {{Form | crispy}} Rejstřík { % 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.
Z Django Import Forms Z django.contrib.auth.models Import Uživatel z django.contrib.auth.forms import userCreationform Třída UserGisterform (userCreationForm): e -mail = forms.emailfield () třída meta: Model = uživatel Fields = ['Username', 'Email', 'Password1', 'Password2']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',)
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 pouze 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:
#… Import Z .formy import userRegisterform Def Register (požadavek): if request.method == "Post": Form = userGisterform (request.post) if form.is_valid (): user = form.save () messages.success (požadavek, „Vítejte v aplikaci, {}.". Format (user.Username)) return render (požadavek, 'Users/Register.html', {'Form': userRegisterform})python manage.py makemigrations
python manage.py migrate
… DovozTo 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, v kolik hodin byli na webu naposledy, některé informace o nich, jako je biografie, časová pásmo atd. Také budeme muset aktualizovat náš model krmiva, zveřejňovat, aby zohlednili uživatelský model a připisovali příspěvky 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:
z django.db importní modely #… import Z django.contrib.auth.models Import Uživatel Třída Post (models.model): id = models.autoField (primární_key = true) autor = models.ForeignKey (uživatel, on_delete = models.cascade, null = true, blank = true, reased_name = 'příspěvky') # Přidat do této řádky text = models.textfield (default = '') posts = Post.objects.all() # … Dovoz
Přidejte do tohoto řádkuVě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. Tento cizí klíč definujeme s třídou, kterou představuje, argument odstranění, který zajistí, že příspěvky jsou smazány 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 nedostatek uživatele na příspěvcích, které jsme již vytvořili, a související jméno, které můžeme použít k odkazování na objekty Post, 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 učinit mnohem méně zranitelnými vůči phishingu jednoduše omezením sazby, kolikrát umožníme přihlášení na web, je to 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ů/models.py, přidejte následující kód.Z django.db importní modely Z django.contrib.auth.models Import Uživatel z django.utils import časové pásmo profil třídy (models.model): user = models.oneToOnefield (user, on_delete = models.cascade, null = true, blank = true, reased_name = 'profil') účet_created = models.dateTimefield (default = timezone.now) last_seen = models.dateTimefield (default = timezone.now) CAN_LOGIN = Models.DateTimefield (Default = TimeZone.Now) prefered_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ů.mkdir feed/templates
mkdir feed/templates/feed
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:#… Import Z .formy import userRegisterform Def Register (požadavek): if request.method == "Post": Form = userGisterform (request.post) if form.is_valid (): user = form.save () Profil.objects.create (user = user) # Nezapomeňte přidat tento řádek, a vytvořit profil pro uživatele messages.success (požadavek, „Vítejte v aplikaci, {}.". Format (user.Username)) return render (požadavek, 'Users/Register.html', {'Form': userRegisterform})
… Dovoz
Nezapomeňte přidat tento řádek a vytvořit profil pro uživateleTo 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í.
#… Import Z. z django.utils import časové pásmo import datetime def přihlášení (požadavek): if request.method == "Post": username = request.post ['username'] heslo = request.post ['heslo'] User = Authenticate (username = uživatelské jméno, heslo = heslo) Pokud uživatel a user.profile.can_login <timezone.now (): # Všimněte si, že nyní kontrolujeme, zda se uživatel může přihlásit auth_login (požadavek, uživatel, backend = 'django.contrib.auth.backends.modelbackend') Messages.Success (žádost, „Vaše heslo bylo přijato. Pokračujte.") RESION RESEMENT (Reverse ('Feed: Feed')) Else: # Pokud nebylo přihlášení úspěšné, messages.warning (žádost, „Uživatelské jméno nebo heslo nesprávné. Zkuste to prosím znovu.") user = user.Objects.filter (username = username) .First () # Toto je část, kde aktualizujeme profil uživatelů Pokud uživatel: profil = user.profile profil.can_login = timezone.now () + datetime.timedelta (sekundy = 15) # takže se nemohou znovu přihlásit na několik sekund profil.save () return render (požadavek, 'Users/Login.html', {'Form': AuthenticationForm ()})python manage.py shell
… DovozVšimněte si, že nyní zkontrolujeme, zda se uživatel může přihlásit
Pokud nebylo přihlášení úspěšné,from feed.models import Post
To je část, kde aktualizujeme profil uživatelůTakže se nemohou znovu přihlásit na několik sekund
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 bude udržovat ř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.Post.objects.create(text='hello world')
exit()
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:zálohování sudo
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:from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
sudo crontab -ePokud 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 BACKUPfrom django.urls import include # 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 VisudoNyní pojďme přejděte na spodní část souboru a přidejte další řádek:
Všechny = NOPASSWD: /BIN /zálohováníbackup
To nám umožňuje spustit příkaz „Zálohování" jako kterýkoli uživatel, bez hesla. Formát pro toto je snadný, stačí předponu řádek s "All = 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 vybrat si, co pro vás nejlépe funguje.
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ší. posts = Post.objects.all() # V opačném případě jste na svém serveru od nuly dobře vytvářet vlastní e -mailovou službu. Tuto možnost doporučuji, i když je to více kódu a může vyžadovat speciální hosting. Nebudete moci spustit poštovní server z vašeho domácího počítače s největší pravděpodobností, takže pokračujme a prozkoumejte konfiguraci a kód, který odešlete e -mail, než spustíme server v cloudu a vytvoříme vlastní poštovní server uvnitř.
if request.method == 'POST': # Nejprve upravte nastavení.py s následujícím příkazem:
form = PostForm(request.POST) # Nano App/Settings.py
if form.is_valid(): # Kde je aplikace název aplikace, kterou jste vytvořili s StartApp.
form.save() # Přidejte následující řádky:
return redirect(reverse('feed:feed')) # 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)
'form': PostForm(), # Nezapomeňte je změnit, až budete připraveni nasadit aplikaci, to později znovu prohlédneme. Nastavení e -mailu_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
s otevřeným ('/etc/config.json') jako 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.
sudo nano /etc/config.json
Přidejte následující řádky:{ "Email_Host_Password": "" }
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.Uživatelé nano/šablony/uživatelé/ověření_email.html
Aplikace Django - ověřte svůj e -mail Drahý {{user.Username}}, Chcete -li ověřit svůj e -mail, klikněte zde. Alternativně můžete vložit následující odkaz do adresního řádku prohlížeče: {{Base_url}} { % url 'Uživatelé: Aktivujte' uidb64 = uid token = token %} Odkaz vyprší za 30 minut. Pokud jste nepožádali o ověřovací e -mail, můžete tento e -mail jednoduše ignorovat. Uvidíme se tam, SedmikráskaTento 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' Doména = 'příklady.com' Base_url = Protocol + ': //' + doménaNakonec, 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:Uživatelé Nano/Tokens.py
Přidejte následující kód:Z django.contrib.auth.tokens import heslaresethettokengenerator import šest Tokengenerator třídy (hesloresetTokenNenerator): def _Make_hash_value (self, uživatel, timestamp): návrat ( šest.text_type (user.pk) + šest.text_type (timestamp) ) Account_activation_token = ToKenGenerator () unsubscribe_token = toKenGenerator ()
Tento generátor základního tokenu generuje token, kterou 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.Uživatelé nano/email.py
Odeslání ověřovacího e -mailu HTML bude vypadat takto:Z django.contrib.auth import get_user_model Z django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode Z django.contrib.sites.shortcuts import get_current_site Z django.core.mail import send_mail z django.template.loader import render_to_string z django.utils.Encding Import Force_Bytes z django.core.mail import e -mailem multialternatives Z django.shortcuts import render Z .Tokens import Account_activation_Token z django.template.loader import render_to_string z django.utils.html import strip_tags Z django.template import šablony, kontext Z nastavení importu django.conf Import Traceback def send_verification_email (uživatel): User = get_user_model () mail_subject = '[{}] Aktivujte svůj účet.'. Format (Settings.site_name) html_message = render_to_string ('Users/Verification_email.html', { „Uživatel": Uživatel, „Domain": Settings.domain, „Protokol": „https", 'Uid': urlsafe_base64_encode (force_bytes (user.pk)), 'Token': Account_activation_token.Make_token (uživatel), }) send_html_email (uživatel, 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.pypip install django-crispy-forms
def send_html_email (user, mail_subject, html_message):
to_email = user.Email
username = user.Username
Pokud to_email == '':
vrátit žádné
unsub_link = settings.base_url + user.profile.create_unsubscribe_link ()
html_message = html_message + "odhlášení"
msg = emailMultialternatives (Mail_Subject, strip_tags (html_message), settings.default_from_email, [to_email], headers = {'list-unsubscribe': '<' + osub_link + '>'},)
msg.attach_alternative (html_message, "text/html")
profil = user.profile
pokus:
msg.send (selhání_silely = false)
pokud ne profil.email_valid:
profil.email_valid = true
profil.save ()
kromě:
profil.email_valid = false
profil.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
Uživatelé nano/models.py#… Z django.core.Signing DOPMON TIMESTASTISIGNER, BADSIGNATURE, SignatureExpired z 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): pokus: key = '%s:%s'%(self.user.username, token) Timestampsigner (). Unsign (klíč, max_age = 60 * 60 * 24 * 30) # platný po dobu 30 dnů kromě (Badsignature, SignatureExpired): vrátit nepravdivé vrátit pravdu def create_unsubscribe_link (self): Uživatelské jméno, token = self.make_token (). Split (":", 1) Return Reverse ('Users: Unsubscribe', kwargs = {'username': username, 'token': token,})
…Platí po dobu 30 dnů
To je poměrně jednoduché, používáme časový list, 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 tokeny 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í.
Uživatelé Nano/Views.pypython manage.py startapp users
Nejprve přidejte následující import. Hodil jsem několik navíc, takže nebudeme muset později importovat více položek.Z django.contrib.auth import odhlášení Z django.shortcuts import render, přesměrování, get_object_or_404 Z django.contrib.auth.models Import Uživatel z django.utils.ecding Import Force_str Z django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode import JSON Import požadavků Import DateTime, Traceback Z django.contrib import zprávy Z. z django.utils import časové pásmo Z django.views.decorators.cache import never_cache Z. Email import send_verification_email # Nezapomeňte importovat funkci odesílání e -mailů ověření Z django.contrib.auth.decorators import login_required Z django.contrib.auth.mixins import loginRequiredMixin, userPassSestestMixin Z django.utils.decorators import metoda_decorator Z django.http importu httpresserederect Z nastavení importu django.conf z django.utils import časové pásmo import datetime import Pytz Z django.views.decorators.csrf import csrf_exempt Z django.http importu httpresse Z django.contrib.auth.tokens import default_token_generator Z django.utils.http import urlsafe_base64_decode Z .Tokens import Account_activation_Token
Nezapomeňte importovat funkci odesílání e -mailuMož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 from Users.Tokens, mimo jiné import.
Nyní ve spodní části souboru přidejte následující kód:def unsubscribe (žádost, uživatelské jméno, token): User = get_object_or_404 (uživatel, username = username) if ((request.user.is_authenticated a request.user == User) nebo user.profile.check_token (token)): # odhlásit je profil = user.profile profil.Subscripted = false profil.save () návrat vykreslení (požadavek, 'uživatelé/odhlášení.html') # Jinak přesměrujte na přihlašovací stránku messages.warning (žádost, odkaz odkazy odhlásit. next_url = reverse ('Users: UnsubScribe', kwargs = {'username': username, 'token': token,}) návrat httPresponSereDirect ('%s? next =%s'%(reverse ('login'), next_url)) def aktivovat (požadavek, uidb64, token): pokus: uid = force_str (urlsafe_base64_decode (uidb64)) user = user.Objects.get (pk = uid) kromě (TypeError, ValueError, OverflowerRor, user.DoesNotexist): Uživatel = žádný ip = get_client_ip (požadavek) Pokud uživatel není žádný a účet_activace_token.check_token (uživatel, token): user.profile.email_verified = true user.profile.save () user.Save () # SendWelcomeEmail (požadavek, uživatel) Messages.Success (požadavek, f'thanks pro potvrzení e -mailu! Nyní se můžete přihlásit ke svému účtu a byl vám zaslán uvítací e -mail. ") return redirect (user.profile.create_face_url ()) jiný: Messages.Success (požadavek, vypršel aktivační odkaz. Return přestect ('ověřte: ověřte') def resend_activation (žádost): if request.method == 'Post': Form = resendactivationEmailform (request.post) email = request.post ['e -mail'] pokus: user = user.Objects.get (email = e -mail) send_verification_email (uživatel) Messages.Success (žádost, „Odeslán váš e -mail s ověřením. Poskytněte kliknutím na odkaz v e -mailu a ověřte svůj účet.") RESION RESIONCE (Reverse ('ověřte: ověřte')) kromě: Messages.Warning (požadavek, e -mail s f'yy není správný. Zkuste to prosím znovu. ') jiný: Form = resendactivationEmailform () return render (požadavek, 'uživatelé/resend_activation.html', {'Form': Form, 'Title': 'Resend Activation', 'Small': True})
odhlásit je username = request.POST['username'] # Jinak přesměrujte na přihlašovací stránku
password = request.POST['password'] # SendWelcomeEmail (požadavek, uživatel)
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.Uživatelé Nano/Views.py
#… (Po) Def Register (žádost): send_verification_email (uživatel) #… (Dříve) přesměrujte (mkdir users/templates
mkdir users/templates/users
… (Po) Def Register (žádost):… (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:nano users/templates/users/login.html
#… Import
Z .formy import userRegisterform
Def Register (požadavek):
if request.method == "Post":
Form = userGisterform (request.post)
if form.is_valid ():
user = form.save ()
send_verification_email (uživatel) # Nezapomeňte přidat tento řádek!
messages.success (požadavek, „Vítejte v aplikaci, {}.". Format (user.Username))
return render (požadavek, 'Users/Register.html', {'Form': userRegisterform})… Dovoz
Nezapomeňte přidat tento řádek!
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ář:#… (Import) Třída resendactivationEmailform (forms.form): e -mail = forms.emailfield (požadované = true)
… (Import)
Budeme také potřebovat šablonu odpovídající tomuto formuláři E -mailu Resendu. Přidejte tuto šablonu do. Upravte soubor:Uživatelé nano/šablony/uživatelé/resend_activation.html
Dále přidejte do souboru 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']
{ % rozšiřuje 'base.html' %}
{ % blok obsah %}
{ % LOAD CRISPY_FORMS_TAGS %}
{ % csrf_token %}
Odeslat aktivační e -mail
{{Form | crispy}}
Odeslat aktivační e -mail
{ % 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 (uživatel): User = get_user_model () html = Open ('{}/Users/Welcome_email.html'.Format (Settings.Base_dir)). Read () předmět = 'Vítejte' + settings.site_name + ', {{username}}!' šablona = šablona (html) subjTemplate = šablona (předmět) context = context ({'username': user.Username, 'base_url': settings.base_url, 'model_name': 'daisy holton,' site_name ': settings.site_name}) renderedTemplate = template.Render (kontext) subjcontext = context ({'username': user.username}) subjRenderedTemplate = subjTemplate.Render (subjContext) send_html_email (uživatel, subjranderedTemplate, 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í.
Vítejte na {{site_name}} Ahoj {{username}}, Jsme rádi, že vás tady vidíme! Děkujeme, že jste se připojili k {{site_name}} a jste součástí zábavy. Chcete -li začít, zde je několik věcí, které můžete udělat po ověření své identity. Použijte aplikaci. Toto je hlavní stránka {{site_name}} Navštivte můj soukromý profil {{site_name}}. Toto je stránka pro každého, kdo mě chce poznat. Více profilů. Tyto lidi najdete na webu a vidět jejich obsah. Podívejte se na všechny příspěvky zde. Toto je soukromá přední stránka {{site_name}}. Na webu je ještě více, takže neváhejte navštívit a podívat se, co najdete. Na každé stránce můžete web sdílet s některým ze sociálních tlačítek. Doufám, že se vám bude líbit svůj čas s {{site_name}}! Díky, že jsi tady. S velkou láskou, {{model_name}} {{base_url}}# 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 Z django.contrib.auth.tokens import default_token_generator z django.contrib.auth.forms import setPasswordform Z django.utils.http import urlsafe_base64_decode def hesla_reset (požadavek, uidb64, token): user = get_object_or_404 (uživatel, id = urlsafe_base64_decode (uidb64)) if request.method == 'Post': Form = setPasswordForm (uživatel, request.post) pokud form.is_valid () a default_token_generator.check_token (uživatel, token): form.save () Messages.Success (požadavek, „Vaše heslo bylo resetováno.") elif not form.is_valid (): messages.warning (žádost, „Vaše hesla se neshodují nebo nesplňují požadavky. Zkuste to prosím znovu.") RESION RESECTION (Request.Path) jiný: Messages.Warning (požadavek, „Odkaz na resetování hesla vypršel. Vytvořte prosím nový.") Return přesměrování (Reverse ('Uživatelé: Přihlášení')) return render (požadavek, 'Users/hesla_reset_confirm.html', { „Název": „Resetovat své heslo", 'Form': setPasswordForm (uživatel)from django.db import models # ... import
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # 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
{ % rozšiřuje 'base.html' %}
{ % LOAD CRISPY_FORMS_TAGS %}
{ % blok obsah %}
{ % csrf_token %}
Resetovat heslo
{{Form | crispy}}
Resetovat heslo
{ % endblock obsah %}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
{ % rozšiřuje 'base.html' %} { % LOAD CRISPY_FORMS_TAGS %} { % blok obsah %} { % csrf_token %} Resetovat heslo {{Form | crispy}} Vyžádat si resetování hesla { % endblock obsah %}Š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.
Uglek - resetujte své heslo Ahoj, Chcete -li resetovat heslo, klikněte sem. Případně můžete vložit následující odkaz do svého prohlížeče: https://uglek.com { % url 'hesla_reset_confirm' uidb64 = uid token = token %} Pokud jste nepožádali o resetování hesla, můžete tento e -mail jednoduše ignorovat. Děkuji, že jste se k nám připojili, Sedmikráskafrom 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='')
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{ % rozšiřuje 'base.html' %} { % blok obsah %} Byl odeslán e -mail s pokyny k resetování hesla. { % endblock obsah %}
A konečně, pro potvrzení, že reset hesla je dokončen, uživatelé/šablony/uživatelé/heslo_reset_complete.html{ % rozšiřuje 'base.html' %} { % blok obsah %} Vaše heslo bylo nastaveno. Přihlaste se sem { % endblock obsah %}
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 ('heslo-reset/',
auth_views.passwordresetView.as_view (
Template_name = 'Users/Password_reset.html',
html_email_template_name = 'Users/hesla_reset_html_email.html'
),
name = 'hesla_reset'),
Path ('Heslo-Reseset/Done/',
auth_views.passwordresetDoneView.as_view (
Template_name = 'Users/hesla_reset_done.html'
),
name = 'hesla_reset_done'),
Path ('heslo-reset-confirm ///',
auth_views.passwordresetConfirmView.as_view (
Template_name = 'Users/hesla_reset_confirm.html'
),
name = 'hesla_reset_confirm'),
Path ('heslo-reset-complete/',
auth_views.passwordresetCompleteView.as_view (
Template_name = 'Users/Password_reset_Complete.html'
),
name = 'hesla_reset_complete'),
]
Profile.objects.create(user=user) # ... Předchozí adresy URL zde
Č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, budeme pokrýt nasazení kódu na vzdálený server a nastavení poštovního serveru a automatizovat vaše nasazení pomocí bash, takže můžete vždy nastavit nový projekt s několika jednoduchými příkazy.
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ší. Všimnete 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í kód:# Z django.db importní modely
Z django.contrib.auth.models Import Uživatel
z django.utils import časové pásmo
# Nezapomeňte importovat signatář UUID, Timestamp a generátor URL (reverzní)
import UUID
Z django.core.Signing DOPMON TIMESTASTISIGNER, BADSIGNATURE, SignatureExpired
z django.urls import reverse
profil třídy (models.model):
user = models.oneToOnefield (user, on_delete = models.cascade, null = true, blank = true, reased_name = 'profil')
účet_created = models.dateTimefield (default = timezone.now)
last_seen = models.dateTimefield (default = timezone.now)
CAN_LOGIN = Models.DateTimefield (Default = TimeZone.Now)
prefered_name = models.charfield (max_length = 20, default = '', null = true, blank = true)
Bio = Models.Textfield (Blank = True, Default = '')
# Přidejte tento kód zde
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, prázdné = true, max_length = 15)
Verification_code_length = models.integerfield (default = 6)
MFA_CODE_EXPIES = Models.DateTimefield (Default = TimeZone.Now)
MFA_ATTEMPTS = models.integerfield (default = 0)
def make_auth_token (self):
návrat 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):
pokus:
key = '%s:%s'%(self.uid, token)
Timestampsigner (). Unsign (key, max_age = 60 * nastavení.auth_valid_minutes) # platný po dobu 3 minut
kromě (Badsignature, SignatureExpired):
vrátit nepravdivé
vrátit pravdu
if user and user.profile.can_login < timezone.now(): # Nezapomeňte importovat signatář UUID, Timestamp a generátor URL (reverzní)
else: # Přidejte tento kód sem
user = User.objects.filter(username=username).first() # A přidejte tuto funkci
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Platí po dobu 3 minut
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.Zdroj Venv/Bin/Activate Python manage.py makemigrations && python manage.py migrujte
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ž můžeme modely 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.
#… Import def přihlášení (požadavek): if request.method == "Post": username = request.post ['username'] heslo = request.post ['heslo'] User = Authenticate (username = uživatelské jméno, heslo = heslo) Pokud uživatel a user.profile.can_login <timezone.now (): # Všimněte si, že nyní kontrolujeme, zda se uživatel může přihlásit # Odstraňte funkci Auth_Login, která byla zde Messages.Success (žádost, „Vaše heslo bylo přijato. Pokračujte.") pokud user.profile.mfa_enabled: Return přesměrování (user.profile.create_auth_url ()) # poznamenejte, že přesměrujeme na novou adresu URL zde Else: # Pokud uživatel nepoužívá autentizaci Mutli-Factor, stačí je přihlaste. auth_login (požadavek, uživatel, backend = 'django.contrib.auth.backends.modelbackend') Return přesměrování ('Feed: Feed') Else: # Pokud nebylo přihlášení úspěšné, messages.warning (žádost, „Uživatelské jméno nebo heslo nesprávné. Zkuste to prosím znovu.") user = user.Objects.filter (username = username) .First () # Toto je část, kde aktualizujeme profil uživatelů Pokud uživatel: profil = user.profile profil.can_login = timezone.now () + datetime.timedelta (sekundy = 15) # takže se nemohou znovu přihlásit na několik sekund profil.save () return render (požadavek, 'Users/Login.html', {'Form': AuthenticationForm ()})sudo backup
… DovozVšimněte si, že nyní zkontrolujeme, zda se uživatel může přihlásit
Odstraňte funkci Auth_Login, která byla zdesudo crontab -e
Všimněte si, že zde přesměrujeme novou adresu URLPokud uživatel nepoužívá vícefaktorovou ověřování, stačí je přihlaste.
Pokud nebylo přihlášení úspěšné,0 * * * * sudo backup
To je část, kde aktualizujeme profil uživatelůTakže se nemohou znovu přihlásit na několik sekund
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.
Uživatelé Nano/SMS.Pysudo visudo
# Importujte všechny potřebné balíčky
z django.utils import časové pásmo
importovat náhodné
import datetime
Z nastavení importu django.conf
Z krmení.middleware import get_current_request
Z django.contrib import zprávy
Import Traceback
účet_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 (cíl_phone, text):
z Twilio.Rest Import Client
pokus:
klient = klient (účet_sid, auth_token)
Pokud Len (Target_phone)> = 11:
message = client.Messages.Create (
to = cíl_phone,
from_ = source_phone,
tělo = text)
kromě:
tisk (traceback.format_exc ())
# Funkce pomocníka pro získání čísla s tolika číslicemi
def get_num_length (num, délka):
n = ''
pro x v dosahu (délka):
n = n + str (num)
návrat int (n)
# Odeslat text k ověření uživatele
def send_verification_text (uživatel):
délka = user.profile.verification_code_length
code = random.randint (get_num_length (1, délka), get_num_length (9, délka));
user.profile.verafication_code = code
user.profile.mfa_code_expires = timezone.now () + datetime.timedelta (minuty = 3)
user.profile.save ()
send_user_text (user, "Váš ověřovací kód pro {} je {}". Format (Settings.site_name, str (kód)))
# Pošlete uživateli jakýkoli text s touto funkcí
def send_user_text (uživatel, text):
send_text (user.profile.phone_number, text)
# Ověřte kód s touto funkcí
def check_verification_code (uživatel, kód):
user.profile.mfa_attempts += 1
result = user.profile.verification_code! = None and Code! = '' a user.profile.verification_code == kód a user.profile.mfa_code_expires> timezone.now () a user.profile.mfa_attempts <= 3 3 = 3
pokud user.profile.mfa_attempts <3 a výsledek:
user.profile.verification_code_length = 6
elif user.profile.mfa_attempts> 2 a ne výsledkem:
user.profile.verification_code_length = 8
user.profile.save ()
Výsledek návratu
# Ověřte čas
def check_verification_time (uživatel):
result = user.profile.mfa_code_expires> timezone.now ()
Výsledek návratuImportujte všechny potřebné balíčky
Tento kód odešle text s TwilioALL ALL=NOPASSWD: /bin/backup
Funkce pomocníka pro získání čísla s tolika číslicemiPošlete text a ověřte uživatele
Pošlete uživateli jakýkoli text s touto funkcíOvěřte kód s touto funkcí
Ověřit časNezapomeňte náležitě změnit nastavení a přidat tyto řádky pomocí klíčů:
# Nezapomeňte je zkopírovat z vašeho řídicího panelu Twilio Twilio_account_sid = "" Twilio_auth_token = "" Telefon_number = "" Site_name = "" Auth_valid_minutes = 3 # Počet minut, kdy je stránka TFA aktivní po instanciUjistěte se, že je zkopírujte z palubní desky Twilio
Počet minut, kdy je stránka TFA aktivní po instanciNejprve budeme potřebovat formuláře pro naše dva faktorové pohledy. Úpravy uživatelů/formulářů, přidejte následující kód.
#… Import Z Django Import Forms # Formulář pro vstup do našeho telefonního čísla Třída PhoneNumberform (forms.form): phone_number = forms.regexfield (regex = r '^\+? 1? \ d {9,15} $', error_messages = {'invalid': "Telefonní číslo musí být zadáno do formátu: '+99999999'. Až 15 digitus je povoleno."}) "})"}). "})."}). " def __init __ (self, *args, ** kwargs): super (fonenumberform, self) .__ init __ (*args, ** kwargs) self.fields ['telefon_number']. Label = Phone_number_label # Formulář pro ověření třída tfaform (forms.form): code = forms.integerfield (požadované = false) def __init __ (self, *args, ** kwargs): super (tfaform, self) .__ init __ (*args, ** kwargs) self.fields ['code']. widget.attrs.update ({'autoComplete': 'off'}) help_texts = { 'Kód': „Po odeslání do telefonu s tlačítkem výše zadejte šestimístný kód." }nano app/settings.py
… DovozFormulář pro vstup do našeho telefonního čísla
Formulář pro ověřeníDále vytvoříme pohledy na uživatele/views.py
#… Import Z django.http importu httpresserederect Z .Forms Import PhoneNumberform, tfaform def mfa (žádost, uživatelské jméno, token): user = user.Objects.filter (profil__uuid = username) .First () Pokud není uživatel: Vraťte httpResponSereDerect (reverzní ('ověření: věk') + '? next =' + request.get.get ('next') if request.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get.get ('next') else '/go/' if Request.User.is_authenticated a Request.user.profile.Vendor Else '/' User = get_object_or_404 (uživatel, profil__uid = username) next = request.get.get ('next', '') pokud není user.profile.mfa_enabled: pokud ne kontrolu_verifikace_time (uživatel): user.profile.mfa_enabled = false user.profile.enable_two_factor_authentication = true user.profile.phone_number = '+1' user.profile.save () Print ('Přihlášení v uživateli') auth_login (požadavek, uživatel, backend = 'django.contrib.auth.backends.modelbackend') messages.warning (požadavek, „Zadejte platné telefonní číslo a ověřte jej pomocí kódu.") recepční přesměrování (Reverse ('Users: MFA_ONBOARTING')) if request.method == 'Post': Form = tfaform (request.post) code = form.data ['code'] Pokud kód a kód! = '' a kód! = Žádné: token_validated = user.profile.check_auth_token (token) p = user.profile is_verified = check_verification_code (uživatel, int (kód)) p.mfa_authenticated = is_verified Pokud token_validated: Pokud je is_verified: user.profile.mfa_enabled = true user.profile.save () auth_login (požadavek, uživatel, backend = 'django.contrib.auth.backends.modelbackend') P.Verfication_code = None p.uid = get_uuid () P.Save () Messages.Success (žádost, „Byli jste ověřeni. Vítejte.") qs = '?' pro klíč, hodnota v request.get.items (): QS = QS + Key + '=' + Value + '&' pokud next! = '' a ne (next.startswith ('/účty/logout/') nebo next.startswith ('/účty/login/') nebo next.startswith ('/admin/login/') nebo next.Startswith ('/účty/registr/'))): Návrat httPresponSereDirect (ext) elif next.startswith ('/účty/logout/') nebo next.startswith ('/účty/login/') nebo next.startswith ('/účty/registr/'): Return přesměrování ('Feed: Feed') elif request.meta.get ('http_referer', '/').startswith('/accounts/login/'): RESION RESEMENT (Reverse ('Feed: Feed')) elif ne příští: RESION RESEMENT (Reverse ('Feed: Feed') jiný: Návrat httPresponSereDirect ('Feed: Feed') jiný: Messages.Warning (žádost, „Kód, který jste zadali, nebyl rozpoznán. Zkuste to prosím znovu.") elif ne token_validated: messages.warning (žádost, „Token URL vypršel nebo nebyl rozpoznán. Zkuste to prosím znovu.") Odhlášení (požadavek) Return přesměrování (Reverse ('Uživatelé: Přihlášení')) Pokud p.mfa_attempts> 3: messages.warning (žádost, „Zadali jste nesprávný kód více než třikrát. Zašlete si nový kód.") p.verification_code = žádné P.Save () elif user.profile.can_send_mfa <timezone.now (): user.profile.mfa_attempts = 0 user.profile.can_send_mfa = timezone.now () + datetime.timedelta (minuty = 2) user.profile.save () send_verification_text (uživatel) Messages.Success (požadavek, „Zadejte kód zaslaný na vaše telefonní číslo. Kód vyprší za 3 minuty.") jiný: Messages.Warning (žádost, „Posíláte příliš mnoho dvou faktorových ověřovacích kódů. Počkejte několik minut před odesláním jiného kódu.") Form = tfaform () Hide_logo = žádné if user.profile.hide_logo: Hide_logo = true return render (požadavek, 'Users/Mfa.html', {'title': 'Enter Code', 'Form': Form, 'XSMall': True, 'User': User, 'Hide_logo': Hide_logo, 'accl_logout': user.profile.shoke_to_logout, 'Preload': false}) @Login_Required def mfa_onboarding (požadavek): if request.method == 'Post': Form = PhoneNumberform (request.post) request.user.profile.phone_number = form.data ['telefon_number']. nahradit ('-', '') .Replace ('(', ''). nahradit (')', '') request.user.profile.mfa_enabled = true request.user.profile.enable_two_factor_authentication = true request.user.profile.save () Messages.Success (žádost, „Na svůj účet jste přidali telefonní číslo.") user = request.user return redirect (user.profile.create_auth_url ())Form = PhoneNumberForm (initial = {'Phone_number': request.user.profile.phone_number if request.profile.phone_number else '+1'}) return render (požadavek, 'Users/MFA_ONBORDING.HTML', {'Title': 'Zadejte své telefonní číslo', 'Form': Form, 'Small':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)
… DovozPro oba tyto názory budeme také potřebovat šablony. Pojďme nejprve přidat šablonu MFA.
Uživatelé/šablony Nano/Uživatelé/MFA.htmlimport os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
Přidejte tento kód HTML do šablony{ % rozšiřuje 'base.html' %} { % blok obsah %} { % načítání app_filters %} { % LOAD CRISPY_FORMS_TAGS %} { % csrf_token %} Zadejte ověřovací kód Krok 1: Odeslat kód Nikdy s nikým nesdílejte svůj kód, protože jej lze použít k dočasnému přístupu k vašemu účtu. Odeslat kód Krok 2: Zadejte kód {{Form | crispy}} Stisknutím tlačítka ENTER odešlete kód na {{user.profile.phone_number | Securephone}}. Poté zadejte kód a stiskněte klávesu Enter. Zadejte kód { % 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.Uživatelé/šablony Nano/Uživatelé/MFA_ONBORTING.HTML
Přidejte následující HTML:sudo nano /etc/config.json
{ % rozšiřuje 'base.html' %}
{ % blok obsah %}
{ % LOAD CRISPY_FORMS_TAGS %}
{ % csrf_token %}
Nastavte ověřování dvou faktorů
{{Form | crispy}}
Přidejte telefonní číslo
{ % 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. Nakonec budeme chtít přidat možnost „Stop to přestat", takže uživatel může text „zastavit" a odhlásit se z budoucích textových zpráv.{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
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 také nám umožní povolit ověřování více faktorů. Nejprve budeme potřebovat další dva formuláře v uživatelích/formách.#... import třída userupdateform (forms.moDellOrm): e -mail = forms.emailfield () třída meta: Model = uživatel Fields = ['Username', 'Email'] telefon_number_label = 'telefonní číslo (žádné mezery, závorka \' (\ 'nebo pomlčka \'-\ ', čísla začínající pouze s +)' Třída profilopdateform (forms.moDellOrm): předplatné = forms.Booleanfield (požadované = false) phone_number = forms.charfield (požadované = false) def __init __ (self, *args, ** kwargs): super (profileupdateform, self) .__ init __ (*args, ** kwargs) třída meta: Model = profil Fields = ['Bio', 'Phone_number', 'enable_mfa', 'předplatné']
... importnano users/templates/users/verification_email.html
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
Z .Forms Import Userupdateform, profilepdateform
Z django.views.decorators.cache import never_cache
Z django.views.decorators.csrf import csrf_exempt
Z.
Od .mfa import send_user_text
@csrf_exEmp
@never_cache
@Login_Required
def profil (požadavek):
if request.method == 'Post':
U_Form = userUpdateForm (request.post, instance = request.user)
p_for = profilePdateForm (request.post,
request.files,
instance = request.user.profile)
pokud u_form.is_valid () a p_form.is_valid ():
new_phone_number = p_form.data ['telefon_number']
u_form.save ()
profil = p_form.save (commit = false)
profile.phone_number = profile.phone_number.replace ('-', '') .replace ('(', ''). nahradit (')', '')
profil.save ()
if new_phone_number! = oldProfile.phone_number a oldProfile.phone_number a len (oldProfile.phone_number)> = 11:
profil.mfa_enabled = true
profil.save ()
Send_text (OldProfile.phone_number, 'Vaše telefonní číslo bylo aktualizováno na' + new_phone_number + '. Přečtěte si texty v tomto telefonu, abyste se přihlásili. Pokud jste tuto změnu neprovedli, zavolejte nám. - {}'. Formát (nastavení.site_name))))))))))))))))))
if profile.enable_two_factor_authentication and profile.phone_number a len (profil.phone_number) <11:
profil.enable_two_factor_authentication = false
Messages.Success (požadavek, ověřování faktorů F'Two může být aktivováno bez zadání telefonního čísla. Zadejte telefonní číslo, aby bylo možné ověřit dva faktory. ')
profil.save ()
if new_phone_number! = oldProfile.phone_number a new_phone_number a len (new_phone_number)> = 11:
send_user_text (request.user, 'Přidali jste toto číslo do {} pro dva faktorové ověření. Nyní můžete své číslo použít pro ověřování dvou faktorů. Pokud jste tuto změnu neprovedli, zavolejte nám. - {}'. Formát (nastavení.site_name, Settings.domain)))))))))))))))))))))
profil.mfa_enabled = true
profil.mfa_code_expires = TimeZone.Now () + DateTime.TimeDelta (minuty = 3)
profil.save ()
return redirect (profile.create_auth_url ())
Messages.Success (požadavek, profil byl aktualizován! ')
Print („Profil aktualizován")
Return přesměrování ('Uživatelé: profil')
jiný:
u_form = useruUpdateForm (instance = request.user)
p_for = profileUpdateForm (instance = request.user.profile, initial = {'telefon_number': request.profile.phone_number, pokud žádost.user.profile.phone_number else '+1'})
kontext = {
'U_form': u_form,
'p_form': p_form,
„Název": „Aktualizujte svůj profil",
}
návrat vykreslení (požadavek, 'uživatelé/profil.html', kontext)Přidejte tyto dovozy
Pro tento pohled budeme také potřebovat šablonu.SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
Uživatelé/šablony Nano/Templates/profil.html{ % rozšiřuje "base.html" %} { % LOAD CRISPY_FORMS_TAGS %} {% Load Feed_filters%} { % blok obsah %} Upravte svůj profil { % csrf_token %} Informace o profilu {{u_form | crispy}} {{p_form | crispy}} Aktualizovat} Uloženo { % endblock obsah %} { % blok javascript %} var formulář = document.getElementById ('profil-form'); $ ('vstup'). Změna (funkce () { var formdata = new FormData (formulář); $ .ajax ({ URL: Window.Location.href, Typ: "Post", Data: Formdata, ProcessData: False, ContentType: False, Timeout: 1000 * 60, Úspěch: funkce (data) { $ (zveřejněno) .RemoveClass ("Hide"); SetTimeout (function () { $ (zveřejněno) .AddClass ("Fade-Hidden"); SetTimeout (function () { $ (zveřejněno) .AddClass ("Hide"); $ (zveřejněno) .RemoVeclass ("Fade-skidend"); }, 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 z django.urls import cesty od. Import zobrazení app_name = 'Users' urlPatterns = [ #… Vzory URL, které jsme dříve zadali, přidejte další tři řádky Path ('mfa ///', views.mfa, name = 'mfa'), PATH ('MFA/ONBOARTING/', views.mfa_onboarding, name = 'mfa_onboard'), Path ('profil/', views.profile, name = 'profil'), ]nano users/tokens.py
… Předchozí kód, import… Vzory URL, které jsme dříve zadali, přidejte další tři řádky
Nyní je vhodný čas na vyzkoušení našeho projektu. Nejprve však spustíme další zálohu.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()
zálohování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í políčka povolíte ověřování po zadání našeho telefonního čísla a poté odeslání formuláře.
Python Manage.py Runserver localhost: 8000Navš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ů.nano users/email.py
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.from django.contrib.auth import get_user_model
from django.utils.http import urlsafe_base64_encode, urlsafe_base64_decode
from django.contrib.sites.shortcuts import get_current_site
from django.core.mail import send_mail
from django.template.loader import render_to_string
from django.utils.encoding import force_bytes
from django.core.mail import EmailMultiAlternatives
from django.shortcuts import render
from .tokens import account_activation_token
from django.template.loader import render_to_string
from django.utils.html import strip_tags
from django.template import Template, Context
from django.conf import settings
import traceback
def send_verification_email(user):
User = get_user_model()
mail_subject = '[{}] Activate your account.'.format(settings.SITE_NAME)
html_message = render_to_string('users/verification_email.html', {
'user': user,
'domain': settings.DOMAIN,
'protocol': 'https',
'uid': urlsafe_base64_encode(force_bytes(user.pk)),
'token': account_activation_token.make_token(user),
})
send_html_email(user, mail_subject, html_message)
Python Manage.py chyby startAppPř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 = 'chyby.views.handler404' handler500 = 'chyby.views.Handler500' handler403 = 'chyby.views.handler403'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 vše, co potřebujeme kromě chyb, šablon a trochu middlewaru. Definujme ty tak:Z django.shortcuts import render, přesměrování Z django.http importu httpresse Z chyby importu StackTrace.Models z chyb.middleware import get_current_exception Z django.contrib.auth.decorators import login_required Z django.contrib.auth.decorators import user_passes_test Z .logy import get_logs Z face.tests import is_superuser_or_vendor Z django.views.decorators.csrf import csrf_exempt z chyb. Highlight Import zvýraznění_code Z django.shortcuts import přesměrování z django.urls import reverse # Vytvořte své názory zde. @Login_Required @USER_PASSES_TEST (is_superuser_or_vendor) def logs (požadavek): logs = zvýraznění_code (get_logs ()) return render (požadavek, 'chyby/live_error.html', {'title': 'chybové protokoly', 'PageTitle': 'chybové protokoly', 'poznámky': 'Toto jsou nedávné chybové protokoly. @Login_Required @USER_PASSES_TEST (is_superuser_or_vendor) def logs_api (požadavek): logs = zvýraznění_code (get_logs ()) návrat httPResponse (protokoly) @Login_Required def handler404 (požadavek, výjimka): pokud ne request.path.endswith ('/'): return přestect (request.path + '/') return render (požadavek, 'chyby/chyba.html', {'title': 'Error 404', 'PageTitle': 'Chyba 404', 'poznámky': „Tato stránka nebyla nalezena na serveru. Mohla se přesunout nebo byla odstraněna. ',' IS_404 ': True}) Def Handler500 (požadavek): tisk (get_current_exception ()) Uživatel = žádný pokud Hasattr (požadavek, „uživatel") a žádost.user a request.user.is_authenticated: user = request.user pokus: Error.Objects.create (user = user, stack_trace = get_current_exception (), notes = 'přihlášeno 500 handler.') kromě: Pass return render (požadavek, 'chyby/chyba.html', {'title': 'Error 500', 'PageTitle': 'Chyba 500', 'poznámky': „Existuje problém se serverem nebo s žádostí, které od vás přichází. Děkuji za pochopení. def handler403 (požadavek, výjimka): return render (požadavek, 'chyby/chyba.html', {'title': 'Chyba 403', 'PageTitle': 'Chyba 403', 'poznámky': „Nemáte povolení k předběžné formování tohoto požadavku. Pokud si myslíte, že je to v omylu, prosím kontaktujte správce serveru.", „IS_403": true}) Def Handler400 (požadavek, výjimka): return render (požadavek, 'chyby/chyba.html', {'title': 'Error 400', 'PageTitle': 'Error 400', 'Poznámky': 'Byl to špatný požadavek.'})
Vytvořte své názory zde.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 'chyby.middleware.exceptionverbosemiddleware, ]... Předchozí middleware
Dále přidejte middleware.nano users/models.py
z nití importu místní
Import Traceback
Z django.utils.deprecation import Middlewaremixin
_error = local ()
Třída ExcepmeverBosemiddleware (Middlewaremixin):
Def Process_exception (self, žádost, výjimka):
_error.value = traceback.format_exc ()
def get_current_exception ():
pokus:
návrat _error.value
kromě atributů:
vrátit žádné
def set_current_exception (výjimka):
pokus:
_error.value = výjimka
kromě atributů:
Print ('Výjimka nastavení chyby atributu.')# 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 chyby/šablony/chyby/chyba.html{ % rozšiřuje 'base.html' %} { % blok obsah %} {{PageTitle}} {{Trace}} { % 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
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Najděte tuto řádek, kde je nastavena na pravdu, a změňte ji na false
Debug = falsePokrač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í.
zálohování sudoNež 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 k tomu dojde, později prozkoumáme, jak automaticky zmírnit 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 skenováním jejich ID nebo biometrickým skenováním, jako je rozpoznávání obličeje 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. Chcete -li s tím bojovat, použijeme model v uživatelských modelech a prohlašujeme, jak interagujeme s webem, když autentizujeme pomocí multi faktorového ověřování pomocí telefonního čísla. Přidáme také možnost ověřit pomocí e -mailu. Začněte úpravou uživatelských modelů pomocí Nano.nano users/views.py
Uživatelé nano/models.pyTak 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 Třída Mfatoken (Models.Model): user = models.ForgeignKey (user, on_delete = models.cascade, reaute_name = 'mfa_tokens') timestamp = models.dateTimefield (default = timezone.now) vyprší = models.dateTimefield (default = timezone.now) token = models.charfield (default = '', max_length = 100) délka = models.Integerfield (výchozí = 6) pokusy = models.integerfield (default = 0) uid = models.charfield (default = uuid.uuid4, max_length = 100)from .email import send_verification_email # Základní token používaný k přihlášení na web
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:dodavatel = models.booleanfield (default = false)
Stejně jako u jakýchkoli změn v databázi musíme provést migraci a migrovat databázi kdykoli upravíme soubor model.py v Django. Nezapomeňte, že k tomu použijeme zdroj nejprve (pokud nebyl již použit od otevření terminálu) a poté Python Manage.py pro provedení migrace a migrace.CD projekt-režiséra-pojmenovaná # (v případě potřeby) Zdroj Venv/Bin/Activate Python manage.py makemigrations && python manage.py migrujte
(v případě potřeby) # Prozatím můžete získat jakékoli účty, které jste vytvořili jako prodejci, pomocí shell.
# Python Manage.py Shell
od uživatelů.Models Import profil
P = profil.objects.get (user__username = 'Charlotte')
P.Vendor = true
P.Save ()
výstup()
# Nyní si vyvineme náš více faktorový autentizační pohled na tento token. Nejprve musíme upravit naše pomocné nástroje MFA. Používání nano,
Uživatelé Nano/MFA.pyz django.utils import časové pásmo importovat náhodné import datetime Z nastavení importu django.conf Z krmení.middleware import get_current_request Z django.contrib import zprávy Z. Email import send_html_email Import Traceback Z .Models import mfatoken účet_sid = settings.twilio_account_sid auth_token = settings.twilio_auth_token source_phone = settings.phone_number def send_text (cíl_phone, text): z Twilio.Rest Import Client pokus: klient = klient (účet_sid, auth_token) Pokud Len (Target_phone)> = 11: message = client.Messages.Create ( to = cíl_phone, from_ = source_phone, Body = text + 'text Stop to Cancel.') kromě: messages.warning (get_current_request (), „Došlo k chybě odesílání zprávy.") tisk (traceback.format_exc ()) def get_num_length (num, délka): n = '' pro x v dosahu (délka): n = n + str (num) návrat int (n) def send_verification_text (uživatel, token): délka = user.profile.verification_code_length code = random.randint (get_num_length (1, délka), get_num_length (9, délka)); token.token = code token.expires = timezone.now () + dateTime.timeDelta (minuty = nastavení.auth_valid_minutes) token.save () send_user_text (user, "Váš ověřovací kód pro {} je {}". Format (Settings.site_name, str (kód))) def send_verification_email (uživatel, token): délka = user.profile.verification_code_length code = random.randint (get_num_length (1, délka), get_num_length (9, délka)); token.token = code token.expires = timezone.now () + dateTime.timeDelta (minuty = nastavení.auth_valid_minutes) token.save () send_html_email (uživatel, "Váš ověřovací kód pro {} je {}". Formát (Settings.site_name, str (kód)), "Drahý {}, váš ověřovací kód pro {} je {}. Děkujeme vám za použití tohoto kódu. str (kód), str (kód), settings.site_name)) def send_user_text (uživatel, text): send_text (user.profile.phone_number, text) def check_verification_code (uživatel, token, kód): token.attempts = token.attempts + 1 profil = user.profile result = (Token! = None and Code! = '' a token.token == kód a (token.expires> timeZone.now ()) a token.Attempts <= Settings.mfa_token_attempts) pokud token.Attempts <3 a výsledek: profil.verification_code_length = 6 elif token.attempts> 1 a ne výsledkem: profil.verification_code_length = profile.verification_code_length + 2 if profile.verification_code_length> Settings.mfa_token_length: profil.verification_code_length = settings.mfa_token_length token.save () profil.save () Výsledek návratu
# Ověřte uživatele pomocí svého e -mailu nebo telefonního čísla Def MFA (Žádost, uživatelské jméno, USERToken): token = mfatoken.objects.filter (uid = username, vyprší __gt = timezone.now () + datetime.timedelta (sekundy = 30)). Order_by ('-timestAmp'). Last () # filtrovat token tokenem (UUID) pokud ne token: token = mfatoken.objects.create (user = user.Objects.filter (profil__uuid = username) .First (), uid = username, vyprší = timezone.now () + datetime.Timedelta (sekundy = 115)) # Pokud byla tato relace vytvořena, Create It. user = user.Objects.filter (id = token.user.id) .first () # Získejte uživatele z tokenu pokud ne uživatelé a požadavek.user.is_authenticated: Return přesměrování (reverzní („krmení: home")) # Pokud jsou již ověřeny, přihlaste je v Pokud není uživatel: Zvedněte povolení () # Deny, pokud nebyl nalezen žádný uživatel next = request.get.get ('next', '') pokud ne user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token (USerToken, token): # Zkontrolujte token Auth auth_login (požadavek, uživatel, backend = 'django.contrib.auth.backends.modelbackend') # přihlaste se k uživateli, pokud již nejsou přihlášeni user.profile.mfa_expires = timezone.now () + datetime.timedelta (minuty = settings.Login_valid_minutes) # Nastavte vypršení o autentizaci jejich více faktorů user.profile.save () Návrat httPresponSereDirect (další, pokud next! = '' else reverse ('přistání: přistání')) # přesměrujte uživatele na další stránku pokud ne user.profile.mfa_enabled: # zkontrolujte, zda je povoleno MFA pokud ne kontrolu_verifikace_time (uživatel, token): # zkontrolujte čas user.profile.mfa_enabled = false # vymazat telefonní číslo user.profile.enable_two_factor_authentication = True # Enable MFA user.profile.phone_number = '+1' # Zakázat telefonní číslo user.profile.save () # uložte profil auth_login (požadavek, uživatel, backend = 'django.contrib.auth.backends.modelbackend') # přihlaste uživatele, pokud jejich MFA není povolena messages.warning (požadavek, „Zadejte platné telefonní číslo a ověřte jej pomocí kódu.") recepční přesměrování (Reverse ('Users: MFA_ONBOARTING')) Pokud žádost.method == 'Post' a ne FRAUD_DETECT (ŽÁDOST, TRUE): # Pokud je požadavek požadavkem příspěvku Form = tfaform (request.post) # instance formuláře code = str (form.data.get ('code', none)) # Získejte kód Pokud kód a kód! = '' a kód! = Žádné: # Ujistěte se, že není prázdný token_validated = user.profile.check_auth_token (userToken) # zkontrolujte token Auth p = user.profile is_verified = check_verification_code (uživatel, token, kód) # Zkontrolujte kód p.mfa_authenticated = is_verified Pokud token_validated: # Pokud je všechno Pokud je is_verified: # je v pořádku user.profile.mfa_enabled = true # Enable MFA (pokud již není povoleno) user.profile.save () auth_login (požadavek, uživatel, backend = 'django.contrib.auth.backends.modelbackend') # přihlaste se k uživateli face = user.faces.filter (session_key = none) .last () p.mfa_expires = timeZone.Now () + datetime.timeDelta (minuty = settings.Login_valid_minutes) P.Save () Messages.Success (žádost, „Byli jste ověřeni. Vítejte.") qs = '?' Pro klíč, hodnota v request.get.items (): # Vytvořte querystring pro další parametr (pokud existuje) QS = QS + Key + '=' + Value + '&' pokud next! = '' a ne (next.startswith ('/účty/logout/') nebo next.startswith ('/účty/login/') nebo next.startswith ('/admin/login/') nebo next.Startswith ('/účty/registr/'))): návrat httPresponSereDirect (next) # přesměrování elif next.startswith ('/účty/logout/') nebo next.startswith ('/účty/login/') nebo next.startswith ('/účty/registr/'): recepční přesměrování (reverzní ('/')) elif request.meta.get ('http_referer', '/').startswith('/accounts/login/'): recepční přesměrování (reverzní ('/')) elif ne příští: recepční přesměrování (reverzní ('/')) jiný: návrat httPresponSereDirect (reverse ('ověřte: věk') + '? next =' + request.meta.get ('http_referer', '/'))) jiný: Messages.Warning (žádost, „Kód, který jste zadali, nebyl rozpoznán. Zkuste to prosím znovu.") elif ne token_validated: # Pokud byl token neplatný messages.warning (žádost, „Token URL vypršel nebo nebyl rozpoznán. Zkuste to prosím znovu.") Odhlášení (požadavek) Return přesměrování (Reverse ('Uživatelé: Přihlášení')) Pokud p.mfa_attempts> 3: # Pokud došlo k příliš mnoho pokusů messages.warning (požadavek, „vyvstoupili do nesprávného kódu více než 3krát. Zašlete si prosím nový kód. ") p.verification_code = žádné P.Save () elif user.profile.can_send_mfa <timezone.now (): user.profile.mfa_attempts = 0 user.profile.can_send_mfa = timezone.now () + datetime.timedelta (minuty = 2) user.profile.save () pokud form.data.get ('send_email', false): # Odeslat e -mail (nebo text) send_mfa_verification_email (uživatel, token) jiný: send_verification_text (uživatel, token) Messages.Success (požadavek, „Zadejte kód zaslaný na vaše telefonní číslo nebo e -mail. Kód vyprší za 3 minuty.") elif user.profile.can_send_mfa <timezone.now () + datetime.timeDelta (sekundy = 115): Messages.Warning (žádost, „Posíláte příliš mnoho dvou faktorových ověřovacích kódů. Počkejte několik minut před odesláním jiného kódu.") Form = tfaform () Hide_logo = žádné if user.profile.hide_logo: Hide_logo = true if request.user.is_authenticated: return přestect (reverse ('/')) # Vykreslete formulář (pro získání požadavků) návrat render (požadavek, '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, 'water.Method = "nano users/views.py
Ověřte uživatele pomocí svého e -mailu nebo telefonního čísla# Filtrujte token o hodnotu předanou v adrese URL (UUID)
# Pokud tato relace nebyla vytvořena, vytvořte ji
Získejte uživatele z tokenuPokud jsou již ověřeny, přihlaste se
Popírejte, zda nebyl nalezen žádný uživatel# Zkontrolujte autorský žeton
send_verification_email(user) # Přihlaste se uživatele, pokud již nejsou přihlášeni
Nastavte vypršení ověřování jejich více faktorůPřesměrovat uživatele na další stránku
Zkontrolujte, zda je MFA povoleno# Zkontrolujte čas
Vymažte telefonní čísloPovolit MFA
Zakázat telefonní číslonano users/templates/users/resend_activation.html
Uložit profilPřihlaste se uživatele, pokud jejich MFA není povoleno
Pokud je požadavek žádost o příspěvek
Nastavit formulářZískejte kód
Ujistěte se, že to není prázdné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)
Zkontrolujte autorský žetonZkontrolujte kód
Pokud všechno
Je v pořádkuPovolit MFA (pokud již není povoleno)
Přihlaste se uživateleVytvořte querystring pro další parametr (pokud existuje)
PřesměrovatPokud byl token neplatný
Pokud došlo k příliš mnoho pokusů# Pošlete e -mail (nebo text)
Vykreslete formulář (pro získání požadavků)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
Od .MFA import send_verification_email jako 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.Uživatelé Nano/MFA.py
def send_verification_email (uživatel, token): délka = user.profile.verification_code_length code = random.randint (get_num_length (1, délka), get_num_length (9, délka)); token.token = code token.expires = timezone.now () + dateTime.timeDelta (minuty = nastavení.auth_valid_minutes) token.save () send_html_email (uživatel, "Váš ověřovací kód pro {} je {}". Formát (Settings.site_name, str (kód)), "Drahý {}, váš ověřovací kód pro {} je {}. Děkujeme vám za použití tohoto kódu. str (kód), str (kód), settings.site_name))
Takže to vše funguje skvěle, nyní máme systém ověřování více faktorů, který záleží 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:# import Z django.contrib.auth.decorators import login_required Z django.contrib.auth.decorators import user_passes_test Od importů. @Login_Required @USER_PASSES_TEST (is_superuser_or_vendor) Def Uživatelé (požadavek): # Získejte seznam uživatelů new_today = user.objects.filter (is_active = true, date_joined__gte = timeZone.now () - datetime.timedelta (hodiny = 24)). count () new_this_month = user.Objects.filter (is_active = true, date_joined__gte = timezone.now () - datetime.timeDelta (hodiny = 24*30)). count () předplatitelé = user.objects.filter (is_active = true, profil__subscribed = true) .Count () návrat render (požadavek, 'Users/Users.html', { # Vrací uživatele v šabloně „Název": „Všechny účty", 'Users': user.Objects.all (), 'New_Today': new_today, 'new_this_month': new_this_month, 'Předplatitelé': Předplatitelé })
import
Tento test budeme muset vytvořitZískejte seznam uživatelů
Vráť uživatele v šabloně
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 (uživatel): return user.profile.Vendor nebo user.is_superuser
To je ve spojení se šablonou uživatelů/uživatelů.html, která vypadá něco takového:
{ % rozšiřuje 'base.html' %}
{ % načítání app_filters %}
{ % blok obsah %}
Všichni registrovaní návštěvníci
{{new_today | nts | Capipialize}} Nové dnes, {{new_this_month | nts}} nový tento měsíc, {{odběratelé | nts}} předplatitelé, {{users.count | nts}} celkem.
{ % pro uživatele u uživatelů %}
{ % zahrnuje 'Users/_user.html' %}
{ % endfor %}
{ % endblock %}user.html. Při použití šablony, která má subtemplate a nepoužívá se rozšiřující, je to dobrý nápad přidat podtržení (
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. # { % načítání app_filters %}
@{{user.Username}} - {{user.profile.name}} ({{user.profile.preferred_name}})
Naposledy vidět {{user.profile.last_seen | datum: "f d, y"}} {{user.profile.last_seen | čas: "h: i"}}
Připojil se na {{user.profile.date_Joined | datum: "f d, y"}} {{user.profile.date_joined | Time: "H: i"}}
{{user.Email}}
{ % if user.profile.phone_number %} {{user.profile.phone_number}} { % endif %}
{ %, pokud user.Verrifications.last %}
'{{user.verifications.last.full_name}}'
{{user.verifications.last.document_number}}
{{user.verifications.last.birthdate}}
Id front
Id zpět
{ % endif %}
#{{user.id}}
{ %, pokud user.profile.Subscripted %} Přihlášeno { % else %} Nepřihlášeno { % endif %}
{ %, pokud není user.is_superuser %}
{ % zahrnuje 'Users/Toggle_Active.html' %}
{ % endif %}
{ % AutoScape Off %}
{{user.bio}}
{ % endautoescape %}
{ %, pokud user.profile.identity_verified %} ověřený uživatel. { % else %} neověřený uživatel.
{{user.id}} </mall>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í.
{ %, pokud user.is_active %} { % else %} { % endif %}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.
Z django.views.decorators.csrf import csrf_exempt @csrf_exEmp @Login_Required @USER_PASSES_TEST (is_superuser_or_vendor) Def TONGLEGLE_USER_Active (Request, PK): user = user.Objects.get (id = pk) if request.method == 'Post': user.is_active = ne user.is_active user.Save () návrat httpResponse ('' if user.is_active else '') # Import Z django.contrib.auth.mixins import loginRequiredMixin, userPassSestestMixin Z django.views.generic import deleteView Třída userDeleTeeview (přihlášeníRequiredMixin, userPassSestestMixin, DeleteView): Model = uživatel úspěch_url = '/' # Přesměrování na URL úspěchu def get_context_data (self, ** kwargs): context = super (). get_context_data (** kwargs) návratový kontext def test_func (self): # test, pokud je uživatel Superužitel a má povolení k odstranění user = self.get_object () if self.request.user! = User and self.request.user.is_superuser: vrátit pravdu vrátit nepravdivéImport
Přesměrování na URL úspěchu# Vyzkoušejte, zda je uživatel Superuživatel a má povolení k odstranění
# I když je to praktické v případě potřeby, mazá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:
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Uživatelé Nano/urls.py
Řádky by měly jít do seznamu cest v uživatelských zobrazeních, před koncem "]", ale po začátku "[".#… cesta ('user // delete/', userDeleTeiew.as_view (template_name = 'blog/user_confirm_delete.html'), name = 'delete-user'), Path ('User // Active/', views.toggle_user_active, name = 'Toggle-User-Active'), #…
…source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
…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,
zálohování sudoNyní 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, ještě 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 pomohou 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 obchodní internetové předplatné, 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).
if user and user.profile.can_login < timezone.now(): # Mějte na paměti, že kód, který nyní běžíme, je relativně tenký, bude třeba jej udržovat a vylepšit, než budeme připraveni použít to, co musíme postavit 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.
return redirect(user.profile.create_auth_url()) # 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í. Doposud jsem měl nejlepší zkušenosti s Ionos a Kamaterou, oba mi umožní poslat neomezený e -mail a jejich ceny jsou docela levné.
else: # 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 klíč SSH.
else: # ssh-keygen
user = User.objects.filter(username=username).first() # 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í.
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # 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 doporučuji je 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, která 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 k jejich účtu klíč SSH.nano users/sms.py
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 v 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
#Listenaddress 0.0.0.0
#Listenaddress ::
#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í
#SySlogfacility Auth
#LogLevel Info
# Autentizace:
#LogingRaceTime 2m
#PermitrootLogin zákazu-pastsword
#StrictModes Ano
#MaxAuthtries 6
#Maxsessions 10
PubkeyAuthentication ANO
# Očekávejte .SSH/AUTORIZED_KEYS2 bude v budoucnu v budoucnu ignorován.
AutorizedKeysFile .SSH/autorized_keys .ssh/autorized_keys2
#AuthorizedPrincipalsFile Žádné
#AuthorizedkeysCommand žádný
#AuthorizedkeysCommandUser Nikdo
# Aby to fungovalo, budete také potřebovat hostitelské klíče v/etc/ssh/ssh_ známé
#HostBasedauthentication no
# Změňte na ano, pokud nedůvěřujete ~/.SSH/známým_Hosts pro
# Hostbasedauthentication
#Ignoreuser známý č
# Nečtete uživatele ~/.rhosts a ~/.shosts soubory
#Ignorerhosts ano
# Chcete -li deaktivovat tunelovaná hesla pro jasné texty, změňte zde ne!
PasswordAuthentication no
#PerMiTompTypAsswords no
# Změňte na ano, abyste povolili hesla pro odpověď na výzvu (problémy s upozorněním
# Některé moduly a vlákna PAM)
KBDinteractiveAuthentication no
# Kerberos Možnosti
#Kerberosauthentication no
#Kerberosorlocalpasswd Ano
#KerberosticketCleanup Ano
#KerberoSgetAfStoken Ne
# Možnosti GSSAPI
#Gssapiauthentication no
#GssapicleanupCredentials ANO
#GssapiSirCacceptorCheck Ano
#Gssapikeyexchange no
# Nastavte to na „Ano", aby se 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
# Hesloauthentication. V závislosti na konfiguraci PAM,
# Ověřování Pam prostřednictvím KBDinteractiveAuthentication může obtok
# Nastavení "PermitrootLogin Bez-Password".
# Pokud chcete pouze spustit účet PAM a kontroly relací
# Ověřování Pam, poté to povolte, ale nastavte hesloauthentication
# a KBDinteractiveAuthentication na „Ne".
UsePam Ano
#Allowagent forwarding ANO
#Allowtcpforwarding ano
#GATEWAYPORTS Ne
X11 forwarding ano
#X11DisplayoffSet 10
#X11uselocalhost Ano
#Permittty ano
Printmotd ne
#PrintLastLog Ano
#Tcpkeepalive ano
#PermituseRerenvironment Ne
#Compression zpožděn
#ClieLaliveInterval 0
#ClieLaliveCountMax 3
#Usedns no
#Pidfile /run/SSHD.PID
#MaxStartups 10: 30: 100
#Permittunnel ne
#CHROOTDirectory Žádné
#Versionaddendum žádné
# žádná výchozí cesta banneru
Banner /Etc /Banner
# Umožněte klientovi předat proměnné prostředí prostředí
Akceptovat Lang lc_*
# Přepište výchozí hodnoty bez subsystémů
Subsystém SFTP/usr/lib/Openssh/SFTP-server
# Příklad převažujícího nastavení na základě uživatele
#Match uživatel anoncvs
# X11forwarding ne
# Povolenímpforwarwarding ne
# Povolení ne
# ForceCommand CVS Server
Permitrootlogin no
# 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
AUTH_VALID_MINUTES = 3 # Poslouchání 0.0.0.0
Poslousnost ::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
Informace o leglevelu# Ověřování:
LOGINGRACETIME 2MPermitrootLogin zakázán-password
Strictmodes anonano users/templates/users/mfa.html
Maxauthtries 6Maxsessions 10
Očekávejte, že .SSH/AUTORIZED_KEYS2 bude v budoucnu ignorován.
Autorizovaný principalsfile žádnýAutorizovanýKeysCommand žádný
AutorizovanýkeysCommandUser nikdonano users/templates/users/mfa_onboarding.html
Aby to fungovalo, budete také potřebovat hostitelské klíče v/etc/ssh/ssh_ známéHOSTASEDAUTHENTIKACE NO
Změňte na ano, pokud nedůvěřujete ~/.ssh/známém_Hosts pro
HostbasedauthenticationIgnoreuserserknowhosts no
Nečtěte si uživatele ~/.rhosts a soubory ~/.shostsIgnorerhosts ano
Chcete -li deaktivovat tunelovaná čistá textová hesla, změňte na ne!PerMitemPypasswords č
Změňte na ANO, abyste povolili hesla pro odpověď na výzvu (problémy s pohledem# Některé moduly a vlákna PAM)
Kerberos možnostiKerberosauthentication no
Kerberosorlocalpasswd Ano# Kerberosticketcleanup Ano
KerberosgetAfStoken neMožnosti GSSAPI
GSSAPIAUTHENTIKACE NOnano users/templates/users/profile.html
GSSAPICLEANUPCREDENTIALS ANO
GSSAPISTRITCECTACCEPTORCHECK ANOGSSAPIKEYEXCHANGE 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 hesloauthenticationbackup
a kbdinteractiveauthentication na „ne".Dovolená profilding ano
Povolení, když anopython manage.py runserver localhost:8000
Gatewayports čX11DISPLAYOFFSET 10
X11uselocalhost anoPovolení ano
PrintLastLog AnoTcpkeepalive ano
PermituseRerenvironment čZpožděná komprese
CLENTALIVEInterval 0CLENTALIVECOUNTMAX 3
Použité nepython manage.py startapp errors
Pidfile /run/sshd.pidMaxStartups 10: 30: 100
Permittunnel nohandler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
CHROOTDIRECTORY ŽÁDNÝVersionAddendum žádné
Žádná výchozí cesta banneru# Umožněte klientovi předat proměnné prostředí prostředí
Přepíše výchozí hodnoty bez subsystémů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 nePovolení č
Server CVS ForCECOMMANDfrom 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.')
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 inicializovat
S klíčem SSH jste našli pomocí CAT. (.SSH/ID_RSA.PUB)nano errors/templates/errors/error.html
#!/bin/bash
sudo apt instalace -y nano git openssh -server
sudo CP sshd_config/etc/ssh/sshd_config
Restartování SHSH SSH SUDO
Sudo Service Sshd Restart
echo "/root/.ssh/id_rsa" | sudo su kořen -c "ssh -keygen -t rsa -n '' ''
echo "root ssh klíč:"
sudo su root -c "kočka /root/.ssh/id_rsa.pub"
SUDO ADDUSER-DESABLED-PASSWORD-GECOS "" Tým
Tým sudo passwd -d
sudo usermod -ag sudo tým
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 '' >> /home/team/.ssh/authorized_keys
echo "Team SSH Key:"
cat /home/team/.ssh/id_rsa.pub
!/bin/bashAbychom 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 root a přidáme uživatelský tým '(můžete si pro to vybrat název, použijte příkaz přídavců s jejich jménem a prozatím deaktivovaného hesla). 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.nano app/settings.py
ssh team@xx.xx.xx.xxTentokrá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:DEBUG = False
CAT ~/.SSH/ID_RSA.PUBDá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.gitsudo backup
Perfektní. Nyní jsou všechny soubory zde. Můžeme je vidět s LSls
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 whatyoucalledidit
Kde je „WhatyOUCalleDidit" 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/ascriptnano users/models.py
sudo nano/usr/bin/ascriptNezapomeňte tam použít sudo, abyste měli k úpravě souboru oprávnění. Do souboru přidejte tyto řádky:
#!/bin/bash Pokud [! -f/usr/bin/$ 1]; pak 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 jiný sudo chmod a+x/usr/bin/$ 1 sudo nano/usr/bin/$ 1 Fi# !/bin/bash
!/bin/bash ">>/usr/bin/$ 1Pamatujte, že tento skript má argument, název skriptu, jako $ 1. Nejprve zkontroluje, zda soubor existuje, nebo jej jinak vytvoří, přidá první řádek pro prohlášení, že skript je bash, změní jeho oprávnění, upravuje jej a přidá své jméno do /etc /ascripts, což nám umožňuje ukládat jména skriptů, které vytváříme. 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 vendor = models.BooleanField(default=False)
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 Sekundy = 0 Python_version = 3,12 echo "FemmeBabe Instalační program inicializován." # sudo chmod a+x skripty/userseTup # ./Scripts/UserSetup # ssh-keygen # Directory projektu Dir = "/home/team/femmebabe" User = "Team" # Příkazy protokolu ozvěna „příkazy protokolování" 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 = "Zdroj/home/Team/FemmeBabe/Venv/Bin/Active"' | sudo tee -a /home/team/.profile echo $ '"Prompt_Command = \' refn_val = $?; logger -p local6.debug" $ (whoami) [$$]: $ (Historie 1 | Sed "S/^[]*[0-9] \+[]*//") "\ '' '| sudo tee -a /etc /bashrc echo $ '"Prompt_Command = \' refn_val = $?; logger -p local6.debug" $ (whoami) [$$]: $ (Historie 1 | Sed "S/^[]*[0-9] \+[]*//") "\ '' '| sudo tee -a "/home/team/.bashrc" echo $ '"Prompt_Command = \' refn_val = $?; logger -p local6.debug" $ (whoami) [$$]: $ (Historie 1 | Sed "S/^[]*[0-9] \+[]*//") "\ '' '| sudo tee -a /root/.bashrc echo "zdroj /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 SLUŽBA RSYSLOG RESTRART # Nano Config Echo "Set TabSize 4" >> .Nanorc echo "set tabstospaces" >> .Nanorc # Git config ozvěna „Konfigurace git" 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 -addd Safe.Directory $ "$ dir" sudo ssh -keyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/ známé_hosts sudo ssh -keyscan -t rsa github.com | sudo tee -a /root/.ssh/ známé_hosts Echo "Nastavení montáže" Sudo Mount -o Remount, velikost = 16g, exec /tmp # Aktualizace a instalace ozvěna „Aktualizace a instalace balíčků" Sudo Apt Update && sudo potřebestart_mode = 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 'internetová stránka'" | Sudo DebConf-Set-Selections Sudo Needoststart_Mode = a debian_frontend = neinteraktivní apt instalace -y postfix sudo nepotřebin_mode = apt instalace -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cMake python-is-python3 python3-nthon3-pip Python3-django libopencv-dev python3-opencv python3-dev libsasl2-dev OpenKim Opendkim-tools Dovecot-Pop3d Dovecot-imapd auditd procmail libpq-dev postgresql postgreql-contrib libheif-devd software-contbot-witbonmon-contbon certbot-witbon certBot-the-the-the-witbon-contrib Python3-CertBot-Apache echo "-a exit, vždy -f arch = b64 -f euid = 0 -s execve" | sudo tee -a /etc/audit/audit.rules echo "-a exit, vždy -f arch = b32 -f euid = 0 -s execve" | sudo tee -a /etc/audit/audit.rules # Povolit antivirus Clamav ozvěna „startovací antivirus" Sudo SystemCtl Povolit Clamav-Daemon Sudo SystemCtl Start Clamav-Daemon # Nastavte název hostitele echo "127.0.0.1 Femmebabe" | sudo tee -a /etc /hosts sudo hostnamectl set-hostname localhost # Nastavení Postgres Echo "Nastavení postgres" sudo -u postgres psql -u postgres -c "Drop Database Database;" sudo -u postgres psql -u postgres -c "Vytvořit databázi databáze;" sudo -u postgres psql -u postgres -c "Vytvořte uživatele django s heslem 'heslo';" sudo -u postgres psql -u postgres -c "alter role django set client_encoding na 'UTF8';" sudo -u postgres psql -u postgres -c "alter role django nastavit default_transAction_isolation na 'číst oddané';" sudo -u postgres psql -u postgres -c "alter role django nastavit TimeZone na 'UTC';" sudo -u postgres psql -u postgres -c "udělit všechna oprávnění v databázi databáze Django;" # Zálohování databáze Echo "Databáze budovy od zálohy, to může chvíli trvat." kočka db.json. ?? > db.json Echo "Konfigurace brány firewall" Sudo UFW Výchozí povolení odchozí sudo UFW výchozí zamítnutí příchozí sudo ufw povolit 22 sudo ufw Povolit http sudo ufw Povolit https sudo ufw povolit 'postfix' sudo ufw Povolit 'postfix smtps' sudo ufw Povolit „Poskytnutí postfixu" sudo ufw Povolit 'Dovecot Pop3' sudo ufw Povolit 'Dovecot Secure Pop3' sudo ufw Povolit 110/TCP sudo UFW Povolit 25/TCP echo "y" | SUDO UFW Povolit # Zakázat iptables Echo "Konfigurace brány firewall" sudo iptables -p vstup přijmout sudo iptables -p výstup přijmout sudo iptables -p vpřed přijmout 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/instalátor sudo chmod a+x bitdefender/instalátor sudo ./bitdefender/installer # Nastavení postfixu CD $ dir Echo „Konfigurace poštovních služeb" 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_opendim.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/klíče sudo mkdir /etc/opendkim/keys/femmebabe.com sudo mkdir/var/cívka/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/klíče Sudo Chown Opendkim: Opendkim /etc/opendkim/Keys/Femmebabe.com/sendonly.private Sudo Chown Opendkim: Postfix/var/cívka/postfix/Opendkim CD $ dir sudo CP poštovní schránka/*/var/pošta/ Sudo Chown: Uživatelé/var/pošta/* sudo chmod -r a+rwx/var/e -mail/* Sudo SystemCtl Restart Opendkim Postfix Dovecot # Vytvořte dirs CD $ dir MKDIR MEDIA/AUDIO MKDIR MEDIA/Zvukové/otisky prstů MKDIR MEDIA/BEZPEČNOST Mídium Mkdir/Secure MKDIR MEDIA/Secure/Media mkdir média/zabezpečení/video MKDIR MEDIA/Secure/Profil MKDIR MEDIA/Secure/Face Mídia/obrázky Mkdir Mkdir Media/Live Mkdir Media/Live/Files Mkdir Media/Live/Stills mkdir média/soubory Mkdir Temp Mkdir Temp/Data MKDIR TEMP/GFPGAN Mkdir Mail/Doručená pošta Mkdir poštovní schránka # Nastavení virtualenv CD $ dir echo „Vytváření virtuálního prostředí" Python -M Venv Venv Zdroj Venv/Bin/Activate # Získejte a buďte závislosti ozvěna „Získání a budování závislostí, může to trvat, než" CD $ dir Git Clone https://github.com/sukhitashvili/violence-detection.git CP config/vd-requirements.txt-detekce/požadavky.txt CP Config/VD-MODEL.PY Detekce násilí/model.py Detekce násilí CD PIP3 instalace -r požadavky.txt CD $ dir wget https://github.com/tencentarc/gfpgan/releases/download/v1.3.0/gfpganv1.3.pth -p experimenty/předběžné_modely Git Clone https://github.com/tencentarc/gfpgan.git Git Clone https://github.com/davisking/dlib.git CD dlib Mkdir Build; CD sestavení; cMake ..; CMake -Build. CD .. Zdroj Venv/Bin/Activate Python Setup.py Instalace CD $ dir Zdroj Venv/Bin/Activate CD $ dir/gfpgan/ Echo "Instalace závislostí Pythonu" PIP instalujte základy PIP nainstalujte facexlib PIP instalace -r požadavky.txt Python Setup.py vývoj PIP nainstalujte realesrgan CD $ dir Sudo Chown -r Team: Uživatelé GFPGAN echo "Instalace 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 nainstalujte # Nastavte pravidla brány firewall CD $ dir # Nainstalujte závislosti PYPI echo "Instalace zbývajících závislostí Pythonu (to může chvíli trvat)" Sudo SystemCtl Mask Tmp.Mount CD $ dir Zdroj Venv/Bin/Activate PIP3 Instalace -U "Celer [redis]" PIP3 instalace -r požadavky.txt-Pouse-Depretated = Legacy-Resolver --use-PEP517 PIP3 Instalace -pgrade OpenCV-PYTHON #== 4.5.4.60 PIP3 Instalace -pgrade OpenCV-Contrib-Python #== 4.5.4.60 #PIP nainstalovat OpenCV-PYTHON == 4.5.5.64 #PIP nainstalujte opencv-contrib-python == 4.5.5.64 PIP3 Instalace -pgrade Opencv-Python-Headless PIP3 odinstalujte kanály PIP3 odinstaluje Daphne PIP3 instalovat kanály ["Daphne"] PIP3 Instalace Pillow == 9.5.0 PIP3 nainstalovat librosu PIP3 Instalace -U 'Twisted [tls, http2]' PIP3 instalace -pgrade Certifie žádosti urllib3 numpy oautlib Twisted Pyjwt Sqlparse Cryptography Astral webAuthn DocBarcodes PDF417 Deepface--ne-cache-dir PIP3 nainstalujte tensorflow == 2.15.1 # Nainstalujte Certbot Echo „Instalace certifikátů" 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 Povolte apache2 Sudo SystemCtl Start apache2 # Spusťte Certbot Sudo Certbot-Apache--ne-interaktivní-Agree-tos--domény femmebabe.com-Email Jasper.Camber.holton@gmail.com # Obnovení poštovního serveru Sudo SystemCtl Restart Opendkim Postfix Dovecot # Kopírovat certifikace #sudo cp /etc/letsensrypt/live/femmebabe.com/privkey.pem privkey.pem #sudo cp /etc/letsenScrypt/Live/FemmeBabe.com/cert.pemH 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" # Nastavte nastavení uživatele Sudo GpassWD -a www -dat uživatelé # Nastavte oprávnění Echo „Nastavení oprávnění" SUDO CHOWN -R TEAM: Uživatelé mezipaměť/ sudo chmod a+rwx -r mezipaměť/ #sudo chown -r Team: Users/var/run/ #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: Uživatelé/var/log/ Sudo Chown -R: Uživatelé .././ 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-dat: www-dat media/ Sudo Chown www-dat: Uživatelé ./ Sudo Chown -r Team: Users Media/ Sudo Chown -r Team: Uživatelé ./ Sudo Chown -r Team: Uživatelé ./gfpgan/ Sudo Chown -r Team: Uživatelé ./TEMP/ Sudo chmod a+r tým/var/e -mail/$ # Zkopírujte a nastavte oprávnění Echo „Konfigurace zbývajících služeb" 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/celer 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 ozvěna „Probíhá migrace, mělo by to být rychlé" Python manage.py makemigrations Python Manage.py migrate-běh-syncdb echo "Načítání dat, to může chvíli trvat" Python manage.py loaddata db.json Echo "Nastavení konfigurace crontab/sudoers" sudo crontab -l -u kořen | Kočka - config/crontab | sudo crontab -u root - sudo sh -c "Cat Config/sudoers >>/etc/sudoers" # Inject PAM Konfigurace a odstraňte vadnou konfiguraci SSH #sudo sed -i '' -e '$ d' /etc/pam.d/sshd #sudo sed -i '' -e '$ d' /etc /profil echo "Session vyžadoval pam_exec.so seteuid /home/team/femmebabe/pam.sh" | sudo tee -a /etc/pam.d/sshd Echo "Session vyžadoval 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 "kopírování skriptů" sudo cp skripty/reload/usr/bin/ Scripty/check/usr/bin/ sudo cp skripty/enagpu/usr/bin/ sudo cp skripty/disgpu/usr/bin/ sudo cp skripty/aktivace/usr/bin/ sudo cp skripty/zálohování/usr/bin/ sudo cp skripty/ascript/usr/bin/ sudo cp skripty/nastavení/usr/bin/ sudo cp skripty/addSetup/usr/bin/ sudo cp skripty/hodinky/usr/bin/ sudo cp skripty/protokoly/usr/bin/ sudo cp skripty/cmds/usr/bin/ sudo cp skripty/nastavení/usr/bin/ sudo cp skripty/pushweb/usr/bin/ sudo cp skripty/purgecache/usr/bin/ Sudo CP Config/Banner/Etc/Banner CD/usr/bin/ sudo chmod a+x aktivuje Zálohování sudo chmod a+x sudo chmod a+x ascript # Obnovit a Povolte služby echo „Povolení služeb" Sudo SystemCtl Daemon-Reload sudo systemctl povolit daphne.service Sudo SystemCtl Povolit celer.Service Sudo SystemCtl Povolit celeryBeat.Service Sudo SystemCtl Povolit 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 "Povolení apache2" SUDO A2ENMOD přepsat sudo a2enmod wsgi záhlaví sudo a2enmod 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 náš 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 # Nastavte oprávnění sudo chown -r: www -dat/var/www/ sudo chown -r: www-data /var/www/.deepface # Konfigurace swapu echo "přidělení swapu, to může chvíli trvat" Sudo Swapoff /Swapfile sudo rm /swapfile Sudo Fallocate -L 8G /SWAPFILE Sudo DDf =/dev/nula =/swapfile BS = 1024 Count = 8388608 sudo chmod 600 /swapfile sudo mkswap /swapfile Sudo Swapon /Swapfile echo "/swapfile swap swap výchozí hodnoty 0 0" | sudo tee -a /etc /fstab Sudo Swapon - -show # INIT CAPTION Engine echo „inicializace rutinního titulku" /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 "nastavení git" CD $ dir sudo rm -r .git git init-initial-branch = main echo „Nastavení uživatele hesla" Sudo Usermod - -Password $ (Echo Team | OpenSSL PASWD -1 -1 -Stdin) Team # Zobrazit IPv6 a OpenDKIM pro konfiguraci domény echo "Zkopírujte níže uvedené informace do konfigurace domény." Název hostitele -I IP A | Grep Inet IP -6 ADDR | Grep "Scope Link" sudo kočka /etc/opendkim/keys/femmebabe.com/sendonly.txt | Tr -d '\ n' | sed 's/\ s // g' | sed 's/"" // g' | awk -f '[) (]' '{tisk $ 2}' # Nastavení dokončeno echo "Nastavení dokončené in" Skripty/nastavení WC -l echo "řádky kódu." echo "Celkový čas:" trvání = $ sekundy echo "$ ((trvání / 60)) minuty a $ ((trvání % 60)) sekundy uplynuly." echo "todo:" Echo "- Kopírovat nad adresou IPv6 do konfigurace DNS domény" Echo "- Klíč domény zkopírovat do konfigurace DNS domény" echo "- Přidejte nové úložiště Git s Git Remoted Add OriginLab." Echo "- Open Port 25" echo "- nainstalujte antivirus podle doporučení" echo "- test" echo "Pokud je nuda", " echo "- ladění" echo "- opravte nastavení a záložní skripty" echo "- oprava serveru" echo "" Echo "Děkuji za použití instalačního programu Femmebabe. Přeji skvělý den!" echo
!/bin/bashcd project-directory-you-named # sudo chmod a+x skripty/userseTup
./Scripts/UserSetupssh-keygen
Directory projektupython manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Protokol příkazůNano config
Git confignano users/mfa.py
Aktualizace a instalacefrom 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
Povolit Clamav antivirus# Nastavte název hostitele
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Nastavení Postgres
if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Zálohování databáze nastavení
user = User.objects.filter(id=token.user.id).first() # Zakázat iptables
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Nainstalujte bitdefender
if not user: raise PermissionDenied() # Nastavení postfixu
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Vytvořte dirs
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Nastavení virtualenv
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Získejte a buďte závislosti
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Nastavit pravidla brány firewall
if not user.profile.mfa_enabled: # Nainstalujte závislosti PYPI
if not check_verification_time(user, token): # == 4.5.4.60
user.profile.mfa_enabled = False # == 4.5.4.60
user.profile.enable_two_factor_authentication = True # PIP nainstalujte OpenCV-PYTHON == 4.5.5.64
user.profile.phone_number = '+1' # PIP nainstalujte OpenCV-Contrib-Python == 4.5.5.64
user.profile.save() # Nainstalujte Certbot
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Spusťte Certbot
if request.method == 'POST' and not fraud_detect(request, True): # Obnovit poštovní server
form = TfaForm(request.POST) # Kopírovat certifikáty
code = str(form.data.get('code', None)) # sudo cp /etc/letsensencrypt/live/femmebabe.com/privkey.tem privkey.pem
if code and code != '' and code != None: # sudo cp /etc/letsensencrypt/live/femmebabe.com/cert.pem cert.pem
token_validated = user.profile.check_auth_token(usertoken) # Patch Venv
is_verified = check_verification_code(user, token, code) # Nastavit nastavení uživatele
if token_validated: # Nastavit oprávnění
if is_verified: # Sudo Chown -r Team: Uživatelé/var/běh/
user.profile.mfa_enabled = True # Sudo Chown Root: Root/Run/Sudo/TS -R
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # sudo chmod 664 db.sqlite3
for key, value in request.GET.items(): # Sudo Chown www-dat: Uživatelé db.sqlite3
return HttpResponseRedirect(next) # Zkopírujte a nastavte oprávnění
elif not token_validated: # Nastavení databáze
if p.mfa_attempts > 3: # Injekční konfiguraci PAM a odstraňte vadnou konfiguraci SSH
if form.data.get('send_email', False): # sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profil
Zkopírujte skripty a nastavte oprávněníObnovit a povolte služby
Povolit moduly Apachefrom .mfa import send_verification_email as send_mfa_verification_email
sudo a2dismod mpm_eventsudo a2dismod mpm_worker
sudo a2enmod mpm_preforknano users/mfa.py
Zakázat výchozí webdef 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))
Povolit náš webObnovit démona a restartujte Apache, Postfix a Opendkim
Nastavit oprávnění# Konfigurace swapu
from .tests import is_superuser_or_vendor # INITIVNÍ TAKOVÝ MOTOR
# Nastavení git
return render(request, 'users/users.html', { # Zobrazit IPv6 a OpendKim pro konfiguraci domény
Nastavení dokončenoTo je hodně nastavení! Stručně řečeno, tyto kódové protokoly příkazy, konfiguruje nano a git, kopie přes soubory, stahování a instalace Ubuntu apt balíčky, Pythonské závislosti, konfiguruje postfix, konfiguruje postgresql (databázový server) a načítají databázi a načítají se, je to, že je nakládáno, a nakládá se, a načítají závislost, a načítají se, je to, že je to k dispozici, a načítají. Nastaví server, nainstaluje konfiguraci, spustí a umožňuje rozhraní, přiděluje swap, nastavuje oprávnění a vytiskne adresu IP, IPv6 a klíč OpendKim. 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 pro nákup domény, jejich rozvržení je intuitivní 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:def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
@ A xx.xx.xx.xxS 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 to, co potřebujeme pro základní pokrok. Zatím nebudeme používat tolik závislostí nebo PostgreSQL, stačí spustit základní server HTTP a obáváme se, že jej při hotovosti certifikujeme. 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 vašeho projektu a dodávejte e -mail a doménu do značek <>.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 (https)#!/bin/bash Sekundy = 0 Python_version = 3,12 echo "FemmeBabe Instalační program inicializován." Dir = "/home/Team/" User = "Team" # Příkazy protokolu ozvěna „příkazy protokolování" 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 = "Zdroj/home/Team/FemmeBabe/Venv/Bin/Active"' | sudo tee -a /home/team/.profile echo $ '"Prompt_Command = \' refn_val = $?; logger -p local6.debug" $ (whoami) [$$]: $ (Historie 1 | Sed "S/^[]*[0-9] \+[]*//") "\ '' '| sudo tee -a /etc /bashrc echo $ '"Prompt_Command = \' refn_val = $?; logger -p local6.debug" $ (whoami) [$$]: $ (Historie 1 | Sed "S/^[]*[0-9] \+[]*//") "\ '' '| sudo tee -a "/home/team/.bashrc" echo $ '"Prompt_Command = \' refn_val = $?; logger -p local6.debug" $ (whoami) [$$]: $ (Historie 1 | Sed "S/^[]*[0-9] \+[]*//") "\ '' '| sudo tee -a /root/.bashrc echo "zdroj /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 SLUŽBA RSYSLOG RESTRART # Nano Config Echo "Set TabSize 4" >> .Nanorc echo "set tabstospaces" >> .Nanorc # Git config ozvěna „Konfigurace git" sudo git config -global user.email "@gmail.com" && sudo git config --global user.name "" git config -global -addd Safe.Directory $ "$ dir" sudo ssh -keyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/ známé_hosts sudo ssh -keyscan -t rsa github.com | sudo tee -a /root/.ssh/ známé_hosts # Aktualizace a instalace ozvěna „Aktualizace a instalace balíčků" Sudo Apt Update && sudo potřebestart_mode = 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 'internetová stránka'" | Sudo DebConf-Set-Selections Sudo Needoststart_Mode = a debian_frontend = neinteraktivní apt instalace -y postfix sudo nepotřebin_mode = apt instalace -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cMake python-is-python3 python3-nthon3-pip Python3-django libopencv-dev python3-opencv python3-dev libsasl2-dev OpenKim Opendkim-tools Dovecot-Pop3d Dovecot-imapd auditd procmail libpq-dev postgresql postgreql-contrib libheif-devd software-contbot-witbonmon-contbon certbot-witbon certBot-the-the-the-witbon-contrib Python3-CertBot-Apache # Povolit antivirus Clamav ozvěna „startovací antivirus" Sudo SystemCtl Povolit Clamav-Daemon Sudo SystemCtl Start Clamav-Daemon # Nastavte název hostitele echo "127.0.0.1 Femmebabe" | sudo tee -a /etc /hosts sudo hostnamectl set-hostname femmebabe # Zálohování databáze Echo "Databáze budovy od zálohy, to může chvíli trvat." kočka db.json. ?? > db.json Echo "Konfigurace brány firewall" Sudo UFW Výchozí povolení odchozí sudo UFW výchozí zamítnutí příchozí sudo ufw povolit 22 sudo ufw Povolit http sudo ufw Povolit https sudo ufw povolit 'postfix' sudo ufw Povolit 'postfix smtps' sudo ufw Povolit „Poskytnutí postfixu" sudo ufw Povolit 'Dovecot Pop3' sudo ufw Povolit 'Dovecot Secure Pop3' sudo ufw Povolit 110/TCP sudo UFW Povolit 25/TCP echo "y" | SUDO UFW Povolit # Zakázat iptables Echo "Konfigurace brány firewall" sudo iptables -p vstup přijmout sudo iptables -p výstup přijmout sudo iptables -p vpřed přijmout sudo iptables -f sudo iptables-save # Nastavení virtualenv CD $ dir echo „Vytváření virtuálního prostředí" Python -M Venv Venv Zdroj Venv/Bin/Activate PIP3 instalace -r požadavky.txt # Nainstalujte Certbot Echo „Instalace certifikátů" 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 Povolte apache2 Sudo SystemCtl Start apache2 # Spusťte Certbot Sudo Certbot-Apache--neinteraktivní-Agree-Tos--Domains FemmeBabe.com-Email @gmail.com # Nastavte nastavení uživatele Sudo GpassWD -a www -dat uživatelé # Nastavte oprávnění Echo „Nastavení oprávnění" SUDO CHOWN -R TEAM: Uživatelé mezipaměť/ sudo chmod a+rwx -r mezipaměť/ #sudo chown -r Team: Users/var/run/ #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: Uživatelé/var/log/ Sudo Chown -R: Uživatelé .././ sudo chmod -r g+rwx ./ sudo chmod -r g+rx .././ sudo chmod -r g -rwx ../.ssh sudo chmod 774 ./ sudo chown -r www-dat: www-dat media/ Sudo Chown www-dat: Uživatelé ./ Sudo Chown -r Team: Users Media/ Sudo Chown -r Team: Uživatelé ./ # Obnovit a Povolte služby echo „Povolení služeb" Sudo SystemCtl Daemon-Reload Sudo SystemCtl Povolit Clamav-Daemon Sudo SystemCtl Start Clamav-Daemon # Povolit moduly Apache echo "Povolení apache2" SUDO A2ENMOD přepsat sudo a2enmod wsgi záhlaví sudo a2enmod sudo a2enmod SSL sudo a2enmod proxy sudo a2enmod proxy_balancer sudo a2enmod proxy_http sudo a2enmodproxy_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 "Zkopírujte níže uvedené informace do konfigurace domény." Název hostitele -I IP A | Grep Inet IP -6 ADDR | Grep "Rozsah
!/bin/bashProtokol příkazů
Nano config <small># Git config
Aktualizace a instalacePovolit Clamav antivirus
Nastavte název hostitele
Zálohování databáze nastaveníZakázat iptables
Nastavení virtualenv# Nainstalujte Certbot
success_url = '/' # Spusťte Certbot
def test_func(self): # Nastavit nastavení uživatele
Nastavit oprávněníSudo Chown -r Team: Uživatelé/var/běh/
Sudo Chown Root: Root/Run/Sudo/TS -RObnovit a povolte služby
Povolit moduly Apachenano users/urls.py
Obnovit démona a restartujte Apache, Postfix a OpendkimZobrazit IPv6 a OpendKim pro konfiguraci domény
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
# 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 backup
Sudo Certbot-Apache--non-interaktivní --agree-tos-domains .com-email @gmail.comDokud 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.pyV nastavení změňte/přidejte tyto řádky.
Debug = false # Konfigurace webu Site_name = 'femme babe' Protocol = 'https' Doména = 'femmebabe.com' Site_id = 1 Base_url = Protocol + ': //' + doména Povoleno_hosts = [doména] Interní_ips = [ 'Xx.xx.xx.xx', ]Konfigurace webu
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 Přesměrovat permanentní/https://femmebabe.com/ Servername femmebabe.com ServerAdmin team@femmebabe.com Dokumentace/var/www/html ErrorLog $ {apache_log_dir} /error.log CustomLog $ {apache_log_dir} /access.log kombinován Alias/static/home/tým/femmebabe/static Vyžadovat vše uděleno Alias/Media/Icons/Home/Team/FemmeBabe/Media/ Vyžadovat vše uděleno Vyžadovat vše uděleno Wsgiscriptalias//home/team/femmebabe/femmebabe/wsgi.py WSGidaemonProcess FemmeBabe Python-Path =/Home/Team/FemmeBabe/Python-Home =/Home/Team/FemmeBabe/Venv-Buffer-Size = 100000000000 Uživatel = Tým = TEAM WSGIPROCESSGROUP FEMMEBABE Wsgiapplicationgroup %{global} Indexy možností sledují Povolit vše RepriteEngine 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] Zahrnout /etc/letsensencrypt/options-sl-apache.conf SslCertificAteFile /etc/letScrypt/live/femmebabe.com/fullchain.pem SslCertificateKeyFile /etc/letScrypt/live/femmebabe.com/privkey.pem Sada záhlaví X-Frame-Options: „Sameorigin" SET HEADER Access-Control-Dalow-Origin "https://femmebabe.com" Timeout 60000 LimitRequestbody 0 Nastavit kontrolu mezipaměti záhlaví "Max-Age = 30, Public" Servername femmebabe.com ServerAdmin team@femmebabe.com Dokumentace/var/www/html ErrorLog $ {apache_log_dir} /error.log CustomLog $ {apache_log_dir} /access.log kombinován RepriteEngine on RewriteCond %{server_name} = femmebabe.com Rewriterule ^ https: //%{server_name}%{request_uri} [end, ne, r = permanent]
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.ssh-keygen
CD ProjectName
Zdroj Venv/Bin/Activate
Python Manage.py CheckPokud 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á „Oplsul není reentrant", upravte následující soubor ve virtuálním prostředí, Registry.py, odhalit chybu.
Nano Venv/Lib/Python3.12/balíčky/django/Apps/Registry.pycat ~/.ssh/id_rsa.pub
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:Pokud self.loading: # Zabránit reentrantským voláním, abyste se vyhnuli spuštění appConfig.ready () # metody dvakrát. # Raise RuntimeError ("Populate () není reentrant") self.app_configs = {} self.loading = true
Zabránit reentrantským hovorům, abyste se vyhnuli spuštění appconfig.ready ()ssh-keygen -t rsa -b 4096
metody dvakrát.Raise RuntimeError ("Populate () není reentrant")
Poté můžete projekt znovu zkontrolovat a vystavit chybu.ssh ubuntu@XX.XX.XX.XX
Python Manage.py CheckPak 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:
Pokud self.loading: # Zabránit reentrantským voláním, abyste se vyhnuli spuštění appConfig.ready () # metody dvakrát. Raise RuntimeError ("Populate () není reentrant") # self.app_configs = {} self.loading = trueZabránit reentrantským hovorům, abyste se vyhnuli spuštění appconfig.ready ()
metody dvakrát.nano sshd_config
self.app_configs = {}# 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ý
# Nyní budeme muset přidat 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.
#myorigin = /etc /MailName
smtpd_banner = $ myhostName esmtp $ mail_name (ubuntu)
biff = ne
# APPINGING .Momain je práce MUA.
append_dot_mydomain = ne
# Unhomment Další řádek pro generování varování „Zpožděná pošta"
#delay_warning_time = 4H
readme_directory = ne
# Viz http://www.postfix.org/compatibility_readme.html - Výchozí na 3.6 ON
# Čerstvé instalace.
kompatibilita_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/PRIVKY.PEM
smtpd_tls_security_level = květen
SMTP_TLS_CAPATH =/ETC/SSL/CERTS
smtp_tls_session_cache_database = btree: $ {data_directory}/smtp_scache
smtpd_relay_restrictions = povolení_sasl_authenticated, defer_unauth_destination
myhostName = femmebabe.com
alias_maps = hash:/etc/aliasys
alias_database = hash:/etc/aliass
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
recept_delimiter = +
inet_interfaces = all
inet_protocols = all
# Konfigurace Milter
MILTER_DEFAULT_ACTION = Accepce
MILTER_PROTOCOCE = 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
# 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.
# myorigin = /etc /mailName
# Appening .domain je práce MUA.
# Unlicment Další řádek pro generování varování „zpožděná pošta"
# delay_warning_time = 4H
# Viz http://www.postfix.org/compatibility_readme.html - výchozí na 3.6 ON
# čerstvé instalace.
# Parametry TLS
# Milter konfigurace
# Další konfigurace!
# Nano config/etc_postfix_master.cf
# Přidejte tyto řádky:
# #
# Postfix hlavní konfigurační soubor procesu. 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).
#
# Nezapomeňte po úpravě tohoto souboru 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: INET N - Y - - SMTPD
Odeslání INET N - Y - - SMTPD
-O smtpd_relay_restrictions = povolení_sasl_authenticated, odmítnout
-O SMTPD_RECIPIENT_RESTRICTIONS = PRACTIT_SASL_AUTHENTICTE, odmítnout
-O syslog_name = postfix/odeslání
-O smtpd_tls_security_level = Encrypt
-O smtpd_tls_wrappermode = no
-O smtpd_sasl_auth_enable = ano
-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_restrictions =
# -o smtpd_relay_restrictions = povolení_sasl_authenticated, odmítnout
# -o milter_macro_daemon_name = původ
# Vyberte jeden: Povolte SMTPS pouze pro klienty Loopback, 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_restrictions =
# -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 vyzvednutí
Čištění UNIX N - Y - 0 Čištění
QMGR UNIX N - N 300 1 QMGR
#QMGR UNIX N - N 300 1 OQMGR
Tlsmgr Unix - - Y 1000? 1 tlsmgr
Přepište UNIX - - Y - - Trivial Rewrite
Bounce Unix - - Y - 0 Bounce
Defer Unix - - Y - 0 Bounce
Trace UNIX - - Y - 0 Bounce
Ověřte UNIX - - Y - 1 Ověřte
Flush Unix N - Y 1000? 0 Splach
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
Chyba UNIX - - Y - - Chyba
Retry UNIX - - Y - - Chyba
Vyhodit UNIX - - Y - - Vyhození
Místní unix - n n - - místní
Virtuální unix - n n - - virtuální
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í Postfix potrubí (8)
# Agent. Informace o stránce potrubí (8) Man o $ {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 - nn - - potrubí
FLAGS = DRXHU Uživatel = VMail argv =/usr/bin/Maildrop -d $ {příjemce}
#
# =======================================================================================
#
# 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 - - potrubí
# FLAGS = DRX User = Cyrus argv =/Cyrus/bin/doručování -e -r $ {Sender} -m $ {Extension} $ {User}
#
# =======================================================================================
# Starý příklad doručení přes Cyrus.
#
#Old -Cyrus Unix - n n - - potrubí
# flags = r user = Cyrus argv =/Cyrus/bin/doručování -e -m $ {Extension} $ {user}
#
# =======================================================================================
#
# Podrobnosti o konfiguraci viz soubor postfixu UUCP_README.
#
UUCP UNIX - N N - - TUPE
FLAGS = FQHU User = UUCP argv = uux -r -n -z -a $ odesílatel -$ nexthop! rmail ($ příjemce)
#
# Další metody externího doručení.
#
ifMail Unix - n n - - trubka
FLAGS = F User = ftn argv =/usr/lib/ifmail/ifmail -r $ nexthop ($ příjemce)
BSMTP UNIX - N N - - TUPE
Flags = FQ. User = Bsmtp argv =/usr/lib/bsmtp/bsmtp -t $ nexthop -f $ odesílatel $ příjemce
ScaleMail -Backend Unix - N N - 2 trubka
FLAGS = R User = ScaleMail argv =/usr/lib/scalemail/bin/scalemail-store $ {nexthop} $ {user} $ {Extension}
Mailman Unix - n n - - potrubí
FLAGS = FRX User = Seznam argv =/usr/lib/mailman/bin/postfix-to-mailman.py $ {nexthop}
#
# 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 Private UNSIV CHROOT Wakeup MaxProc Command + Args
# (Ano) (Ano) (ne) (nikdy) (100)
# ==========================================================================================
# SMTP INET N - Y - 1 POSTSCREEN
# SMTPD PASS - - Y - - SMTPD
# DNSBlog UNIX - - Y - 0 DNSBlog
# TLSProxy UNIX - - Y - 0 TLSProxy
# Vyberte jeden: Povolte odeslání pouze pro klienty Loopback, nebo pro každého klienta.
# 127.0.0.1:1:submission INET N - Y - - SMTPD
# -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_RESTRICICS =
# -O smtpd_relay_restrictions = povolení_sasl_authenticated, odmítnout
# -O milter_macro_daemon_name = původ
# Vyberte jeden: Povolte SMTPS pouze pro klienty Loopback, 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_WRAPPMERMODE = 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_RESTRICICS =
# -O smtpd_relay_restrictions = povolení_sasl_authenticated, odmítnout
# -O milter_macro_daemon_name = původ
# 628 INET N - Y - - QMQPD
# QMGR UNIX N - N 300 1 OQMGR
# -O smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
#
# ==================================================================================
# 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 potrubí (8) Man o $ {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 = 1nano initialize
# 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 = tcp4Určete v main.cf jeden nebo více z následujících:
ssh team@XX.XX.XX.XX
Mailbox_TRANSPORT = LMTP: INET: LocalHostVirtual_Transport = LMTP: INET: localhost
==================================================================================
cat ~/.ssh/id_rsa.pub
Cyrus 2.1.5 (Amos Gouaux)Také určete v Main.CF: Cyrus_destination_RecipienT_limit = 1
git clone git://github.com/you/yourproject.git
Cyrus Unix - N N - - trubkaFLAGS = DRX User = Cyrus argv =/Cyrus/bin/doručování -e -r $ {Sender} -m $ {Extension} $ {User}
ls
==================================================================================Starý příklad doručení přes Cyrus.
cp -r yourproject whatyoucalledit
Old -Cyrus Unix - N N - - trubkaFLAGS = R User = Cyrus argv =/Cyrus/bin/doručování -e -m $ {Extension} $ {user}
sudo nano /usr/bin/ascript
==================================================================================Podrobnosti o konfiguraci naleznete v souboru Postfix UUCP_README.
#
echo "#
Další metody externího doručení.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.
sudo chmod a+x /usr/bin/ascript
Nano config/etc_default_opendKimPřidejte tyto řádky:
# Poznámka: Toto je starý konfigurační soubor. Opendkim to nepoužívá # Systemd Service. Použijte odpovídající konfigurační parametry v # /etc/opendkim.conf místo toho. # # Dříve by zde upravilo výchozí nastavení a poté spustila # /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čeno upravit nastavení přímo v /etc/opendkim.conf. # #Daemon_opts = "" # Změna na/var/cívka/postfix/run/opendkim k použití zásuvky Unix s # postfix v chrootu: #Rundir =/var/cívka/postfix/run/opendkim Rundir =/Run/OpendKim # # Uncomment pro zadání alternativní zásuvky # Všimněte si, že nastavení toto přepíše jakoukoli hodnotu zásuvky v Opendkim.Conf # Výchozí: Socket = "local: /var/spool/postfix/opendim/opendkim.sock" # Poslouchejte všechna rozhraní na portu 54321: #Socket = INET: 54321 # Poslouchejte na Loopback na portu 12345: #Socket = INET: 12345@localhost # Poslouchejte na 192.0.2.1 na portu 12345: #Socket = inet: 12345@192.0.2.1 Uživatel = OpendKim Skupina = Opendkim Pidfile = $ rundir/$ name.pid Extrafter =# 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 zde bylo upraveno výchozí nastavení a poté spuštěna
# /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ívka/postfix/run/opendkim k použití zásuvky unix s
# postfix v chrootu:
# Rundir =/var/cívka/postfix/run/opendkim
#
# Nekonečné zařazení alternativní zásuvky
# Všimněte si, že nastavení přepíše jakoukoli hodnotu soketu v Opendkim.Conf
# výchozí:
# Poslouchejte všechna rozhraní na portu 54321:
# Socket = INET: 54321
# Poslouchejte na smyčku na portu 12345:
pip3 install --upgrade opencv-python # Socket = INET: 12345@localhost
pip3 install --upgrade opencv-contrib-python # Poslouchejte na 192.0.2.1 na portu 12345:
# Socket = inet: 12345@192.0.2.1
# 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ě
# Zamýšlel zachytit a zabít procesy, které prosakují paměť, než se snívají
# všechno.
#default_vsz_limit = 256m
# Přihlašovací uživatel je interně používán přihlašovacími procesy. Toto je nejvíce nedůvěryhodné
# Uživatel v Dovecot System. Nemělo by to mít přístup k ničemu.
#default_login_user = dovell
# Interní uživatel je používán nerivilegovanými procesy. Mělo by to být oddělené od
# Přihlaste se uživatele, aby se přihlašovací procesy nemohly rušit další 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ší.
#service_count = 1
# Počet procesů vždy čekat na další spojení.
#process_min_avail = 0
# Pokud nastavíte servis_count = 0, pravděpodobně to musíte růst.
#vsz_limit = $ default_vsz_limit
}
Service Pop3-login {
inet_listener pop3 {
#port = 110
}
inet_listener pop3s {
#port = 995
#SSL = ano
}
}
podání služby-login {
podání inet_listener {
#port = 587
}
}
Service LMTP {
UNIX_LISTENER/VAR/SPOOL/POSTFIX/PRIVAL/DOVECOT-LMTP {
Skupina = postfix
režim = 0666
Uživatel = postfix
}
# Vytvořte posluchače INET, pouze pokud nemůžete použít výše uvedenou zásuvku UNIX
#inet_listener lmtp {
# Vyhněte se, aby LMTP zviditelnil pro celý internet
#address =
#port =
#}
}
Service IMAP {
# Většina paměti jde do souborů MMAP (). Možná to budete muset zvýšit
# Limit, 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
}
Odeslání služby {
# 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 soketu UserDB. Obvykle je to
# Používá se 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 pokud UserDB vrátí pole „UID", které
# odpovídá UID procesu volajícího. Také pokud se shoduje s volajícím UID nebo GID
# Uid nebo Gid Socket uspěje. Cokoli jiného způsobuje selhání.
#
# 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ádro vynutit
# Oprávnění (např. 0777 umožňuje všem plná oprávnění).
UNIX_LISTENER/VAR/SPOOL/POSTFIX/PRIVAL/AUTH {
režim = 0660
Uživatel = postfix
Skupina = postfix
}
}
Service Auth-Worker {
# Auth Worker Proces je ve výchozím nastavení spuštěn jako root, aby měl přístup
# /etc /stín. Pokud to není nutné, měl by se uživatel změnit na
# $ default_internal_user.
#User = root
}
Služba dikt {
# Pokud se použije 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 {
#mode = 0600
#User =
#group =
}
}
# 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živatele, aby se přihlašovací procesy nemohly rušit jiné procesy.
# default_internal_user = dovecot
# Port = 143
# 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_limit = $ default_vsz_limit
# Port = 110
# Port = 995
# SSL = ano
# Port = 587
# Vytvořte posluchače INET, pouze pokud nemůžete použít výše uvedenou zásuvku UNIX
# inet_listener lmtp {
# Vyvarujte se zviditelnění LMTP pro celý internet
# adresa =
Port =}
Většina paměti jde do souborů MMAP (). Možná to budete muset zvýšitOmezte, pokud máte obrovské poštovní schránky.
vsz_limit = $ default_vsz_limitMax. Počet procesů IMAP (připojení)
Process_limit = 1024Max. Počet procesů POP3 (připojení)
Process_limit = 1024Max. Počet procesů odesílání SMTP (připojení)
Process_limit = 1024Auth_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ádro vynutit
# Oprávnění (např. 0777 umožňuje všem plná oprávnění).
# 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_internal_user.
# Uživatel = root
# 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
# 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 jste ve spěchu, viz http://wiki2.dovecot.org/quickconfiguration
# příkaz "DoveConf -n" poskytuje čistý výstup změněného nastavení. Použijte to
# namísto kopírování a vkládání; Soubory při zveřejňování příspěvku do seznamu adresátů DoveCot.
# '#' postava a všechno poté, co je považováno za komentáře. Extra prostory
# a karty jsou ignorovány. Pokud chcete použít některou z nich explicitně, dejte
# Hodnota uvnitř citátů, např.: 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 =/etc -localstatedir =/var
# Povolit nainstalované protokoly
! Inclution_try /usr/share/dovecot/protocols.d/*.protocol
# Oddělený seznam IPS nebo hostitelů, kde poslouchat připojení.
# "*" Poslouchá ve všech rozhraních IPv4, "::" Poslouchá ve všech rozhraních IPv6.
# Pokud chcete zadat ne-defační porty nebo něco složitějšího,
# Upravit conf.d/master.conf.
#listen = *, ::
# Základní adresář kde ukládat data runtime.
#Base_dir =/var/run/dovecot/
# Název této instance. V nastavení multiinstance Doveadm a další příkazy
# může použít -i k výběru, který instance se používá (alternativa
# to -c). Název instance je také přidán do procesů Dovecot
# ve výstupu PS.
#Instance_name = DoveCot
# Pozdravovací zpráva pro klienty.
#Login_Greeting = Dovecot Ready.
# 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ásuvek pro kontrolu 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 podrobný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_proctitle = ne
# Měly by být všechny procesy zabity, když se zavře master procesu 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 je nenulové, spusťte poštovní příkazy prostřednictvím tohoto mnoha připojení k serveru Doveadm,
# Místo jejich spuštění přímo ve stejném procesu.
#doveadm_worker_count = 0
# UNIX SOTKET nebo HOST: 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
# Key = Value Páry pro vždy nastavení konkrétních nastavení.
#import_environment = tz
##
## Nastavení serveru slovníku
##
# Dictionary lze použít k ukládání seznamů hodnot Key =. 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 ::".
dict {
#quota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
}
# Většina skutečné konfigurace je zahrnuta níže. Názvy souborů jsou
# poprvé tříděno podle jejich hodnoty ASCII a analyzováno v tomto pořadí. 00-prefixy
# V názvech jsou určeny k usnadnění porozumění uspořádání.
! zahrnout conf.d/*. Conf
# Konfigurační soubor se může také pokusit být zahrnut bez chyby, pokud
# to není nalezeno:
! zahrnout_try local.conf
passdb {
Driver = Passwd-File
args =/etc/dovecot/passwd
}
userdb {
Driver = Passwd
}
Protokoly = IMAP pop3
#Alows DoveCot poslouchat všechna vstupní připojení (IPv4 / IPv6)
Poslouchejte = *, ::
Konfigurační soubor DovecotPokud 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 toping femmebabe.com # 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 prostorya karty jsou ignorovány. Pokud chcete použít některou z nich explicitně, dejte
char a koncový mezník "Většina (ale ne všechna) 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 uvolnitsudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
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 konfiguracinano yourproject/settings.py
Možnosti. Zde uvedené cesty jsou pro konfiguraci -prefix =/usr-SysConfdir =/atd-localstatedir =/var
Povolit nainstalované protokoly# 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.sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Poslouchejte = *, ::Základní adresář kde ukládat data runtime.
base_dir =/var/běh/dovecot/ServerSignature Off
ServerTokens Prod
<IfModule mod_ssl.c>
<VirtualHost *:80>
Redirect permanent / https://femmebabe.com/
</VirtualHost>
<VirtualHost *:443>
ServerName femmebabe.com
ServerAdmin team@femmebabe.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /static /home/team/femmebabe/static
<Directory /home/team/femmebabe/static>
Require all granted
</Directory>
Alias /media/icons /home/team/femmebabe/media/
<Directory /home/team/femmebabe/media>
Require all granted
</Directory>
<Directory /home/team/femmebabe/femmebabe>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIScriptAlias / /home/team/femmebabe/femmebabe/wsgi.py
WSGIDaemonProcess femmebabe python-path=/home/team/femmebabe/ python-home=/home/team/femmebabe/venv header-buffer-size=100000000000 user=team
WSGIProcessGroup femmebabe
WSGIApplicationGroup %{GLOBAL}
<Directory /home/team/femmebabe/static>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} \.(css|webp|webm|gif|png|mp3|wav|jpeg|jpg|svg|webp)$ [NC]
RewriteCond %{HTTP_REFERER} !^https://femmebabe.com/media/.*$ [NC]
RewriteRule ^(.+?)/$ /media/$1 [F,L]
</IfModule>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/femmebabe.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/femmebabe.com/privkey.pem
Header set X-Frame-Options: "SAMEORIGIN"
Header set Access-Control-Allow-Origin "https://femmebabe.com"
TimeOut 60000
LimitRequestBody 0
<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|webp|JPG|JPEG|wav|mp3|mp4|public|js|css|swf|webp|svg)$">
Header set Cache-Control "max-age=30, public"
</FilesMatch>
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
ServerName femmebabe.com
ServerAdmin team@femmebabe.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =femmebabe.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>
Název této instance. V nastavení multiinstance Doveadm a další příkazymůž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ů Dovecotsudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
ve výstupu PS.instance_name = dovecot
Pozdrav pro klienty.sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
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í acd projectname
source venv/bin/activate
python manage.py check
pro kontroly ověřování). Disable_plaintext_auth je také ignorován protyto sítě. Obvykle byste zde zadali servery IMAP proxy.
login_trusted_networks =nano venv/lib/python3.12/site-packages/django/apps/registry.py
Space oddělený seznam zásuvných přístupu k přihlášení (např. TCPWRAP)login_access_sockets =
S proxy_maybe = ano, pokud cíl proxy 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 aIP 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).python manage.py check
verbose_proctitle = nePokud by se zabily všechny procesy, pokud se uzavře 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 je 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 = 0sudo systemctl reload apache2
UNIX SOTKET nebo HOST: Port používaný pro připojení k serveru Doveadmdoveadm_socket_path = doveadm-server
Space oddělený seznam proměnných prostředí, které jsou zachovány na DovecotSpuš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
ip -6 addr
Nastavení serveru slovníkuSlovní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 URISPo použití serveru. Poté lze na ně odkazovat pomocí URI ve formátu
"Proxy :: <name>".Kvóta = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
Většina skutečné konfigurace je zahrnuta níže. Názvy souborů jsounejprve 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í.Konfigurační soubor se může také pokusit být zahrnut bez chyby, pokud
není to nalezeno:Umožňuje Dovecot poslouchat všechna vstupní připojení (IPv4 / IPv6)
Přidejte heslo pro uživatele DoveCot:Nano config/etc_dovecot_passwd
Tým: {Plain} YourPassword
Dále konfigurace Opendkimnano config/etc_postfix_main.cf
Nano config/etc_opendkim.confA přidat tyto řádky:
# Toto je základní konfigurace pro podepisování a ověření. Může to být snadno # Přizpůsobeno tak, aby vyhovovalo základní instalaci. Viz Opendkim.Conf (5) a # /usr/share/doc/opendkim/examples/opendkim.Conf.Sample pro úplné # Dokumentace dostupných konfiguračních parametrů. Syslog ano Syslogsuccess ano #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á zabezpečení. Kanonikace uvolněná/jednoduchá Režimy s Subdomény č Převrácené hlavy z # Podepisování domény, voliče a klíče (vyžadováno). Například proveďte podpis # pro doménu "example.com" s selektorem "2020" (2020._domainkey.example.com), # Používání soukromého klíče uloženého v /etc/dkimkeys/example.private. Více granulované # Možnosti nastavení lze nalézt v /usr/share/doc/opendkim/readme.opendkim. #Domain příklad.com #Selector 2020 #Keyfile /etc/dkimkeys/example.private # V Debianu běží Opendkim jako uživatel "Opendkim". Je vyžadován umask 007 # Používání 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 # Socket 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/opendim/opendkim.pid # Hostitelé, pro které se mají podepisovat spíše než ověřit, je výchozí hodnota 127.0.0.1. Viz # Operation Section of 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 # Podle balíčku dns-root-data. TrustAchorfile /usr/share/dns/root.key #NameServers 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 Podepsání refile: /etc/opendkim/signing.table # Sada interních hostitelů, jejichž pošta by měla být podepsána Internalhosts /etc/opendkim/Trusted.hosts# 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ů.
# 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.
# 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í lze nalézt v /usr/share/doc/opendkim/readme.opendkim.
Doména příkladem.comSelector 2020
Keyfile /etc/dkimkeys/example.privatenano config/etc_postfix_master.cf
V Debianu běží Opendkim jako uživatel „Opendkim". Je vyžadován umask 007Použ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ě.
# 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
# Hostitelé, pro které se mají podepisovat spíše než ověřit, je výchozí hodnota 127.0.0.1. Viz
# Operace Sekce 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.
# NasideServers 127.0.0.1
# Mapujte domény z adres do klíčů používaných k podepisování zpráv
# Sada interních hostitelů, jejichž pošta by měla být podepsána
# Nano config/etc_default_opendKim
# A přidejte tyto řádky
# # Poznámka: Toto je starý konfigurační soubor. Opendkim to nepoužívá
# Systemd Service. Použijte odpovídající konfigurační parametry v
# /etc/opendkim.conf místo toho.
#
# Dříve by zde upravilo výchozí nastavení a poté spustila
# /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čeno upravit nastavení přímo v /etc/opendkim.conf.
#
#Daemon_opts = ""
# Změna na/var/cívka/postfix/run/opendkim k použití zásuvky Unix s
# postfix v chrootu:
#Rundir =/var/cívka/postfix/run/opendkim
Rundir =/Run/OpendKim
#
# Uncomment pro zadání alternativní zásuvky
# Všimněte si, že nastavení toto přepíše jakoukoli hodnotu zásuvky v Opendkim.Conf
# Výchozí:
Socket = "local: /var/spool/postfix/opendim/opendkim.sock"
# Poslouchejte všechna rozhraní na portu 54321:
#Socket = INET: 54321
# Poslouchejte na Loopback na portu 12345:
#Socket = INET: 12345@localhost
# Poslouchejte na 192.0.2.1 na portu 12345:
#Socket = inet: 12345@192.0.2.1
Uživatel = OpendKim
Skupina = Opendkim
Pidfile = $ rundir/$ name.pid
Extrafter =
# 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 zde bylo upraveno výchozí nastavení a poté spuštěna
# /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ívka/postfix/run/opendkim k použití zásuvky unix s
# postfix v chrootu:
# Rundir =/var/cívka/postfix/run/opendkim
#
# Nekonečné zařazení alternativní zásuvky
# Všimněte si, že nastavení přepíše jakoukoli hodnotu soketu v Opendkim.Conf
# výchozí:
# Poslouchejte všechna rozhraní na portu 54321:
# Socket = INET: 54321
# Poslouchejte na smyčku na portu 12345:
# Socket = INET: 12345@localhost
# Poslouchejte na 192.0.2.1 na portu 12345:
# Socket = inet: 12345@192.0.2.1
# 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
# Dotkněte se skriptů/postfixSetup
sudo chmod a+x skripty/postfixSetup
nano skripty/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 „Konfigurace poštovních služeb"
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_opendim.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/klíče
sudo mkdir /etc/opendkim/keys/femmebabe.com
sudo mkdir/var/cívka/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/klíče
Sudo Chown Opendkim: Opendkim /etc/opendkim/Keys/Femmebabe.com/sendonly.private
Sudo Chown Opendkim: Postfix/var/cívka/postfix/Opendkim
CD $ dir
sudo CP poštovní schránka/*/var/pošta/
Sudo Chown: Uživatelé/var/pošta/*
sudo chmod -r a+rwx/var/e -mail/*
Sudo SystemCtl Restart Opendkim Postfix Dovecot
sudo kočka /etc/opendkim/keys/femmebabe.com/sendonly.txt | Tr -d '\ n' | sed 's/\ s // g' | sed 's/"" // g' | awk -f '[) (]' '{tisk $ 2}'
# !/bin/bash
# Nastavení postfixu
# 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 = doména
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)
# 'Love@mamasheen.com'
# 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
s otevřeným ('/etc/config.json') jako config_file:
config = json.load (config_file)
# Otevřete a načtěte konfiguraci
# 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 souboru následující řádky s klíčem, který OpenSSL vygeneroval jako tajný klíč.
# {
"Secret_Key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-generated-using-openSl)", ",", ",", ",", ",", ","
"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, a udržet je odděleně od našeho adresáře projektu, aby jim ostatní uživatelé nemohli psát, a proto je nemohou být přečteny pouze z našeho projektového adresáře. 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.
# zálohování sudo
# 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
Z django.contrib.auth.models Import Uživatel
u = user.Objects.get (username = 'Charlotte')
od uživatelů.email import send_welcome_email
send_welcome_email (u)
výstup()
# Pokud první příkaz nefunguje, nezapomeňte použít
# Zdroj 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ělou práci.
# 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 vydání!
# Navštivte tento odkaz (zavede vás mimo Lotte Harper)
nano config/etc_default_opendkim
nano config/etc_dovecot_conf.d_10-master.conf
nano config/etc_dovecot_dovecot
nano config/etc_dovecot_passwd
team:{plain}yourpassword
nano config/etc_opendkim.conf
nano config/etc_default_opendkim
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
./scripts/postfixsetup
echo "test" | mail -s "Test Email" youremail@gmail.com
tail –lines 150 /var/log/mail.log
openssl rand -base64 64
sudo nano /etc/config.json
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
sudo backup
python manage.py shell
from django.contrib.auth.models import User
u = User.objects.get(username='Charlotte')
from users.email import send_welcome_email
send_welcome_email(u)
exit()
source venv/bin/activate
https://glamgirlx.com/cs/practical-web-based-deep-learning-and
https://glamgirlx.com/cs/practical-web-based-deep-learning-and -
Nechte mi tip v bitcoinu pomocí této adresy: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE