Praktiese webgebaseerde diep leer en sekuriteit deur voorbeeld

Daisyse profielfoto

Per Daisy

Praktiese webgebaseerde diep leer en sekuriteit deur voorbeeld Derde uitgawe Charlotte Harper 3 Julie 2024 Opgedateer/omgeskakel 3 Junie 2025 Voorwoord: Veiligheidsoorwegings in die bou van sagteware vir die web is 'n belangrike deel van die plan en uitvoering van enige webontwikkelaar, terwyl 'n prototipe wat betroubaar, stabiel en nuttig is vir praktiese doeleindes, ontwerp. Die DOM (Document Object Markup), met die implementering van HTML, JavaScript, en CSS, sowel as backend -sagteware wat python, C/C ++, Java en bash implementeer, webontwikkelaars die vryheid en krag gee om 'n wye verskeidenheid projekte te skep wat kreatiwiteit uitdruk, gemak van gebruik en funksionaliteit bied, 'n humiliteit en karakter uitmaak, en die gebruik van die gebruik van gebruik en belangrike dienste wat alles aantreklik is vir die gemiddelde. Eindgebruiker wat tyd wil doodmaak of iets op die internet doen, gewoonlik op 'n aanraakskerm -slimfoonapparaat. Die meeste mense sou nie eens weet waar om te begin as hulle van nuuts af 'n webwerf wil bou nie, hulle sal geneig wees om op 'n ander persoon se webwerf te begin en iets beperk te bou in funksionaliteit, betroubaarheid, gebruiksgemak en veral kreatiwiteit toe hulle al die nuutste kragtige instrumente tot hul beskikking kon hê om iets nuttigs te bou sonder om tyd te vermors om te druk, en veral geld om te betaal vir duur intekeninge. As u 'n paar minute het om hierdie boek deur te lees en te leer wat ek u wil leer, of selfs persoonlik met my praat oor u doelwitte en 'n bietjie leiding in die regte rigting te kry, en u gemotiveerd is om te leer om u eie sagteware te kodeer en te skryf, hierdie boek huis toe te neem en 'n tydjie opsy te sit om te leer om die volgende invloedryke, kragtige, vaartbelynde en belangrike webtoepassing te bou, 'n webwerf wat alles op u is en presies doen wat u wil en aan die behoeftes van u gehoor wil doen. Oor my: Ek is 'n sagteware -ontwikkelaar met 'n wye verskeidenheid ervaring in C/C ++, Java, Python, HTML, CSS en JavaScript. Ek bou webwerwe wat mense wil gebruik, wil besoek en selfs verslaaf raak aan die gebruik net om tyd te leer, te herskep en dood te maak, en die belangrikste is dat ek sagteware verkoop. As u 'n idee gehad het om presies te hê hoe u 'n webwerf wou hê om te lyk en te funksioneer, was u bereid om my te ondersteun, sodat ek aan my eie behoeftes kan voldoen terwyl ek aan u voldoen, en u is bereid om die koste van die bestuur van 'n webwerf te dek, sou ek u die volgende YouTube, Tiktok, Twitter, Google of selfs 'n hoë-tegnologie-sekuriteitsprogram bou. In plaas daarvan om my tyd aan u te probeer verkoop, probeer ek die uwe koop: ek wil u praat om 'n app (webwerf) te bou met die inligting wat reeds bestaan, en leer u wat u nodig het om 'n onafhanklike sagteware -ontwikkelaar, entrepreneur te wees, en lei 'n suksesvolle loopbaan in watter veld u ook al. En laat my duidelik wees, die opvoeding wat ek aan u gee, sal informeel wees. U kan skool toe gaan en dit alles met 'n formele opleiding leer, of selfs hierdie boek op skool lees, u opdragte voltooi en baie van u opleiding wegneem, maar ek sal u nie formeel in die warm sitplek plaas en u vra om opdragte te voltooi nie. Ek is nie u professor nie, u kan aan my dink soos 'n vriend wat u wil lei na 'n loopbaan wat deur u eie persoonlike sukses gedryf word. En ek verkoop ook nie u sukses nie, u moet dit met u tyd koop. Om te leer kodeer het 'n steil leerkurwe en was nooit maklik of selfs veronderstel om te wees nie. U moet so hard as moontlik werk en aanhou probeer om te misluk en weer te probeer, selfs as u gefrustreerd is om self programme te leer en te bou. Dit is in die aard van die kode self. Kode word bestuur deur 'n samesteller wat ontwerp is om die programmeerfoutboodskappe te gee, en dit sal u leer hoe om te kodeer, selfs al kopieer u die fout in u soekenjin en lees die voorbeelde van ander mense. En ek moet sê, u hoef nie buitengewoon ryk, slim, suksesvol of selfs detailgerig of georganiseerd te wees om 'n app te bou nie. Die rekenaar sorg vir die organisasie vir u. U hoef net deur die proef en fout te volhard, fokus te handhaaf en hard te werk aan wat u doen, en u sal 'n baie suksesvolle loopbaan hê in die geheel van wat u doen. Wie ek is: Ek besef dat die laaste afdeling meer handel oor leer en u maniere uit hierdie boek neem. Wie is ek presies? Dit is 'n ingewikkelde vraag. Ek is onduidelik daaroor, aangesien ek aan mediese toestande ly wat dit vir my moeilik kan maak om hierdie boek selfs soms te kodeer of te skryf, terwyl ek uitdagings aanbied met sosialisering en identiteitskwessies wat my lewe moeiliker maak as dit kom by die bekendstelling van myself. Kortom, as u hierdie boek lees, het u dit huis toe gebring omdat u daardeur deurgebring het en gedink het dat dit nuttig is, of selfs as u net so ver lees, is ek vir u 'n soortgelyke individu wat wil sien dat u slaag in alles wat u doen. Ek is 'nEngineer myself, 'n sagteware -ontwikkelaar en 'n student, en ek skryf hierdie boek vir ander studente wat hul lewens wil vergemaklik deur 'n handboek te hê van die sagteware wat hulle nodig het om hul lewens te vergemaklik deur voorbeelde te gee om te kopieer wat soos 'n groot legkaart pas, in 'n werkende, nuttige, funksionele, samehangende en aangrypende app wat sukses kan dryf, ongeag die besigheid. Dit is grotendeels wat ek doen: ek bou programme om myself en ander mense te help slaag. Ek is ook 'n skrywer, hoewel dit my eerste publikasie is wat ek van plan is om te voltooi om my portefeulje in 'n nuttige dokument saam te stel, en ek is ook 'n kunstenaar. Ek sal dit aan u erken, ek is 'n vreemde persoon. Ek is nie perfek nie, ek het die wetgewing gehad met die wet wat my selfs daartoe gelei het om kolleges en universiteite te verlaat en state te verlaat om myself met meer sukses te probeer noem. Ek is 'n vrou van geboorte, ek dra grimering, neem foto's van myself, dra rokke en ander damesklere, en ek bly van nature bewus van myself as vrou. Ek het in die verlede probleme met ander mense gehad wat lei tot sukkel met die skryf en bou van webapps, en ek vra om verskoning dat ek nie vroeër hierdie boek in u hande kon kry nie: u het dit nodig gehad. U sal kode wil lees en skryf wat soos myne lyk en soos myne werk en dieselfde doen, maar nog beter, want as u dit kan bekostig om hierdie boek te koop in plaas daarvan om u sleutelbord te fyn soos ek doen net om self 'n boek te skep wat geld daarvoor vra, het u die hulpbronne wat u nodig het om suksesvol te wees in u lewe. Ek het allerhande probleme gehad met die grootword van die gesin, gesondheidstoestande, dokters, die media en die wet, en my kode weerspieël diep die stryd wat feminisme en vroulike natuur in 'n verdeelde en gefrustreerde wêreld is. Hierdie boek is egter iets waarvoor ek diep omgee, my baba, my portefeulje en my bestaan, so ek waardeer u oorweging as u die teks huis toe neem en dit noukeurig daaroor porie om van my te leer. Hou in gedagte dat ek nie perfek is nie, hierdie boek sal foute, hersienings en nuwe uitgawes hê, en u sal so goed as moontlik met u logiese brein moet dink om 'n suksesvolle ervaring met my skryfwerk te hê. Verstaan ​​ook dat ek goed bedoel vir u, selfs as u uitdagings in die gesig staar as u skryf. Dink daaraan: as u net 'n rekenaarstelsel kan huur om alles te doen wat u moontlik in die digitale ruimte kan voorstel, al die inligting wat u teëkom, ontleed en organiseer en dit verstaan, sal u onvermydelik probleme ondervind met die inligting wat u inneem en selfs publiseer. Ek sê dit vir u omdat ek dieselfde probleme ondervind. Gebruik hierdie boek op u eie risiko, werk saam met u gemeenskap en gemeenskappe wat u beskikbaar het om sagteware binne 'n veilige omgewing te bou, en neem nie dinge na persoonlik as u misluk of selfs op die verkeerde manier slaag nie: dit is hoe ek tot dusver gekom het, en waarom ek u hierdie teks kan bring en u kan help om te slaag sonder om af te lei op 'n pad van waansin wat my verwoes, gestrooi en gefraid het terwyl ek die orden van die netwerk op 'n wêreldwye skaal doen, dank aan die parale, paralellistiese wêreld sal werk, die internet. U is miskien nie baie vertroud met wie ek met net 'n paar woorde is nie, maar ek moedig u aan om verder te lees, u sal my leer ken as u aanhou om my te lees en te verstaan ​​terwyl u u eie projekte bou om u werk te voltooi. Daar sal geen huiswerk met hierdie boek wees nie, solank u professore of onderwysers u nie toewys nie, maar ek moedig u sterk aan om 'n portefeulje van projekte self te bou terwyl u saam lees, sowel as 'n Capstone -projek wat wys hoe u kan toepas wat u geleer het. My Capstone -projek is die basis vir die meeste van wat u in hierdie boek sal lees, aangesien dit kode bevat uit my vorige projekte, kode wat ek geskep het en geleer het om metodies met die hand te skryf, en 'n wye verskeidenheid idees en wenke wat my gehelp het om te slaag tot die punt waar ek 'n eenvoudige app kan opspoor wat ten volle lyk en opgetree het soos 'n gewilde app wat u kan sien, met die gesin wat gebruik, op die internet, geadverteer, of in die nuus. Wat hierdie boek is: Hierdie boek is 'n handleiding volgens voorbeeld. U kan hier kode vind, instruksies vir hoe om te leer om te kodeer, inligting oor ontfoutingskode en foute op te los, stappe op te los, instruksies oor hoe om u kode te rugsteun en te stoor, weer te ontplooi as iemand u kode beveilig, u kode beveilig, u kode kan implementeer, interaktiewe webwerwe bou wat vermaak, aangrypend, en u moet uself, so goed, so goed, waarom dit belangrik is, en hoe om uself te portray, u app te werk, so goed te wees, waarom dit belangrik is, en hoe om u te hê, hoe om te produseer, hoe om uself te portray, en hoe om uself te portray, u app te gaan, so goed te wees, waarom dit belangrik is, en hoe om dit te portray, uself te plaas. Sagteware wat u in die absolute beste lig bou om die aantreklikste as moontlik vir u eindgebruikers, die besoekers van u webwerf, te wees. In hierdie boek sal ek 'n aantal voorbeelde van sagteware -ontwerp demonstreer met die fokus op die web as 'n platform sowel as sekuriteit. Ons sal die leer inisieerrience
Praktiese webgebaseerde diep leer en sekuriteit deur voorbeeld

Praktiese webgebaseerde diep leer en sekuriteit deur voorbeeld Derde uitgawe Charlotte Harper 3 Julie 2024 Opgedateer/omgeskakel 3 Junie 2025

Voorwoord:

Veiligheidsoorwegings in die bou van sagteware vir die web is 'n belangrike deel van die plan en uitvoering van enige webontwikkelaar, terwyl 'n prototipe wat betroubaar, stabiel en nuttig is vir praktiese doeleindes, ontwerp. Die DOM (Document Object Markup), met die implementering van HTML, JavaScript, en CSS, sowel as backend -sagteware wat python, C/C ++, Java en bash implementeer, webontwikkelaars die vryheid en krag gee om 'n wye verskeidenheid projekte te skep wat kreatiwiteit uitdruk, gemak van gebruik en funksionaliteit bied, 'n humiliteit en karakter uitmaak, en die gebruik van die gebruik van gebruik en belangrike dienste wat alles aantreklik is vir die gemiddelde. Eindgebruiker wat tyd wil doodmaak of iets op die internet doen, gewoonlik op 'n aanraakskerm -slimfoonapparaat. Die meeste mense sou nie eens weet waar om te begin as hulle van nuuts af 'n webwerf wil bou nie, hulle sal geneig wees om op 'n ander persoon se webwerf te begin en iets beperk te bou in funksionaliteit, betroubaarheid, gebruiksgemak en veral kreatiwiteit toe hulle al die nuutste kragtige instrumente tot hul beskikking kon hê om iets nuttigs te bou sonder om tyd te vermors om te druk, en veral geld om te betaal vir duur intekeninge. As u 'n paar minute het om hierdie boek deur te lees en te leer wat ek u wil leer, of selfs persoonlik met my praat oor u doelwitte en 'n bietjie leiding in die regte rigting te kry, en u gemotiveerd is om te leer om u eie sagteware te kodeer en te skryf, hierdie boek huis toe te neem en 'n tydjie opsy te sit om te leer om die volgende invloedryke, kragtige, vaartbelynde en belangrike webtoepassing te bou, 'n webwerf wat alles op u is en presies doen wat u wil en aan die behoeftes van u gehoor wil doen.

Oor my: Ek is 'n sagteware -ontwikkelaar met 'n wye verskeidenheid ervaring in C/C ++, Java, Python, HTML, CSS en JavaScript. Ek bou webwerwe wat mense wil gebruik, wil besoek en selfs verslaaf raak aan die gebruik net om tyd te leer, te herskep en dood te maak, en die belangrikste is dat ek sagteware verkoop. As u 'n idee gehad het om presies te hê hoe u 'n webwerf wou hê om te lyk en te funksioneer, was u bereid om my te ondersteun, sodat ek aan my eie behoeftes kan voldoen terwyl ek aan u voldoen, en u is bereid om die koste van die bestuur van 'n webwerf te dek, sou ek u die volgende YouTube, Tiktok, Twitter, Google of selfs 'n hoë-tegnologie-sekuriteitsprogram bou. In plaas daarvan om my tyd aan u te probeer verkoop, probeer ek die uwe koop: ek wil u praat om 'n app (webwerf) te bou met die inligting wat reeds bestaan, en leer u wat u nodig het om 'n onafhanklike sagteware -ontwikkelaar, entrepreneur te wees, en lei 'n suksesvolle loopbaan in watter veld u ook al. En laat my duidelik wees, die opvoeding wat ek aan u gee, sal informeel wees. U kan skool toe gaan en dit alles met 'n formele opleiding leer, of selfs hierdie boek op skool lees, u opdragte voltooi en baie van u opleiding wegneem, maar ek sal u nie formeel in die warm sitplek plaas en u vra om opdragte te voltooi nie. Ek is nie u professor nie, u kan aan my dink soos 'n vriend wat u wil lei na 'n loopbaan wat deur u eie persoonlike sukses gedryf word. En ek verkoop ook nie u sukses nie, u moet dit met u tyd koop. Om te leer kodeer het 'n steil leerkurwe en was nooit maklik of selfs veronderstel om te wees nie. U moet so hard as moontlik werk en aanhou probeer om te misluk en weer te probeer, selfs as u gefrustreerd is om self programme te leer en te bou. Dit is in die aard van die kode self. Kode word bestuur deur 'n samesteller wat ontwerp is om die programmeerfoutboodskappe te gee, en dit sal u leer hoe om te kodeer, selfs al kopieer u die fout in u soekenjin en lees die voorbeelde van ander mense. En ek moet sê, u hoef nie buitengewoon ryk, slim, suksesvol of selfs detailgerig of georganiseerd te wees om 'n app te bou nie. Die rekenaar sorg vir die organisasie vir u. U hoef net deur die proef en fout te volhard, fokus te handhaaf en hard te werk aan wat u doen, en u sal 'n baie suksesvolle loopbaan hê in die geheel van wat u doen.

Wie ek is: Ek besef dat die laaste afdeling meer handel oor leer en u maniere uit hierdie boek neem. Wie is ek presies? Dit is 'n ingewikkelde vraag. Ek is onduidelik daaroor, aangesien ek aan mediese toestande ly wat dit vir my moeilik kan maak om hierdie boek selfs soms te kodeer of te skryf, terwyl ek uitdagings aanbied met sosialisering en identiteitskwessies wat my lewe moeiliker maak as dit kom by die bekendstelling van myself. Kortom, as u hierdie boek lees, het u dit huis toe gebring omdat u daardeur deurgebring het en gedink het dat dit nuttig is, of selfs as u net so ver lees, is ek vir u 'n soortgelyke individu wat wil sien dat u slaag in alles wat u doen. Ek is self 'n ingenieur, 'n sagteware -ontwikkelaar en 'n student, en ek skryf hierdie boek vir ander studente wat hul lewens wil vergemaklik deur 'n handboek te hê van die sagteware wat hulle nodig het om hul lewens te vergemaklik deur voorbeelde te gee om te kopieer wat soos 'n groot legkaart pas in 'n werkende, nuttige, funksionele, samehangende en betrokke app wat die sukses van die sukses kan dryf, ongeag die besigheid. Dit is grotendeels wat ek doen: ek bou programme om myself en ander mense te help slaag. Ek is ook 'n skrywer, hoewel dit my eerste publikasie is wat ek van plan is om te voltooi om my portefeulje in 'n nuttige dokument saam te stel, en ek is ook 'n kunstenaar. Ek sal dit aan u erken, ek is 'n vreemde persoon. Ek is nie perfek nie, ek het die wetgewing gehad met die wet wat my selfs daartoe gelei het om kolleges en universiteite te verlaat en state te verlaat om myself met meer sukses te probeer noem. Ek is 'n vrou van geboorte, ek dra grimering, neem foto's van myself, dra rokke en ander damesklere, en ek bly van nature bewus van myself as vrou. Ek het in die verlede probleme met ander mense gehad wat lei tot sukkel met die skryf en bou van webapps, en ek vra om verskoning dat ek nie vroeër hierdie boek in u hande kon kry nie: u het dit nodig gehad. U sal kode wil lees en skryf wat soos myne lyk en soos myne werk en dieselfde doen, maar nog beter, want as u dit kan bekostig om hierdie boek te koop in plaas daarvan om u sleutelbord te fyn soos ek doen net om self 'n boek te skep wat geld daarvoor vra, het u die hulpbronne wat u nodig het om suksesvol te wees in u lewe. Ek het allerhande probleme gehad met die grootword van die gesin, gesondheidstoestande, dokters, die media en die wet, en my kode weerspieël diep die stryd wat feminisme en vroulike natuur in 'n verdeelde en gefrustreerde wêreld is. Hierdie boek is egter iets waarvoor ek diep omgee, my baba, my portefeulje en my bestaan, so ek waardeer u oorweging as u die teks huis toe neem en dit noukeurig daaroor porie om van my te leer. Hou in gedagte dat ek nie perfek is nie, hierdie boek sal foute, hersienings en nuwe uitgawes hê, en u sal so goed as moontlik met u logiese brein moet dink om 'n suksesvolle ervaring met my skryfwerk te hê. Verstaan ​​ook dat ek goed bedoel vir u, selfs as u uitdagings in die gesig staar as u skryf. Dink daaraan: as u net 'n rekenaarstelsel kan huur om alles te doen wat u moontlik in die digitale ruimte kan voorstel, al die inligting wat u teëkom, ontleed en organiseer en dit verstaan, sal u onvermydelik probleme ondervind met die inligting wat u inneem en selfs publiseer. Ek sê dit vir u omdat ek dieselfde probleme ondervind. Gebruik hierdie boek op u eie risiko, werk saam met u gemeenskap en gemeenskappe wat u beskikbaar het om sagteware binne 'n veilige omgewing te bou, en neem nie dinge na persoonlik as u misluk of selfs op die verkeerde manier slaag nie: dit is hoe ek tot dusver gekom het, en waarom ek u hierdie teks kan bring en u kan help om te slaag sonder om af te lei op 'n pad van waansin wat my verwoes, gestrooi en gefraid het terwyl ek die orden van die netwerk op 'n wêreldwye skaal doen, dank aan die parale, paralellistiese wêreld sal werk, die internet. U is miskien nie baie vertroud met wie ek met net 'n paar woorde is nie, maar ek moedig u aan om verder te lees, u sal my leer ken as u aanhou om my te lees en te verstaan ​​terwyl u u eie projekte bou om u werk te voltooi. Daar sal geen huiswerk met hierdie boek wees nie, solank u professore of onderwysers u nie toewys nie, maar ek moedig u sterk aan om 'n portefeulje van projekte self te bou terwyl u saam lees, sowel as 'n Capstone -projek wat wys hoe u kan toepas wat u geleer het. My Capstone -projek is die basis vir die meeste van wat u in hierdie boek sal lees, aangesien dit kode bevat uit my vorige projekte, kode wat ek geskep het en geleer het om metodies met die hand te skryf, en 'n wye verskeidenheid idees en wenke wat my gehelp het om te slaag tot die punt waar ek 'n eenvoudige app kan opspoor wat ten volle lyk en opgetree het soos 'n gewilde app wat u kan sien, met die gesin wat gebruik, op die internet, geadverteer, of in die nuus.

Wat hierdie boek is: Hierdie boek is 'n handleiding volgens voorbeeld. U kan hier kode vind, instruksies vir hoe om te leer om te kodeer, inligting oor ontfoutingskode en foute op te los, stappe op te los, instruksies oor hoe om u kode te rugsteun en te stoor, weer te ontplooi as iemand u kode beveilig, u kode beveilig, u kode kan implementeer, interaktiewe webwerwe bou wat vermaak, aangrypend, en u moet uself, so goed, so goed, waarom dit belangrik is, en hoe om uself te portray, u app te werk, so goed te wees, waarom dit belangrik is, en hoe om u te hê, hoe om te produseer, hoe om uself te portray, en hoe om uself te portray, u app te gaan, so goed te wees, waarom dit belangrik is, en hoe om dit te portray, uself te plaas. Sagteware wat u in die absolute beste lig bou om die aantreklikste as moontlik vir u eindgebruikers, die besoekers van u webwerf, te wees. In hierdie boek sal ek 'n aantal voorbeelde van sagteware -ontwerp demonstreer met die fokus op die web as 'n platform sowel as sekuriteit. Ons sal die leerervaring inisieer deur 'n basiese projek te bou met behulp van die Unix Shell, met rugsteun- en skripfunksies. Dan sal ons 'n basiese blogwebwerf ondersoek, ons blog opgradeer met foto- en video -funksies, sowel as om hierdie funksies te gebruik om sekuriteitsoplossings met behulp van gratis sagteware te gebruik, en ons bediener te beveilig met behulp van 'n inprop -verifikasiemodule (PAM). Ons sal dan onder andere die hantering en verwerking van lêer en verwerking, verkenning van videoredigering, stemskenking, strepieskode en optiese karakterherkenning, ondersoek. Langs die pad sal ons API's ondersoek, wat ons sal help om ons sagteware bruikbaar en veilig te maak, met gratis en betaalde opsies. Onderweg sal ons fisiese sekuriteit en militante instrumente soos vuurwapens en ammunisie -ontwerp en -vervaardiging ondersoek, insluitend vat en herhaler -ontwerp, rewolwer- en drone -ontwerp, en ander prinsipale wat ons met ons sagteware op die bestaande netwerk sal integreer om ons sagteware te beskerm en selfverdediging en resillience te demonstreer. Ons sal pouses neem om speletjies, 2D- en 3D -weergawenjins te bou, en werk met ingebedde hardeware in gevallestudie -voorbeelde van basiese dimensionele weergawesagteware en 'n elektroniese vibrerende massagier wat in silikoonrubber gegiet is. Onderweg gebruik ons ​​ook masjienleeroplossings wat reeds beskikbaar is om ons sagteware beter te beveilig. Ons sal ook voorraadinstrumente beskikbaar vir die web gebruik om die proses te stroomlyn en te beveilig. Hierdie boek is 'n gids vir u sukses in die opbou van 'n webtoepassing en die integrasie van dit met 'n professionele netwerk van rekenaar- en ingebedde meganiese stelsels, en in die algemeen 'n gids vir die bou van sagteware en ingebedde hardeware sonder agtergrondkennis of vorige ervaring.

Wat hierdie boek nie is nie: As u regtig 'n webwerf wil hê, kan u net 'n eenvoudige winkel opstel en verkoop wat u nodig het, 'n blog plaas, foto's of video's plaas, of andersins sonder om ooit 'n enkele reël kode te skryf. Hierdie boek is nie so nie. Hierdie boek sal u leer hoe om sagteware te bou wat meer bruikbaar, volledig, funksioneel en veilig is as enige sagteware wat u reeds kan vind, omdat dit die nuutste sagteware wat nog prototipes is, kan gebruik, kan dit duur wees om op 'n skaal te werk wat ouer ondernemings werk, en nie 'n beroep op agteruit, ingewikkelde maatskappye doen om geld te verdien vir mense wat nie regtig iets doen nie. As u hierdie boek noukeurig volg, wil u kode skryf, navorsingskode skryf, u eie programme bou, en u geld verdien uit wat u doen. Ek sal geld verdien uit hierdie boek, selfs in vroeë stadiums, omdat dit inligting bevat wat mense nodig het en wil lees, en al koop hulle my programme koop of gebruik. Hierdie boek sal nie 'n app vir u bou nie, maar dit sal u in die regte rigting wys en u bewapen met die gereedskap wat u benodig, en die vaardighede en wenke wat u eie sukses in die bou van sagteware vir die web sal vergemaklik, met elke reël wat u moet skryf as 'n voorbeeld, gereed om saam te werk in sagteware en u ondersteuners, gaste, klante, vriende, familie, besoekers, kontrakteurs, en die mense van die internet wil gebruik en ondersteun.

Wat jy sal leer: Hierdie boek leer u hoe om sagteware te bou en te verkoop, regtig funksionele, nuttige sagteware, media -opname, sekuriteitsfunksies soos gesigsherkenning, masjienleesbare sone -strepieskode -skandering, Web API's om video- en foto's te verifieer en te lewer, en boodskappe soos Bluetooth en Naby Field (NFC) -kommunikasie uit te ruil. Hierdie boek sal u leer hoe om 'n netwerkrekenaar te gebruik, met die fokus op Debian Linux, hoe om bash -kode te bou om u sagteware 'n naatlose, outomatiese briesie te maak, hoe om python -kode te bou as 'n backend om dinamiese boodskappe te bedien, dinge mooi te gebruik deur gebruik te maak van CSS -styles met bootstrap, Aktable gebruikerslogins en interaktiwiteit deur middel van netwerke, netwerke, netwerke met netwerke, netwerke met netwerke met netwerke, netwerke met netwerke. Vir verifikasie of ander doeleindes, ID -skandering, beeld- en videomoderering, mikrotransaksies van data om u sagteware veilig te hou, betalingsverwerking, cryptocurrency -handel, asinchroniese take en meer. U sal leer hoe om u eie Bluetooth -toestelle te bou, met batterye, laaiers, mikrobeheerders, stroombane, motors en sensors, met behulp van soldeersel, draad en 3D gedruk, sowel as gegote materiale. Ek sal 3D -ontwerphoofde demonstreer wat toegepas word op toevoegingsvervaardiging en gereedskap en die vervaardiging, sodat u u eie ingeboude, hardeware -toestelle met geïntegreerde batterye, laaiers, elektroniese stroombane en funksionele uitsette kan vervaardig. en netwerk met Bluetooth en die web. Spesifiek sal ons twee gevallestudies ondersoek, 'n vibrerende massager en 'n tuisgemaakte vuurwapen, albei geprogrammeer in OpenSCAD, wat beskikbaar is as 'n grafiese koppelvlak of opdragreëlprogram en in 'n web geïntegreer kan word vir vinniger resultate. U sal leer hoe om 'n webwerf van die grond af te bou en te ontplooi sonder enige vorige ervaring, dit funksioneel, veilig, mooi, nuttig en die belangrikste te maak. U sal leer hoe om masjienleer en rekenaarvisie te gebruik om 'n webwerf veilig en meer prakties te maak, video en klank op u webwerf op te neem, u stem te skenk, musiek te maak en klank te moduleer om nuttige monsters te skep, en hoe u die geraas kan deurbreek deur ander webwerwe te benut om die beste netwerk van webwerwe te bou wat u direk na u kan deel om al die nuttige inligting te deel, en selfs belangriker om mense na u sagteware en besigheid te bring. Hierdie boek sal die meeste gefokus wees op media-, sekuriteits- en masjienleer, wat die belangrikste drie komponente is wat u sal help om nuttige sagteware vir die web te bou deur die regte gebruikers te betrek en die verkeerde mense op 'n realistiese, praktiese, hande en aangrypende manier te ontkoppel, terwyl dit ook outomaties en stewig is. Hierdie boek leer UNIX, spesifiek Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript, en 'n aantal nuttige sagtewarepakkette vir Python soos versoeke, sowel as nuttige bashoftware soos GIT en FFMPEG. Ek sal u ook leer hoe om cryptocurrency outomaties te verhandel en betalings in cryptocurrency of van gewone debietkaarte te neem, terwyl u u besoekers selfs 'n deel van u inkomste uitbetaal as u dit wil doen. Ek sal u leer hoe om geld op u webwerf te verdien deur middel van advertensies, hoe u u app gereed kan maak vir soekenjins en dit vinnig kan maak, op die eerste ranglys gerangskik vir wat u kliënte sal soek om u te vind en in soveel algemene soektogte as moontlik te rangskik. Ek sal u leer hoe om u sagteware te verkoop, dit te adverteer, 'n beroep op kliënte te soek wat u dienste soek en 'n naam vir uself op die internet te maak deur middel van moontlikhede wat reeds bestaan, goedkoop is en goed werk. Ek sal u leer hoe om u data te stoor op wolkrekenaars wat vir u werk en u data goedkoop stoor, hoe om 'n webwerf te beplan en te bou wat u gebruikers wil hê en wat u wil hê, en hoe u gebruikers besig kan hou deur u webwerf 'n tik op hul fone te hou met kennisgewings, e -pos, sms -boodskappe, telefoonoproepe en meer moontlikheid om u slegs na u webwerf terug te bring. Hierdie boek sal fokus op die praktiese van die publikasie en verspreiding van media in groot bedrae, van teks tot foto's tot video's tot klank, 'n goeie indruk op eindgebruikers (u kliënte) en uself verkoop op enige manier wat u doen om 'n webwerf te skep, 'n app wat u en u slegs moontlik maak, en u, u sagteware en u onderneming goed lyk. U sal ook 'n paar wenke en truuks van my leer, van koderingswenke, praktiese nietigheid soos make -up en fotografie, modellering en toneelspel, en meer, wat belangrik sal wees om uself en u onderneming in die beste moontlike lig uit te beeld deur al die instrumente wat u beskikbaar het, uit te voer, terwyl u soveel inhoud as wat u nodig het oor 'n gesonde balans van platforms, versprei word sonder enige moeite, werk of geld as wat nodig is. Hierdie boek word 'prakties genoemWebgebaseerde diep leer en sekuriteit deur voorbeeld "om 'n rede: dit handel oor leer om te kodeer, spesifiek vir die web, spesifiek met die fokus op sekuriteit, vanuit 'n praktiese oogpunt, met voorbeelde van werkkode wat die praktiese doeleindes in die teks bedien. Verbetering, beeldopskrif en ander take soos voorspellingsmetrieke verkry van beelde, soos die aard van die beeld as 'n outentieke, rekenaar-oorgedrewe beeld, of 'n optiese kopie ('n foto van 'n beeld of gedrukte foto). u in u gesig. jy gebruik). Enigiemand wat sagteware bou wat onberispelik veilig is, het 'n mate van gevoel van wat dit impliseer. Sagteware is inherent onseker omdat die toestelle en rekeninge wat ons gebruik om toegang daartoe te kry nie altyd tot ons beskikking is nie, hulle in die hande van iemand met 'n slegte voorneme vir die sagteware kan wees en daarom 'n risiko vir die sagteware self kan inhou. Dit is iets van die fokus van hierdie boek. 'N Netwerk -rekenaar is standaard beveilig met 'n lang sleuteltoken, genaamd en SSH of Secure Shell -sleutel, en is andersins die beste met 'n webbediener beveilig, omdat die webbediener die oop toegang en 'n toestand van die kunsveiligheidsinstrumente op die bediener self bied. Die webbediener het toegang tot die gebruiker se webblaaier, wat waarskynlik die kragtigste deel van die gebruiker se toestel is, want dit is die plek waar die gebruiker toegang tot netwerk -sagteware het. Hierdie gereedskapstel kan teks lewer, die webblaaie wat u sien, en kan ook prente, klank en video opneem (soos 'n foto van 'n gesig of 'n toestand -ID), kan lees en skryf na Bluetooth -radio -toestelle, en kan lees en skryf na naby -veld -transponder -etikette, goedkoop sleutelkaarte, fobs, plakkers, ringe en selfs chip wat met 'n unieke seriengetalle geplaas kan word. Gebruik al die gereedskap tot u beskikking, met hierdie boek sal u uself toerus met die kennis om 'n veilige webwerf te bou, en in die algemeen 'n veilige netwerk -rekenaarstelsel wat vir u werk, u bie en lyk en voel en voel

Waar om te begin: U is welkom om verby die afdeling te slaan. Ek begin met hierdie boek met, of enige afdeling, na die presiese kode wat u benodig, veral as u ondervinding het met kodering voor of enige van die bogenoemde instrumente wat ek in hierdie boek in detail sal beskryf, asook om gebruiksgevalle en praktiese voorbeelde daarvan te dokumenteer. As u nie ervaring in die skryf van kode het nie, beveel ek u aan om al hierdie boeke te lees, en beveel veral aan dat u die vorige afdelings lees, om seker te maak dat hierdie boek die beste by u is. As hierdie boek nie die beste vir u is nie, oorweeg dit om dit aan 'n vriend of familielid te gee wat miskien belangstel om self oor webontwikkeling te leer, en dit selfs oorweeg om dit terug te leen en by hulle te leer om die leemtes in te vul waar ek u as onderwyser misluk het, of ander onderwysers voor my gedoen het. Begin waar u wil, elke deel van hierdie boek sal nuttig wees as u van plan is om 'n nuttige app te bou, en oorweeg dat die beste programme gebou is met die eindgebruiker in gedagte: ken u kliënt. Nou ken jy my, jy ken hierdie boek, en jy is gereed om te begin. Om mee te begin, gryp 'n rekenaar (selfs die goedkoopste skootrekenaar van 'n bokswinkel, Amazon of 'n ou tafelblad werk, en stel dit op 'n manier wat vir u werk.

Hoe om hierdie boek te lees: Teks wat uitgelig is, dui aan dat die teks in 'n opdragprompt hoort, waar u die kode wat u uitgevoer het, sal skryf. Die opdragprompt is baie gefokus op die sleutelbord en benodig min tot geen klik nie, bespoedig u werkvloei en maak dit vir u makliker.

Aan die gang: Kom ons duik in. Ons begin met die bou van kode op 'n plaaslike masjien en begin sonder om 'n webwerf wat aan die internet gekoppel is, te bou. Dit is veiliger om mee te begin, kos niks, en dit is maklik vir u. Afhangend van u bedryfstelsel, sal dit 'n bietjie anders wees om in 'n bash -dop te kom. Vir Mac OS beveel ek aan dat u op hierdie punt 'n virtuele masjien installeer, aangesien u die meeste verenigbaarheid met 'n virtuele masjien sal kry. Verskeie verskaffers soos VirtualBox en Paralells kan 'n virtuele masjien vir u bestuur, hoewel dit ook moontlik is om Ubuntu direk op die masjien te installeer, as u verkies om 'n inheemse omgewing te gebruik wat aanbeveel word om 'n vinnige, vaartbelynde ervaring te skep. As u Linux of Windows gebruik, wat ek aanbeveel, moet dit maklik wees om 'n projek te skep. Maak u terminale oop, pas die grootte aan soos u inpas, en begin stap 2. As u Windows gebruik, volg Stap 1.

Stap 1: - Slegs Windows -gebruikers Open Command Prompt as administrateur en tik in Windows in Windows WSL –install

Stap 2: - Gaan hier voort, of slaan stap 1 oor tot hier as u nie Windows gebruik nie In 'n oop terminale (afhangende van u bedryfstelsel, genaamd Ubuntu in Windows, Terminal in Mac of Linux, of 'n soortgelyke naam), begin met die skep van 'n projek. Ons doen dit met die Mkdir -opdrag, wat 'n gids skep. As u 'n gids moet skep om u projek te stoor, wat aanbeveel word, gebruik die CD -opdrag om na die gids en en

CD/pad/na/gids - Die pad is die gidse (lêers) wat voorafgaan aan u bestemmingsgids, u standaardpad is ~ of/huis/gebruikersnaam (waar gebruikersnaam u gebruikersnaam is). Om na die standaardgids te verander, tik CD of CD ~ in MKDIR Voorbeeld - Vervang 'Voorbeeld' met die naam van die gids

Nou het u 'n werkende gids vir u projek. Aangesien dit so belangrik is dat hierdie gids gestoor word as u na 'n ander masjien moet oorskakel of die kode wat u skryf, moet ontplooi, sodat dit gereed is vir die web, sal ons 'n skrif bou om u gids in die volgende paar stappe te rugsteun. Maar die bou van 'n skrif neem 'n bietjie kode in, en die kode moet outomaties wees om so bruikbaar as moontlik te wees. Laat ons dus 'n skrif bou om eers skrifte te bou. Laat ons begin deur die skrif te skep en uitvoerbaar te maak. Ons sal Sudo, Chmod en Touch hiervoor gebruik en die skrif "ASCRIPT" noem.

sudo touch/usr/bin/ascript sudo chmod a+x/usr/bin/ascript sudo nano/usr/bin/ascript

Nou het ons die skrif geskep, dit uitvoerbaar gemaak en is gereed om dit te wysig. Nano is 'n teksredakteur waarmee u teks kan redigeer sonder om te klik, wat baie makliker is as om 'n grafiese gebruikerskoppelvlak te gebruik. Gebruik nano en dan die pad na die lêer om 'n lêer met Nano te wysig. Om 'n draaiboek te maak wat 'n draaiboek maak, is dit redelik soortgelyk aan die maak van ons skrif in die eerste plek. Ons gebruik dieselfde kode as hierbo en vervang die naam van die skrif, "ASCript" met 'n argumentparameter, $ 1. Hiermee kan ons die skrif noem deur eenvoudig Sudo ASCript Newscript in te tik, op watter punt ons enige nuwe skrif kan skep deur 'newcript' met die naam van u skrif te vervang. Die kode in Nano moet lyk soos:

sudo touch/usr/bin/$ 1 sudo chmod a+x/usr/bin/$ 1 sudo nano/usr/bin/$ 1

En om Nano te sluit, kan ons die kontrolesleutel vashou en X druk, dan Y om aan te dui dat ons die lêer stoor en op die terugkeer kom. In plaas daarvan om hierdie drie opdragte in te tik om 'n skrif te redigeer, sal ons Sudo Astcript AstScript kan tik om die skrif weer te wysig. Dit werk! En enige nuwe skrif kan maklik uitgevoer word deur dit in die dop te noem. Laat ons nou ons werk red: kom ons skryf 'n rugsteunskrip om ons nuwe skrif te stoor en dit dan in ons projekgids te rugsteun, terwyl ons ook die rugsteunskrip rugsteun.

Sudo ASCRIPT -rugsteun

Nou, in Nano:

sudo cp/usr/bin/rugsteun/pad/na/gids/ sudo cp/usr/bin/ascript/pad/na/gids/

Waar/pad/na/gids die pad is na die projek wat u met MKDIR geskep het. Later sal ons leer hoe om herhalingspaaie soos hierdie te kopieer met 'n lus en 'n lys, wat minder kode is, maar laat ons dit nou eenvoudig hou en 'n paar reëls hê. Om hierdie skrip uit te voer en u kode te rugsteun, stoor die lêer in nano met control+x, y en return, en tik die onderstaande in u dop

rugsteun

As u enigsins gevra word vir 'n wagwoord tydens die lees van hierdie boek en in die dop volg, voer u gebruikerswagwoord korrek in, u sal drie drieë hê voordat u die opdrag weer moet uitvoer. U kan die pyltjies op en af ​​gebruik om opdragte weer te gee en dit te redigeer as u iets twee keer moet hardloop. Eenvoudig druk op en af ​​af en toe om 'n opdrag te kies voordat u die opdrag met die regter-, linkerpyltjies en die sleutelbord sowel as die sleutelbord redigeer en dit met terugkeer loop.

Baie geluk! U het daarin geslaag om 'n ongelooflike rugsteunskrip te skep wat twee belangrike skulpskripte in u werkgids ondersteun. Ons kan later dinge rondbeweeg namate die projek groter word, maar dit werk nou. Laat ons verder gaan met die rugsteun in die wolk, ons sal GitHub hiervoor gebruik (alhoewel daar talle ander GIT -oplossings vir rugsteun is, is dit alles omtrent dieselfde.) Git is 'n verdeling -sagteware waarmee u wysigings na u sagteware kan rugsteun, terwyl u dit na 'n bediener maak, terwyl u ook die hele kopie van u sagteware agter 'n wagwoord of sleutel kan aflaai. Dit is 'n belangrike rol in die stoor van u sagteware, veral as ons na die beveiligde Linux -gevalle migreer wat soms breek as 'n enkele reël kode misluk, wat u uitsluit terwyl u kode nie gerugsteun word as u nie die kans kry om dit outomaties te rugsteun nie, wat ons sal dek.

As u op hierdie punt nog nie 'n Ubuntu -virtuele masjien gebruik nie, beveel ek op hierdie punt met 'n Ubuntu -virtuele masjien, want dit sal u lewe vergemaklik wanneer u al die nodige pakkette installeer om 'n werkende webwerf te bou en diep leeroperasies op u rekenaar te vorm. Ons sal die kode binne die nabye toekoms na 'n webbediener skuif, maar ons wil seker maak dat daar ten minste 'n paar lae sekuriteit agter ons webbediener is wat bestand is teen phishing, en 'n aantal Linux -pakkette gebruik om dit te kan doen. As u nog steeds Mac OS wil gebruik, is u welkom om die nodige pakkette aanlyn te soek en te installeer, maar daar is miskien nie alternatiewe vir elke pakket wat hierdie boek of reeks dek nie.

Kom ons voeg 'n paar opdragte by om ons werk met die rugsteunskrip te pleeg deur die Command Sudo ASCript -rugsteun uit te voer.

#… git add –all git commit -M "rugsteun" git push -U oorsprong meester

...

Weereens, beheer X om te stoor.
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Nou moet ons eenmalige konfigurasie vir hierdie projek doen. Aangesien dit binnekort 'n GIT -projek sal wees, hoef ons nie elke opdrag te tik elke keer as ons van 'n Git -bewaarplek gebruik word nie, maar ons kry die weg as ons ons implementeringsskripte skryf. Laat ons eers seker maak dat ons in die regte gids is en die git -bewaarplek initialiseer en SSH -sleutels genereer.

CD/pad/na/gids git init git tak -M meester ssh-keygeneg

Nadat ons SSH-Keygen ingetik het, moet die nuwe sleutel in die tuismap gestoor word onder 'n lêergids genaamd .SSH. Dit word ID_RSA.pub genoem. Kom ons vind hierdie sleutel en kopieer dit. Om dit te sien,
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
CD ~ kat .ssh/id_rsa.pub

Kopieer die teks wat deur die laaste opdrag teruggestuur word, en skep 'n rekening by u GIT -verskaffer (ideaal GitHub) voordat u die SSH -sleutel by u rekening voeg. Sodra u 'n rekening het, klik op die boonste regter -menu en voer instellings in voordat u u SSH -sleutel in SSH- en GPG -sleutels onder toegang in die menu voeg. Kies Voeg 'n SSH -sleutel by en voeg joune by deur dit in te plak en dit 'n titel te gee voordat u stoor en terugkeer na GitHub om 'n nuwe bewaarplek te skep. Dit is soortgelyk vir ander GIT -verskaffers, u moet hul dokumentasie lees. Gee u bewaarplek 'n beskrywende naam in die nuwe bewaarplekkonfigurasie en besluit of u dit wil publiseer, en maak seker dat u nog geen lêers vir insluiting opstel nie. Sodra die bewaarplek geskep is, kopieer die kloon met SSH URL en plak dit in die volgende opdrag.

git afstands voeg git by: // ... (u afgeleë URL)
sudo ascript backup
Nou kan u met CD na u bewaarplek terugbeweeg, sal u hiermee vertroud wees. Probeer nou u rugsteunskrif met rugsteun

Groot! Nou kan ons regtig kodering kry. Laat ons django installeer noudat ons 'n goeie begrip van Bash en Git het. Django laat ons outomaties ons sagteware rugsteun, Bash kan dit ook doen, maar Django moet 'n eenvoudiger veiliger implementering hê (dit kan makliker gedeaktiveer en makliker gekonfigureer word).

Om sagteware in Ubuntu te installeer, gebruik ons ​​die Sudo Apt-Get-opdrag. Laat ons eers die sagteware wat ons reeds gehad het, opdateer en opgradeer. Dit kan gedoen word met Sudo Apt-Get Update en Sudo Apt-Get Upgrade -Y. Laat ons nou Python en ons virtuele omgewing, die tuiste van ons kode, installeer, met die volgende opdrag: Sudo apt-Get Install Python-is-Python3 Python3-VENV
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Dit is al wat u nodig het om met Django aan die gang te kom in terme van sagteware -installasies in die Ubuntu -instansie. Vir Windows en Linux moet dit redelik eenvoudig wees, maar vir Mac wil u miskien 'n virtuele masjien en Linux daarop installeer met behulp van 'n gratis of betaalde virtuele omgewing soos VirtualBox of Paralells -tafelblad en die bogenoemde stappe herskep om 'n Ubuntu -omgewing op te stel. Ubuntu is in hierdie geval van kritieke belang omdat dit die sagteware is wat die webwerwe bestuur en dit in staat stel om webwerwe met al die bogenoemde sagteware aan te bied.

Kom ons grawe in die django.

Weer in ons gids, met CD:
backup
Python -M Venv Venv # skep die virtuele omgewing waar kode gestoor word Bron Venv/Bin/Activate # Aktiveer die virtuele omgewing PIP Installeer Django django-admin startproject mysite. # Waar MySite die projek is wat ek in my huidige gids begin.

Skep die virtuele omgewing waar kode gestoor word

Aktiveer die virtuele omgewing

Waar MySite die projek is, begin ek in my huidige gids.

Django begin ons net aan die gang, want Django bied die webbediener aan en doen alles wat ons nodig het om 'n basiese plaaslike webwerf aan die gang te kry. Noudat ons Django geïnstalleer het, laat ons die instellings 'n bietjie wysig om dit te laat werk soos ons nodig het. Laat ons eers 'n nuwe app skep

Python Manage.py StartApp voer

U sal sien dat die eerste app Feed genoem word. Die app moet genoem word wat u wil, en ons sal nuwe programme skep, maar die naam van elke app moet konsekwent wees elke keer as die app in die kode verwys word. Om 'n nuwe app by te voeg, sal ons altyd die instellings.py wysig in die ander gids wat die app geskep het, genoem in StartProject, hierna App. Nano te gebruik,

nano app/instellings.py

Vind geïnstalleerde_apps in die instellings en skei die [] in 3 reëls. Gebruik vier spasies op die leë middellyn, voeg 'voer' of die naam van u app by. Hierdie gedeelte van die instellings.py moet lyk soos:
# Geïnstalleer_apps = [
    'voer',
]
Laat ons toets dat Django werk voordat ons vergeet. Met behulp van die opdrag python management.py runserver 0.0.0.0:8000, kan ons die bediener bestuur en dan in 'n webblaaier op die rekenaar navigeer met die kode na http: // localhost: 8000 en sien 'n voorbeeld van die webblad (dit werk!) Staak die bediener met Control C, dieselfde as enige ander opdrag.

Laat ons nou 'n paar Python -kode skryf. Django het drie hoofkomponente, wat almal heeltemal volgens kode bestuur word. Die komponente word model, aansig en sjabloon genoem, en elkeen is onderskeidelik op 'n hoër en laer vlak voordat die webblad aan die gebruiker gelewer word.

Die model is die kode wat inligting in die databasis stoor vir herwinning, sorteer en weergawes.

Die siening besluit hoe die model weergegee, gemanipuleer en gewysig word, byna elke siening sal 'n model direk gebruik.

Die sjabloon is die HTML -kode met 'n paar ekstra klokkies en fluitjies wat sjabloontaal genoem word. Die sjabloon word weergegee deur die aansig waar dit gevul is met die python -kode en konteks, soos modelle en inligting (gebruikers en heelgetalle) van die aansig.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Django het ook ander komponente, insluitend maar nie beperk nie tot:

Instellings, wat die app opstel soos ons bespreek het.

URL's, wat patrone is wat die gebruiker volg om toegang tot spesifieke dele van die webtoepassing te verkry.
cd ~
cat .ssh/id_rsa.pub
Vorms, wat definieer hoe inligting wat na die bediener gestuur word, hanteer en aan die databasis sowel as die gebruiker weergegee word. Dit is die basis om inligting aan die bedienerkant te verwerk, en kan enige soort inligting wat die rekenaarwinkels aanvaar, veral teksstringe, nommers en ware/vals Boolese (gewoonlik merkblokkies).

Sjablone, wat HTML -kode en sjabloontaal is en die gaping tussen Python en HTML oorbrug, wat beteken dat Python -inligting kan bedien word as HTML -kode wat almal toegang kan kry en 'n webwerf met beperkte toegang kan beveilig, terwyl Python -kode toeganklik is vir die web en nuttig is vir 'n verskeidenheid doeleindes op 'n afstandtoestel wat nie naby die bediener hoef te wees nie.

Statiese lêers, wat gewoonlik JavaScript is en dit is biblioteke wat die bediener dien en met die sjabloon gekoppel is.
git remote add git://… (your remote URL)
Media -lêers, wat die bediener bedien of ekstern aangebied word, of net aan die bediener geskryf is voordat hy verwerk word en na 'n ander bediener ('n emmer) geplaas word vir die aanbieding.

Middleware, wat stukke kode is wat op dieselfde tyd as elke aansig uitgevoer word en wat as "ingesluit" in die aansig beskou word.

Konteksverwerkers, wat die konteks van elke siening verwerk en gebruik word om ekstra konteks by te voeg.

Toetse, wat bevestig dat die gebruiker of versoek sekere vereistes aan die aansig gee.

Verbruikers, wat bepaal hoe Websockets op kommunikasie hanteer en reageer.

Admin, wat gebruik word om modelle te registreer, sodat dit in detail binne die Django -admin -bladsy gemanipuleer kan word, waar die databasis via 'n grafiese koppelvlak toegedien kan word.

Seldery, wat asinchroniese take definieer, kan dele van die Django -kode begin loop voordat dit onmiddellik na die volgende taak of kode -reël gaan.

Django kan baie ander komponente hê, wat ons hier in detail sal bespreek. Daar is baie maniere om Django meer funksioneel te maak, met die toevoeging van Websockets, wat vinnige, vaartbelynde kommunikasiekanale is, seldery, wat asinchroniese take uitvoer, en 'n menigte ander sagteware vir die uitbreiding van django, veral in die sieningsfunksies, waar die meeste van die kode uitgevoer word. Kykfunksies is die sleutel omdat dit gewoonlik elke stuk kode verklaar wat spesifiek is vir 'n spesifieke URL -patroon, of 'n gedeelte van die bediener.

Laat ons eers kykfunksies ondersoek. Kykfunksies begin met invoer wat kode aandui wat in die aansig gebruik sal word, en word gedefinieer met behulp van gewone funksie -definisies of klasse. Die eenvoudigste aansigte word gedefinieer deur die funksie -definisie DEF, en gee 'n HTTPRESPONSE met 'n basiese sjabloon terug. Laat ons begin deur 'n basiese siening te definieer om die teks "Hello World" terug te gee. Onthou dat u elke keer as u kode byvoeg na 'n stelling soos DEF, indien u, ens, u 4 ruimtes moet byvoeg vir elk van die voorafgaande definisies wat u op u funksie wil toepas. Ons sal binnekort begin wat elkeen hiervan beteken.

Wysig die Feed/Views.py -lêer in die gids van ons webwerf met behulp van nano en voeg die volgende reëls aan die einde van die lêer.

van django.http invoer httpresponse def hallo (versoek): return httpresponse ('Hello World')

Django se httpresponse reageer met 'n teksstring, aangedui met die opening en sluiting '. Elke keer as u inligting aan 'n funksie of klas deurgee, soos versoek of 'n string, moet u hakies (, opening en sluiting) gebruik.

Dit is nie al wat ons nodig het om ons siening te sien nie. Natuurlik het ons nie aan die bediener gesê waar die uitsig presies is nie; ons moet nog steeds 'n pad definieer waarmee die aansig moet lewer. Laat ons begin deur 'n basiese pad in app/urls.py te definieer, en ons sal later in padgroepe kom.
python -m venv venv # Voeg 'n reël na die invoerstate in App/URLS.py na die begin van die uitsig wat ons pas geskep het.
source venv/bin/activate # Van voerinvoeraansigte as FEED_VIEWS
django-admin startproject mysite . # Laat ons nou die uitsigpatroon definieer. Kykpatrone het drie komponente, die padkomponent, wat aan die bediener sê waar die aansig binne die bediener bestaan ​​(die URL -pad wat die gebruiker in die navigasiebalk tik om die webblad te betree), die View -komponent waar die aansig gespesifiseer is, en 'n vriendelike naam vir die uitsig, sodat dit maklik is om die patroon te kry as u met 'n templaat werk, veral die naam van die naam kan verander en opgedateer word indien nodig om 'n ander aansig te neem of 'n meer aansig te neem. Dit is sinvol om dinge op hierdie manier te doen en buigsaam te wees, want u kodebasis sal 'n steeds veranderende omgewing wees wat buigsaamheid en improvisasie nodig het om waardevol en maklik te werk om mee te werk. Hier is hoe u siening sal lyk, u kan dit by die urlpatterns = [gedeelte van app/urls.py voeg. Die sieningspatroon word gedefinieer met die drie komponente hierbo beskryf, en 'n funksie genaamd Path. U URL -patrone is 'n lys, dus maak seker dat u elke item altyd met 'n komma beëindig, want dit skei elkeen. Elke item moet ook op 'n nuwe lyn gaan, weer met vier ruimtes daarvoor, net soos die app in instellings.py. Ons definieer die eerste komponent van die aansig met 'n leë stringfunksie om 'n aansig te skep wat op die wortelgids van die webbediener werk. U urls.py moet nou so lyk:
Van voerinvoeraansigte as FEED_VIEWS urlpatterns = [ pad ('', feed_views.hello, naam = 'hallo'), ]

Dit is die basis om 'n webwerf met Django te skep wat heeltemal staties is. Om 'n meer dinamiese webwerf te maak waar ons inligting kan begin, soos prente, video's, klank en meer, moet ons modelle gebruik wat ons volgende gaan ondersoek. Kom ons kyk nou na ons kode en voer die bediener uit. Om die kode vir foute na te gaan, hardloop:

Python Manage.py tjek
python manage.py startapp feed
As daar foutboodskappe is, moet u die veranderinge wat u aan u app aangebring het, noukeurig hersien en kyk of daar iets is wat reggestel moet word, soos 'n vreemde of gebrek aan ruimte, 'n ekstra karakter, 'n ongeslote string, enige tikfout, enige per ongeluk uitgevee karakter of iets anders. As u die foutboodskap deurlees (as u een het), moet u die pad kan sien na 'n lêer wat u geskep of geredigeer het saam met 'n reëlnommer, dus kyk na die lêer en reël en kyk of u iets kan regstel wat daar is. As u die probleem opgelos het, voer die bogenoemde opdrag weer uit. As u sagteware gereed is om te hardloop en werk, sal u die uitset "Stelselkontrole geïdentifiseer geen probleme" sien nie. Nou is jy gereed om te gaan. Begin die bediener met:

Python Manage.py Runserver 0.0.0.0:8000

Maak nou 'n webblaaier oop en navigeer na http: // localhost: 8000. U moet sien dat die teks in u mening in die hakies en aanhalings van die HTTPResponse -funksie teruggestuur word. Dit is net 'n basiese voorbeeld, maar as u dit tot dusver bereik het, verstaan ​​u die basiese beginsels van hoe Linux, Bash, Python en Django werk. Laat ons dieper in 'n paar databasismodellering delf en die krag van 'n Python -klas ondersoek in die stoor van inligting. Dan sal ons begin om HTML en CSS te gryp voordat ons ons webwerf volledig, buigsaam en veilig maak met JavaScript en masjienleer.
nano app/settings.py
Klasse word in die modelle.py van u app gestoor. Gebruik nano, wysig app/modelle.py en voeg 'n nuwe klas by. 'N Klas word gedefinieer met die klasdefinisie en word deur 'n superklas geslaag waaruit dit erf, in hierdie geval modelle. Model. Die naam van die klas kom na die klasdefinisie, en na die klasdefinisie a: (kolon) word gebruik voordat die eienskappe en funksionele definisies wat aan die klas gekoppel is, hieronder aangedui word. Ons klas het 'n ID nodig wat ons kan gebruik om dit op te spoor en uniek te hou, en dit benodig ook 'n teksveld om inligting te stoor. Later kan ons 'n tydstempel, lêers, booleërs byvoeg (ware of vals definisies wat ons kode kan help om besluite te neem oor wat om met die model te doen, en kan gebruik word om dit te sorteer), 'n voorbeeld om die model vas te bind aan 'n gebruiker wat by die bediener aangemeld is, en meer. Kom ons pak die kode hieronder uit:

van django.db -invoermodelle # die invoer wat gebruik word om ons klas te definieer en dit is eienskappe klaspos (modelle.model): # Die definisie van ons klas self id = modelle.autofield (primêre_key = true) # Die ID van ons model, 'n outomaties gegenereerde sleutel wat ons in staat stel om die model te bevraagteken, dit uniek te hou en nuttig is as ons met die model moet kommunikeer sodra dit geskep is. Text = Models.TextField (standaard = '') # Die attribuut Ons klas stoor, in hierdie geval, 'n paar teks, standaard na 'n leë string.

Die invoer wat gebruik word om ons klas en sy eienskappe te definieer
INSTALLED_APPS = [
    'feed',
]
Die definisie van ons klas self

Die ID van ons model, 'n outomaties gegenereerde sleutel wat ons in staat stel om die model te bevraagteken, dit uniek te hou en nuttig is as ons met die model moet kommunikeer sodra dit geskep is.

Die eienskap wat ons klaswinkel in hierdie geval, in hierdie geval, 'n teks, wat standaard is vir 'n leë string.

Sluit en stoor die lêer soos voorheen om klaar te maak.

Daar is baie ander velde en opsies wat ons sal ondersoek wanneer ons hierdie klas opdateer namate ons app ontwikkel, maar dit is die basiese benodigdhede om 'n app te skep om teks te plaas. Hierdie model sal egter nie alleen werk nie. Soos voorheen beskryf, benodig ons 'n pasgemaakte aansig en 'n pasgemaakte URL -patroon om hierdie model te laat werk, en ons sal ook 'n vorm saam met 'n sjabloon benodig. Kom ons ondersoek die vorm eers.

Om 'n vorm te definieer, wysig app/vorms.py met nano en voeg die volgende reëls by. Ons benodig twee invoere, ons vormklas, sowel as die model wat ons geskep het (feed.models.post), 'n klasdefinisie soortgelyk aan die model, en 'n veld saam met 'n subklas genaamd meta wat die model sal definieer waarmee die vorm in wisselwerking is. Die vorm kan ook 'n inisialiseringsfunksie hê wat dit opstel op grond van inligting in die versoek, model of andersins, ons sal dit later ondersoek.

Modelvorms is so nuttig omdat dit 'n model kan skep of ook 'n model kan redigeer, dus gebruik ons ​​dit vir albei. Kom ons definieer een in vorms.py hieronder.

van Django -invoervorms Van Feed.Models invoerpos klas PostForm (vorms.modelform): text = vorms.Charfield (widget = forms.TextArea) Klasmeta: Model = Pos velde = ('teks',)

Dit is die basiese beginsels van hoe 'n vorm en model lyk. Hierdie modelvorm kan gebruik word om 'n pos te installeer of te redigeer deur die teks wat dit bevat, te verander. Ons sal kyk na die integrasie van hierdie vorm in 'n uitsig. Laat ons eers die migrasies maak en die databasis migreer sodat ons kode met die model kan omgaan as dit loop. Om dit te doen, voer die volgende opdragte uit:

Python Manage.py makemigrations Python Manage.py migreer

Dit sal 'n minuut neem om uit te voer, maar sodra dit dit doen, sal dit u toelaat om toegang tot die model in die aansigte, middelware of op enige ander plek in die sagteware te kry. Laat ons voortgaan deur 'n siening te maak waar ons ons model kan sien. Wysig Feed/Views.py en voeg die volgende kode by, soos aangedui. U hoef niks by te voeg na die # teken nie, die kode is kommentaar wat gebruik word om inligting oor die kode aan te dui. Ons sal begin met die invoer van ons model in die sienings en dit by te voeg tot 'n konteks waar ons dit in 'n sjabloon kan lewer as 'n lys om te vertoon. Vervolgens voeg ons 'n sjabloon by waar ons die vorm en die model met 'n knoppie kan lewer om 'n nuwe voorwerp te skep wat gebaseer is op die model en dit op die bediener kan plaas. Dit klink ingewikkeld, so laat ons dit net stap vir stap neem. Voordat ons klaar is met die aansig, laat ons 'n sjabloon skep wat die model net weergee en seker maak dat ons dit kan sien deur 'n nuwe pos in die dop te skep. Hier is hoe daardie siening moet lyk:

Van Feed.Models invoerpos van django.shortcuts invoer lewer, herlei Vanaf django.urls voer omgekeerde in Def Feed (versoek): posts = post.objects.all () # vra al die poste in die databasis tot dusver retures (versoek, 'voer/feed.html', { 'poste': poste, })

Vra tot dusver al die plasings in die databasis

Dit lyk alles redelik eenvoudig totdat ons onderaan kom. Weergegee, die waarde wat deur die funksie teruggestuur is in plaas van in 'n HTTP -antwoord soos die vorige voorbeeld, neem altyd 'n versoek as die eerste inset, aanvaar 'n konteks (in hierdie geval die poste in die databasis), wat nou in die sjabloon weergegee kan word, en die templaat wat in die funksie gedefinieer is, weergee. Die sjabloon gaan 'n HTML -dokument wees met 'n bietjie taal genaamd Jinja2, wat Python -inligting in die HTML lewer.

Maak twee kaarte in voer om sjablone te begin skep.

Mkdir -voer/sjablone mkdir voer/sjablone/voer

Bewerk vervolgens 'n sjabloon in die gids hierbo, voer/sjablone/voer, en voeg die kode by vir hierdie voorbeeld. Kom ons kyk na die sjabloon vir hierdie voorbeeld.

Voer { % vir pos in poste %} {{post.text}} { % endfor %}

Dit is 'n baie eenvoudige sjabloon. Dit definieer die opening en sluiting van HTML -etikette, 'n dokumenttipe -etiket, 'n liggaamsmerk met 'n legende -titel, 'n breekplaatjie wat 'n klein lyn oor die skerm voeg, en 'n vir lus wat elke pos in die lys van plasings as 'n paragraaf in die sjabloon maak. Dit is al wat nodig is om poste te lewer, maar daar is nog niemand in die databasis nie. Laat ons 'n paar met die dop skep. Ons kan die dop met bestuur.py bestuur

Python Manage.py Shell

Laat ons nou ons posmodel invoer

Van Feed.Models invoerpos

Vervolgens sal ons 'n eenvoudige pos met 'n tou skep en die dop verlaat. Die string kan enigiets wees, solank dit 'n geldige teks is.

Post.objects.create (teks = 'hallo wêreld') Uitgang ()

Laastens moet ons 'n URL -patroon by ons voer voeg. Aangesien ons voerprogram verskeie URL's sal gebruik en ons lêergroottes klein wil hou, laat ons 'n plaaslike URL.py skep in ons voerprogram wat so lyk:

van django.urls invoerpad van. Voer uitsigte in urlpatterns = [ pad ('', views.feed, naam = 'voer'), ]

Ons sal ook die URLS.py in die basis -app moet redigeer, wat ons ook al besluit het om dit te noem, dit was die eerste gids wat ons geskep het. Wysig app/app.py en voeg die volgende by die URL -patrone

Vanaf django.urls -invoer sluit # aan die bokant in urlpatterns = [ #... vorige kode hier pad ('voer/', sluit in (('feed.urls'), naamruimte = 'voer')), ]

aan die bokant

... Vorige kode hier

As ons die bediener met Python Manage.py Runserver bestuur, sal ons die bladsy sien wat ons geskep het omdat ons die model, aansig en sjabloon sowel as URL -patroon het, saam met items in die databasis. Laat ons nou die vorm wat ons geskep het, implementeer en begin om ons eie poste te skep. Maar voordat ons te veel kode skryf, laat ons 'n rugsteun maak met behulp van die skrif wat ons vroeër geskryf het, rugsteun. Begin hierdie skrif in die dop, wag 'n paar oomblikke, en al die kode word gerugsteun na ons Git -bewaarplek.

rugsteun

Die implementering van die vorm is relatief eenvoudig. Ons sal ons vorm invoer, 'n postversoekhanteerder by die aansig voeg en die pos in die databasis stoor voordat ons na dieselfde aansig herlei word. Ons kan die herlei -funksie wat ons reeds ingevoer het, gebruik, en 'n ander funksie genaamd omgekeerde om die URL vir die uitsigpatroon te kry. Ons sal dit bevraagteken met die string 'voer: voer', want die naamruimte van die ingeslote patroon is voer, en die uitsig word ook voer genoem.

Van Feed.Forms invoer na vorm Def Feed (versoek): posts = post.objects.all () # vra al die poste in die databasis tot dusver As Request.Method == 'Post': # Hanteer die posversoek vorm = postForm (request.post) # Skep 'n voorbeeld van die vorm en stoor die data daarop As vorm.is_valid (): # Valideer die vorm vorm.save () # stoor die nuwe voorwerp return Redirect (reverse ('voer: voer')) # Herlei na dieselfde URL met 'n GET -versoek retures (versoek, 'voer/feed.html', { 'Form': postForm (), # Maak seker dat u die vorm in die konteks deurgee sodat ons dit kan lewer. 'poste': poste, })

Vra tot dusver al die plasings in die databasis

Hanteer die posversoek

Skep 'n voorbeeld van die vorm en stoor die data daarop

Valideer die vorm

Stoor die nuwe voorwerp

Herlei na dieselfde URL met 'n GET -versoek

Maak seker dat u die vorm in die konteks deurgee sodat ons dit kan lewer.

Merk in HTML en lewer die vorm in die HTML -sjabloon met 'n Submit -knoppie. Ons sal ook 'n CSRF -teken benodig, 'n teken wat verhoed dat eksterne webwerwe na die vorm plaas sonder om eers 'n bladsy te laai.

Voer { % csrf_token %} {{vorm}} Nuwe pos { % vir pos in poste %} {{post.text}} { % endfor %}
from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world')
Kom ons breek dit af. Daar is 'n nuwe vormklas, 'n teken, die vorm self en 'n indienknoppie. Redelik eenvoudig, maar as ons daarna kyk, wil ons dit beter laat lyk. Dit werk, ons kan nuwe plasings met die vorm plaas en dit word nou in die databasis gestoor. Daar is 'n paar dinge hier aan die gang. Ons gebruik HTML -etikette om te verklaar dat die dokument 'n HTML -dokument is, ons gebruik 'n sjabloonetiket ({ % ... %}) om die teken vir die vorm te lewer, en 'n ander, {{…}} om die vorm te lewer. Ons het ook 'n lus om die teks te lewer met behulp van bloketikette en 'n sjabloonetiket. Bloketikette is baie belangrik, want ons kan definieer hoe gedeeltes van die sjabloon daarmee gelewer word, en sjabloonetikette is die basis van hoe ons veranderlikes in ons kode plaas.

Nou moet ons ons app beter laat lyk, want dit lyk nou regtig basies. Ons kan dit doen deur CSS te gebruik, hetsy inlyn, of in klasse wat aan elke voorwerp in die dokument gekoppel is. CSS is baie lekker, want dit vertel alles op die bladsy hoe dit moet lyk, en dit kan regtig goed lyk. Daar is 'n paar biblioteke wat dit kan doen, maar my persoonlike Bootstrap is.

getbootstrap.com/

Maak 'n nuwe gids genaamd sjablone met MKDIR -sjablone, en wysig dan sjablone/basis.html.

Dit moet so lyk:

{ % blok liggaam %} { % EndBlock %}

Maak seker dat u die CSS en JavaScript, die .css- en .js -lêers, kopieer, want ons het die JavaScript nodig om ons webwerf in die toekoms meer funksioneel te maak.
from feed import views as feed_views
Laat ons nou terugkeer na die bash -dop en 'n vinnige opdrag uitvoer. Onthou, as u ooit toegang tot die virtuele omgewing moet kry, tik die bron Venv/bin/aktiveer. Hiermee kan u Python -pakkette plaaslik installeer op 'n manier waarmee Django toegang tot hulle kan kry. Om ons vorms wat deur Django Bootstrap -klasse gegenereer word, te gee, gebruik ons ​​'n python -pakket genaamd Crispy Forms. Ons kan dit met die volgende opdrag aflaai

pip installeer django-krispy-vorms

Sodra dit geïnstalleer is, voeg dit by die instellings.py
from feed import views as feed_views

urlpatterns = [
    path('', feed_views.hello, name='hello'),
]
Geïnstalleer_apps = [ # ... vorige kode hier 'Crispy_forms', ]

... Vorige kode hier

Nou, terug in ons voervorm, kan ons 'n paar dinge verwyder. Kom ons verwyder die begin en einde van die dokument en vervang dit met erfenis van ons basisvorm, met behulp van Extss en die blokdefinisie. Ons sal ook 'n sjabloonfilterinvoer met las en 'n sjabloonfilter by die vorm voeg. Laastens, laat ons 'n bootstrap -klas by die knoppie op die vorm voeg om dit meer soos 'n knoppie te laat lyk. Dit moet so lyk:
python manage.py check
{ % brei 'basis.html' %} { % blok liggaam %} { % laai Crispy_forms_tags %} { % csrf_token %} {{vorm | bros}} Nuwe pos { % vir pos in poste %} {{post.text}} { % endfor %} { % EndBlock %}

Pragtig! Dit is al 'n bietjie kode. Vervolgens moet ons dit toets en seker maak dat ons kan sien dat alles mooi lyk, en ook seker wees dat alles behoorlik werk. Begin die bediener volgens vorige instruksies en maak seker dat die webwerf in orde lyk en werk. Goeie werk! U is gereed om oor te gaan na die volgende stap, waarin ons gebruikersaanmeldingsfunksies sal byvoeg met behulp van soortgelyke URL's, vorms, aansigte en sjablone. Die basisvorm is belangrik, en ons sal voortgaan om dit te verander en veranderings aan te bring, maar laat ons nou daarop fokus om ons webwerf veiliger te maak, deur gebruikers in staat te stel om aan te meld met 'n gebruikersnaam en wagwoordkode, en uiteindelik selfs belangriker inligting wat u app sal help om veilig en u eie rekening slegs deur u toeganklik te wees.

Om dit te kan doen, moet ons die gebruikersmodel wat in django ingebou is, gebruik. Die gebruikersmodel is 'n databasismodel, soos ons pos, wat weergegee kan word om 'n gebruiker op die webwerf aan te meld. In die toekoms, voordat ons die webwerf op die internet ontplooi, sal ons hierdie model uitbrei met ander modelle wat daaraan toegeskryf word, en bykomende sekuriteitsmaatreëls opbou vir die aanmelding wat bestand is teen phishing. Ons sal begin met die gebruik van 'n paar ingeboude aanmeldvorms wat Django bied. Laat ons eerstens 'n nuwe app skep wat ons sal gebruik om die sjablone en aansigte vir die basiese aanmeldbladsy weer te gee. Ons sal ook ander programme skep om die voortgesette aanmelduitdagings voor te stel om die app te beveilig, insluitend 'n pincode, gesigsherkenning, naby veldkommunikasie, eksterne toestelle, multi -faktor -verifikasie en vingerafdrukherkenning.
python manage.py runserver 0.0.0.0:8000
Ons het al gepraat oor die begin van 'n app. Vanuit ons gids, binne die virtuele omgewing, slaag bestuur.py hierdie argumente

Python Manage.py StartApp -gebruikers

Nou moet ons 'n gids vir die nuwe app hê. Laat ons begin deur 'n aansig te skep in die gids wat ooreenstem met die aanmelding van die gebruiker. Django het 'n ingeboude siening vir gebruikersaanmeldings, maar dit sal nie vir ons geskik wees nie, want ons het 'n pasgemaakte aansig nodig, wat verkieslik met 'n definisie gedoen word.

In hierdie siening sal ons begin met die ondersoek na 'n posversoek, pasversoek. Post na 'n aanmeldvorm wat vanaf Django ingevoer is, die gebruikersrekening verifieer en die gebruiker aanmeld voordat dit na ons Feed -app herlei word.

Voeg die volgende kode in gebruikers/views.py by
from django.db import models # van django.shortcuts invoer lewer, herlei
Vanaf django.urls voer omgekeerde in
van django.contrib.auth.forms Import AuthenticationForm, SetPasswordForm
van django.contrib.auth invoer verifieer, logout
van django.contrib.auth invoeraanmelding as autor
van django.contrib -invoerboodskappe

Def -aanmelding (versoek):
    As Request.Method == "Post":
        gebruikersnaam = versoek.post ['gebruikersnaam'] # Kry die gebruikersnaam en wagwoord uit die posversoek
        wagwoord = versoek.post ['wagwoord'] # verifieer die gebruiker
        gebruiker = verifieer (gebruikersnaam = gebruikersnaam, wagwoord = wagwoord)
        As gebruiker:
            Auth_login (versoek, gebruiker, backend = 'django.contrib.auth.backends.modelbackend')
            boodskappe.success (versoek, 'U wagwoord is aanvaar. Gaan voort')
            Return Redirect (omgekeer ('voer: voer'))
        anders: boodskappe.warning (versoek, 'Gebruikersnaam of wagwoord verkeerd. Probeer asseblief weer')
    return render (versoek, 'gebruikers/login.html', {'vorm': verifikasievorm ()})
class Post(models.Model): # Kry die gebruikersnaam en wagwoord vanaf die posversoek
    id = models.AutoField(primary_key=True) # Verifieer die gebruiker
    text = models.TextField(default='') # Dit is al wat u nodig het vir 'n basiese aanmeldaansig. Laat ons nou 'n vorm vir die aansig skep deur die basisvorm uit te brei. Ons sal begin met die skep van 'n nuwe gids vir sjablone in die gebruikersmap.
MKDIR -gebruikers/sjablone MKDIR -gebruikers/sjablone/gebruikers

Nou moet ons gebruikers/sjablone/gebruikers/login.html kan wysig. Terwyl ons daarmee besig is, sal ons 'n sjabloon skep om die gebruiker ook in staat te stel om aan te meld.

nano -gebruikers/sjablone/gebruikers/login.html

Nou, in die sjabloon,

{ % brei 'basis.html' %} { % laai Crispy_forms_tags %} { % blokinhoud %} { % csrf_token %} Teken in {{vorm | bros}} Aanmeld { % EndBlock %}

Dit is die basiese beginsels van 'n aanmeldvorm. Dit is regtig net soos die ander sjabloon in struktuur, maar dit lyk effens anders as dit weergegee word. Ons kan hierdie kode kopieer om 'n ander soortgelyke sjabloon met die naam Register.html te bou, waar ons die bewoording sal verander en 'n nuwe vorm sal gebruik wat ons bou. Laat ons eers die sjabloon maak. Wysig gebruikers/sjablone/gebruikers/register.html en voeg die volgende kode by:

{ % brei 'basis.html' %} { % laai Crispy_forms_tags %} { % blokinhoud %} { % csrf_token %} Skep 'n rekening {{vorm | bros}} Register { % EndBlock %}

Laat ons nou 'n vorm vir ons gebruikersregistrasie bou en terugkyk na die aansigte voordat ons ons gebruikersaanmeldings met 'n model opgradeer. Ons sal hierdie vorm basies maak om mee te begin, maar in die toekoms meer besonderhede en sekuriteitsfunksies soos ooreenkomste en CAPTCHA inkorporeer. Wysig die vorms met nano -gebruikers/vorms.py, en voeg die volgende kode by.

van Django -invoervorms van django.contrib.auth.modelle invoergebruiker van django.contrib.auth.forms invoer userCreationForm Klas UserRegisterForm (UserCreationForm): e -pos = vorms.emailfield () Klasmeta: Model = Gebruiker velde = ['gebruikersnaam', 'e -pos', 'wagwoord1', 'wagwoord2']
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',)
Ons het dus 'n ander vorm hier, wat redelik eenvoudig werk. Dit is 'n gebruikersregistervorm met 'n gebruikersnaam, e -pos en wagwoord, sowel as 'n bevestigingswagwoordveld. Let daarop dat hierdie vorm nie die gewone vorm uitgebrei het nie. Vorm klas, dit is 'n modelvorm wat beteken dat dit 'n meta het. Een veld word net so gedefinieer, en die klasmeta definieer die model wat die vorm ooreenstem met die res van die inligting wat aan die vorm geskryf sal word. Die meeste hiervan bestaan ​​reeds in Django se ingeboude UserCreationForm, daarom sal ons dit as basis vir die klas gebruik (in die hakies).

Vervolgens sal ons die aansig ondersoek om 'n gebruiker te registreer, noudat ons 'n vorm en 'n sjabloon het. Dit is 'n Modelform, net soos die een in die nuwe posbeskouing. Wysig gebruikers/views.py en voeg die volgende kode by:

# ... invoer van .vorms invoer userRegisterForm Def Register (versoek): As Request.Method == "Post": vorm = userRegisterForm (versoek.post) As vorm.is_valid (): gebruiker = vorm.save () boodskappe.success (versoek, 'Welkom by die app, {}.'. Formaat (user.userName)) return render (versoek, 'gebruikers/register.html', {'vorm': userRegisterForm})
python manage.py makemigrations
python manage.py migrate
... invoer

Dit is al wat ons nodig het om 'n gebruiker te laat geregistreer, maar ons moet meer inligting hê. Ons wil weet die tyd wat die gebruiker geregistreer het, hoe laat dit op die webwerf was, 'n paar inligting daaroor, soos 'n biografie, tydsone, ens. Om dit te kan doen, sal ons die modelle.py in albei programme opdateer. Laat ons begin met die redigering van die voermodel. Dit moet nou so lyk:

van django.db -invoermodelle # ... invoer van django.contrib.auth.modelle invoergebruiker klaspos (modelle.model): id = modelle.autofield (primêre_key = true) outeur = modelle.foreignkey (gebruiker, on_delete = modelle.cascade, null = true, blank = true, concely_name = 'posts') # voeg hierdie reël in text = modelle.textfield (standaard = '')
    posts = Post.objects.all() # ... invoer
Voeg hierdie reël by

Let op die tweede reël wat by die lêer gevoeg is. Dit is 'n vreemde sleutel wat elke pos aan 'n enkele gebruiker per pos sal toeskryf, sodat ons kan sorg dat ons die poste op 'n gebruiker-per-gebruiker-basis stoor en dat geen pos gemaak kan word sonder om dit aan 'n gebruiker toe te skryf nie. Ons definieer hierdie vreemde sleutel met die klas wat dit verteenwoordig, 'n delete -argument om te verseker dat poste met gebruikers, nul en leë argumente geskrap word om seker te maak dat ons die gebruiker kan verwyder indien nodig, en om te akkommodeer vir die gebrek aan 'n gebruiker op poste wat ons reeds geskep het, en 'n verwante naam, wat ons kan gebruik om te verwys na die posvoorwerpe wat die gebruiker skep. Hierdie verwante naam, in teenstelling met Post.Author, die skrywer van die pos, gee ons die gebruiker wat die pos self gepos het. Ons kan nou die plasings kry wat 'n gebruiker gemaak het deur user.posts.all () of out author.posts.all () te laat loop.

Laat ons nou ons aanmeldings meer veerkragtig maak. Ons kan ons webwerf reeds baie minder kwesbaar maak vir phishing deur bloot die aantal kere wat ons 'n aanmelding op die webwerf toelaat, te beperk, dit is redelik maklik. Laat ons ook begin om inligting oor elke gebruiker te stoor, terwyl ons voortgaan om ons app te ontwikkel. Redigering van gebruikers/modelle.py, voeg die volgende kode by.

van django.db -invoermodelle van django.contrib.auth.modelle invoergebruiker van django.utils invoer tydsone klasprofiel (modelle.model): gebruiker = modelle.onetOneField (gebruiker, on_delete = modelle.cascade, null = true, blank = true, concely_name = 'profiel') Account_created = Models.DateTimeField (standaard = tydzone.now) last_seen = modelle.DateTimeField (standaard = timezone.now) can_login = modelle.DateTimeField (standaard = tydzone.now) voorkeur_name = modelle.Charfield (max_length = 20, default = '', null = true, blank = true) bio = modelle.textfield (blank = true, default = '')

Let daarop dat hierdie model redelik soortgelyk is aan die POST -model. Ons het 'n addisionele invoer, TimeSone, wat ons in staat sal stel om standaard op die datetime -velde in te stel, en ons het ook 'n karakterfeild en textfield soos die pos. Deur al hierdie tydstempels te gebruik, kan ons die webwerf beveilig en die gebruik daarvan verstaan, en die teksvelde laat ons inligting oor elke gebruiker of outeur op die webwerf lewer. Die OnetOnefield moet die enigste geringe oorweging wees, dit tree presies dieselfde op as 'n voorafgaande, maar slegs een per daaropvolgende model. Op hierdie manier het die gebruiker slegs een profiel, terwyl hulle baie poste het.
mkdir feed/templates
mkdir feed/templates/feed
Laat ons nou ons aanmeld- en registreer -aansigte verbeter om die profiel te verantwoord. Eerstens, wysig gebruikers/views.py en fokus op die registeraansig:

# ... invoer van .vorms invoer userRegisterForm Def Register (versoek): As Request.Method == "Post": vorm = userRegisterForm (versoek.post) As vorm.is_valid (): gebruiker = vorm.save () Profiel.objects.create (gebruiker = gebruiker) # Maak seker dat u hierdie reël byvoeg om 'n profiel vir die gebruiker te skep boodskappe.success (versoek, 'Welkom by die app, {}.'. Formaat (user.userName)) return render (versoek, 'gebruikers/register.html', {'vorm': userRegisterForm})

... invoer
Maak seker dat u hierdie reël byvoeg om 'n profiel vir die gebruiker te skep

Dit skep eenvoudig 'n profiel vir die gebruiker sonder om enige van die inligting in te vul. Nou wil ons seker maak dat die gebruikersrekening nie te gereeld by aangemeld kan word nie, of dat daar ten minste nie te gereeld wagwoorde probeer word nie, so laat ons die aanmeldaansig opdateer.

# ... invoer van .modelle invoerprofiel van django.utils invoer tydsone invoer datetime Def -aanmelding (versoek): As Request.Method == "Post": gebruikersnaam = versoek.post ['gebruikersnaam'] wagwoord = versoek.post ['wagwoord'] gebruiker = verifieer (gebruikersnaam = gebruikersnaam, wagwoord = wagwoord) As user en user.profile.can_login <timezone.now (): # Let daarop dat ons nou kyk of die gebruiker kan aanmeld Auth_login (versoek, gebruiker, backend = 'django.contrib.auth.backends.modelbackend') boodskappe.success (versoek: 'U wagwoord is aanvaar. Gaan voort.') Return Redirect (omgekeer ('voer: voer')) anders: # As die aanmelding nie suksesvol was nie, boodskappe.warning (versoek, 'Gebruikersnaam of wagwoord verkeerd. Probeer asseblief weer.') user = user.objects.filter (gebruikersnaam = gebruikersnaam). First () # Dit is die deel waar ons die gebruikersprofiel opdateer As gebruiker: profiel = user.profile profiel.can_login = timezone.now () + datetime.timedelta (sekondes = 15) # sodat hulle nie vir 'n paar sekondes nie weer kan aanmeld nie profiel.save () return render (versoek, 'gebruikers/login.html', {'vorm': verifikasievorm ()})
python manage.py shell
... invoer

Let daarop dat ons nou kyk of die gebruiker kan aanmeld

As die aanmelding nie suksesvol was nie,
from feed.models import Post
Dit is die deel waar ons die gebruikersprofiel opdateer

Hulle kan dus nie 'n paar sekondes weer aanmeld nie

Dit is die basiese fundamentele van sekuriteit. Maak seker dat die webwerf nie kwesbaar is vir iemand wat bloot elke moontlike wagwoordkombinasie probeer nie, of selfs 'n paar van hulle terselfdertyd. Dit sal nie frustrerend wees vir die gewone gebruiker wat hul wagwoord ken nie en net 'n paar toestelle aanmeld, maar dit sal talle phishing -robotte uit die app hou. Let daarop dat ons 'n IF -stelling bygevoeg het met 'n veranderlike, can_login, wat in die verlede 'n tyd moet wees, en dit opdateer met elke onsuksesvolle aanmelding met dieselfde gebruikersnaam. Op hierdie manier kan 'n kwaadwillige gebruiker 'n wagwoord nêrens so vinnig raai nie. Die aantal sekondes in die datetime.timedelta () kan ook opgedateer word, en die webwerf is meer veerkragtig, maar tog effens minder bruikbaar met meer sekondes. Ek beveel 15 aan om mee te begin.
Post.objects.create(text='hello world')
exit()
Onthou, ons het 'n rugsteunskrip gebou om ons werk te red, so laat ons voortgaan met die wat ons tot dusver het om seker te maak dat ons alles stoor. Voer die opdrag uit:

Sudo -rugsteun

Weereens sal dit u werk tot dusver red. Ek beveel aan dat u gereelde rugsteun doen om u werk te stoor, en u wil selfs outomaties 'n rugsteunwerk doen. U kan dit doen met behulp van 'n UNIX -nut genaamd Cron. Om hierdie nut te aktiveer, voer die volgende opdrag uit en voer u wagwoord in:
from django.urls import path
from . import views

urlpatterns = [
    path('', views.feed, name='feed'),
]
sudo crontab -e

As u nog nie opsie 1 vir Nano gekies het nie, moet die teksredakteur u alreeds vertroud wees, en blaai na die onderkant van die lêer met die pyltjie -sleutels. Voeg die volgende reël by:

0 * * * * sudo rugsteun
from django.urls import include # Cron gebruik die formaat minuut, uur, dag van maand, maand, dag van week, waar 'n * of 'n nommer verteenwoordig wanneer om die opdrag uit te voer. Met behulp van 'n 0 vir die minuut en * vir die res van die opsies, kan ons 'n opdrag op die eerste minuut van elke uur aan die begin van die minuut uitvoer. Dit laat ons die kode outomaties rugsteun. Al Cron se poste as hy met Sudo uitgevoer word, hardloop as wortel, so ons hoef nie elke uur 'n wagwoord in te tik nie.
    # Om dit makliker te maak om ons kode te rugsteun sonder om 'n wagwoord te gebruik, laat ons die wagwoord vir ons rugsteunopdrag deaktiveer. Ons sal dit doen deur die volgende opdrag uit te voer en 'n wagwoord in te voer:
Sudo Visudo

Laat ons nou na die onderkant van die lêer blaai en 'n ander reël byvoeg:

Alles = nopasswd: /bin /rugsteun
backup
Hiermee kan ons die opdrag "rugsteun" as enige gebruiker sonder 'n wagwoord uitvoer. Die formaat hiervoor is maklik, maak net die lyn voor met "All All = Nopasswd:/bin/" en eindig met die opdrag, byvoorbeeld/bin/rugsteun, wat bestaan ​​in/usr/bin/.

Laat ons nou met e -pos begin werk. E -pos is baie belangrik vir webwerwe, want dit is 'n manier om 'n webwerf veiliger te hou, te verifieer dat gebruikers regte mense is en selfs produkte of dienste aan kliënte bemark. Baie mense wat die internet gereeld besoek, kyk daagliks na hul e -pos en ontvang allerhande bemarkings -e -pos oor produkte en dienste waarin hulle belangstel. Daar is 'n paar opsies om e -pos op 'n Django -webwerf moontlik te maak, en u is welkom om te kies wat die beste vir u werk.

Eerstens kan u betaal vir 'n e -posdiens wat u in staat stel om e -pos vanaf u domein te stuur en minimale kode benodig. Daar is baie dienste wat dit aanbied, soos Google Workspace, SendinBlue, Mailgun en meer.
    posts = Post.objects.all() # Andersins kan u van nuuts af u eie e -posdiens binne u bediener bou. Ek beveel hierdie opsie aan, al is dit meer kode en kan dit spesiale aanbiedings benodig. U kan nie waarskynlik 'n e -posbediener vanaf u tuisrekenaar begin nie, so laat ons voortgaan om die konfigurasie en kode te ondersoek om e -pos te stuur voordat ons 'n bediener in die wolk begin en ons eie e -posbediener binne skep.
    if request.method == 'POST': # Eerstens, wysig instellings.py met die volgende opdrag:
        form = PostForm(request.POST) # nano app/instellings.py
        if form.is_valid(): # Waar die app die naam is van die app wat u met StartApp geskep het.
            form.save() # Voeg die volgende reëls by:
        return redirect(reverse('feed:feed')) # Site_name = 'django app'

E -pos_backend = 'django.core.mail.backends.smtp.emailbackend'
E -pos_host = 'localhost'
E -pos_port = 587
E -pos_use_tls = waar
E -pos_address = gebruikersnaam@server.com '
E -pos_host_user = 'gebruikersnaam'
E -pos_host_password = config ['e -pos_host_password']
DEFAULLE_FROM_EMAIL = '{} <{}>'. Formaat (Site_Name, e -pos_host_user)
        'form': PostForm(), # Maak seker dat u dit verander as u gereed is om u app te ontplooi. Ons sal dit later weer besoek. Die e -pos_address -instelling moet die e -pos wees waaruit u wil stuur, en die wagwoord (e -pos_host_password) moet ingestel word op die wagwoord wat u vir die bediener genereer. Ek laai die wagwoord in 'n config -lêer om dit uit die kode te hou met behulp van die volgende logika, bo hierdie reëls in instellings.py:
invoer os voer JSON in met oop ('/etc/config.json') as config_file: config = json.load (config_file)

Dan het ek 'n JSON -lêer opgestel met die config in /etc/config.json met behulp van nano soos volg.

Om die lêer te wysig:

sudo nano /etc/config.json
Voeg die volgende reëls by:

{ "E -pos_host_password": "" }

Ons sal voortgaan om die config -lêer te wysig en al die wagwoorde en sleutels wat ons in die app sal gebruik, by te voeg. Laat ons nou vinnig ondersoek hoe om e -pos met Python te stuur. Laat ons eerstens 'n sjabloon skep vir 'n verifikasie -e -pos wat ons aan ons gebruikers kan stuur, en dit in die gebruikersjabloongids kan plaas. Hierdie sjabloon sal in HTML geskryf word.

nano -gebruikers/sjablone/gebruikers/verifikasie_email.html

Django -app - Verifieer u e -posadres Liewe {{user.userName}}, Klik hier om u e -pos te verifieer. Alternatiewelik kan u die volgende skakel in die adresbalk van u blaaier plak: {{BASE_URL}} { % url 'Gebruikers: aktiveer' UIDB64 = uid token = token %} Die skakel sal binne 30 minute verval. As u nie 'n verifikasie -e -pos aangevra het nie, kan u hierdie e -pos eenvoudig ignoreer. Sien jou daar, Daisy

Hierdie e -pos is redelik eenvoudig. Dit neem 'n konteks van 'n gebruiker, die basis -URL vir die webwerf, en 'n gebruikers -ID en teken wat gebruik word om die e -pos van die gebruiker te verifieer. Definieer die basis -URL in instellings.py voordat ons 'n Python -kode skryf om die sjabloon weer te gee. Gaan voort en voeg die volgende reëls by App/Instellings.py, naby die begin.Site_name = 'django app' Protokol = 'https' Domein = 'voorbeeld.com' Base_url = protokol + ': //' + domeinUiteindelik, wanneer u webwerf gereed is vir die internet en u dit ontplooi, sal u u domein wil definieer as die domeinnaam wat u koop om die webwerf te verteenwoordig. Dit is die naam wat u in die Navbar sal tik om toegang tot u webwerf te kry. Vir nou kan u die domein leeg laat of 'n plekhouer gebruik. U sal ook die webwerf van die webwerf wil verander na 'n naam wat u wil gee, van u keuse.

Voordat ons e -pos stuur, laat ons 'n token -kragopwekker skep, sodat ons 'n rekeningaktiveringstoken kan hê wat nooit verval nie. Ons kan dit doen deur 'n rekeningaktiveringstoken op te bou en in te voer wat soos die volgende lyk. Wysig die lêer:

nano -gebruikers/tokens.py

Voeg die volgende kode by:

van django.contrib.auth.tokens Invoer wagwoordresettokenGenerator invoer ses invoer Klas TokenGenerator (wagwoordResettokEngenerator): def _make_hash_value (self, gebruiker, tydstempel): terugkeer ( Six.Text_Type (user.pk) + ses.text_type (tydstempel) ) Account_activation_token = tokenGenerator () UNSubscribe_token = tokenGenerator ()

Hierdie basiese tokengenerator genereer 'n teken dat ons die gebruiker in 'n URL kan stuur en die gebruiker kan gebruik om hul e -pos te verifieer en hul rekening te aktiveer.
Kom ons kyk hoe om 'n e -pos te stuur. Gebruik nano, wysig gebruikers/e -pos.py.

nano -gebruikers/e -pos.py

Die stuur van die verifikasie HTML -e -pos sal so lyk:

van django.contrib.auth invoer get_user_model van django.utils.http Import urlsafe_base64_encode, urlsafe_base64_decode van django.contrib.sites.shortcuts invoer get_current_site van django.core.mail invoer send_mail van django.template.loader invoer render_to_string van django.utils.coding Import Force_bytes van django.core.mail invoer e -posmultialternatives van django.shortcuts invoer lewer van .tokens invoer rekening_aktivering_token van django.template.loader invoer render_to_string van django.utils.html invoer strip_tags Vanaf django.template invoer sjabloon, konteks van django.conf invoerinstellings voer Traceback in def send_verification_email (gebruiker): Gebruiker = get_user_model () Mail_subject = '[{}] aktiveer u rekening.'. Formaat (instellings.site_name) html_message = render_to_string ('gebruikers/verifikasie_email.html', { 'gebruiker': gebruiker, 'domein': instellings.domain, 'protokol': 'https', 'uid': urlsafe_base64_encode (force_bytes (user.pk)), 'token': account_activation_token.make_token (gebruiker), }) send_html_email (gebruiker, mail_subject, html_message)

Dit is redelik eenvoudig. Ons voer die funksies in wat ons nodig het om die e -pos te stuur, die e -pos met sjablone en ons instellings te lewer, en dan definieer ons die e -pos met die naam van die sjabloon en stuur dit na die gebruiker met behulp van 'n funksie. U sal sien dat ons nog nie die funksie gedefinieer het om die e -pos, send_html_email te stuur nie, so kom ons skryf dit onder die kode wat ons reeds by gebruikers/e -pos.py gevoeg het
pip install django-crispy-forms
def send_html_email (gebruiker, mail_subject, html_message): na_email = user.email gebruikersnaam = gebruiker.userName As To_email == '': NIEMAND terug nie unsub_link = instellings.base_url + user.profile.create_unsubscribe_link () html_message = html_message + "UNSubscribe" msg = e-posmultialternatives (mail_subject, strip_tags (html_message), instellings.default_from_email, [to_email], headers = {'list-unsubscribe': '<' + unub_link + '>'},) msg.attach_alternative (html_message, "teks/html") profiel = user.profile Probeer: msg.send (fail_silenty = onwaar) indien nie profiel.email_valid: profiel.email_valid = waar profiel.save () Behalwe: profiel.email_valid = onwaar profiel.save ()

Dit is 'n bietjie meer ingewikkeld, en ons is nog nie gereed om al hierdie kode uit te voer nie. Let op dat ons 'n unsub_link definieer, die skakel wat die gebruiker kan gebruik om uit ons e -pos te teken. Dit is belangrik, want gebruikers sal ons e -posse moet kies, tensy hulle dit te eniger tyd wil sien. Ons voeg ook 'n teksalternatief vir ons boodskap, wat die HTML -boodskap is wat van HTML -etikette gestroop is. Laastens kyk ons ​​of die e -pos gestuur is, en of dit nie so is nie, merk ons ​​die profiel van die gebruiker dat hul e -pos nie geldig is nie.

Kom ons gaan terug na die gebruikersmodelle sodat ons dit alles kan laat werk. Ons moet 'n funksie definieer om 'n skakel na uit te teken, en 'n Boole -veld te definieer om te merk dat die e -pos van die gebruiker nie geldig is nie.
    # Voeg eers die volgende invoer aan die bokant van gebruikers/modelle.py
nano -gebruikers/modelle.py

#… van django.core. onderteken die invoer -tydstempel, BadSignature, Signature Expired Vanaf django.urls voer omgekeerde in

...
Laat ons nou funksies by die gebruikersmodel voeg om die teken te maak en die token te kontroleer wat gebruik word om die e -pos te aktiveer, sowel as die veld om te stoor of die gebruiker hul pos suksesvol ontvang. Voeg die volgende kode weer by gebruikers/modelle.py aan die einde van die model (ingedrukte kode)

#… e -pos_valid = modelle.booleanfield (standaard = waar) def mak_token (self): return timestampsigner (). teken (self.user.userName) def check_token (self, teken): Probeer: sleutel = '%s:%s'%(self.user.userName, token) TimesTampSigner (). Unsign (sleutel, max_age = 60 * 60 * 24 * 30) # geldig vir 30 dae Behalwe (BadSignature, Signature Expired): Naal terug Wys waar def create_unsubscribe_link (self): gebruikersnaam, token = self.make_token (). split (":", 1) Return Reverse ('Gebruikers: UNSubScribe', kwargs = {'gebruikersnaam': gebruikersnaam, 'token': token,})

...

Geldig vir 30 dae

Dit is redelik eenvoudig; ons gebruik 'n tydstempel -signer, wat 'n basiese kriptografie -instrument is, om 'n teken te skep wat na 'n sekere tyd sal verval, en ons gebruik ook 'n ander funksie om te kyk of dit geldig is. Ons gebruik hierdie tokens twee keer, een keer om die e -pos te verifieer, en een keer vir 'n skakel wat u nie opskryf nie.

Noudat ons dit het, is die laaste van die werk wat ons moet doen, in die sienings. Laat ons kyke na die e -posadres en om uit te teken, binne gebruikers/views.py.

nano -gebruikers/views.py
python manage.py startapp users
Voeg eers die volgende invoer by. Ek het 'n paar ekstra ingegooi, sodat ons nie later weer meer items hoef in te voer nie.

van django.contrib.auth invoer -uitmelding Vanaf django.shortcuts invoer, herleiding, get_object_or_404 van django.contrib.auth.modelle invoergebruiker van django.utils.coding Import Force_str van django.utils.http Import urlsafe_base64_encode, urlsafe_base64_decode voer JSON in Voer versoeke in invoer datetime, traceback van django.contrib -invoerboodskappe van .modelle invoerprofiel van django.utils invoer tydsone van django.views.decorators.cache Import Never_cache Vanaf. e -pos invoer send_verification_email # Maak seker dat u die verifikasie -e -pos stuurfunksie invoer van django.contrib.auth.decorators invoer login_required van django.contrib.auth.mixins invoer loginrequiredMixin, userPassestestStmixin van django.utils.decorators invoermetode_decorator Vanaf django.http invoer httpresponseredirect van django.conf invoerinstellings van django.utils invoer tydsone invoer datetime invoer pytz van django.views.decorators.csrf invoer csrf_rexemp van django.http invoer httpresponse van django.contrib.auth.tokens invoer default_token_generator van django.utils.http urlsafe_base64_decode van .tokens invoer rekening_aktivering_token

Maak seker dat u die verifikasie -e -pos stuurfunksie invoer

Miskien het u al 'n paar van hierdie invoere, maar dit is nie seer om dit te herhaal nie. U sal die verifikasie -e -pos stuurfunksie moet invoer, sowel as Account_Activation_Token van gebruikers.Tokens, onder andere.

Voeg die volgende kode aan die onderkant van die lêer by:

def uitskryf (versoek, gebruikersnaam, teken): gebruiker = get_object_or_404 (gebruiker, gebruikersnaam = gebruikersnaam) if ((request.user.is_authenticated en request.user == gebruiker) of user.profile.check_token (token)): # Skrip hulle uit profiel = user.profile profiel.subscribed = onwaar profiel.save () return render (versoek, 'gebruikers/uitteken.html') # Andersins herlei na aanmeldbladsy boodskappe.warning (versoek, f'y u UNSubscribe -skakel het verval. Meld asseblief aan om uit te teken. ') next_url = reverse ('gebruikers: uitteken', kwargs = {'gebruikersnaam': gebruikersnaam, 'token': token,}) opbrengs httpresponeredirect ('%s? next =%s'%(omgekeer ('login'), next_url)) def aktiveer (versoek, uidb64, token): Probeer: uid = force_str (urlsafe_base64_decode (uidb64)) gebruiker = user.objects.get (pk = uid) Behalwe (TypeError, ValueError, OverflowerRor, User.DoesNotexist): Gebruiker = Geen ip = get_client_ip (versoek) As die gebruiker nie niemand is nie en Account_activation_token.check_token (gebruiker, token): user.profile.email_verified = true user.profile.save () user.save () # sendWelCoMail (versoek, gebruiker) boodskappe.success (versoek, f'denk vir die bevestiging van u e -pos! U kan nou by u rekening aanmeld, en 'n welkome e -pos is aan u gestuur. ') return Redirect (user.profile.create_face_url ()) anders: boodskappe.success (versoek, f'y -aktiveringsskakel het verval. Vra 'n nuwe aktiveringsskakel aan. ') Return Redirect ('Verifieer: verifieer') def resend_activation (versoek): As Request.Method == 'Post': vorm = resendActiVationEMailForm (versoek.post) e -pos = versoek.post ['e -pos'] Probeer: gebruiker = user.objects.get (e -pos = e -pos) send_verification_email (gebruiker) boodskappe.success (versoek, 'U verifikasie -e -pos gestuur. Klik op die skakel in u e -pos om u rekening te verifieer.') Return Redirect (omgekeer ('Verifieer: verifieer')) Behalwe: boodskappe.warning (versoek, u e -pos is nie korrek nie. Probeer asseblief weer. ') anders: vorm = resendactivationemailform () return render (versoek, 'gebruikers/resend_activation.html', {'vorm': vorm, 'titel': 'Resend Activation', 'Small': True})

teken hulle uit
        username = request.POST['username'] # Andersins herlei na aanmeldbladsy
        password = request.POST['password'] # SendWelComeMail (versoek, gebruiker)
Dit is baie kode. Kom ons breek dit af. Die eerste funksie, skoon en eenvoudig, skryf die gebruiker uit die poslys uit. Die tweede funksie aktiveer hul e -pos, en u sal agterkom dat ek 'n kommentaar -funksie bygevoeg het, SendWelMeAmail. U is welkom om 'n e -pos -sjabloon en funksie -definisie te gebruik om 'n welkome e -pos te stuur, ek het nog nie. Die laaste funksie wat ek ingegooi het, is belangrik, want aktiverings -e -posse verval. Daarom sal ons die aktivering van die aktivering sommige van die tyd moet weergee. Ons kan 'n basiese vorm hiervoor gebruik en die funksie noem om die verifikasie -e -pos te stuur. Voordat ons dit doen, laat ons seker maak dat dit in die eerste plek gestuur word deur 'n funksie -oproep by die registeraansig te voeg. Voeg hierdie reël by net voor die herleiding in die Register View, DEF -register, in gebruikers/views.py.

nano -gebruikers/views.py

# ... (na) Def Register (versoek): send_verification_email (gebruiker) # ... (voor) herlei (
mkdir users/templates
mkdir users/templates/users
... (Na) Def Register (versoek):

... (voor) herlei (

U hoef nie die eerste en laaste reëls in die kode -stuk by te voeg nie, maak net seker dat die registeraansig die verifikasie -e -pos aan die gebruiker stuur. Dit moet so lyk:
nano users/templates/users/login.html
# ... invoer van .vorms invoer userRegisterForm Def Register (versoek): As Request.Method == "Post": vorm = userRegisterForm (versoek.post) As vorm.is_valid (): gebruiker = vorm.save () send_verification_email (gebruiker) # Maak seker dat u hierdie reël byvoeg! boodskappe.success (versoek, 'Welkom by die app, {}.'. Formaat (user.userName)) return render (versoek, 'gebruikers/register.html', {'vorm': userRegisterForm})

... invoer

Maak seker dat u hierdie reël byvoeg!
Nou sal ons 'n vorm moet byvoeg om die aktiverings -e -pos weer te gee. Voeg die volgende vorm by gebruikers/vorms.py by:

# ... (invoer) Klas ResEndactiVationEMailForm (Forms.form): e -pos = vorms.emailfield (vereis = waar)

... (invoer)
Ons sal ook 'n sjabloon benodig wat ooreenstem met hierdie resend -e -posaktiveringsvorm. Kom ons voeg hierdie sjabloon in. Wysig die lêer:

nano -gebruikers/sjablone/gebruikers/resend_activation.html

Voeg dan die volgende kode by die lêer.
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']
{ % brei 'basis.html' %} { % blokinhoud %} { % laai Crispy_forms_tags %} { % csrf_token %} Resend aktiverings -e -posadres {{vorm | bros}} Resend aktiverings -e -posadres { % EndBlock %}

Whew, dit is baie! As ons die kode na ons bediener ontplooi, sal ons HTML -e -pos kan stuur en gebruikersrekeninge met 'n klik in die e -pos kan aktiveer. Ons wil miskien ook 'n eenvoudige welkome e -pos stuur, so kom ons kyk hoe om dit te doen. Terug in gebruikers/e -pos.py, voeg die volgende kode by:

Def SendWelComaMail (gebruiker): Gebruiker = get_user_model () html = open ('{}/gebruikers/welkom_email.html'.format (settings.base_dir)). lees () onderwerp = 'welkom by' + instellings.site_name + ', {{gebruikersnaam}}!' sjabloon = sjabloon (html) subjTemplate = sjabloon (onderwerp) konteks = konteks ({'gebruikersnaam': user.userName, 'base_url': instellings.base_url, 'model_name': 'Daisy Holton,' Site_name ': instellings.site_name}) renderedTemplate = template.render (konteks) subjContext = konteks ({'gebruikersnaam': user.UserName}) subjrenderedTemplate = subjTemplate.render (subjContext) send_html_email (gebruiker, subjrenderedTemplate, renderedTemplate)

Ons het ook 'n sjabloon nodig om al hierdie inligting te lewer. Op my webwerf lyk die sjabloon soos hieronder, maar u is welkom om dit te formateer soos u wil.

Welkom by {{site_name}} Hallo {{gebruikersnaam}}, Ons is bly om u hier te sien! Dankie dat u by {{site_Name}} aangesluit het en 'n deel van die pret was. Hier is 'n paar dinge wat u kan doen nadat u u identiteit verifieer. Gebruik die app. Dit is die hoofblad van {{site_name}} Besoek my privaat {{site_name}} profiel. Dit is 'n bladsy vir almal wat my wil leer ken. Meer profiele. U kan hierdie mense op die webwerf vind en hul inhoud sien. Sien alle plasings hier. Dit is die privaat voorblad van {{site_name}}. Daar is nog meer op die webwerf, so voel vry om te besoek en te kyk wat u vind. U kan die webwerf met enige van die sosiale knoppies op elke bladsy deel. Ek hoop dat u u tyd geniet met {{site_name}}! Dankie dat u hier was. Met baie liefde, {{model_name}} {{BASE_URL}}
# Let daarop dat ons nie 'n sluitingsliggaam of HTML -etikette het nie, want ons voeg dit in wanneer ons die HTML -intekenaar -skakel byvoeg. Dit is belangrik, maar ons wil dit nie twee keer definieer nie.
So, wat is volgende? Ons het 'n lang pad gekom. Ons moet regtig gereed wees om die webwerf na 'n bediener te ontplooi. Ons kan die @login_required versierder byvoeg en ons sienings veilig maak, gebruikersaanmeldings neem, e -posadres stuur en inligting oor die kas stuur, wat die basis vorm van wat 'n webwerf moet doen om relevant te bly. Ons sal 'n paar meer nuttige funksies byvoeg, en dan 'n basis bou vir die ontplooiing van ons kode op 'n afstandbediener, die opstel van 'n e -posbediener, domeinkonfigurasie en filters om ons webwerf veilig en toepaslik te maak.

Ons het ook 'n wagwoord vir die herstel van die wagwoord nodig, so laat ons dit vinnig vinnig byvoeg. Django se ingeboude wagwoord Reset View is in sommige funksies gebreek, maar ons sal kyk hoe ons ons eie aansig, e -pos -sjabloon, vorms en URL -patrone kan skryf. Hier is hoe die uitsig lyk, in gebruikers/views.py

#... invoer van django.contrib.auth.tokens invoer default_token_generator van django.contrib.auth.forms invoer setpasswordform van django.utils.http urlsafe_base64_decode DEF PASWORD_RESET (versoek, UIDB64, token): gebruiker = get_object_or_404 (gebruiker, id = urlsafe_base64_decode (UIDB64)) As Request.Method == 'Post': vorm = setpasswordform (gebruiker, versoek.post) As vorm.is_valid () en default_token_generator.check_token (gebruiker, token): vorm.save () boodskappe.success (versoek, 'U wagwoord is herstel.') Elif nie vorm.is_valid (): boodskappe.warning (versoek: 'U wagwoorde stem nie ooreen nie, of voldoen nie aan die vereistes nie. Probeer asseblief weer.') Return Redirect (versoek.path) anders: boodskappe.warning (versoek: 'U skakel met die herstel van die wagwoord het verval. Skep asseblief 'n nuwe een.') return Redirect (omgekeer ('Gebruikers: login')) return render (versoek, 'gebruikers/wagwoord_reset_confirm.html', { 'titel': 'Herstel u wagwoord', 'vorm': setPasswordForm (gebruiker)
from django.db import models # ... invoer
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Hierdie vorm is ingebou in Django, maar ons het 'n sjabloon nodig om die wagwoord te bevestig, gebruikers/sjablone/gebruikers/wagwoord_reset_confirm.html
{ % brei 'basis.html' %} { % laai Crispy_forms_tags %} { % blokinhoud %} { % csrf_token %} Stel wagwoord terug {{vorm | bros}} Stel wagwoord terug { % Endblock -inhoud %}

Ons het ook 'n sjabloon om 'n e -pos met 'n eenvoudige vorm, met 'n eenvoudige vorm, in gebruikers/sjablone/gebruikers/wagwoord_reset.html te stuur

{ % brei 'basis.html' %} { % laai Crispy_forms_tags %} { % blokinhoud %} { % csrf_token %} Stel wagwoord terug {{vorm | bros}} Versoek wagwoord herstel { % Endblock -inhoud %}

Die sjabloon vir die e -pos self is eenvoudig; dit is 'n basiese HTML -lêer wat 'n skakel weergee om die wagwoord terug te stel, in gebruikers/sjablone/gebruikers/wagwoord_reset_email.html. Django sal hierdie lêer outomaties interpreteer.

Uglek - Stel u wagwoord terug Hallo, Klik hier om u wagwoord terug te stel. Alternatiewelik kan u die volgende skakel in u blaaier plak: https://uglek.com { % url 'wagwoord_reset_confirm' uidb64 = uid token = token %} As u nie 'n wagwoord vir 'n wagwoord gevra het nie, kan u hierdie e -pos eenvoudig ignoreer. Dankie dat u by ons aangesluit het, Daisy
from django.db import models
from django.contrib.auth.models import User
from django.utils import timezone

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null=True, blank=True, related_name='profile')
    account_created = models.DateTimeField(default=timezone.now)
    last_seen = models.DateTimeField(default=timezone.now)
    can_login = models.DateTimeField(default=timezone.now)
    preferred_name = models.CharField(max_length=20,default='', null=True, blank=True)
    bio = models.TextField(blank=True, default='')
Ons het ook nog twee sjablone nodig. Die eerste is om te bevestig dat die e -pos gestuur is. Uitsigte hiervoor is reeds in Django, so ons moet dit net in die URLS.py aanspreek. Hierdie sjabloon is by gebruikers/sjablone/gebruikers/wagwoord_reset_done.html geleë

{ % brei 'basis.html' %} { % blokinhoud %} 'N E -pos is gestuur met instruksies om u wagwoord terug te stel. { % Endblock -inhoud %}

En laastens, om te bevestig dat die wagwoord van die wagwoord voltooi is, gebruikers/sjablone/gebruikers/wagwoord_reset_complete.html

{ % brei 'basis.html' %} { % blokinhoud %} U wagwoord is ingestel. Meld hier aan { % Endblock -inhoud %}

Nou benodig ons URL -patrone vir hierdie sienings. Voeg die volgende URL -patrone by gebruikers/urls.py by:
# urlpatterns = [
    #... vorige URL's hier
    pad ('wagwoord-reset/',
         autor
             template_name = 'gebruikers/wagwoord_reset.html',
             html_email_template_name = 'gebruikers/wagwoord_reset_html_email.html'
         ),
         naam = 'wagwoord_reset'),
    pad ('wagwoord-reset/done/',
         autor
             template_name = 'gebruikers/wagwoord_reset_done.html'
         ),
         naam = 'wagwoord_reset_done'),
    pad ('wagwoord-reset-confirm ///',
         autor
             template_name = 'gebruikers/wagwoord_reset_confirm.html'
         ),
         naam = 'wagwoord_reset_confirm'),
    pad ('Wagwoord-reset-volledige/',
         autor
             template_name = 'gebruikers/wagwoord_reset_complete.html'
         ),
         naam = 'wagwoord_reset_complete'),
]
            Profile.objects.create(user=user) # ... Vorige URL's hier
Vier sjablone, dit is baie! Maar nou kan ons seker wees dat ons die gebruiker se wagwoord kan herstel wanneer ons dit nodig het, alles vanaf die webblaaier.

Ek verstaan ​​dat dit baie kode is. As dit 'n bietjie oor jou kop lyk, is dit in orde. U sal verbeter, u begrip sal verbeter, en u sal binnekort baie bekwaam wees met die kode. As u heeltemal verlore is, beveel ek aan dat u later terugkom na hierdie sagteware nadat u aan 'n self-tempo geleer het om kursus aanlyn te kodeer. Dit is gewoonlik gratis om aan die gang te kom, en sal u lei deur alles wat u nodig het om suksesvol te wees as u terugkom na hierdie projek. As u voel dat u gereed is om voort te gaan, verder te lees, sal ons u kode na 'n afgeleë bediener bespreek en 'n e -posbediener opstel, sowel as u implementering met behulp van bash outomatiseer, sodat u altyd 'n nuwe projek met 'n paar eenvoudige opdragte kan opstel.

Die laaste ding wat ons moet doen voordat ons na 'n afgeleë bediener ontplooi, is om ons webwerf 'n bietjie veiliger te maak. U sal sien dat die aanmelduitsig slegs 'n gebruikersnaam en wagwoord neem, en dat daar geen multifaktorverifikasie of een tydkode is nie. Dit is 'n maklike oplossing, en met dieselfde kode kan ons ons webwerf sms -boodskappe laat stuur en selfs reageer op sms -boodskappe wat na die bediener gestuur word. Om mee te begin, gaan ons terug na die gebruikersmodelle en voeg 'n tydstempel -ondertekenaar by wat elke aanmelding sal voorstel. Ons sal ook 'n unieke, roterende identifiseerder by die gebruikersmodel voeg wat gebruik sal word om ekstra sekuriteit by ons aanmelding te voeg. Die gebruikersmodelle, gebruikers/modelle.py, redigeer, voeg die volgende kode by:
# van django.db -invoermodelle
van django.contrib.auth.modelle invoergebruiker
van django.utils invoer tydsone
# Maak seker dat u die UUID, tydstempel -ondertekenaar en URL -kragopwekker (omgekeer) invoer
Invoer UUID
van django.core. onderteken die invoer -tydstempel, BadSignature, Signature Expired
Vanaf django.urls voer omgekeerde in

klasprofiel (modelle.model):
    gebruiker = modelle.onetOneField (gebruiker, on_delete = modelle.cascade, null = true, blank = true, concely_name = 'profiel')
    Account_created = Models.DateTimeField (standaard = tydzone.now)
    last_seen = modelle.DateTimeField (standaard = timezone.now)
    can_login = modelle.DateTimeField (standaard = tydzone.now)
    voorkeur_name = modelle.Charfield (max_length = 20, default = '', null = true, blank = true)
    bio = modelle.textfield (blank = true, default = '')
    # Voeg hierdie kode hier by
    uid = modelle.Charfield (max_length = 32, standaard = uUID.UUID4, null = waar, blank = true)
    mfa_enabled = modelle.booleanfield (standaard = onwaar)
    Akaat_mfa = modelle.booleanfield (standaard = onwaar)
    Phone_Number = Models.Charfield (standaard = '', null = true, blank = true, max_length = 15)
    verifikasie_code = modelle.Charfield (standaard = '', null = true, blank = true, max_length = 15)
    verifikasie_code_length = modelle.Integerfield (standaard = 6)
    mfa_code_expires = modelle.DateTimeField (standaard = timezone.now)
    MFA_ATTEMPTS = modelle.Integerfield (standaard = 0)

    def mak_auth_token (self):
        return TimeStampSigner (). teken (self.uid)

    # En voeg hierdie funksie by
    def create_auth_url (self):
        gebruikersnaam, token = self.make_auth_token (). split (":", 1)
        return reverse ('gebruikers: mfa', kwargs = {'gebruikersnaam': gebruikersnaam, 'token': token,})

    def check_auth_token (self, teken):
        Probeer:
            sleutel = '%s:%s'%(self.uid, teken)
            TimesTampSigner (). Unsign (sleutel, max_age = 60 * instellings.auth_valid_minutes) # Geldig vir 3 minute
        Behalwe (BadSignature, Signature Expired):
            Naal terug
        Wys waar
        if user and user.profile.can_login < timezone.now(): # Maak seker dat u die UUID, tydstempel -ondertekenaar en URL -kragopwekker (omgekeer) invoer
        else: # Voeg hierdie kode hier by
            user = User.objects.filter(username=username).first() # En voeg hierdie funksie by
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Geldig vir 3 minute
Maak seker dat u gebruikers/modelle.py so lyk, behalwe die opmerkings (kode op die reëls met #). As u dit afbreek, is dit eenvoudig. Ons het 'n paar invoere, 'n tydstempel -siganger, wat 'n kriptografiese nut is wat 'n veilige kode kan genereer en dit kan verifieer om seker te maak dat dit geldig is, slegs een keer gebruik is, en nie ouer as 'n sekere aantal sekondes nie. Ons gebruik ook 'n UUID, wat 'n unieke identifiseerder is wat ons gebruiker identifiseer in die ondertekening van die teken, en in die URL waar die token aan die gebruiker gestuur word. Ons sal hierdie basiese kriptografie gebruik om 'n twee -faktor -verifikasie -aansig te bou. Voordat ons iets anders doen, laat ons die migrasies uitvoer, sodat ons gebruikersmodelle opgedateer word. Voer die volgende opdragte in die gids met bestuur.py om die migrasies te maak en te voltooi.

bron venv/bin/aktiveer Python Manage.py Makemigrations && Python Manage.py Migrate

Dit is belangrik, want elke keer as ons veranderings aan die modelle aanbring, moet ons die tabelle skep en die databasis met verstekke opdateer voordat ons die modelle kan gebruik.

Laat ons nou ons aanmelduitsig improviseer om na 'n sekondêre verifikasie -aansig te herlei. Verwyder die aanmeldfunksie in gebruikers/views.py en herlei na die URL wat ons pas in die gebruikersmodelle gegenereer het.

# ... invoer Def -aanmelding (versoek): As Request.Method == "Post": gebruikersnaam = versoek.post ['gebruikersnaam'] wagwoord = versoek.post ['wagwoord'] gebruiker = verifieer (gebruikersnaam = gebruikersnaam, wagwoord = wagwoord) As user en user.profile.can_login <timezone.now (): # Let daarop dat ons nou kyk of die gebruiker kan aanmeld # Verwyder die autor boodskappe.success (versoek: 'U wagwoord is aanvaar. Gaan voort.') As user.profile.mfa_enabled: return Redirect (user.profile.create_auth_url ()) # OPMERKING Ons herlei hier na 'n nuwe URL Anders: # As die gebruiker nie Mutli-Factor Authentication gebruik nie, moet u dit net aanmeld. Auth_login (versoek, gebruiker, backend = 'django.contrib.auth.backends.modelbackend') Return Redirect ('voer: voer') anders: # As die aanmelding nie suksesvol was nie, boodskappe.warning (versoek, 'Gebruikersnaam of wagwoord verkeerd. Probeer asseblief weer.') user = user.objects.filter (gebruikersnaam = gebruikersnaam). First () # Dit is die deel waar ons die gebruikersprofiel opdateer As gebruiker: profiel = user.profile profiel.can_login = timezone.now () + datetime.timedelta (sekondes = 15) # sodat hulle nie vir 'n paar sekondes nie weer kan aanmeld nie profiel.save () return render (versoek, 'gebruikers/login.html', {'vorm': verifikasievorm ()})
sudo backup
... invoer

Let daarop dat ons nou kyk of die gebruiker kan aanmeld

Verwyder die autor
sudo crontab -e
Let daarop dat ons hier na 'n nuwe URL herlei

As die gebruiker nie multifaktor-verifikasie gebruik nie, moet u dit net aanmeld.

As die aanmelding nie suksesvol was nie,
0 * * * * sudo backup
Dit is die deel waar ons die gebruikersprofiel opdateer

Hulle kan dus nie 'n paar sekondes weer aanmeld nie

Dit is dus redelik eenvoudig, ons het nou 'n manier om na die twee faktor -verifikasie -aansig te herlei wanneer ons dit skep. Ons het ook 'n terugslag vir die geval dat die gebruiker nie 'n telefoonnommer bygevoeg het nie. Ons sal 'n basiese aansig byvoeg om binnekort 'n telefoonnommer by te voeg en binnekort met 'n SMS aan te meld.

Eerstens het ons 'n maklike manier nodig om 'n SMS -boodskap uit ons kode te stuur. Om dit te kan doen, kan ons kies uit 'n aantal API's, maar die maklikste is na my mening Twilio. Dit bied ook goeie pryse vir kleiner projekte, sowel as grootmaatafslag. Skep 'n rekening op Twilio.com, vul 'n paar besonderhede oor u projek in, koop 'n telefoonnommer en kopieer u API -sleutels na u instellings.py. Voeg dan hierdie kode by onder 'n nuwe lêer, gebruikers/sms.py.

nano -gebruikers/sms.py
sudo visudo
# Voer al die nodige pakkette in van django.utils invoer tydsone invoer willekeurig invoer datetime van django.conf invoerinstellings Van Feed.Middleware invoer get_current_request van django.contrib -invoerboodskappe voer Traceback in rekening_sid = instellings.twilio_account_sid autor bron_phone = settings.phone_Number # Hierdie kode stuur die teks met Twilio def send_text (teiken_phone, teks): van Twilio.rest Import -kliënt Probeer: client = client (Account_sid, Auth_token) As len (teiken_phone)> = 11: boodskap = client.messages.create ( TO = Target_Phone, van_ = bron_phone, liggaam = teks) Behalwe: druk (traceback.format_exc ()) # 'N Helperfunksie om 'n nommer met soveel syfers te kry def get_num_length (num, lengte): n = '' vir x in reikafstand (lengte): n = n + str (num) terugkeer int (n) # Stuur die teks om die gebruiker te verifieer def send_verification_text (gebruiker): lengte = gebruiker.profile.verification_code_length kode = ewekansig.randint (get_num_length (1, lengte), get_num_length (9, lengte)); user.profile.verification_code = kode user.profile.mfa_code_expires = timezone.now () + datetime.timedelta (minute = 3) user.profile.save () send_user_text (gebruiker, "u verifikasiekode vir {} is {}". formaat (instellings.site_name, str (kode))) # Stuur 'n gebruiker enige teks met hierdie funksie def send_user_text (gebruiker, teks): send_text (user.profile.phone_number, teks) # Valideer die kode met hierdie funksie def check_verification_code (gebruiker, kode): user.profile.mfa_attempts += 1 resultaat = user.profile.verification_code! = geen en kode! = '' en user.profile.verification_code == kode en gebruiker.profile.mfa_code_expires> timezone.now () en user.profile.mfa_attempts <= 3 As user.profile.mfa_attempts <3 en resultaat: user.profile.verification_code_length = 6 elif user.profile.mfa_attempts> 2 en nie resultaat nie: user.profile.verification_code_length = 8 user.profile.save () terugkeer resultaat # Valideer die tyd def check_verification_time (gebruiker): resultaat = user.profile.mfa_code_expires> timezone.now () terugkeer resultaat

Voer al die nodige pakkette in

Hierdie kode stuur die teks met Twilio
ALL ALL=NOPASSWD: /bin/backup
'N Helperfunksie om 'n nommer met soveel syfers te kry

Stuur die teks om die gebruiker te verifieer

Stuur 'n gebruiker enige teks met hierdie funksie

Valideer die kode met hierdie funksie

Valideer die tyd

Maak seker dat u u instellings toepaslik verander, en voeg hierdie reëls by u sleutels by:

# Maak seker dat u dit vanaf u Twilio Dashboard kopieer Twilio_account_sid = "" Twilio_auth_token = "" Telefoon_number = "" Site_name = "" Auth_valid_minutes = 3 # Die aantal minute Die TFA

Sorg dat u dit vanaf u Twilio Dashboard kopieer

Die aantal minute Die TFA -bladsy is aktief sodra dit geïnisieer is

Eerstens sal ons vorms benodig vir ons twee faktore -verifikasie -sienings. Redigering van gebruikers/vorms.py, voeg die volgende kode by.

# ... invoer van Django -invoervorms # 'N vorm om ons telefoonnommer in te voer klas PhonenumberForm (Forms.form): phone_number = forms.regexfield (regex = r '^\+? 1? \ d {9,15} $', fout_messages = {'ongeldig': "Telefoonnommer moet in die formaat ingevoer word: '+999999999'. Tot 15 Digits word toegelaat."}) def __init __ (self, *args, ** kwargs): super (Phonenumberform, self) .__ init __ (*args, ** kwargs) self.fields ['phone_number']. label = phone_number_label # 'N vorm om te verifieer klas tfaform (vorms.form): kode = vorms.Ingerfield (vereis = onwaar) def __init __ (self, *args, ** kwargs): super (tfaform, self) .__ init __ (*args, ** kwargs) self.fields ['code']. widget.attrs.update ({'autoComplete': 'off'}) help_texts = { 'Kode': 'Voer asseblief die ses -syfer -kode in nadat u dit met die knoppie hierbo na u foon gestuur het.' }
nano app/settings.py
... invoer

'N vorm om ons telefoonnommer in te voer

'N vorm om te verifieer

Laat ons nou die aansigte in gebruikers/views.py skep

# ... invoer Vanaf django.http invoer httpresponseredirect Van. Vorms invoer PhonenumberForm, TFAForm def mfa (versoek, gebruikersnaam, token): user = user.objects.filter (profiel__UUID = userName). First () Indien nie gebruiker nie: gee httpResponSerEdirect (omgekeer ('verifieer: ouderdom') + 'terug? next =' + request.get.get ('next') indien versoek.get.get ('next') anders '/go/' if request.user.is_authenticated en request.user.profile.vendor anders '/' indien versoek.user. gebruiker = get_object_or_404 (gebruiker, profiel__UUID = gebruikersnaam) next = request.get.get ('next', '') Indien nie gebruiker.profile.mfa_enabled: Indien nie, check_verification_time (gebruiker): user.profile.mfa_enabled = onwaar user.profile.enable_two_factor_authentication = true user.profile.phone_number = '+1' user.profile.save () druk ('aanmelding in gebruiker') Auth_login (versoek, gebruiker, backend = 'django.contrib.auth.backends.modelbackend') boodskappe.warning (versoek: 'Voer asseblief 'n geldige telefoonnommer in en verifieer dit met 'n kode.') Return Redirect (omgekeer ('Gebruikers: MFA_ONBOARDING')) As Request.Method == 'Post': vorm = tfaform (versoek.post) kode = vorm.data ['kode'] As kode en kode! = '' en kode! = Geen: token_validated = user.profile.check_auth_token (token) p = user.profile is_verified = check_verification_code (gebruiker, int (kode)) p.mfa_authenticated = is_verified As Token_validated: As dit_verifieer: user.profile.mfa_enabled = true user.profile.save () Auth_login (versoek, gebruiker, backend = 'django.contrib.auth.backends.modelbackend') p.verfication_code = geen p.Uid = get_uuid () p.save () boodskappe.success (versoek: 'U is geverifieer. Welkom.') qs = '?' Vir sleutel, waarde in versoek.get.items (): qs = qs + sleutel + '=' + waarde + '&' indien volgende! = '' en nie (volgende.startWith ('/rekeninge/logout/') of next.startWith ('/rekeninge/login/') of next.startWith ('/admin/login/') of next.startsWith ('/rekeninge/register/'): Terugkeer httpResponSerEdirect (ext) elif next.startswith ('/rekeninge/logout/') of next.startswith ('/rekeninge/login/') of next.startWith ('/rekeninge/register/'): Return Redirect ('voer: voer') elif versoek.meta.get ('http_referer', '/').startswith('/accounts/login/'): Return Redirect (omgekeer ('voer: voer')) Elif nie volgende nie: Return Redirect (omgekeer ('voer: voer') anders: terugkeer httpresponeredirect ('voer: voer') anders: boodskappe.warning (versoek, 'Die kode wat u ingevoer het, is nie herken nie. Probeer asseblief weer.') Elif nie token_validated nie: boodskappe. WAARSKUWING (versoek: 'Die URL -teken het verval of is nie erken nie. Probeer asseblief weer.') Uitmeld (versoek) return Redirect (omgekeer ('Gebruikers: login')) As p.mfa_attempts> 3: boodskappe.warning (versoek: 'U het die verkeerde kode meer as drie keer ingevoer. Stuur vir u 'n nuwe kode.') p.verification_code = geen p.save () elif user.profile.can_send_mfa <timezone.now (): user.profile.mfa_attempts = 0 user.profile.can_send_mfa = timezone.now () + datetime.timedelta (minute = 2) user.profile.save () send_verification_text (gebruiker) boodskappe. anders: boodskappe.warning (versoek: 'U stuur te veel twee faktore -verifikasiekodes. Wag 'n paar minute voordat u 'n ander kode stuur.') vorm = tfaform () hide_logo = geen As user.profile.hide_logo: hide_logo = waar return render (versoek, 'gebruikers/mfa.html', {'titel': 'voer kode', 'vorm': vorm, 'xsmall': true, 'user': gebruiker, 'huge_logo': hide_logo, 'Accl_logout': user.profile.shake_to_logout, 'preload': false}) @login_required def mfa_onboarding (versoek): As Request.Method == 'Post': vorm = phonenumberForm (versoek.post) Request.user.profile.phone_number = Form.Data ['Phone_Number']. Vervang ('-', ''). Verslae ('(', ''). Vervang (')', '') versoek.user.profile.mfa_enabled = true versoek.user.profile.enable_two_factor_authentication = true request.user.profile.save () boodskappe.success (versoek: 'U het 'n telefoonnommer by u rekening gevoeg.') Gebruiker = versoek.user return Redirect (user.profile.create_auth_url ())vorm = phonenumberForm (aanvanklik = {'phone_number': request.user.profile.phone_number as request.user.profile.phone_number anders '+1'}) return render (versoek, 'gebruikers/mfa_onboarding.html', {'titel': 'voer u telefoonnommer', 'vorm': vorm, 'klein' in:
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)
... invoer

Ons sal ook sjablone benodig vir albei hierdie sienings. Kom ons voeg eers die MFA -sjabloon by.

nano -gebruikers/sjablone/gebruikers/mfa.html
import os
import json
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
Voeg hierdie HTML -kode by die sjabloon

{ % brei 'basis.html' %} { % blokinhoud %} { % laai app_filters %} { % laai Crispy_forms_tags %} { % csrf_token %} Voer verifikasiekode in Stap 1: Stuur die kode Moet nooit u kode met iemand deel nie, want dit kan gebruik word om tydelik toegang tot u rekening te kry. Stuur kode Stap 2: Voer die kode in {{vorm | bros}} Druk op die Enter -knoppie om die kode by {{user.profile.phone_Number | SecurePhone}} te stuur. Voer dan die kode in en druk Enter. Voer kode in { % EndBlock %}

Dit is redelik vanselfsprekend. Die vorm stuur 'n kode of 'n leë kode, en u sal in die aansig sien dat ons die kode stuur as ons 'n leë kode ontvang. Dan het ons net twee submit -knoppies, en op hierdie manier kan ons die kode met een van die knoppies stuur. Vervolgens voeg ons 'n eenvoudige vorm by om 'n telefoonnommer by te voeg.

nano -gebruikers/sjablone/gebruikers/mfa_onboarding.html

Voeg die volgende html by:
sudo nano /etc/config.json
{ % brei 'basis.html' %} { % blokinhoud %} { % laai Crispy_forms_tags %} { % csrf_token %} Stel twee faktorverifikasie op {{vorm | bros}} Voeg telefoonnommer by { % EndBlock %}

Hierdie vorm is baie eenvoudiger, dit maak net die telefoonnommervorm wat ons geskep het, en laat die gebruiker 'n telefoonnommer byvoeg.

Dit lyk regtig goed! Solank alles behoorlik opgestel is, moet ons boodskappe kan stuur en die gebruiker met hul telefoonnommer kan aanmeld sodra ons die URL -patrone byvoeg. Die laaste ding wat ons moet opstel, is 'n profielaansig, sodat ons kan sorg dat die gebruiker hul telefoonnommer kan verander sonder om aan te meld. Uiteindelik sal ons 'n "Stop to ophou" -opsie wil byvoeg, sodat die gebruiker 'Stop' kan sms om uit toekomstige sms -boodskappe te kies.
{
	"EMAIL_HOST_PASSWORD": "<some password here>"
}
Kom ons voeg 'n profielaansig by die gebruikers/views.py. Hierdie siening sal die bio, e -pos, gebruikersnaam en telefoonnommer van die gebruiker opdateer, en ons kan ook multi -faktore -verifikasie moontlik maak. Eerstens het ons nog twee vorms in gebruikers/vorms nodig.

#... invoer Klas UserUpDateForm (Forms.modelform): e -pos = vorms.emailfield () Klasmeta: Model = Gebruiker velde = ['gebruikersnaam', 'e -pos'] phone_number_label = 'Telefoonnommer (geen ruimtes, hakies \' (\ 'of streep \'-\ ', nommers wat slegs met + begin)' KlasprofielupdateForm (vorms.modelform): ingeteken = vorms.booleanfield (vereis = onwaar) telefoon_number = vorms.Charfield (vereis = onwaar) def __init __ (self, *args, ** kwargs): Super (ProfileUpDateForm, self) .__ Init __ (*args, ** kwargs) Klasmeta: model = profiel Fields = ['Bio', 'Phone_Number', 'Enable_Mfa', 'Intcribed']

... invoer
nano users/templates/users/verification_email.html
Vervolgens kan ons 'n siening skep om albei hierdie vorms te gebruik. Wysig gebruikers/views.py en voeg die aansig by.
# Voeg hierdie invoer by van .vorms invoer userUpDateForm, profileUpDateForm van django.views.decorators.cache Import Never_cache van django.views.decorators.csrf invoer csrf_rexemp van .modelle invoerprofiel van .mfa invoer send_user_text @csrf_exempt @never_cache @login_required DEF -profiel (versoek): As Request.Method == 'Post': u_form = userUpDateForm (request.post, instansie = versoek.user) p_Form = profileUPDateForm (request.post, versoek.files, instansie = versoek.user.profile) As u_form.is_valid () en p_form.is_valid (): new_phone_number = p_form.data ['phone_number'] u_form.save () profiel = p_form.save (verbintenis = onwaar) profiel.phone_number = profile.phone_number.replace ('-', ''). Verslae ('(', ''). Vervang (')', '') profiel.save () As new_phone_number! = oldprofile.phone_number en oldprofile.phone_number en len (oldprofile.phone_number)> = 11: profiel.mfa_enabled = waar profiel.save () send_text (oldprofile.phone_number, 'U telefoonnommer is opgedateer na' + new_phone_Number + '. Raadpleeg die tekste op die telefoon om aan te meld. As u nie hierdie verandering aangebring het nie, skakel ons. - {}'. Formaat (Instellings.Site_Name)) If profiel.enable_two_factor_authentication and profile.phone_number en len (profile.phone_number) <11: profiel.enable_two_factor_authentication = onwaar boodskappe.success (versoek, F'two Factor -verifikasie kan nie geaktiveer word sonder om 'n telefoonnommer in te voer nie. Voer 'n telefoonnommer in om twee faktore -verifikasie moontlik te maak. ') profiel.save () As new_phone_Number! = oldprofile.phone_Number en new_phone_Number en len (new_phone_Number)> = 11: send_user_text (request.user, 'U het hierdie nommer bygevoeg tot {} vir twee faktore -verifikasie. U kan nou u nommer gebruik vir twee faktore -verifikasie. As u nie hierdie verandering aangebring het nie, skakel ons. - {}'. Formaat (Instellings.Site_Name, Instellings.Domain)) profiel.mfa_enabled = waar profiel.mfa_code_expires = timezone.now () + datetime.timedelta (minute = 3) profiel.save () return Redirect (profiel.create_auth_url ()) boodskappe. Druk ('Profiel bygewerk') Return Redirect ('Gebruikers: profiel') anders: u_form = userUpDateForm (instansie = versoek.user) p_Form = profileUpDateForm (instansie = request.user.profile, firic = {'phone_number': request.user.profile.phone_number as request.user.profile.phone_number anders '+1'}) konteks = { 'U_Form': U_Form, 'P_Form': P_Form, 'titel': 'werk u profiel op', } return render (versoek, 'gebruikers/profiel.html', konteks)

Voeg hierdie invoer by

Ons het ook 'n sjabloon vir hierdie siening nodig.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'

BASE_URL = PROTOCOL + '://' + DOMAIN
nano -gebruikers/sjablone/gebruikers/profiel.html

{ % brei "basis.html" %} verleng { % laai Crispy_forms_tags %} {% load feed_filters%} { % blokinhoud %} Wysig u profiel { % csrf_token %} Profielinligting {{U_Form | Crispy}} {{P_Form | Crispy}} UPDATE} Gestoor { % Endblock -inhoud %} { % blokkeer JavaScript %} var vorm = document.getElementById ('profielvorm'); $ ('invoer'). verander (funksie () { var formData = new FormData (vorm); $ .ajax ({ URL: Window.location.href, Tipe: "Post", Data: FormData, ProcessData: onwaar, ContentType: onwaar, Timeout: 1000 * 60, Sukses: funksie (data) { $ (gepos) .removeclass ("Hide"); setTimeOut (funksie () { $ (gepos) .addClass ("Fade Hidden"); setTimeOut (funksie () { $ (gepos) .addClass ("Hide"); $ (gepos) .removeclass ("vervaag verborge"); }, 2000); }, 2000); } }); }); { % EndBlock %}

U sal agterkom dat dit 'n redelike eenvoudige vorm is, maar 'n JavaScript het wat die inhoud van die vorm outomaties plaas soos dit opgedateer word. Dit is nuttig om te hê, sodat u in staat is om wysigings aan te bring sonder om elke keer in te dien.

Vervolgens benodig ons URL's wat al hierdie sienings in die gebruikers URL -patters voorstel. Wysig gebruikers/urls.py en voeg hierdie kode by:

# ... vorige kode, invoer van django.urls invoerpad van. Voer uitsigte in app_name = 'gebruikers' urlpatterns = [ # ... URL -patrone wat ons voorheen ingevoer het, voeg die volgende drie reëls by pad ('mfa ///', views.mfa, naam = 'mfa'), pad ('mfa/onboarding/', views.mfa_onboarding, name = 'mfa_onboarding'), pad ('profiel/', views.profile, naam = 'profiel'), ]
nano users/tokens.py
... vorige kode, invoer

... URL -patrone wat ons voorheen ingevoer het, voeg die volgende drie reëls by

Dit is nou 'n goeie tyd om ons projek te toets. Maar laat ons eers weer 'n rugsteun hardloop.
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()
rugsteun

En bestuur die bediener. Voordat ons na 'n Linux -bediener ontplooi, is dit 'n goeie idee om twee faktore -verifikasie op die rekening moontlik te maak. Ons sal dit doen om na ons profiel -URL,/gebruikers/profiel/te gaan, en die kassie te merk om verifikasie in te skakel nadat ons ons telefoonnommer ingevoer het, en dan die vorm in te dien.

Python Manage.py runserver localhost: 8000

Besoek die webblad deur na u webblaaier te gaan, ek gebruik Google Chrome in hierdie voorbeeld en voer die URL https in: // localhost: 8000/rekeninge/profiel/

U kan indien nodig aanmeld en twee faktore -verifikasie moontlik maak.
nano users/email.py
Hierdie projek het 'n bediener nodig om aan te gaan, sodat dit regtig e -pos kan stuur. Maar eers het ons 'n manier nodig om foute te sien. U sal sien dat as u die bediener in die ontfoutmodus gebruik, met instellings.Debug gelyk aan True, die bediener outomaties foute toon. Om foute te wys sonder om die ontfoutmodus te gebruik, wat onveilig op 'n produksiebediener is, moet ons 'n aansig daarvoor byvoeg. Die belangrikste foute wat ons moet hanteer, is:

Fout 500 - 'n Probleem met ons kode Fout 404 - 'n bladsy wat nie gevind is nie (gebreekte URL) Fout 403 - 'n Toestemming geweierde fout

Kom ons voeg 'n nuwe app by om hierdie foute, genaamd foute, te hanteer.
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 StartApp -foute

Voeg dit by die instellings.py soos ons voorheen in die Installed_Apps -instelling gedoen het, en begin deur verwysings na sommige sienings in app/urls.py toe te voeg, waar App die naam van u Django -projek is.

hantler404 = 'foute.views.handler404' hantler500 = 'foute.views.handler500' hantler403 = 'foute.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()
Dit is al wat ons nodig het, behalwe foutaansigte, sjablone en 'n bietjie middelware. Kom ons definieer dit so:

van django.shortcuts invoer lewer, herlei van django.http invoer httpresponse van StackTrace.modelle invoerfout van foute. Middleware invoer get_current_exception van django.contrib.auth.decorators invoer login_required van django.contrib.auth.decorators invoer user_passes_test van .logs invoer get_logs van gesig.tests invoer is_superuser_or_vendor van django.views.decorators.csrf invoer csrf_rexemp van foute. van django.shortcuts invoer herleiding Vanaf django.urls voer omgekeerde in # Skep u sienings hier. @login_required @user_passes_test (is_superuser_or_vendor) Def Logs (versoek): logs = hoogtepunt_code (get_logs ()) return render (versoek, 'foute/live_error.html', {'titel': 'foutlogs', 'pagetitle': 'foutlogs', 'note': 'Dit is die onlangse foutlogboeke.', 'Trace': logs, 'full': true}) @login_required @user_passes_test (is_superuser_or_vendor) def logs_api (versoek): logs = hoogtepunt_code (get_logs ()) return httpresponse (logs) @login_required DEF HANDLER404 (versoek, uitsondering): indien nie versoek.path.endsWith ('/'): gee herleiding terug (versoek.path + '/') return render (versoek, 'foute/fout.html', {'titel': 'fout 404', 'pagetitle': 'fout 404', 'note': 'Hierdie bladsy is nie op die bediener gevind nie. Dit is moontlik beweeg of geskrap.', 'Is_404': waar}) DEF HANDLER500 (versoek): druk (get_current_exception ()) Gebruiker = Geen As Hasattr (versoek, 'gebruiker') en versoek.user en request.user.is_authenticated: Gebruiker = versoek.user Probeer: Fout.objects.create (gebruiker = gebruiker, stapel_trace = get_current_exception (), note = 'aangeteken deur 500 hanteerder.') Behalwe: Slaag return render (versoek, 'foute/fout.html', {'titel': 'fout 500', 'pagetitle': 'fout 500', 'note': 'Daar is 'n probleem met die bediener, of met 'n versoek wat van u af kom. Dankie vir u begrip terwyl ons dinge opstel.', 'Trace': Get_current_Exception ()}) DEF HANDLER403 (versoek, uitsondering): return render (versoek, 'foute/fout.html', {'titel': 'fout 403', 'PageTitle': 'Fout 403', 'Notes': 'U moet nie toestemming hê om hierdie versoek te vorm nie. As u dink dat dit verkeerd is, kontak die bedieneradministrateur.', 'Is_403': waar}) DEF HANDLER400 (versoek, uitsondering): return render (versoek, 'foute/fout.html', {'titel': 'Fout 400', 'PageTitle': 'Fout 400', 'Notes': 'Dit was 'n slegte versoek.'})

Skep u sienings hier.

Laat ons dan die middelware definieer om hierdie foute te hanteer. Ons sal dit doen deur eers by die middelware_klasse in instellings.py te voeg, met die naam van ons middelware.

Middelware_classes = [ #... Vorige middelware 'foute.middleware.exceptionverbosemiddleware, ]

... Vorige middelware

Laat ons nou die middelware byvoeg.
nano users/models.py
Van die invoer van die invoer voer Traceback in van django.utils.deprecation invoer Middlewaremixin _Error = plaaslik () Klas uitsonderingvroue (middelwaremixin): def process_exception (self, versoek, uitsondering): _error.Value = traceback.format_exc () def get_current_exception (): Probeer: return _Error.value Behalwe AttributeError: NIEMAND terug nie def set_current_exception (uitsondering): Probeer: _error.value = uitsondering Behalwe AttributeError: druk ('uitsondering van die attribuutfoutinstelling.')
# Ons voeg 'n funksie by om die huidige uitsondering te kry deur 'n draad van die draad te gebruik, wat ons help om enige foute in ons kode op te spoor. Wat sjablone betref, het ons slegs een nodig, want ons definieer die titel dinamies in die aansig. Die sjabloon moet net die titel en "spoor", ons foutopsporing vanuit die konteks, weergee.
nano -foute/sjablone/foute/fout.html

{ % brei 'basis.html' %} { % blokinhoud %} {{pagetitle}} {{trace}} { % EndBlock %}

Dit is ons eenvoudigste sjabloon nog, maar dit is hoe maklik dit is om die foute in ons projek te sien. Laat ons nou die ontfout in instellings deaktiveer.
# nano app/instellings.py
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Soek hierdie reël waar dit op waar gestel is, en verander dit na vals
Ontfout = onwaar

Gaan voort en rugsteun nou die app. Ons is gereed om na 'n afgeleë Linux -bediener te ontplooi en hou aan om funksies daarvandaan by te voeg.

Sudo -rugsteun

Voordat ons hierdie kode op 'n bediener plaas, moet ons oorweeg dat daar probleme met die kode kan wees. Afhangend van die saak, sal webwerwe wat inligting wat aan hulle geplaas is, probleme ondervind met spam wat geplaas word en probleme met die verwydering van die strooipos. Dit behoort nie onmiddellik te gebeur nie, maar as dit gebeur, sal ons later ondersoek hoe om outomaties op die webwerf te modereer en dit moeiliker te maak vir robotte om toegang tot die webwerf te kry, tesame met hoe om gebruikersrekeninge te deaktiveer, en die identiteit van 'n gebruiker te verifieer met 'n skandering van hul ID of 'n biometriese skandering, soos 'n vingerafdruk of gesigsherkenning.

As ons kyk na die voorbeeld van multifaktorverifikasie wat ons in produksie ondersoek het, kan dinge anders wees. Let op hoe ons koersbeperkingsaanmeldings is en tekens verval. As robotte toegang tot 'n webwerf kry, kan twee faktore -verifikasie moeiliker wees, aangesien dit kodes kan invoer op dieselfde tyd as die gebruiker. Om dit te bekamp, ​​laat ons 'n model in die gebruikersmodelle gebruik en verklaar hoe ons met die webwerf omgaan wanneer ons met behulp van multifaktor -verifikasie met 'n telefoonnommer is. Ons sal ook 'n opsie byvoeg om met e -pos te verifieer. Begin deur die gebruikersmodelle met nano te redigeer.
nano users/views.py
nano -gebruikers/modelle.py

Dit is hoe die model wat ons byvoeg, moet lyk. Ons het geen metodes nodig nie, net veranderlikes om 'n ID, die gebruiker, die tydstempel, verstryking, lengte en pogings teen enige multifaktorverifikasie te stoor ('n kode soos 123456 wat na 'n telefoon of e -pos gestuur word).

# 'N Basiese teken wat gebruik word om by die webwerf aan te meld Klas Mfatoken (modelle.model): gebruiker = modelle.foreignkey (gebruiker, on_delete = modelle.cascade, verwante_name = 'mfa_tokens') tydstempel = modelle.DateTimeField (standaard = timezone.now) verval = modelle.DateTimeField (standaard = timezone.now) token = modelle.Charfield (standaard = '', max_length = 100) lengte = modelle.Integerfield (standaard = 6) pogings = modelle.Integerfield (standaard = 0) uid = modelle.Charfield (standaard = uUID.UUID4, max_length = 100)
from .email import send_verification_email # 'N Basiese teken wat gebruik word om by die webwerf aan te meld
Laat ons ook 'n voorreg by ons gebruiker voeg, en ons sal dit vir nou met die hand stel voordat ons uiteindelik na vore kom om bevoorregte gebruikers outomaties in te win. Voeg hierdie reël in die profiel in die gebruikersmodelle:

verkoper = modelle.booleanfield (standaard = onwaar)

Soos met enige veranderinge aan die databasis, moet ons migrasies maak en die databasis migreer wanneer ons 'n modelle.py -lêer in django wysig. Onthou, om dit te doen, gebruik ons ​​eers die bron (as dit nog nie gebruik is sedert die terminale oop was nie) en dan Python Manage.py om die migrasies te maak en te migreer.

CD Project-Directory-You-genaamd # (indien nodig) bron venv/bin/aktiveer Python Manage.py Makemigrations && Python Manage.py Migrate

(indien nodig)
        # Voorlopig kan u enige rekeninge wat u as verkopers geskep het, inskakel deur die dop te gebruik.
    # Python Manage.py Shell
van gebruikers.modelle invoerprofiel
p = profiel.objects.get (user__UserName = 'charlotte')
P.Vendor = waar
p.save ()
Uitgang ()
# Laat ons nou ons multi -faktor -verifikasie -aansig ontwikkel om hierdie teken te gebruik. Eerstens moet ons ons MFA Helper Utilities verander. Nano te gebruik,
Nano -gebruikers/MFA.py

van django.utils invoer tydsone invoer willekeurig invoer datetime van django.conf invoerinstellings Van Feed.Middleware invoer get_current_request van django.contrib -invoerboodskappe van .email invoer send_html_email voer Traceback in van .modelle invoer mfatoken rekening_sid = instellings.twilio_account_sid autor bron_phone = settings.phone_Number def send_text (teiken_phone, teks): van Twilio.rest Import -kliënt Probeer: client = client (Account_sid, Auth_token) As len (teiken_phone)> = 11: boodskap = client.messages.create ( TO = Target_Phone, van_ = bron_phone, liggaam = teks + 'teks stop om te kanselleer.') Behalwe: boodskappe.warning (get_current_request (), 'Daar was 'n fout om die boodskap te stuur.') druk (traceback.format_exc ()) def get_num_length (num, lengte): n = '' vir x in reikafstand (lengte): n = n + str (num) terugkeer int (n) def send_verification_text (gebruiker, token): lengte = gebruiker.profile.verification_code_length kode = ewekansig.randint (get_num_length (1, lengte), get_num_length (9, lengte)); token.token = kode token.expires = timezone.now () + datetime.timedelta (minute = instellings.auth_valid_minutes) Token.save () send_user_text (gebruiker, "u verifikasiekode vir {} is {}". formaat (instellings.site_name, str (kode))) def send_verification_email (gebruiker, token): lengte = gebruiker.profile.verification_code_length kode = ewekansig.randint (get_num_length (1, lengte), get_num_length (9, lengte)); token.token = kode token.expires = timezone.now () + datetime.timedelta (minute = instellings.auth_valid_minutes) Token.save () send_html_email (gebruiker, "U verifikasiekode vir {} is {}". Formaat (instellings.site_name, str (kode)), "Beste {}, u verifikasiekode vir {} is {}. Dankie vir die gebruik van hierdie kode om u rekening te beveilig. str (kode), instellings.site_name)) def send_user_text (gebruiker, teks): send_text (user.profile.phone_number, teks) def check_verification_code (gebruiker, token, kode): token.atempts = token.atempts + 1 profiel = user.profile resultaat = (token! = geen en kode! = '' en token.token == kode en (token.expires> timezone.now ()) en token.attempts <= settings.mfa_token_attempts) As Token.atempts <3 en resultaat: profiel.verification_code_length = 6 elif token.atempts> 1 en nie resultaat nie: profiel.verification_code_length = profile.verification_code_length + 2 if profiel.verification_code_length> settings.mfa_token_length: profile.verification_code_length = settings.mfa_token_length Token.save () profiel.save () terugkeer resultaat

# Verifieer die gebruiker met behulp van hul e -pos of telefoonnommer def mfa (versoek, gebruikersnaam, usertoken): token = mfatoken.objects.filter (UID = gebruikersnaam, verstryke__gt = timezone.now () + datetime.timedelta (sekondes = 30)). order_by ('-tydstempel'). laaste () # filter die token deur die waarde wat in die URL ('n UUID) geslaag is indien nie teken nie: token = mfatoken.objects.create (gebruiker = user.objects.filter (profiel__UUID = username). First (), uid = gebruikersnaam, verval = timezone.now () + datetime.timedelta (sekondes = 115) # As hierdie sessie nie geskep is nie, skep dit, skep dit dit skep dit. gebruiker = user.objects.filter (id = token.user.id). first () # Kry die gebruiker van die token indien nie gebruiker en versoek.user.is_authenticated: return Redirect (reverse ('feed: home')) # As hulle reeds geverifieer is, teken dit aan indien nie gebruiker nie: verhoog toestemming () # weier as daar geen gebruiker gevind is nie next = request.get.get ('next', '') Indien nie gebruiker.profile.enable_two_factor_authentication and user.is_active en user.profile.check_auth_token (usertoken, token): # kyk na die outoriteit autored_login (versoek, gebruiker, backend = 'django.contrib.auth.backends.modelbackend') # Teken die gebruiker aan as hulle nie reeds aangemeld is nie user.profile.mfa_expires = timezone.now () + datetime.timedelta (minute = instellings.login_valid_minutes) # Stel 'n verstryking op hul multi -faktor verifikasie user.profile.save () Return httpresponSerEdirect (volgende as volgende! = '' anders omgekeer ('landing: landing')) # Herlei die gebruiker na die volgende bladsy Indien nie gebruiker.profile.mfa_enabled: # Kontroleer of MFA geaktiveer is Indien nie check_verification_time (gebruiker, token): # Kontroleer die tyd user.profile.mfa_enabled = onwaar # Maak die telefoonnommer skoon user.profile.enable_two_factor_authentication = true # Aktiveer MFA user.profile.phone_number = '+1' # Deaktiveer die telefoonnommer user.profile.save () # stoor die profiel Auth_login (versoek, gebruiker, backend = 'django.contrib.auth.backends.modelbackend') # log die gebruiker in as hul MFA nie geaktiveer is nie boodskappe.warning (versoek: 'Voer asseblief 'n geldige telefoonnommer in en verifieer dit met 'n kode.') Return Redirect (omgekeer ('Gebruikers: MFA_ONBOARDING')) As Request.Method == 'Post' en nie Fraud_Detect (versoek, waar): # As die versoek 'n posversoek is nie vorm = tfaform (versoek.post) # Instant die vorm kode = str (vorm.data.get ('kode', geen)) # Kry die kode As kode en kode! = '' en kode! = Geen: # Maak seker dat dit nie leeg is nie token_validated = user.profile.check_auth_token (usertoken) # kyk na die outoriteit p = user.profile is_verified = check_verification_code (gebruiker, teken, kode) # Gaan die kode na p.mfa_authenticated = is_verified As token_validated: # as alles As dit is_verifieer: # is in orde user.profile.mfa_enabled = waar # Aktiveer MFA (indien nie reeds geaktiveer nie) user.profile.save () Auth_login (versoek, gebruiker, backend = 'django.contrib.auth.backends.modelbackend') # log in die gebruiker face = user.faces.filter (session_key = geen) .last () p.mfa_expires = timezone.now () + datetime.timedelta (minute = instellings.login_valid_minutes) p.save () boodskappe.success (versoek: 'U is geverifieer. Welkom.') qs = '?' Vir die sleutel, waarde in versoek.get.items (): # Bou 'n navraagstring vir die volgende parameter (indien enige) qs = qs + sleutel + '=' + waarde + '&' indien volgende! = '' en nie (volgende.startWith ('/rekeninge/logout/') of next.startWith ('/rekeninge/login/') of next.startWith ('/admin/login/') of next.startsWith ('/rekeninge/register/'): Terugkeer httpresponeredirect (volgende) # Redirect elif next.startswith ('/rekeninge/logout/') of next.startswith ('/rekeninge/login/') of next.startWith ('/rekeninge/register/'): Return Redirect (reverse ('/')) elif versoek.meta.get ('http_referer', '/').startswith('/accounts/login/'): Return Redirect (reverse ('/')) Elif nie volgende nie: Return Redirect (reverse ('/')) anders: gee httpResponSerEdirect (omgekeer ('verifieer: ouderdom') + '? next =' + request.meta.get ('http_referer', '/')) anders: boodskappe.warning (versoek, 'Die kode wat u ingevoer het, is nie herken nie. Probeer asseblief weer.') Elif nie token_validated nie: # As die teken ongeldig was boodskappe. WAARSKUWING (versoek: 'Die URL -teken het verval of is nie erken nie. Probeer asseblief weer.') Uitmeld (versoek) return Redirect (omgekeer ('Gebruikers: login')) As p.mfa_attempts> 3: # as daar te veel pogings was boodskappe.warning (versoek, 'jyhet die verkeerde kode meer as drie keer ingevoer. Stuur vir u 'n nuwe kode. ') p.verification_code = geen p.save () elif user.profile.can_send_mfa <timezone.now (): user.profile.mfa_attempts = 0 user.profile.can_send_mfa = timezone.now () + datetime.timedelta (minute = 2) user.profile.save () As vorm.data.get ('send_email', onwaar): # Stuur die e -pos (of teks) send_mfa_verification_email (gebruiker, teken) anders: send_verification_text (gebruiker, teken) boodskappe.success (versoek: "Voer die kode in wat na u telefoonnommer of e -pos gestuur word. Die kode verval binne 3 minute.") elif user.profile.can_send_mfa <timezone.now () + datetime.timedelta (sekondes = 115): boodskappe.warning (versoek: 'U stuur te veel twee faktore -verifikasiekodes. Wag 'n paar minute voordat u 'n ander kode stuur.') vorm = tfaform () hide_logo = geen As user.profile.hide_logo: hide_logo = waar As Request.user.is_authenticated: Return Redirect (Reverse ('/')) teruggee # Lewer die vorm (vir GET -versoeke) return render (versoek, 'gebruikers/mfa.html', {'title': 'voer kode', 'vorm': vorm, 'xsmall': true, 'user': gebruiker, 'huge_logo': hide_logo, 'Accl_logout': user.profile.shake_to_logout, 'preload': false, 'autofocus': versoek.Met
nano users/views.py
Verifieer die gebruiker met behulp van hul e -pos of telefoonnommer
# Filter die teken deur die waarde wat in die URL geslaag is ('n UUID)
# Skep dit as hierdie sessie nog nie geskep is nie
Kry die gebruiker van die token

Teken dit aan as hulle reeds geverifieer is

Ontken as geen gebruiker gevind is nie
# Kyk na die Auth -token
            send_verification_email(user) # Meld die gebruiker aan as hulle nie reeds aangemeld is nie
Stel 'n verstryking op hul multifaktorverifikasie

Herlei die gebruiker na die volgende bladsy

Kyk of MFA geaktiveer is
# Kyk na die tyd
Maak die telefoonnommer skoon

Aktiveer MFA

Skakel die telefoonnommer uit
nano users/templates/users/resend_activation.html
Stoor die profiel

Teken die gebruiker in as hul MFA nie geaktiveer is nie

As die versoek 'n posversoek is
Instant die vorm

Kry die kode

Maak seker dat dit nie leeg is nie
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)
Kyk na die Auth -token

Gaan die kode na

As alles
Is in orde

Aktiveer MFA (indien nie reeds geaktiveer nie)

Meld die gebruiker aan

Bou 'n navraagstring vir die volgende parameter (indien enige)

Herlei

As die teken ongeldig was

As daar te veel pogings was
# Stuur die e -pos (of teks)
Lewer die vorm (vir GET -versoeke)

As ons hierdie kode byvoeg, moet u die funksie invoer om 'n e -pos te stuur. Aan die bokant van die lêer sien die gebruiker (met ander invoer), voeg by

van .mfa invoer send_verification_email as send_mfa_verification_email
Nou moet ons die funksie skryf voordat enige hiervan sal werk. Dit moet ons stuur -e -posfunksie uitbrei en 'n e -pos aan die gebruiker stuur met die verifikasiekode.

Nano -gebruikers/MFA.py

def send_verification_email (gebruiker, token): lengte = gebruiker.profile.verification_code_length kode = ewekansig.randint (get_num_length (1, lengte), get_num_length (9, lengte)); token.token = kode token.expires = timezone.now () + datetime.timedelta (minute = instellings.auth_valid_minutes) Token.save () send_html_email (gebruiker, "U verifikasiekode vir {} is {}". Formaat (instellings.site_name, str (kode)), "Beste {}, u verifikasiekode vir {} is {}. Dankie vir die gebruik van hierdie kode om u rekening te beveilig. str (kode), instellings.site_name))
Dit werk dus goed, nou het ons 'n multifaktor -verifikasiestelsel wat 'n telefoonnommer of e -pos afhang om aan te meld. Maar ons het ook 'n manier nodig om gebruikers te verwyder of ten minste weg te steek wat nie met ons voorwaardes saamwerk nie. Dit kan spammers, robotte of iemand wees wat nie goed vir ons werk bedoel nie. Kyk na die siening wat ek het om gebruikers op my webwerf te monitor:

# invoer van django.contrib.auth.decorators invoer login_required van django.contrib.auth.decorators invoer user_passes_test Vanaf. Tests invoer is_superuser_or_vendor # Ons sal hierdie toets moet opstel @login_required @user_passes_test (is_superuser_or_vendor) DEF -gebruikers (versoek): # Kry 'n lys van gebruikers new_today = user.objects.filter (is_active = true, date_joined__gte = timezone.now () - datetime.timedelta (ure = 24)). tel () new_this_month = user.objects.filter (is_active = true, date_joined__gte = timezone.now () - datetime.timedelta (ure = 24*30)). tel () intekenare = gebruiker.objects.filter (is_active = true, profiel__subscribed = true) .count () return render (versoek, 'gebruikers/gebruikers.html', { # returners in 'n sjabloon 'titel': 'alle rekeninge', 'gebruikers': user.objects.all (), 'new_today': new_today, 'new_this_month': new_this_month, 'intekenare': intekenare })

invoer
Ons sal hierdie toets moet opstel

Kry 'n lys van gebruikers

Gebruikers terug in 'n sjabloon
Let daarop dat hierdie kode 'n toets gebruik, ons moet hierdie toets in 'n toetse.py -lêer verklaar en dit invoer. Redigering van gebruikers/toetse.py, laat ons die toets skep.

def is_superuser_or_vendor (gebruiker): return user.profile.vendor of user.is_superuser

Dit is in samewerking met die gebruikers/gebruikers.html -sjabloon, wat so lyk:
{ % brei 'basis.html' %} { % laai app_filters %} { % blokinhoud %} Alle geregistreerde besoekers {{new_today | nts | kapitaliseer}} nuut vandag, {{new_this_month | nts}} nuut hierdie maand, {{intekenare | nts}} intekenare, {{gebruikers.count | nts}} totaal. { % vir gebruikers in gebruikers %} { % sluit 'gebruikers/_user.html' %} in { % endfor %} { % EndBlock %}

user.html. As u 'n sjabloon met 'n subtemplaat gebruik en nie uitbrei nie, is dit 'n goeie idee om 'n onderstreep by te voeg (

Let daarop dat dit baie jinja is, dat u moontlik nie al hierdie veranderlikes gedefinieër het nie. Maar dit is hoe my kode lyk.
    # { % laai app_filters %}


    
      @{{user.UserName}} - {{user.profile.name}} ({{user.profile.prefererred_name}})
      Laas gesien {{user.profile.last_seen | datum: "f d, y"}} {{user.profile.last_seen | tyd: "h: i"}}
      Aangesluit op {{user.profile.date_joined | datum: "f d, y"}} {{user.profile.date_joined | tyd: "h: i"}}
      {{user.email}}
      { % As user.profile.phone_number %} {{user.profile.phone_number}} { % endif %}
      { % As user.verifikasies.last %}
      '{{user.verifications.last.full_name}}'
       {{user.verifications.last.document_number}}
       {{user.verifications.last.birthdate}}
       ID -voorkant
       ID terug
      { % endif %}
      #{{user.id}}
      { % As user.profile.subscribed %} ingeteken { % anders %} nie ingeteken { % endif %}
    
    { %indien nie gebruiker.is_superuser %}
    { % sluit 'gebruikers/roggle_active.html' %} in
    { % endif %}
    { % autoEScape van %}    
    {{user.bio}}
    { % endautoEScape %}
    
    { % As user.Profile.Identity_verified %} geverifieerde gebruiker. { % anders %} Onverifieerde gebruiker. { % endif %} Verifikasies: {{user.verifications.count | nts}}
{{user.id}} </small>

Ons het ook nog 'n subtemplaat, woggle_active.html nodig. Hierdie sjabloon moet 'n vorm wees waarmee ons kan skakel of 'n gebruiker aktief is.

{ % As user.is_active %} { % anders %} { % endif %}

Ons sal ook 'n aansig moet byvoeg om gebruikersaktiwiteit en toepaslike URL -patrone te skakel. Laat ons 'n aansig byvoeg om 'n gebruiker te verwyder as ons dit nodig het.

van django.views.decorators.csrf invoer csrf_rexemp @csrf_exempt @login_required @user_passes_test (is_superuser_or_vendor) DEF TWYGLE_USER_AKTIEWE (versoek, pk): gebruiker = user.objects.get (id = pk) As Request.Method == 'Post': user.is_active = nie user.is_active user.save () gee httpResponse terug ('' as user.is_active anders '') # Invoer van django.contrib.auth.mixins invoer loginrequiredMixin, userPassestestStmixin van django.views.generiese invoer DeleteView Klas UserDeletEview (LoginRequiredMixin, UserPassestestMixin, DeleteView): Model = Gebruiker Success_url = '/' # Die herleiding op sukses -URL def get_context_data (self, ** kwargs): konteks = super (). get_context_data (** kwargs) terugkeer konteks DEF TEST_FUNC (self): # Toets of die gebruiker supergebruiker is en toestemming het om te verwyder gebruiker = self.get_object () As self.request.user! = gebruiker en self.request.user.is_superuser: Wys waar Naal terug

Invoer

Die herleiding op sukses -URL
# Toets of die gebruiker supergebruiker is en toestemming het om dit uit te vee
    # Alhoewel dit prakties is indien nodig, moet die verwydering van 'n gebruiker die meeste van die tyd nie nodig wees nie, maar ons kan net die sigbaarheid van gebruikers wat die webwerf besoek, skakel as ons dit moet ontslaan.
    # Die URL -patrone wat ons bygevoeg het, lyk so. Met nano, wysig gebruikers/urls.py en voeg hierdie reëls by:
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # nano -gebruikers/urls.py
Die reëls moet op die lys van paaie in die gebruikersaansigte gaan, voor die einde "]" maar na die begin "[".

#… pad ('gebruiker // delete/', userDeletView.as_view (template_name = 'blog/user_confirm_delete.html'), name = 'delete-user'), pad ('gebruiker // aktief/', views.toggle_user_active, name = 'wissel-gebruiker-aktiewe'), #…

...
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
...

Maak nou seker dat u die webwerf rugsteun sodat u dit op die webbediener kan aflaai waaraan ons sal voortgaan. Van die opdragreël,

Sudo -rugsteun

Nou is ons webwerf gerugsteun.

Nou het ons 'n paar meer nuttige funksies. Maar wat van die groot prentjie hier? Hierdie kode is nog steeds nie van die internet af nie, ons het nog geen e -posbediener nie, en ons moet ons app uitbrei om 'n uitgebreide verifikasieproses sowel as gladde uitlegte in te sluit om ons te help om die webwerf te verken, saam met veilige protokolle vir die verifiëring van bevoorregte gebruikers.
# Ons sal dit alles regkry. Die belangrikste ding vir nou is net om hierdie kode aanlyn te kry, wat ons met net 'n paar reëls bash op 'n Ubuntu -bediener kan doen. U moet egter 'n bediener hiervoor huur, tensy u 'n bediener tuis het en 'n internet -intekening op die internet het waarmee u poorte kan oopmaak. Ek het persoonlik my webwerf bestuur op 'n HP Z440 wat in my woonstel geïnstalleer is, maar dit is gewoonlik baie goedkoper vir basiese behoeftes om 'n virtuele private bediener (VPS) te huur.
        if user and user.profile.can_login < timezone.now(): # Hou in gedagte dat die kode wat ons nou bestuur, relatief dun is, dit moet onderhou en verbeter word voordat ons gereed is om te gebruik wat ons moet bou. Maak seker dat u versigtig is wat u met die internet doen, maak seker dat u hierdie webwerf in die openbaar op die web op 'n Linux -bediener ontplooi, u 'n plan het om ongewenste interaksies met u webwerf te blokkeer. Dit sal waarskynlik aanvanklik nie 'n probleem wees nie, maar ons sal 'n verskeidenheid oplossings ondersoek om dit te bekamp, ​​insluitend masjienleer, kunsmatige intelligensie en rekenaarvisie. As dit 'n probleem word, kyk verder in hierdie teks vir 'n oplossing.
            # Wat 'n VPS huur, is daar baie plekke waarheen u kan gaan. Google Cloud het VPS -bedieners, Ionos, Kamatera, Amazon AWS, en meer verskaffers bied wolkbedienersoplossings aan wat by ons behoeftes pas.
                return redirect(user.profile.create_auth_url()) # U moet deur hul vorms klik en 'n plan kies om aan die gang te kom. U kan met 'n basiese plan saam met enige verskaffer gaan, maar maak seker dat die verskaffer u toelaat om Port Mail Server -poorte oop te maak om e -pos te stuur (dit moet poort 587 en poort 25 wees), sommige verskaffers blokkeer hierdie poorte. Tot dusver het ek die beste ervaring met Ionos en Kamatera gehad, albei sal my toelaat om onbeperkte e -pos te stuur en hul pryse is redelik goedkoop.
            else: # U sal aan u nuwe bediener koppel oor 'n protokol genaamd SSH of Secure Shell, waarmee u op afstand koppelvlak met die bediener kan koppel presies soos u persoonlike rekenaar, vanaf u persoonlike rekenaar. As u die bediener opstel, sal die gasheerverskaffer u waarskynlik vra om 'n SSH -sleutel by te voeg, of hulle sal u 'n gebruikersnaam en wagwoord gee. Die SSH -sleutel is hoe u vanaf die opdragreël by die bediener sal aanmeld om die kode te wysig. Gebruik die onderstaande SSH-keygen-opsies om 'n SSH-sleutel te genereer.
        else: # ssh-keygeneg
            user = User.objects.filter(username=username).first() # Stoor die lêer en skryf dit oor as u dit nodig het, dit is goed om u SSH -sleutels te draai as u dit nog nie gedoen het nie. Nou kan u die volgende opdrag gebruik om u SSH -sleutel te sien. U wil dit na u afstandbediener kopieer, sodat u dit kan gebruik om te verifieer.
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # kat ~/.ssh/id_rsa.pub
As u nie 'n SSH-sleutel kon sien wanneer u die opdrag tik nie ('n lang string syfers en letters wat met 'sSH-RSA AAA' begin), probeer om 'n RSA-sleutel te genereer (dit is veiliger, so ek raai u aan om dit te gebruik.) Die volgende kode sal 'n 4096 bit RSA SSH-sleutel genereer.

ssh -keygen -t rsa -b 4096

Skep 'n VPS wat Ubuntu bestuur, maar u beplan om dit te doen. Nadat u 'n VPS geskep het deur deur die vorms op die verskafferswebwerf (Kamatera.com, Ionos.com of soortgelyk) te klik, wil u aanmeld. Om dit te doen, gebruik die SSH -opdrag met u IP -adres (die adres wat soos xx.xx.xx.xx lyk). U moet ook sensitief wees vir die standaard -gebruikersnaam op die bediener wat ons geskep het, byvoorbeeld Ubuntu.

ssh ubuntu@xx.xx.xx.xx

U kan gevra word vir 'n wagwoord, as u gevra word vir 'n wagwoord, voer dit in. Ons sal nie die standaardgebruikernaam gebruik nie, so laat ons begin deur 'n nuwe gebruiker te skep en 'n SSH -sleutel by hul rekening te voeg.
nano users/sms.py
Laat ons begin deur 'n nuwe SSHD_CONFIG -lêer by te voeg, wat aan die bediener sê hoe om SSH te gebruik.
# nano sshd_config
# # Dit is die SSHD-bediener-stelselwye konfigurasielêer.  Sien
# sshd_config (5) vir meer inligting.

# Hierdie SSHD is saamgestel met pad =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games

# Die strategie wat gebruik word vir opsies in die standaard sshd_config wat saam met
# OpenSSH is om opsies met hul standaardwaarde te spesifiseer waar
# Moontlik, maar laat hulle kommentaar lewer.  Ongeastemmenteerde opsies oorskry die
# standaardwaarde.

#Port 22
#AddressFamily enige
#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

# Kode en keying
#Rekeylimit standaard geen

# Aanmelding
#SyslogFacility Auth
#Loglevel inligting

# Verifikasie:

#LogingRacetime 2M
#Permitrootlogin Verbod-paswoord
#Strictmodes Ja
#Maxauthtries 6
#MaxSessions 10

Pubkeyauthentication ja

# Verwag .SSH/gemagtigde_Keys2 sal in die toekoms by verstek nie in ag geneem word nie.
MightisedKeysFile .ssh/gemagtigde_keys .ssh/gemagtigde_keys2

#AuthorizedPrincipalSfile Geen

#AuthorizedKeysCommand Geen
#AuthorizedKeysCommanduser niemand

# Daarvoor om te werk, benodig u ook gasheerleutels in/etc/ssh/ssh_bekend_hosts
#Hostbasedauthentication No
# Verander na ja as u nie vertrou nie ~/.ssh/geken_hosts vir
# Gasheergebaseerde vertraging
#IgnorEUSer bekendhosts nee
# Lees nie die gebruiker se ~/.rhosts en ~/.Shosts -lêers
#IgnorerHosts Ja

# Om Tunnel -duidelike tekswagwoorde te deaktiveer, verander na nee hier!
WagwoordAuthentication No
#PermitEmpTypAsswords nee

# Verander na Ja om uitdagings vir uitdagings-respons moontlik te maak (pasop probleme met
# 'n paar PAM -modules en drade)
Kbdinteractiveauthentication No

# Kerberos -opsies
#Kerberosauthentication No
#Kerberosorlocalpasswd Ja
#Kerberosticketcleanup Ja
#Kerberosgetafstoken nee

# GSSAPI -opsies
#Gssapiauthentication No
#Gssapicleanupcredentials Ja
#Gssapistrictacceptorcheck Ja
#GssapikeExchange nee

# Stel dit op 'ja' om PAM -verifikasie, rekeningverwerking moontlik te maak,
# en sessieverwerking. As dit geaktiveer is, sal PAM -verifikasie
# word toegelaat deur die kbdinteractiveauthentication en
# PasswordAuthentication.  Afhangende van u PAM -konfigurasie,
# PAM -verifikasie via kbdinteractiveauthentication kan omseil
# Die instelling van "Permitrootlogin sonder paswoord".
# As u net wil hê dat die PAM -rekening en sessie -tjeks moet loop sonder
# PAM -verifikasie, stel dit dan in staat, maar stel Passwordauthentication in
# en kbdinteractiveauthentication to 'No'.
USEPAM JA

#AllowAgentForwarding Ja
#Allowtcpforwarding Ja
#Gatewayports nee
X11 Forwarding Ja
#X11displayOffset 10
#X11uselocalhost ja
#Permittty ja
Printmotd nee
#Printlastlog ja
#Tcpkeepalive ja
#PermitUseren omgewingsnommer
#Compression vertraag
#Clientaliveinterval 0
#Clientalivecountmax 3
#Gebruikns nee
#Pidfile /run/sshd.pid
#Maxstartups 10: 30: 100
#Permittunnel nee
#Chrootdirectory Geen
#VersionAddendum geen

# Geen standaardbanierpad nie
Banner /etc /banier

# Laat die kliënt toe om plaaslike omgewingveranderlikes te slaag
Acceptenv lang lc_*

# Oorskryf standaard van geen substelsels nie
Substelsel SFTP/USR/LIB/OpenSSH/SFTP-SERVER

# Voorbeeld van die oorheersende instellings op 'n per-gebruiker basis
#Match -gebruiker anoncvs
# X11 Forwarding no
# AllowTCPForwarding No
# Permittty nee
# ForceCommand CVS -bediener
Permitrootlogin nr
# Dit is die SSHD Server-stelselwye konfigurasielêer.  Sien
# SSHD_CONFIG (5) vir meer inligting.
# Hierdie SSHD is saamgestel met pad =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
# Die strategie wat gebruik word vir opsies in die standaard sshd_config wat saam met
# OpenSSH is om opsies met hul standaardwaarde te spesifiseer waar
moontlik, maar laat hulle kommentaar lewer. Ongeastemmenteerde opsies oorskry die

standaardwaarde.

Hawe 22
# Adresfamilie enige
AUTH_VALID_MINUTES = 3 # 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
# Kodes en keying
# REKEYLIMIT standaard geen
Aanmelding

SyslogFacility Auth

Loglevel -inligting
# Verifikasie:
LogingRacetime 2M

Permitrootlogin Verbod-paswoord

Strictmodes ja
nano users/templates/users/mfa.html
Maxauthtries 6

MaxSessions 10

Verwag .SSH/gemagtigde_keys2 sal in die toekoms by verstek nie in ag geneem word nie.
Gemagtigde PrincipalSfile Geen

Gemagtigde keyScommand Geen

Gemagtigde keyscommanduser niemand
nano users/templates/users/mfa_onboarding.html
Om dit te laat werk, benodig u ook gasheerleutels in/etc/ssh/ssh_bekend_hosts

Gasheergebasettingsverskaffing nr

Verander na ja as u nie vertrou nie ~/.ssh/geken_hosts vir
Gasheergebaseerde oormatigheid

IgnoreUser bekendhosts nee

Lees nie die gebruiker se ~/.rhosts en ~/.Shosts -lêers nie

Ignorerhosts ja

Om Tunnel -duidelike tekswagwoorde te deaktiveer, verander hier na nee!

PermitEmptypasswords no

Verander na Ja om uitdagings vir uitdagings-respons moontlik te maak (pasop probleme met
# Sommige PAM -modules en drade)
Kerberos -opsies

Kerberosauthentication no

Kerberosorlocalpasswd ja
# Kerberosticketcleanup ja
Kerberosgetafstoken nee

GSSAPI -opsies

GSSAPIAUTHENTIKASIE NEE
nano users/templates/users/profile.html
Gssapicleanupcredentials ja
Gssapistrictacceptorcheck ja

GSSAPIKEEXCHANGE NEE

Stel dit op 'Ja' om PAM -verifikasie, rekeningverwerking moontlik te maak,

en sessieverwerking. As dit geaktiveer is, sal PAM -verifikasie

toegelaat word deur die KBD -interaktiewea -verifiëring en
# WagwoordAuthentication.  Afhangende van u PAM -konfigurasie,
# PAM -verifikasie via kbdinteractiveauthentication kan omseil
die instelling van "Permitrootlogin sonder paswoord".

As u net wil hê dat die PAM -rekening en sessie -tjeks moet loop sonder

PAM -verifikasie, stel dit dan in staat, maar stel Passwordauthentication
backup
en kbdinteractiveauthentication to 'No'.

Laat die voorwaardes toe

AllowTCPForwarding Ja
python manage.py runserver localhost:8000
Gatewayports no

X11displayOffset 10

X11uselocalhost ja

Permittty ja

Printlastlog ja

TCPKEEPALIVE JA

Permituseren omgewings nr

Kompressie vertraag

Clientaliveinterval 0

Clientalivecountmax 3

Gebruikns nee
python manage.py startapp errors
Pidfile /run/sshd.pid

MaxStartups 10: 30: 100

Permittunnel nee
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Chrootdirectory Geen

Weergaweaddendum geen

Geen standaardbanierpad nie
# Laat die kliënt toe om plaaslike omgewingveranderlikes te slaag
die standaard van geen substelsels te oorskry nie

Voorbeeld van die oorheersende instellings op 'n per-gebruiker basis

Pas gebruiker anoncvs
    # X11 Forward No
ALLE

Permittty nee

ForceCommand CVS -bediener
from threading import local
import traceback
from django.utils.deprecation import MiddlewareMixin

_error = local()

class ExceptionVerboseMiddleware(MiddlewareMixin):
    def process_exception(self, request, exception):
        _error.value = traceback.format_exc()

def get_current_exception():
    try:
        return _error.value
    except AttributeError:
        return None

def set_current_exception(exception):
    try:
        _error.value = exception
    except AttributeError:
        print('Attribute error setting exception.')
Onthou, Ctrl+X en Y om die lêer te stoor. Kom ons skryf dan 'n basiese skrif genaamd Initialize (alles in die standaard tuisgids van ons gebruiker).

nano initialiseer

Met u SSH -sleutel het u met CAT gevind. (.ssh/id_rsa.pub)
nano errors/templates/errors/error.html
#!/bin/bash Sudo Apt Install -y Nano Git OpenSsh -Server sudo cp sshd_config/etc/ssh/sshd_config Sudo Service SSH herbegin Sudo Service SSHD herbegin echo "/root/.ssh/id_rsa" | sudo su root -c "ssh -keygen -t rsa -n ''" eggo "root ssh -sleutel:" sudo su root -c "cat /root/.ssh/id_rsa.pub" sudo adduser-gestremde-password-GECOS "" Team sudo passwd -d -span sudo usermod -ag sudo -span echo "/home/team/.ssh/id_rsa" | SU -span -c "ssh -keygen -t rsa -n ''" kat /home/team/.ssh/id_rsa.pub >> /home/team/.ssh/authorized_keys eggo '' >> /home/team/.ssh/authorized_keys eggo "Team SSH Key:" kat /home/team/.ssh/id_rsa.pub
!/bin/bash

Laat ons lyn vir lyn begin om u deur hierdie lêer te lei. Die eerste reël sê vir die samesteller dat dit 'n bash -skrif is. Dan installeer ons afhanklikhede, kopieer SSHD_CONFIG na die regte gids, begin SSH weer, genereer SSH -sleutels vir Root, voeg die gebruiker 'Team' by (u kan 'n naam kies wat u hiervoor wil gebruik, gebruik die adduser -opdrag met hul naam en gestremde wagwoord vir nou). Ons voeg ook span by die Sudo -groep, genereer hul SSH -sleutel, voeg ons sleutel by tot gemagtigde sleutels en hulle s'n, en druk hul sleutel. Hierdie nuwe gebruiker is hoe ons by die webwerf aanmeld.

Gaan voort in 'n nuwe terminale en maak die bediener weer oop.
nano app/settings.py
SSH span@xx.xx.xx.xx

U moet hierdie keer nie 'n wagwoord nodig hê nie, omdat u 'n SSH -sleutel het. Ons het ook die aanmelding met 'n wagwoord gedeaktiveer om die webwerf veiliger te hou.

Nou begin hierdie bediener heeltemal leeg met geen inligting daaroor nie. Laat ons begin met die kloning van ons projek van Git, sodat ons dit op die afgeleë masjien kan aflaai en uitvoer. Druk eers u SSH -sleutel op die afgeleë bediener wat oor SSH gekoppel is:
DEBUG = False
kat ~/.ssh/id_rsa.pub

Plak dan hierdie sleutel in die Git -instellings soos ons voorheen gedoen het om ons Git -bewaarplek op te stel. Ons kan nou ons projek direk na die bediener kloon. Maak seker dat u eers die projek plaaslik gerugsteun het, sodat dit op die Git -bediener is om af te laai.

git kloon git: //github.com/you/yourproject.git
sudo backup
Perfek. Nou is al die lêers hier. Ons kan hulle met LS sien

LS

Laat ons nou begin om die bediener op te stel. Kopieer eers u projekgids in 'n eenvoudige, onvergeetlike naam wat ons vir die projek sal gebruik.

cp -r jou projek wat jy ook nie

Waar "What YouCalledit" die nuwe naam van u projek is. Vervolgens moet ons 'n basiese nut opbou om die bediener op te stel. Ons sal hierdie nut stoor en dit in die toekoms gebruik. Om hierdie nut op te bou, laat ons 'n gebruiker binêre skep om te definieer hoe ons 'n skrip wysig. Gebruik bash, wysig/usr/bin/ascript
nano users/models.py
sudo nano/usr/bin/ascript

Maak seker dat u Sudo daar gebruik, sodat u toestemmings het om die lêer te wysig. Voeg hierdie reëls in die lêer by:

#!/bin/bash As [! -f/usr/bin/$ 1]; destyds sudo touch/usr/bin/$ 1 eggo "#!/bin/bash" >>/usr/bin/$ 1 sudo chmod a+x/usr/bin/$ 1 sudo nano/usr/bin/$ 1 eggo $ 1 | sudo tee -a /etc /ascripts anders sudo chmod a+x/usr/bin/$ 1 sudo nano/usr/bin/$ 1 fi
# !/bin/bash
!/bin/bash ">>/usr/bin/$ 1

Onthou dat hierdie skrif 'n argument, die skrifnaam, as $ 1 neem. Eerstens kontroleer dit of die lêer dit bestaan, of andersins skep, die eerste reël byvoeg om die skrif te verklaar, is bash, verander sy toestemmings, wysig dit en voeg die naam by /etc /ascripts waarmee ons die name van die skripte wat ons skep, kan stoor. As die lêer reeds bestaan, verander dan die toestemmings en wysig dit. Stoor die lêer, en daarna sal ons die toestemmings verander. Solank ons ​​hierdie skrif gebruik, hoef ons dit nie weer te doen nie.

sudo chmod a+x/usr/bin/ascript
    vendor = models.BooleanField(default=False)
Perfek. Laat ons nou 'n skrif met die naam Setup skep. Eerstens, om jou nie te oorweldig nie, maar kyk hoe my opstellingsskrif lyk. Ons sal deurloop hoe hierdie skrif in u projek moet lyk, u het nie alles in my skrif nodig om mee te begin nie.

#!/bin/bash Sekondes = 0 Python_version = 3.12 eggo "femmebabe -installeerder geïnitialiseer." # sudo chmod a+x scripts/userSetup # ./scripts/usersetup # SSH-KeyGen # Projekgids Dir = "/huis/span/femmebabe" Gebruiker = "Team" # Log opdragte eggo "Logging -opdragte" sudo cp log/commands.log /var/log/commands.log sudo chmod -r a+w /var /log sudo chown -R: syslog /var /log eggo $ 'alias venv = "bron/huis/span/femmebabe/venv/bin/aktiveer"' | sudo tee -a /home/team/.profile eggo $ 'prompt_command = \' retn_val = $?; logger -p local6.debug "$ (whoami) [$$]: $ (geskiedenis 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a /etc /bashrc eggo $ 'prompt_command = \' retn_val = $?; logger -p local6.debug "$ (whoami) [$$]: $ (geskiedenis 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a "/home/team/.bashrc" eggo $ 'prompt_command = \' retn_val = $?; logger -p local6.debug "$ (whoami) [$$]: $ (geskiedenis 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a /root/.bashrc eggo "bron /etc /bashrc" | sudo tee -a /home/team/.profile echo "/var/log/commands.log" | sudo tee -a /etc/logrotate.d/syslog eggo "local6.* /var/log/commands.log" | sudo tee -a "/etc/rsysslog.d/bash.conf" Sudo -diens Rsyslog herbegin # Nano config eggo "Stel TableSize 4" >>. Nanorc eggo "stel tabstospaces" >> .nanorc # Git config eggo "git configuration" Sudo Git Config -Global User.Eemail "jasper.camber.holton@gmail.com" && sudo git config -Global user.name "jasper holton" git config -global user.email "jasper.camber.holton@gmail.com" Git Config -Global user.Name "Jasper Holton" git config -global -add safe.directory $ "$ dir" sudo ssh -keyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/bekend_hosts sudo ssh -keyscan -t rsa github.com | sudo tee -a /root/.ssh/bekend_hosts eggo "Monting Setup" Sudo Mount -O -remount, grootte = 16G, EXEC /TMP # Update en installeer eggo "Opdatering en installeer pakkette" Sudo Apt Update && Sudo Needrestart_mode = A APT Upgrade -y Sudo APT Purge PostgreSQL-Client-14 Echo "postfix postfix/mailname string femmebabe.com" | Sudo DebConf-stel-seleksies eggo "postfix postfix/main_mailer_type string 'internet site'" | Sudo DebConf-stel-seleksies sudo needrestart_mode = 'n debian_frontend = noninteractive apt install -y postfix sudo needrestart_mode = a Apt install -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cmake python-is-python3 python3-venv python3-pip python3-django verwag tesseract-oCOCH-op opnam libopencv-dev python3-pytencv python3-dev libasl2-dev opendkim opendkim-tools dovecot-core dovecot-pop3d dovecot-imapd auditd procmail libpq-dev postgresql postgresql-contrib libheif-dev Snapd Git-sagteware-properties-common cerbot python3-certbot-apache eggo "-a uitgang, altyd -f boog = b64 -f euid = 0 -s execve" | sudo tee -a /etc/audit/audit.rules eggo "-a uitgang, altyd -f boog = b32 -f euid = 0 -s execve" | sudo tee -a /etc/audit/audit.rules # Aktiveer clamav antivirus eggo "Begin antivirus" Sudo Systemctl Aktiveer clamav-daemon Sudo Systemctl Start Clamav-Daemon # Stel gasheernaam in Echo "127.0.0.1 femmebabe" | sudo tee -a /etc /leërskare sudo hostnamectl set-hostname localhost # Stel postgres op eggo "Postgres Setup" Sudo -u Postgres psql -u postgres -c "DROP -databasisdatabasis;" Sudo -u Postgres psql -u postgres -c "Skep databasisdatabasis;" Sudo -u Postgres psql -u postgres -c "Skep gebruiker django met wagwoord 'wagwoord';" Sudo -u Postgres psql -u postgres -c "alter rol django stel client_encoding op 'utf8';" sudo -u postgres psql -u postgres -c "alter rol django set default_transaction_isolation to 'Read commited';" Sudo -u Postgres psql -u postgres -c "alter rol django stel tydsone op 'UTC';" Sudo -U Postgres PSQL -U Postgres -C "Vertel alle voorregte op die databasisdatabasis aan django;" # Stel databasis -rugsteun op Echo "Bou databasis van rugsteun, dit kan 'n rukkie duur." kat db.json. ?? > db.json eggo "Configuring Firewall" sudo ufw standaard laat uitgaande uitgaan sudo ufw standaard ontken inkomende sudo ufw laat 22 toe sudo ufw laat http toe sudo ufw laat https toe sudo ufw laat 'postfix' toe sudo ufw laat 'postfix smtps' toe sudo ufw laat 'postfix indiening' toe sudo ufw laat 'Dovecot pop3' toe sudo ufw laat 'Dovecot Secure Pop3' toe sudo ufw laat 110/tcp toe sudo ufw laat 25/tcp toe eggo "y" | Sudo UFW Aktiveer # Deaktiveer iptables eggo "Configuring Firewall" sudo iptables -p -insette aanvaar sudo iptables -p -uitset aanvaar sudo iptables -p vorentoe aanvaar sudo iptables -f Sudo iptables-save # Installeer BitDefender CD $ dir Echo "Runnning Bitdefender Antivirus Installer" wget https://cloud.gravityzone.bitdefender.com/packages/nix/0/7atssy/setup_downloader.tar Mkdir bitdefender teer -xf setup_downloader.tar -c bitdefender sudo rm setup_downloader.tar sed -i -e 's/{loginPasswd/z & a;*3bpd_qbgums/g' bitdefender/installeerder sudo chmod a+x bitdefender/installeerder sudo ./bitdefender/installer # Stel postfix op CD $ dir eggo "Mail Services Configuration" Sudo CP/etc/postfix/main.cf /etc/postfix/main.cf.backup sudo cp config/etc_postfix_main.cf /etc/postfix/main.cf sudo cp config/etc_postfix_master.cf /etc/postfix/master.cf sudo cp config/etc_default_opendkim/etc/default/opendkim sudo cp config/etc_dovecot_conf.d_10-auth.conf /etc/dovecot/conf.d/10-auth.conf sudo cp config/etc_dovecot_conf.d_10-master.conf /etc/dovecot/conf.d/10-master.conf sudo cp config/etc_dovecot_dovecot.conf /etc/dovecot/dovecot.conf sudo cp config/etc_dovecot_passwd/etc/dovecot/passwd sudo cp config/etc_opendkim.conf /etc/opendkim.conf sudo cp config/etc_default_opendkim/etc/default/opendkim sudo adduser postfix opendkim Sudo Mkdir /etc /Opendkim sudo mkdir/etc/opendkim/sleutels sudo mkdir /etc/opendkim/keys/femmebabe.com sudo mkdir/var/spool/postfix/opendkim sudo echo "*@femmebabe.com sendonly._domainkey.femmebabe.com" | sudo tee -a /etc/opendkim/signing.table sudo echo "sendonly._domainkey.femmebabe.com femmebabe.com:sendonly:/etc/opendkim/keys/femmebabe.com/sendonly.private" | sudo tee -a /etc/opendkim/key.table sudo eggo "127.0.0.1" | sudo tee -a /etc/opendkim/trusted.hosts sudo eggo "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/sleutels Sudo Chown Opendkim: Opendkim /etc/opendkim/keys/femmebabe.com/sendonly.private Sudo Chown Opendkim: Postfix/Var/Spool/Postfix/Opendkim CD $ dir Sudo CP Mailbox/*/var/Mail/ Sudo Chown: gebruikers/var/e -pos/* sudo chmod -r a+rwx/var/pos/* Sudo Systemctl herbegin Opendkim Postfix Dovecot # Skep dirs CD $ dir Mkdir Media/Audio MKDIR Media/klank/vingerafdrukke Mkdir Media/Security Mkdir Media/Secure Mkdir Media/Secure/Media Mkdir Media/Secure/Video Mkdir Media/Secure/Profile Mkdir Media/Secure/Face Mkdir Media/Beelde Mkdir Media/Live Mkdir Media/Live/Files Mkdir Media/Live/Stills MKDIR Media/lêers mkdir temp Mkdir temp/data Mkdir Temp/Gfpgan Mkdir Mail/Inbox Mkdir Mailbox # Setup virtualenv CD $ dir eggo "Skep virtuele omgewing" Python -M Venv Venv bron venv/bin/aktiveer # Kry en bou afhanklikhede eggo "om afhanklikheid te kry en te bou, dit kan 'n whit hou" CD $ dir git kloon https://github.com/sukhitashvili/violence-detection.git CP config/vd-requirements.txt Geweldopsporing/vereistes.txt CP Config/VD-Model.py Geweldopsporing/Model.py CD Geweldopsporing pip3 install -ren -vereistes.txt CD $ dir wget https://github.com/tencentarc/gfpgan/releases/download/v1.3.0/gfpganv1.3.pth -p -eksperimente/voorlopige_modelle git kloon https://github.com/tencentarc/gfpgan.git git kloon https://github.com/davisking/dlib.git CD DLIB Mkdir Build; CD -bou; cmake ..; cmake -bou. CD .. bron venv/bin/aktiveer python setup.py installasie CD $ dir bron venv/bin/aktiveer CD $ dir/gfpgan/ eggo "Installering van Python -afhanklikhede" PIP Installeer Basicsr PIP Installeer Facexlib PIP Install -R -vereistes.txt python setup.py ontwikkel Pip installeer realesrgan CD $ dir Sudo Chown -R -span: gebruikers GFPGAN eggo "Installeer 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 maak Sudo maak installasie # Stel firewall -reëls in CD $ dir # Installeer PYPI -afhanklikhede eggo "die installering van die oorblywende Python -afhanklikhede (dit kan 'n rukkie duur)" Sudo Systemctl Mask Tmp.mount CD $ dir bron venv/bin/aktiveer PIP3 Install -U "Celery [Redis]" PIP3 Installeer -R-vereistes.txt-Gebruik-DEPRECATED = Legacy Resolver-Use-PEP517 PIP3-installasie-Upgrade OpenCV-Python #== 4.5.4.60 PIP3-installasie-Upgrade OpenCV-Contrib-Python #== 4.5.4.60 #pip Installeer OpenCV-Python == 4.5.5.64 #pip Installeer OpenCV-Contrib-Python == 4.5.5.64 PIP3-installasie-Upgrade OpenCV-Python-Headless PIP3 verwyder kanale PIP3 verwyder Daphne PIP3 Installeer kanale ["Daphne"] PIP3 Installeer kussing == 9.5.0 PIP3 Installeer librosa PIP3 Install -U 'Twisted [TLS, HTTP2]' PIP3 Install-Upgrade CertiTi-versoeke Urllib3 Numpy Oauthlib Twisted Pyjwt Sqlparse Cryptography Astral WebAuthn DocBarcodes PDF417 Deepface-No-Cache-Dir PIP3 Installeer TensorFlow == 2.15.1 # Installeer Certbot eggo "Installeer sertifikate" 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 Aktiveer apache2 Sudo Systemctl Start Apache2 # Hardloop certbot sudo certbot --apache-non-interactive-tagree-tos-domeine femmebabe.com-e-pos jasper.camber.holton@gmail.com # Herlaai e -posbediener Sudo Systemctl herbegin Opendkim Postfix Dovecot # Kopieërserts #sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem #sudo cp /etc/letsencrypt/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" # Stel gebruikersinstellings in sudo gpasswd -a www -data -gebruikers # Stel toestemmings in eggo "Instelling van toestemmings" Sudo Chown -R -span: gebruikers cache/ sudo chmod a+rwx -r cache/ #sudo chown -r -span: gebruikers/var/run/ #sudo chown wortel: wortel/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 -span: gebruikers/var/log/ sudo chown -R: gebruikers .././ 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-data: gebruikers db.sqlite3 sudo chown -r www-data: www-data media/ sudo chown www-data: gebruikers ./ Sudo Chown -R -span: gebruikersmedia/ Sudo Chown -R -span: gebruikers ./ Sudo Chown -R -span: gebruikers ./gfpgan/ Sudo Chown -R -span: gebruikers ./temp/ Sudo Chmod A+R -span/var/e -pos/$ gebruiker # Kopieer konfigurasie en stel toestemmings in eggo "Configuring van oorblywende dienste" sudo cp config/apis.json /etc/apis.json sudo cp config/config.json /etc/config.json sudo cp config/femmebabe-le-ssl.conf /etc/apache2/sites-available/femmebabe-le-ssl.conf sudo cp config/etc_dovecot_passwd/etc/dovecot/passwd sudo cp config/etc_init.d_celery /etc/init.d/celery sudo cp config/etc_init.d_celerybeat /etc/init.d/celerybeat sudo cp config/etc_default_celerybeat/etc/default/celeryBeat sudo cp config/etc_default_celery/etc/default/celery sudo cp config/etc_systemd_system_daphne.service /etc/systemd/system/daphne.service sudo cp config/etc_systemd_system_celery.service /etc/systemd/system/celery.service sudo cp config/etc_systemd_system_celerybeat.service /etc/systemd/system/celerybeat.service sudo chmod a+x /etc/init.d/celery sudo chmod a+x /etc/init.d/celerybeat # Stel databasis op eggo "hardloop migrasies, dit moet vinnig wees" Python Manage.py makemigrations Python Manage.py migreer-hardloop-syncdb eggo "laai data, dit kan 'n rukkie duur" Python Manage.py LoadData db.json eggo "Setup crontab/sudoers configuration" sudo crontab -l -u root | Kat - config/crontab | sudo crontab -U wortel - Sudo sh -c "Cat Config/Sudoers >>/etc/Sudoers" # Spuit PAM -konfigurasie en verwyder foutiewe SSH -konfigurasie #sudo sed -i '' -e '$ d' /etc/pam.d/sshd #sudo sed -i '' -e '$ d' /etc /profiel eggo "Sessie benodig pam_exec.so seteuid /home/team/femmebabe/pam.sh" | sudo tee -a /etc/pam.d/sshd eggo "Sessie benodig 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 # Kopiebin -skrifte en stel toestemmings in eggo "Copying Scripts" sudo cp scripts/herlaai/usr/bin/ sudo cp scripts/check/usr/bin/ sudo cp scripts/enagpu/usr/bin/ sudo cp scripts/vermommpu/usr/bin/ Sudo CP -skrifte/aktiveer/usr/bin/ Sudo CP -skrifte/rugsteun/usr/bin/ sudo cp scripts/ascript/usr/bin/ sudo cp scripts/setup/usr/bin/ sudo cp scripts/addSetup/usr/bin/ Sudo CP -skrifte/Watchlogs/usr/bin/ sudo cp scripts/logs/usr/bin/ sudo cp scripts/cmds/usr/bin/ sudo cp scripts/setup/usr/bin/ sudo cp scripts/pushweb/usr/bin/ sudo cp scripts/purgecache/usr/bin/ Sudo CP Config/Banner/Ecc/Banner CD/usr/bin/ sudo chmod a+x aktiveer sudo chmod a+x rugsteun sudo chmod a+x ascript # Herlaai en Aktiveer dienste eggo "Aktiveer dienste" Sudo Systemctl Daemon-Reload Sudo Systemctl stel daphne.iens in staat Sudo Systemctl stel seldery in staat. Diens Sudo Systemctl stel CeleryBeat in staat. Diens Sudo Systemctl Aktiveer clamav-daemon Sudo Systemctl Start Daphne.Service Sudo Systemctl Start Celery.Service Sudo Systemctl Start CeleryBeat.Service Sudo Systemctl Start Clamav-Daemon # Aktiveer Apache -modules eggo "Aktiveer Apache2" sudo a2enmod herskryf sudo a2enmod wsgi Sudo A2enmod Headers Sudo A2enmod SSL sudo a2enmod proxy sudo a2enmod proxy_balancer sudo a2enmod proxy_httpp sudo a2enmod proxy_wstunnel #sudo a2dismod mpm_event #sudo a2dismod mpm_worker #sudo a2enmod mpm_prefork # Deaktiveer standaardwebwerf sudo a2dissite 000-default Sudo A2Dissite 000-Default-le-SSL # Aktiveer ons webwerf sudo a2ensite femmebabe-le-ssl # Herlaai Daemon en herbegin Apache, Postfix en Opendkim Sudo Systemctl Daemon-Reload Sudo Systemctl herbegin Apache2 Sudo Systemctl herbegin Opendkim postfix Sudo Systemctl Start Daphne # Stel toestemmings in sudo chown -R: www -data/var/www/ sudo chown -R: www -data /var/www/.deepface # Ruilkonfigurasie eggo "Om ruil toe te ken, dit kan 'n rukkie duur" Sudo Swapoff /Swapfile sudo rm /swapfile sudo fallocate -l 8g /swapfile Sudo DDf =/dev/nul van =/swapfile bs = 1024 telling = 8388608 Sudo Chmod 600 /Swapfile Sudo Mkswap /Swapfile Sudo Swapon /Swapfile eggo "/swapfile ruil ruil standaard 0 0" | sudo tee -a /etc /fstab Sudo Swapon -Show # Init -onderskrif enjin eggo "Inisialisering van roetine -onderskrif" /Home/Team/Femmebabe/venv/bin/python /home/team/femmebabe/routine_caption.py /Home/Team/Femmebabe/venv/bin/python /home/team/femmebabe/setup_mail.py # Setup git eggo "Stel git op" CD $ dir sudo rm -r .git git init-inisiatief-branch = main eggo "Instelling van gebruikerswagwoord" Sudo Usermod -Password $ (Echo Team | OpenSSL Passwd -1 -Stdin) Team # Toon IPv6 en Opendkim vir domeinkonfigurasie eggo "Kopieer die onderstaande inligting na domeinkonfigurasie." gasheernaam -i ip a | grep inet ip -6 addr | grep "omvangskakel" sudo cat /etc/opendkim/keys/femmebabe.com/sendonly.txt | tr -d '\ n' | Sed 'S/\ S // G' | Sed 'S/"" // G' | awk -f '[) (]' '{druk $ 2}' # Opstelling voltooi eggo "Opstelling voltooi in" WC -L Skripte/opstelling eggo "lyne van kode." eggo "Totale tyd:" Duur = $ sekondes eggo "$ ((duur / 60)) minute en $ ((duur % 60)) sekondes verloop." Echo "Todo:" Echo "- Kopieer hierbo IPv6-adres na DOMAIN DNS-konfigurasie" Echo "- kopieer domeinsleutel tot domeine DNS-konfigurasie" ECHO "- Voeg nuwe git-bewaarplek by met git afstands voeg oorspronglab." Echo "- Open Port 25" Echo "- Installeer antivirus volgens aanbeveling" eggo "- toets" eggo "As 'n nccesary," Echo "- Debug" Echo "- Stel opstelling en rugsteunskripte op" eggo "- fix server" eggo "" eggo "Dankie dat u die femmebabe -installeerder gebruik het. Hou 'n wonderlike dag!" eggo

!/bin/bash
cd project-directory-you-named # Sudo Chmod A+X Scripts/UserSetup
./scripts/usersetup

ssh-keygeneg

Projekgids
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Log opdragte

Nano config

Git config
nano users/mfa.py
Opdatering en installeer
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken

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

def send_text(target_phone, text):
    from twilio.rest import Client
    try:
        client = Client(account_sid, auth_token)
        if len(target_phone) >= 11:
            message = client.messages.create(
                to=target_phone,
                from_=source_phone,
                body=text + ' Text STOP to cancel.')
    except:
        messages.warning(get_current_request(), 'There was an error sending the message.')
        print(traceback.format_exc())

def get_num_length(num, length):
    n = ''
    for x in range(length):
        n = n + str(num)
    return int(n)

def send_verification_text(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))

def send_verification_email(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))

def send_user_text(user, text):
    send_text(user.profile.phone_number, text)

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result
Aktiveer clamav antivirus
# Stel gasheernaam in
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Stel postup -postgres op
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Stel databasis -rugsteun op
    user = User.objects.filter(id=token.user.id).first() # Deaktiveer iptables
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Installeer BitDefender
    if not user: raise PermissionDenied() # Stel postfix op
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Skep dirs
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Stel virtualenv op
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Kry en bou afhanklikhede
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Stel firewall -reëls op
    if not user.profile.mfa_enabled: # Installeer PYPI -afhanklikhede
        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 Installeer OpenCV-Python == 4.5.5.64
            user.profile.phone_number = '+1' # PIP Installeer OpenCV-Contrib-Python == 4.5.5.64
            user.profile.save() # Installeer Certbot
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Run certbot
    if request.method == 'POST' and not fraud_detect(request, True): # Herlaai posbediener
        form = TfaForm(request.POST) # Kopiesertserts
        code = str(form.data.get('code', None)) # sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
        if code and code != '' and code != None: # sudo cp /etc/letsencrypt/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) # Stel gebruikersinstellings in
            if token_validated: # Stel toestemmings in
                if is_verified: # Sudo Chown -R -span: gebruikers/var/run/
                    user.profile.mfa_enabled = True # sudo chown wortel: wortel/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-data: gebruikers db.sqlite3
                        return HttpResponseRedirect(next) # Kopieer config en stel toestemmings in
            elif not token_validated: # Stel databasis op
            if p.mfa_attempts > 3: # Spuit PAM -konfigurasie en verwyder foutiewe SSH -konfigurasie
            if form.data.get('send_email', False): # sudo sed -i '' -e '$ d' /etc/pam.d/sshd
    # sudo sed -i '' -e '$ d' /etc /profiel
Kopieer bin -skrifte en stel toestemmings in

Herlaai en dienste in staat stel

Aktiveer Apache -modules
from .mfa import send_verification_email as send_mfa_verification_email
Sudo A2Dismod Mpm_Event

sudo a2dismod mpm_worker

sudo a2enmod mpm_prefork
nano users/mfa.py
Deaktiveer standaardwebwerf
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))
Aktiveer ons webwerf

Herlaai Daemon en herbegin Apache, Postfix en Opendkim

Stel toestemmings in
# Ruilkonfigurasie
from .tests import is_superuser_or_vendor # Init -onderskrifmotor
    # Stel git op
    return render(request, 'users/users.html', { # Toon IPv6 en Opendkim vir domeinkonfigurasie
Opstel voltooi

Dit is baie opgestel! Kortom, hierdie kode logs opdragte, stel nano en git, kopieë oor lêers, downloads en installeer ubuntu aptke, python -afhanklikhede, stel postfix in, stel postgresql (die databasisbediener) en laai die databasis, maak 'n ufw ('n ongekompliseerde firewall), maak dit om te dink, 'n antivirus, downloads, downloads, downloads Afhankings, installeer sertifikate en stel die bediener op, installeer konfigurasie, begin en stel die Sever, ken ruil toe, stel toestemmings in, en druk die IP, IPv6 -adres en Opendkim -sleutel uit. Redelik eenvoudig, maar dit lyk soos baie kode. Ons sal nie baie hiervan nodig hê nie, want ons het nie die afhanklikhede nie, ons gebruik nie seldery, CeleryBeat of Daphne nie, maar ons sal in elk geval sommige daarvan installeer om aan die gang te kom. Let op dat hierdie kode 'n domein verskeie kere verklaar het.

Ons sal ook 'n domeinnaam moet koop (wat 'n klein jaarlikse fooi is). Ek beveel Squarespace aan vir die aankoop van 'n domein, hul uitleg is intuïtief en maklik om te gebruik. U kan enige domein van u keuse koop, maar ek gebruik die domein femmebabe.com in hierdie voorbeeld. Nadat u 'n domein gekoop het, gaan na die Squarespace DNS -konfigurasiepaneel en voeg 'n rekord by wat u domein met die IP -adres op die bediener wys. Dit moet so lyk:
def is_superuser_or_vendor(user):
    return user.profile.vendor or user.is_superuser
@ A xx.xx.xx.xx

Met die @ -operateur as gasheer, wat beteken dat alle subdomeine onder hierdie domein en die worteldomein almal na die bediener herlei word. Daar is meer rekords om te verklaar, maar ons kan hierna oorgaan sodra ons gereed is om e -pos te stuur. Hou in gedagte, dit kan 'n paar dae duur voordat u e -pos van die bediener kan stuur. Die DNS -rekords wat ons stel, sal tyd neem om te versprei.

Hoe dit ook al sy, die enigste rekord wat ons moet begin, is 'n rekord. Nou kan ons die onderstaande skrif volgens ons projek invul en dit uitvoer.
Laat ons begin met 'n kleiner opstellingsskrip om net te installeer wat ons nodig het vir 'n basiese vordering. Ons sal nog nie soveel afhanklikhede of PostgreSQL gebruik nie, ons sal net 'n basiese HTTP -bediener begin en bekommerd wees om dit te sertifiseer as dit gedoen is. Onthou, om 'n HTTPS -sertifikaat te kry en die bediener veilig uit te voer, moet ons 'n domein koop saam met die huur van 'n bediener. Vervang nou vir nou 'Team' in hierdie lêer met die naam van u gebruiker, 'DIR' met die gids van u projek, en voorsien u e -pos en domein in die <> tags.

Voordat ons hierdie kode uitvoer, moet ons die instellings verander na die firewall wat die gasheerverskaffer ondersteun, indien enige. Gewoonlik is dit in die 'Networks' -oortjie van u gasheerverskaffer, of as u self aanbied, is dit in die' Port Forward' -gedeelte van u router. U wil ook 'n statiese IP via u router opstel met die adres van u bedienermasjien, as u selfhosting gebruik. U moet die volgende poorte oopmaak vir lees-/skryftoegang.22 (SSH) 25 (pos) 587 (pos) 110 (Poskliënt) 80 (http) 443 (https)#!/bin/bash Sekondes = 0 Python_version = 3.12 eggo "femmebabe -installeerder geïnitialiseer." Dir = "/huis/span/" Gebruiker = "Team" # Log opdragte eggo "Logging -opdragte" sudo cp log/commands.log /var/log/commands.log sudo chmod -r a+w /var /log sudo chown -R: syslog /var /log eggo $ 'alias venv = "bron/huis/span/femmebabe/venv/bin/aktiveer"' | sudo tee -a /home/team/.profile eggo $ 'prompt_command = \' retn_val = $?; logger -p local6.debug "$ (whoami) [$$]: $ (geskiedenis 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a /etc /bashrc eggo $ 'prompt_command = \' retn_val = $?; logger -p local6.debug "$ (whoami) [$$]: $ (geskiedenis 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a "/home/team/.bashrc" eggo $ 'prompt_command = \' retn_val = $?; logger -p local6.debug "$ (whoami) [$$]: $ (geskiedenis 1 | sed" s/^[]*[0-9] \+[]*// ")" \ '' | sudo tee -a /root/.bashrc eggo "bron /etc /bashrc" | sudo tee -a /home/team/.profile echo "/var/log/commands.log" | sudo tee -a /etc/logrotate.d/syslog eggo "local6.* /var/log/commands.log" | sudo tee -a "/etc/rsysslog.d/bash.conf" Sudo -diens Rsyslog herbegin # Nano config eggo "Stel TableSize 4" >>. Nanorc eggo "stel tabstospaces" >> .nanorc # Git config eggo "git configuration" sudo git config -global user.email "@gmail.com" && sudo git config -global user.name "" git config -global -add safe.directory $ "$ dir" sudo ssh -keyscan -t rsa gitlab.com | sudo tee -a /root/.ssh/bekend_hosts sudo ssh -keyscan -t rsa github.com | sudo tee -a /root/.ssh/bekend_hosts # Update en installeer eggo "Opdatering en installeer pakkette" Sudo Apt Update && Sudo Needrestart_mode = A APT Upgrade -y Sudo APT Purge PostgreSQL-Client-14 Echo "postfix postfix/mailname string femmebabe.com" | Sudo DebConf-stel-seleksies eggo "postfix postfix/main_mailer_type string 'internet site'" | Sudo DebConf-stel-seleksies sudo needrestart_mode = 'n debian_frontend = noninteractive apt install -y postfix sudo needrestart_mode = a Apt install -y rkhunter clamav-daemon libx264-dev ffmpeg libapache2-mod-wsgi-py3 apache2 cmake python-is-python3 python3-venv python3-pip python3-django verwag tesseract-oCOCH-op opnam libopencv-dev python3-pytencv python3-dev libasl2-dev opendkim opendkim-tools dovecot-core dovecot-pop3d dovecot-imapd auditd procmail libpq-dev postgresql postgresql-contrib libheif-dev Snapd Git-sagteware-properties-common cerbot python3-certbot-apache # Aktiveer clamav antivirus eggo "Begin antivirus" Sudo Systemctl Aktiveer clamav-daemon Sudo Systemctl Start Clamav-Daemon # Stel gasheernaam in Echo "127.0.0.1 femmebabe" | sudo tee -a /etc /leërskare sudo hostnamectl set-hostname femmebabe # Stel databasis -rugsteun op Echo "Bou databasis van rugsteun, dit kan 'n rukkie duur." kat db.json. ?? > db.json eggo "Configuring Firewall" sudo ufw standaard laat uitgaande uitgaan sudo ufw standaard ontken inkomende sudo ufw laat 22 toe sudo ufw laat http toe sudo ufw laat https toe sudo ufw laat 'postfix' toe sudo ufw laat 'postfix smtps' toe sudo ufw laat 'postfix indiening' toe sudo ufw laat 'Dovecot pop3' toe sudo ufw laat 'Dovecot Secure Pop3' toe sudo ufw laat 110/tcp toe sudo ufw laat 25/tcp toe eggo "y" | Sudo UFW Aktiveer # Deaktiveer iptables eggo "Configuring Firewall" sudo iptables -p -insette aanvaar sudo iptables -p -uitset aanvaar sudo iptables -p vorentoe aanvaar sudo iptables -f Sudo iptables-save # Setup virtualenv CD $ dir eggo "Skep virtuele omgewing" Python -M Venv Venv bron venv/bin/aktiveer pip3 install -ren -vereistes.txt # Installeer Certbot eggo "Installeer sertifikate" 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 Aktiveer apache2 Sudo Systemctl Start Apache2 # Hardloop certbot sudo certbot-apache-non-interaktief-agree-tos-domeine femmebabe.com-eMail @gmail.com # Stel gebruikersinstellings in sudo gpasswd -a www -data -gebruikers # Stel toestemmings in eggo "Instelling van toestemmings" Sudo Chown -R -span: gebruikers cache/ sudo chmod a+rwx -r cache/ #sudo chown -r -span: gebruikers/var/run/ #sudo chown wortel: wortel/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 -span: gebruikers/var/log/ sudo chown -R: gebruikers .././ sudo chmod -r g+rwx ./ sudo chmod -r g+rx .././ sudo chmod -r g -rwx ../.ssh Sudo Chmod 774 ./ sudo chown -r www-data: www-data media/ sudo chown www-data: gebruikers ./ Sudo Chown -R -span: gebruikersmedia/ Sudo Chown -R -span: gebruikers ./ # Herlaai en Aktiveer dienste eggo "Aktiveer dienste" Sudo Systemctl Daemon-Reload Sudo Systemctl Aktiveer clamav-daemon Sudo Systemctl Start Clamav-Daemon # Aktiveer Apache -modules eggo "Aktiveer Apache2" sudo a2enmod herskryf sudo a2enmod wsgi Sudo A2enmod Headers Sudo A2enmod SSL sudo a2enmod proxy sudo a2enmod proxy_balancer sudo a2enmod proxy_httpp sudo a2enmodproxy_wstunnel # Herlaai Daemon en herbegin Apache, Postfix en Opendkim Sudo Systemctl Daemon-Reload Sudo Systemctl herbegin Apache2 Sudo Systemctl herbegin Opendkim postfix # Toon IPv6 en Opendkim vir domeinkonfigurasie eggo "Kopieer die onderstaande inligting na domeinkonfigurasie." gasheernaam -i ip a | grep inet ip -6 addr | grep "omvang

!/bin/bash

Log opdragte

Nano config
      <small># Git config
Opdatering en installeer

Aktiveer clamav antivirus

Stel gasheernaam in
Stel databasis -rugsteun op

Deaktiveer iptables

Stel virtualenv op
# Installeer Certbot
    success_url = '/' # Run certbot
    def test_func(self): # Stel gebruikersinstellings in
Stel toestemmings in

Sudo Chown -R -span: gebruikers/var/run/

sudo chown wortel: wortel/run/sudo/ts -r

Herlaai en dienste in staat stel

Aktiveer Apache -modules
nano users/urls.py
Herlaai Daemon en herbegin Apache, Postfix en Opendkim

Toon IPv6 en Opendkim vir domeinkonfigurasie

Voordat u hierdie kode uitvoer, moet u seker maak dat die domein wat u gekoop het, aan die bediener gekoppel is. Om dit te kan doen, maak 'n terminale op u plaaslike masjien oop en voer hierdie opdrag met u domein uit:
# ping femmebabe.com # voeg jou domein hier na ping in
# Voeg u domein hier in, na ping
As alles goed lyk en die bediener antwoorde stuur, is ons gereed om die skrip uit te voer en pakkette te installeer, sowel as om ons Apache -bediener in te skakel, in staat te stel.

Dit is nie al die opstelling wat nodig is om Postfix te konfigureer nie; ons sal later meer na die opstelling kyk. Begin nou hierdie opstellingskode en dit moet 'n paar minute neem om u bediener te installeer en te sertifiseer. Maak weereens seker dat u naam, e -pos en domeinnaam in die skrip vervang volgens die naam wat u gekoop het.

Noudat die bediener voorsien word, kan u na die URL in enige webblaaier gaan en kyk of die bediener HTTPS gebruik. As dit nie so is nie, probeer dan om 'n rukkie te wag vir die DNS -rekords om in te haal en voer dan die volgende opdrag uit om CertBot -sertifisering weer te gee:
sudo backup
sudo certbot-apache-non-interaktief-agree-tos-domeine .com-eMail @gmail.com

Solank u alles reg gekonfigureer het, moet u toegang tot Apache se standaardbladsy kan kry net om te weet dat u kode werk en 'n regstreekse webblad vertoon. Laat ons dan die instellings.py wysig om ons standaard -ontfoutmodus na produksie te verander. Ons sal ook die domein in die instellings, sowel as interne IP's, opstel.

nano yourprojek/instellings.py

Verander/voeg hierdie lyne in die instellings.

Ontfout = onwaar # Site Config Site_name = 'femme babe' Protokol = 'https' Domein = 'femmebabe.com' Site_id = 1 Base_url = protokol + ': //' + domein Toegelate_hosts = [domein] Interne_ips = [ 'Xx.xx.xx.xx', ]

Werfkonfig

Nou sal ons Apache2 moet opstel. Kom ons wysig die config -lêer wat ons met hierdie reël sal ontplooi:

sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf

Hierdie config -lêer moet ons domeinnaam daarin hê, en die naam van die gebruiker en projek. Ek gebruik die domeinnaam femmebabe.com, die gebruikersnaamspan en die projeknaam femmebabe.

Serversignature Off Servertokens prod Herlei permanente/https://femmebabe.com/ Serverame femmebabe.com ServerAdmin span@femmebabe.com DocumentRoot/var/www/html Foutlog $ {apache_log_dir} /error.log CustomLog $ {apache_log_dir} /access.log gekombineer Alias/staties/huis/span/femmebabe/staties Vereis dat alles toegestaan ​​word Alias/media/ikone/huis/span/femmebabe/media/ Vereis dat alles toegestaan ​​word Vereis dat alles toegestaan ​​word Wsgiscriptalias//home/team/femmebabe/femmebabe/wsgi.py Wsgidaemonprocess femmebabe python-path =/home/span/femmebabe/python-home =/home/span/femmebabe/Venv kop-buffer-grootte = 100000000000 gebruiker = span Wsgiprocessgroup femmebabe WsgiapplicationGroup %{global} Opsiesindekse volgsig Allatoverride All Herskryfgine op REWRITECOND %{request_uri} \. (CSS | WebP | WebM | GIF | PNG | MP3 | WAV | JPEG | JPG | SVG | WebP) $ [NC] Rewritecond %{http_referer}!^Https: //femmebabe.com/media/.*$ [nc] Herskryf ^(.+?)/$/Media/$ 1 [f, l] Sluit /etc/letsetsencrypt/options-ssl-apache.conf in Sslcertificatefile /etc/letsencrypt/live/femmebabe.com/fullchain.pem SslCertificateKeyefile /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 Kopstel Cache-Beheer "Max-Age = 30, Public" Serverame femmebabe.com ServerAdmin span@femmebabe.com DocumentRoot/var/www/html Foutlog $ {apache_log_dir} /error.log CustomLog $ {apache_log_dir} /access.log gekombineer Herskryfgine op Herskryfcond %{server_name} = femmebabe.com Herskryf ^ https: //%{server_name}%{request_uri} [einde, ne, r = permanent]

Sorg dat u die naam van die projek, kaarte en domein in hierdie voorbeeldkode vervang wanneer u u bediener opstel. Nou moet ons die standaardwebwerf deaktiveer. Dit kan gedoen word met Bash.

Sudo A2Dissite 000-Default-le-SSL sudo a2dissite 000-default Sudo A2Dissite Default-SSL

Vervolgens kan ons die standaardwebwerf in staat stel en Apache2 herlaai, ook met Bash. Onthou om femmebabe te vervang met die naam van die lêer wat u verklaar het tydens die redigering van/etc/apache2/webwerwe-beskikbaar/.

sudo a2ensite femmebabe-le-ssl Sudo Systemctl herlaai Apache2

Gaan terug na u domein in die Navbar. U moet die webwerf sien wat u in u webblaaier gekonfigureer het. Baie geluk! As u dit nie sien nie, moet u dalk 'n paar veranderinge aanbring. Lees die instellings in u projek, Apache -konfigurasie, noukeurig, en maak seker dat u geen foute het nie, en voer die volgende opdragte uit om die projek vir foute na te gaan.
ssh-keygen
CD -projeknaam bron venv/bin/aktiveer Python Manage.py tjek

As u foute in u Python -projek het, moet u dit opspoor na waar hulle is en regmaak. U kan miskien nie al u foute sien nie, afhangende van waar hulle is, so as u 'n fout het wat sê "Populate is nie weer herintrant nie", wysig die volgende lêer in die virtuele omgewing, register.py, om die fout bloot te stel.

nano venv/lib/python3.12/werfpackages/django/apps/register.py
cat ~/.ssh/id_rsa.pub
Blaai na reël 83, waar hierdie runtime -fout geopper word (Raise RuntimeError ("Populate () is nie herintrant nie")), en voeg 'n opmerking voor hierdie reël by, en voeg dan met dieselfde inkeping by, self.app_configs = {}. Dit lyk so:

As self.laai: # Voorkom herintrantoproepe om te verhoed dat AppConfig.ready () # Metodes twee keer. # Raise RuntimeError ("Populate () is nie herintrant nie") self.app_configs = {} self.loading = waar

Voorkom herintrantoproepe om AppConfig.ready () te vermy ()
ssh-keygen -t rsa -b 4096
metodes twee keer.

Raise RuntimeError ("Populate () is nie herintrant nie")

U kan dan weer die projek nagaan en die fout blootstel.
ssh ubuntu@XX.XX.XX.XX
Python Manage.py tjek

Dan kan u die fout sien en dit regstel. As u dit regstel en die kode sonder foute saamstel, moet u die lêer terug verander, sodat dit so lyk:

As self.laai: # Voorkom herintrantoproepe om te verhoed dat AppConfig.ready () # Metodes twee keer. Raise RuntimeError ("Populate () is nie herintrant nie") # self.app_configs = {} self.loading = waar

Voorkom herintrantoproepe om AppConfig.ready () te vermy ()

metodes twee keer.
nano sshd_config
self.app_configs = {}
# Mits die bediener aanlyn is, moet ons die volgende opdrag gebruik om die bediener te herlaai as ons verdere veranderinge daaraan aanbring:
# Sudo Systemctl herlaai Apache2
# Awesome! Maar wat van die stuur van e -pos? Om e -pos te stuur, moet ons eers die domeinkonfigurasie opdateer. Dit moet in u DNS -paneel in Squarespace wees, of watter domeinnaamregistrateur u ook al gekies het. Ons sal ook konfigurasie moet installeer en byvoeg en 'n paar opdragte uitvoer.
# Laat ons eers die IPv6 -adres van die bediener kry. Ons sal dan u DNS oopmaak en die rekords byvoeg.
# Gebruik hierdie opdrag om die IPv6 -adres van die bediener te kry:
# ip -6 addr
# Nou kan ons die volgende rekords by die DNS -instellings voeg. My rekords lyk so. Vir u rekords moet u egter die IP -adres met u IP vervang (nie 75.147.182.214, dit is myne). Voeg ook u domein in die plek van femmebabe.com, sowel as u IPv6 -adres wat met die vorige opdrag gevind is (u kan nie myne gebruik nie, Fe80 :: 725A: FFF: FE49: 3E02). Moenie bekommerd wees oor die Domainkey vir nou nie, dit word geskep wanneer ons Postfix, die e -posbediener, met OpenDkim opstel en die sleutel druk. Ons sal dit laaste opstel.
# @
N
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
# DEFAULT._BIMI
Txt
N/A
v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
# _dmarc
Txt
N/A
v = dmarc1; P = Geen
# Nou moet ons 'n paar volgehoue ​​konfigurasie vir postfix byvoeg. Al wat ons hoef te doen is om seker te maak dat ons die domeinnaam, femmebabe.com, vervang met die domeinnaam wat u gebruik. Kom ons kyk na al die config -lêers een vir een en installeer dit in 'n gids genaamd Config in ons projek, om op die bedryfstelsel te installeer.
# nano config/etc_postfix_main.cf
# Voeg hierdie teks by die lêer
# # Kyk /usr/share/postfix/main.cf.dist vir 'n kommentaar, meer volledige weergawe


# Debian -spesifiek: Spesifisering van 'n lêernaam sal die eerste veroorsaak
# reël van die lêer wat as die naam gebruik moet word.  Die Debian standaard
# is /etc /e -posnaam.
#Myorigin = /etc /MailName

smtpd_banner = $ myhostname Esmtp $ mail_name (ubuntu)
biff = nee

# Aanhanger .Domain is die werk van die MUA.
voeg_dot_mydomain = nee

# Ontkoppeling van die volgende reël om waarskuwings "vertraagde pos" te genereer
#delay_warning_time = 4h

readme_directory = nee

# Kyk http://www.postfix.org/compatibility_readme.html - standaard tot 3.6 op
# vars installasies.
verenigbaarheid_level = 3.6



# TLS -parameters
smtpd_tls_cert_file =/etc/letsencrypt/live/femmebabe.com/fullchain.pem
smtpd_tls_key_file =/etc/letsencrypt/live/femmebabe.com/privkey.pem
smtpd_tls_security_level = mag

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

SMTPD_RELAY_RESTRICTS = PERMIT_SASL_AUTHENTICED, DEFER_UNAUTH_DESTINASIE
MyHostName = femmebabe.com
alias_maps = hash:/etc/aliasse
alias_database = hash:/etc/aliasse
myorigin = /etc /e -posnaam
mydestination = femmebabe.com, localhost, $ myhostname
smtp_helo_name = femmebabe.com
MyNetWorks = 127.0.0.0/8 [::fff:127.0.0.0.0.00/104 [:: 1]/128
Mailbox_size_limit = 0
ontvanger_delimiter = +
inet_interfaces = almal
inet_protocols = almal

# Milter Configuration
milter_default_action = aanvaar
milter_protocol = 6
smtpd_milters = plaaslik: /opendkim/opendkim.sock
non_smtpd_milters = $ smtpd_milters

smtp_tls_security_level = encrypt
smtp_tls_loglevel = 1

Virtual_transport = LMTP: Unix: Privaat/Dovecot-Lmtp

smtpd_sasl_path = private/auth
# Kyk /usr/share/postfix/main.cf.dist vir 'n kommentaar, meer volledige weergawe
# Debian spesifiek: Spesifisering van 'n lêernaam sal die eerste veroorsaak
# reël van die lêer wat as die naam gebruik moet word.  Die Debian standaard
# is /etc /e -posnaam.
# myorigin = /etc /e -posnaam
# bykomende. Domain is die werk van die MUA.
# Die volgende reël om 'n vertraagde pos 'waarskuwings te genereer
# vertraging_warning_time = 4h
# Kyk http://www.postfix.org/compatibility_readme.html - standaard tot 3.6 op
# vars installasies.
# TLS -parameters
# Milter konfigurasie
# Volgende konfigurasie!
# nano config/etc_postfix_master.cf
# Voeg hierdie lyne by:
# #
# Postfix Master Process Configuration File.  Vir meer inligting oor die formaat
# van die lêer, sien die Master (5) handbladsy (opdrag: "man 5 meester" of
# On-line: http://www.postfix.org/master.5.html).
#
# Moenie vergeet om "Postfix Reload" uit te voer nadat u hierdie lêer geredigeer het nie.
#
# ============================================================================================================ is
# Dienstipe Privaat UNPRIV CHROOT WAKEUP MAXPROC COMMAND + ARGS
# (ja) (ja) (nee) (nooit) (100)
# ============================================================================================================ is
Smtp inet n - y - - smtpd
#smtp inet n - y - 1 postcreen
#Smtpd Pass - - Y - - SMTPD
#dnsblog unix - - y - 0 dnsblog
#TLPROXY UNIX - - Y - 0 TLPROXY
# Kies een: Aktiveer indiening slegs vir Loopback -kliënte, of vir enige kliënt.
#127.0.0.1: indiening inet n - y - - smtpd
indiening inet n - y - - smtpd
  -o smtpd_relay_restrictions = permit_sasl_authenticated, verwerp
  -o SMTPD_RECIPIENT_RESTRICTS = PERMIT_SASL_Authenticated, verwerp
  -o syslog_name = postfix/indiening
  -o smtpd_tls_security_level = Encrypt
  -o smtpd_tls_wrappermode = nee
  -o smtpd_sasl_auth_enable = ja
  -o smtpd_sasl_type = Dovecot
  -o smtpd_sasl_path = private/auth
# -o syslog_name = postfix/indiening
# -o smtpd_tls_security_level = Encrypt
# -o smtpd_sasl_auth_enable = ja
# -o smtpd_tls_auth_only = ja
# -o smtpd_reject_unlisted_recipient = nee
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o SMTPD_HELO_RESTRICTS = $ MUA_HELO_RESTRICTS
# -o SMTPD_SENDER_RESTRICTS = $ MUA_SENDER_RESTRICTS
# -o SMTPD_RECIPIENT_RESTRICTS =
# -o SMTPD_RELAY_RESTRICTS = PERMIT_SASL_Authenticated, verwerp
# -o milter_macro_daemon_name = oorsprong
# Kies een: Aktiveer SMTP's slegs vir Loopback -kliënte, of vir enige kliënt.
#127.0.0.1: Smtps inet n - y - - smtpd
#smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -o smtpd_tls_wrappermode = ja
# -o smtpd_sasl_auth_enable = ja
# -o smtpd_reject_unlisted_recipient = nee
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o SMTPD_HELO_RESTRICTS = $ MUA_HELO_RESTRICTS
# -o SMTPD_SENDER_RESTRICTS = $ MUA_SENDER_RESTRICTS
# -o SMTPD_RECIPIENT_RESTRICTS =
# -o SMTPD_RELAY_RESTRICTS = PERMIT_SASL_Authenticated, verwerp
# -o milter_macro_daemon_name = oorsprong
#628 Inet N - Y - - QMQPD
Pickup Unix N - Y 60 1 bakkie
skoonmaak unix n - y - 0 skoonmaak
QMGR Unix N - N 300 1 QMGR
#qmgr unix n - n 300 1 oqmgr
TLSMGR UNIX - - Y 1000?   1 tlsmgr
Herskryf Unix - - Y - - Trivial -Rewrite
Bounce Unix - - Y - 0 Bounce
Uitstel Unix - - Y - 0 Bounce
Trace Unix - - Y - 0 Bounce
Verifieer Unix - - Y - 1 Verifieer
Spoel unix n - y 1000?   0 spoel
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
Fout Unix - - Y - - Fout
Herhou weer Unix - - Y - - Fout
Gooi Unix - - y - - weggooi
plaaslike unix - n n - - plaaslik
virtuele unix - n n - - virtueel
LMTP Unix - - Y - - LMTP
Anvil Unix - - Y - 1 Anvil
scache unix - - y - 1 scache
postlog unix -dgram n - n - 1 postlogd
#
# =====================================================================================================================
# Interfaces to Non-PostFix-sagteware. Ondersoek die handleiding
# bladsye van die nie-postfix-sagteware om uit te vind watter opsies hy wil hê.
#
# Baie van die volgende dienste gebruik die postfix -pyp (8) aflewering
# Agent.  Raadpleeg die pyp (8) manbladsy vir inligting oor $ {ontvanger}
# en ander opsies vir die koevert.
# =====================================================================================================================
#
# MailDrop. Raadpleeg die Postfix MailDrop_Readme -lêer vir meer inligting.
# Spesifiseer ook in main.cf: Maildrop_destination_recipient_limit = 1
#
MailDrop Unix - Nn - - pyp
  vlae = drxhu gebruiker = vmail argv =/usr/bin/maildrop -d $ {ontvanger}
#
# =====================================================================================================================
#
# Onlangse Cyrus -weergawes kan die bestaande "LMTP" Master.cf -inskrywing gebruik.
#
# Spesifiseer in cyrus.conf:
# lmtp cmd = "lmtpd -a" luister = "localhost: lmtp" proto = tcp4
#
# Spesifiseer in Main.cf een of meer van die volgende:
# mailbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
#
# =====================================================================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Spesifiseer ook in main.cf: cyrus_destination_recipient_limit = 1
#
#cyrus unix - n n - - pyp
# vlae = drx gebruiker = cyrus argv =/cyrus/bin/aflewer -e -r $ {sender} -m $ {uitbreiding} $ {gebruiker}
#
# =====================================================================================================================
# Ou voorbeeld van aflewering via Cyrus.
#
#Old -Cyrus Unix - N N - - Pyp
# vlae = r gebruiker = cyrus argv =/cyrus/bin/aflewer -e -m $ {uitbreiding} $ {gebruiker}
#
# =====================================================================================================================
#
# Kyk na die Postfix uucp_readme -lêer vir konfigurasiebesonderhede.
#
UUCP unix - n n - - pyp
  vlae = fqhu gebruiker = uucp argv = uux -r -n -z -a $ sender -$ nexthop! rmail ($ ontvanger)
#
# Ander eksterne afleweringsmetodes.
#
ifmail unix - n n - - pyp
  vlae = f gebruiker = ftn argv =/usr/lib/ifmail/ifmail -r $ nexthop ($ ontvanger)
BSMTP unix - n n - - pyp
  Vlae = fq. gebruiker = bsmtp argv =/usr/lib/bsmtp/bsmtp -t $ nexthop -f $ sender $ ontvanger
scalemail -backend unix - n n - 2 pyp
  vlae = r gebruiker = scalemail argv =/usr/lib/scalemail/bin/scalemail-store $ {nexthop} $ {user} $ {uitbreiding}
Mailman Unix - N N - - Pyp
  vlae = frx gebruiker = lys argv =/usr/lib/mailman/bin/postfix-to-e-posman.py $ {nexthop}
# 
# Postfix Master Process Configuration File.  Vir meer inligting oor die formaat
# van die lêer, sien die Master (5) handblad (opdrag: "man 5 meester" of
# On-line: http://www.postfix.org/master.5.html).
# 
# Moenie vergeet om "Postfix Reload" uit te voer nadat u hierdie lêer geredigeer het nie.
# 
# ======================================================================================================================
# Dienstipe Privaat UNPRIV CHROOT WAKEUP MAXPROC COMMAND + ARGS
# (ja) (ja) (nee) (nooit) (100)
# ======================================================================================================================
# SMTP Inet N - Y - 1 Postcreen
# SMTPD PASS - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# TLPROXY UNIX - - Y - 0 TLPROXY
# Kies een: Aktiveer indiening slegs vir Loopback -kliënte, of vir enige kliënt.
# 127.0.0.1: Submission inet n - y - - smtpd
# -o syslog_name = postfix/indiening
# -o smtpd_tls_security_level = Encrypt
# -o smtpd_sasl_auth_enable = ja
# -o smtpd_tls_auth_only = ja
# -o smtpd_reject_unlisted_recipient = nee
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o SMTPD_HELO_RESTRICTS = $ MUA_HELO_RESTRICTS
# -o SMTPD_SENDER_RESTRICTS = $ MUA_SENDER_RESTRICTS
# -o SMTPD_RECIPIENT_RESTRICTS =
# -o smtpd_relay_restrictions = permit_sasl_authenticated, verwerp
# -o milter_macro_daemon_name = oorsprong
# Kies een: Aktiveer SMTP's slegs vir Loopback -kliënte, of vir enige kliënt.
# 127.0.0.1:smtps inet n - y - - smtpd
# Smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -o smtpd_tls_wrappermode = ja
# -o smtpd_sasl_auth_enable = ja
# -o smtpd_reject_unlisted_recipient = nee
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o SMTPD_HELO_RESTRICTS = $ MUA_HELO_RESTRICTS
# -o SMTPD_SENDER_RESTRICTS = $ MUA_SENDER_RESTRICTS
# -o SMTPD_RECIPIENT_RESTRICTS =
# -o smtpd_relay_restrictions = permit_sasl_authenticated, verwerp
# -o milter_macro_daemon_name = oorsprong
# 628 inet n - y - - qmqpd
# Qmgr unix n - n 300 1 oqmgr
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
# 
# ================================================================================================ is
# Koppelvlakke na nie-postfix-sagteware. Ondersoek die handleiding
# Bladsye van die nie-postfix-sagteware om uit te vind watter opsies hy wil hê.
# 
# Baie van die volgende dienste gebruik die postfix -pyp (8) aflewering
# agent.  Raadpleeg die pyp (8) manbladsy vir inligting oor $ {ontvanger}
# en ander opsies vir die koevert van boodskappe.
# ================================================================================================ is

MailDrop. Raadpleeg die Postfix MailDrop_Readme -lêer vir meer inligting.

Spesifiseer ook in main.cf: MailDrop_Destination_Recipient_limit = 1
nano initialize

================================================================================================ is

# Onlangse Cyrus -weergawes kan die bestaande "LMTP" Master.cf -inskrywing gebruik.

Spesifiseer in cyrus.conf:

lmtp cmd = "lmtpd -a" luister = "localhost: lmtp" proto = tcp4

Spesifiseer in Main.cf een of meer van die volgende:
ssh team@XX.XX.XX.XX
mailbox_transport = lmtp: inet: localhost

Virtual_transport = lmtp: inet: localhost

================================================================================================ is

cat ~/.ssh/id_rsa.pub
Cyrus 2.1.5 (Amos Gouaux)

Spesifiseer ook in main.cf: cyrus_destination_recipient_limit = 1

git clone git://github.com/you/yourproject.git
Cyrus unix - n n - - pyp

vlae = drx gebruiker = cyrus argv =/cyrus/bin/aflewer -e -r $ {sender} -m $ {uitbreiding} $ {gebruiker}

ls
================================================================================================ is

Ou voorbeeld van aflewering via Cyrus.

cp -r yourproject whatyoucalledit
Old -Cyrus unix - n n - - pyp

vlae = r gebruiker = cyrus argv =/cyrus/bin/aflewer -e -m $ {uitbreiding} $ {gebruiker}

sudo nano /usr/bin/ascript
================================================================================================ is

Raadpleeg die postfix uucp_readme -lêer vir konfigurasiebesonderhede.
# 
    echo "# 
Ander eksterne afleweringsmetodes.

En die Opendkim -konfigurasie. Opendkim identifiseer e -posbedieners met domeinksleutels om hulle veiliger te maak. Daarsonder is e -pos nie onderteken nie en kom dit miskien nie na 'n inkassie nie.
sudo chmod a+x /usr/bin/ascript
nano config/etc_default_opendkim

Voeg hierdie lyne by:

# Opmerking: dit is 'n nalatenskapskonfigurasielêer. Dit word nie deur die Opendkim gebruik nie # SystemD -diens. Gebruik die ooreenstemmende konfigurasieparameters in # /etc/opendkim.conf in plaas daarvan. # # Voorheen sou 'n mens die standaardinstellings hier wysig en dan uitvoer # /lib/opendkim/opendkim.service.genereer om stelsels te genereer # /etc/systemd/system/opendkim.service.d/override.conf en # /etc/tmpfiles.d/opendkim.conf. Alhoewel dit nog moontlik is, is dit nou # word aanbeveel om die instellings direk aan te pas in /etc/opendkim.conf. # #Daemon_opts = "" # Verander na/var/spoel/postfix/run/opendkim om 'n unix -sok met # postfix in 'n chroot: #Rundir =/var/spool/postfix/run/opendkim Rundir =/run/opendkim # # Ontkoppeling om 'n alternatiewe sok te spesifiseer # Let daarop dat die instelling daarvan enige sokwaarde in OpenDkim.conf sal ignoreer # standaard: Sok = "plaaslik: /var/spool/postfix/opendkim/opendkim.sock" # Luister op alle koppelvlakke op poort 54321: #Sok = inet: 54321 # Luister op Loopback op poort 12345: #Sok = inet: 12345@localhost # Luister op 192.0.2.1 op poort 12345: #Socket = inet: 12345@192.0.2.1 Gebruiker = Opendkim Groep = Opendkim Pidfile = $ rundir/$ name.pid Extraafter =
# Opmerking: dit is 'n nalatenskapskonfigurasielêer. Dit word nie deur die Opendkim gebruik nie
# SystemD -diens. Gebruik die ooreenstemmende konfigurasieparameters in
# /etc/opendkim.conf in plaas daarvan.
# 
# Voorheen sou 'n mens die standaardinstellings hier wysig en dan uitvoer
# /lib/opendkim/opendkim.service.
# /etc/systemd/system/opendkim.service.d/override.conf en
# /etc/tmpfiles.d/opendkim.conf. Alhoewel dit nog moontlik is, is dit nou
# aanbeveel om die instellings direk aan te pas in /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Verander na/var/spoel/postfix/run/opendkim om 'n unix -sok met
# Postfix in 'n chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Onkomment om 'n alternatiewe sok te spesifiseer
# Let daarop dat die instelling daarvan enige sokwaarde in OpenDkim.conf sal ignoreer
# verstek:
# Luister op alle koppelvlakke op hawe 54321:
# Sok = inet: 54321
# Luister op Loopback op poort 12345:
pip3 install --upgrade opencv-python # Sok = inet: 12345@localhost
pip3 install --upgrade opencv-contrib-python # Luister op 192.0.2.1 op poort 12345:
# Sok = inet: 12345@192.0.2.1
# nano config/etc_dovecot_conf.d_10-master.conf
# Voeg hierdie lyne by:
# 0-meester.conf 
#default_process_limit = 100
#default_client_limit = 1000

# Standaard VSZ (virtuele geheue -grootte) limiet vir diensprosesse. Dit is hoofsaaklik
# bedoel om prosesse te vang en dood te maak wat geheue lek voordat hulle op eet
# alles.
#default_vsz_limit = 256m

# Aanmeldingsgebruiker word intern gebruik deur aanmeldprosesse. Dit is die mees onbetroubaarste
# Gebruiker in Dovecot -stelsel. Dit moet glad nie toegang tot iets hê nie.
#default_login_user = dovenull

# Interne gebruiker word gebruik deur onbevoorregte prosesse. Dit moet apart van
# Aanmeldingsgebruiker, sodat aanmeldprosesse nie ander prosesse kan steur nie.
#default_internal_user = Dovecot

diens imap-login {
  inet_listener imap {
    #port = 143
  }
  inet_listener imaps {
    #port = 993
    #ssl = ja
  }

  # Aantal verbindings om te hanteer voordat u met 'n nuwe proses begin. Tipies
  # Die enigste nuttige waardes is 0 (onbeperk) of 1. 1 is veiliger, maar 0
  # is vinniger. 
  #Service_Count = 1

  # Aantal prosesse om altyd te wag vir meer verbindings.
  #process_min_avail = 0

  # As u Service_Count = 0 stel, moet u dit waarskynlik laat groei.
  #vsz_limit = $ default_vsz_limit
}

diens pop3-login {
  inet_listener pop3 {
    #port = 110
  }
  inet_listener pop3s {
    #port = 995
    #ssl = ja
  }
}

Diensvoorlegging-logien {
  Inet_listener -indiening {
    #port = 587
  }
}

Diens LMTP {
  unix_listener/var/spool/postfix/private/dovecot-lmtp {
    groep = postfix
    modus = 0666
    Gebruiker = postfix
  }

  # Skep slegs luisteraar as u nie die bogenoemde Unix -aansluiting kan gebruik nie
  #inet_listener lmtp {
    # Vermy LMTP sigbaar vir die hele internet
    #Address =
    #port = 
  #}
}

diens imap {
  # Die meeste van die geheue gaan na mmap () lêers. Miskien moet u dit verhoog
  # Limiet as u groot posbusse het.
  #vsz_limit = $ default_vsz_limit

  # Max. Aantal IMAP -prosesse (verbindings)
  #process_limit = 1024
}

diens pop3 {
  # Max. Aantal POP3 -prosesse (verbindings)
  #process_limit = 1024
}

Diensvoorlegging {
  # Max. Aantal SMTP -indieningsprosesse (verbindings)
  #process_limit = 1024
}

Diens Author {
  # Auth_Socket_Path wys standaard na hierdie userDB -aansluiting. Dit is tipies
  # Gebruik deur Dovecot-LDA, DoveadM, moontlik IMAP-proses, ens.
  # Volle toestemmings op hierdie sok kan 'n lys kry van alle gebruikersname en
  # Kry die resultate van almal se USERDB -op soek.
  #
  # Die standaard 0666 -modus stel iemand in staat om aan die sok te koppel, maar die
  # userDB -opsoeke sal slegs slaag as die userDB 'n "UID" -veld teruggee
  # stem ooreen met die UID van die oproeperproses. Ook as die UID of GID van die beller ooreenstem met die
  # Socket se UID of GID Die opsoek slaag. Enigiets anders veroorsaak 'n mislukking.
  #
  # Om die oproeper volle toestemmings te gee om alle gebruikers op te soek, stel die modus op
  # iets anders as 0666 en Dovecot laat die kern die
  # Toestemmings (bv. 0777 laat almal volle toestemmings toe).
  unix_listener/var/spool/postfix/private/auth
    modus = 0660
    Gebruiker = postfix
    groep = postfix
  }
}

Diens Author-werker {
  # Auth -werkersproses word standaard as wortel uitgevoer, sodat dit toegang kan kry
  # /etc /Shadow. As dit nie nodig is nie, moet die gebruiker verander word na
  # $ default_internal_user.
  #gebruiker = wortel
}

Diens DICT {
  # As DICT -instaanbediener gebruik word, moet e -posprosesse toegang tot die sok hê.
  # Byvoorbeeld: modus = 0660, groep = Vmail en Global Mail_access_Groups = Vmail
  unix_listener dict {
    #Mode = 0600
    #gebruiker = 
    #groep = 
  }
}
# DEFAULT_PROCESS_LIMIT = 100
# Default_client_limit = 1000
# Standaard VSZ (virtuele geheue -grootte) limiet vir diensprosesse. Dit is hoofsaaklik
# bedoel om prosesse te vang en dood te maak wat die geheue lek voordat hulle eet
# alles.
# DEFAULT_VSZ_LIMIT = 256M
# Aanmeldingsgebruikers word intern gebruik deur aanmeldprosesse. Dit is die mees onbetroubaarste
# Gebruiker in Dovecot -stelsel. Dit moet glad nie toegang tot iets hê nie.
# DEFAULTE_LOGIN_USER = DOEVOUDL
# Interne gebruiker word deur onbevoorregte prosesse gebruik. Dit moet apart van
# Aanmeldingsgebruiker, sodat aanmeldprosesse nie ander prosesse kan steur nie.
# DEFAULT_INTERNAL_USER = DOVECOT
# Poort = 143
# poort = 993
# SSL = Ja
# Aantal verbindings om te hanteer voordat u met 'n nuwe proses begin. Tipies
# Die enigste nuttige waardes is 0 (onbeperk) of 1. 1 is veiliger, maar 0
# is vinniger. <doc/wiki/loginprocess.txt>
# service_count = 1
# Aantal prosesse om altyd te wag vir meer verbindings.
# proses_min_avail = 0
# As u Service_Count = 0 stel, moet u dit waarskynlik laat groei.
# vsz_limit = $ default_vsz_limit
# poort = 110
# poort = 995
# SSL = Ja
# poort = 587
# Skep slegs luisteraar as u nie die bogenoemde Unix -aansluiting kan gebruik nie
# inet_listener lmtp {
# Vermy LMTP sigbaar vir die hele internet
# adres =
poort =

}

Die meeste van die geheue gaan na mmap () lêers. Miskien moet u dit verhoog

Beperk as u groot posbusse het.

vsz_limit = $ default_vsz_limit

Maks. Aantal IMAP -prosesse (verbindings)

proses_limit = 1024

Maks. Aantal POP3 -prosesse (verbindings)

proses_limit = 1024

Maks. Aantal SMTP -indieningsprosesse (verbindings)

proses_limit = 1024

Auth_socket_path wys standaard na hierdie userDB -aansluiting. Dit is tipies

gebruik deur Dovecot-Lda, Doveadm, moontlik IMAP-proses, ens.

Volledige toestemmings vir hierdie sok kan 'n lys kry van alle gebruikersname en

Kry die resultate van almal se USERDB -op soek.

Die standaard 0666 -modus stel iemand in staat om aan die sok aan te sluit, maar die
# UserDb Soeke sal slegs slaag as die USERDB 'n "UID" -veld teruggee
# Pas die UID van die oproeperproses. Ook as die UID of GID van die beller ooreenstem met die
# SOCKET se UID of GID Die opsoek slaag. Enigiets anders veroorsaak 'n mislukking.
# 
# Stel die modus op om die oproeper volle toestemmings te gee om alle gebruikers op te soek
# iets anders as 0666 en Dovecot laat die kern die
# Toestemmings (bv. 0777 laat almal volle toestemmings toe).
# Auth -werkersproses word standaard as wortel uitgevoer, sodat dit toegang kan kry
# /etc/skaduwee. As dit nie nodig is nie, moet die gebruiker verander word na
# $ default_internal_user.
# Gebruiker = wortel
# As DICT -instaanbediener gebruik word, moet e -posprosesse toegang tot die aansluiting hê.
# Byvoorbeeld: modus = 0660, groep = Vmail en Global Mail_access_Groups = Vmail
# modus = 0600
# Gebruiker =
# groep =
# Maak weereens seker dat u die domein in al hierdie lêers, femmebabe.com, vervang met die domein wat u gekies het. Wysig die volgende lêer, Dovecot's Config,
# nano config/etc_dovecot_dovecot
# En voeg hierdie lyne by
# ## Dovecot -konfigurasielêer

# As u haastig is, sien http://wiki2.dovecot.org/quickconfiguration

# "Doveconf -N" -opdrag gee 'n skoon uitset van die veranderde instellings. Gebruik dit
# in plaas van kopie en plak; lêers wanneer u na die Dovecot -poslys gepos word.

# '#' Karakter en alles nadat dit as opmerkings behandel word. Ekstra ruimtes
# en oortjies word geïgnoreer. As u een van hierdie eksplisiete wil gebruik, plaas die
# Waarde binne kwotasies, bv.: sleutel = "# char en agterspan"

# Die meeste (maar nie alle) instellings kan deur verskillende protokolle en/of
# Bron/bestemming IPS deur die instellings binne gedeeltes te plaas, byvoorbeeld:
# protokol imap {}, plaaslik 127.0.0.1 {}, afstand 10.0.0.0/8 {}

# Standaardwaardes word vir elke instelling getoon, dit is nie nodig om te kom nie
# dié. Dit is egter uitsonderings hierop: geen afdelings nie (bv. Naamruimte {})
# of plugin -instellings word standaard bygevoeg, dit word slegs as voorbeelde gelys.
# Paaie is ook net voorbeelde met die regte standaard wat gebaseer is op Configure
# Opsies. Die paaie wat hier gelys word, is vir Configure --Prefix =/USR
# --sysconfdir =/etc -localstatedir =/var

# Aktiveer geïnstalleerde protokolle
! Include_try /usr/share/dovecot/protocols.d/*.protocol

# 'N Komma -geskeide lys van IP's of gashere waar u moet luister vir verbindings. 
# "*" Luister in alle IPv4 -koppelvlakke, "::" Luister in alle IPv6 -koppelvlakke.
# As u nie-default-poorte of iets meer ingewikkeld wil spesifiseer,
# wysig conf.d/master.conf.
#Listen = *, ::

# Basisgids Waar om runtime -data te stoor.
#base_dir =/var/run/dovecot/

# Naam van hierdie instansie. In multi-instansie-opstelling Doveadm en ander opdragte
# kan -I gebruik om te kies watter instansie gebruik word ('n alternatief
# tot -c). Die naam van die instansie word ook by Dovecot -prosesse gevoeg
# in PS -uitset.
#instance_name = Dovecot

# Groetboodskap vir kliënte.
#login_greeting = Dovecot gereed.

# Ruimte -geskeide lys van betroubare netwerkreekse. Verbindings hiervan
# IPS word toegelaat om hul IP -adresse en poorte te ignoreer (vir aanmelding en
# vir verifikasie -tjeks). deaktiveer_plaintext_auth word ook geïgnoreer vir
# Hierdie netwerke. U sal gewoonlik u IMAP Proxy -bedieners hier spesifiseer.
#login_trusted_networks =

# Space -geskeide lys van aanmeldtoegang -kontrole -voetstukke (bv. TCPWrap)
#login_access_sockets = 

# Met proxy_maybe = ja as proxy -bestemming ooreenstem met een van hierdie IP's, moenie doen nie
# Proxying. Dit is normaalweg nie nodig nie, maar kan nuttig wees as die bestemming
# Ip is bv. 'N Load Balancer se IP.
#Auth_proxy_self =

# Toon meer verbose prosesstitels (in PS). Wys tans gebruikersnaam en
# IP -adres. Nuttig om te sien wie die IMAP -prosesse gebruik
# (bv. Gedeelde posbusse of as dieselfde UID vir verskeie rekeninge gebruik word).
#verbose_proctitle = nee

# Sou alle prosesse doodgemaak word wanneer die Dovecot -meesterproses afskakel.
# Om dit op "nee" in te stel, beteken dat Dovecot opgegradeer kan word sonder
# Dwing bestaande kliëntverbindings om te sluit (hoewel dit ook kan wees
# 'n Probleem as die opgradering bv. as gevolg van 'n sekuriteitsoplossing).
#shutdown_clients = ja

# As dit nie nul is nie, voer e-posopdragte uit via hierdie vele verbindings na Doveadm Server,
# In plaas daarvan om dit direk in dieselfde proses te laat loop.
#DOVEADM_WERKER_COUNT = 0
# Unix Socket of Host: Port wat gebruik word om aan Doveadm Server te koppel
#doveadm_socket_path = Doveadm-Server

# Ruimte -geskeide lys van omgewingsveranderlikes wat op Dovecot bewaar word
# Opstart en oorgedra na al sy kinderprosesse. Jy kan ook gee
# sleutel = waardepare om altyd spesifieke instellings in te stel.
#IMPORT_ENVARDER = TZ

##
## Dictionary Server Instellings
##

# Dictionary kan gebruik word om sleutel = waardeslyste te stoor. Dit word deur verskeie gebruik
# plugins. Die woordeboek kan direk óf verkry word óf 'n
# Dictionary Server. Die volgende DICT -blokkaarte -woordeboekname aan URI's
# Wanneer die bediener gebruik word. Daar kan dan verwys word met behulp van URI's in formaat
# "Proxy ::".

DICT {
  #quota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
}

# Die meeste van die werklike konfigurasie word hieronder ingesluit. Die lêernaam is
# word eers volgens hul ASCII -waarde gesorteer en in daardie volgorde ontleed. Die 00-voorvoegsels
# In lêernaam is bedoel om dit makliker te maak om die bestelling te verstaan.
! sluit conf.d/*. conf

# 'N Config -lêer kan ook probeer om ingesluit te word sonder om 'n fout te gee indien
# Dit word nie gevind nie:
! sluit_try local.conf in

passdb {
  Bestuurder = Passwd-lêer
  args =/etc/dovecot/passwd
}
userDb {
  drywer = passwd
}

protokolle = imap pop3

#Allows Dovecot om na alle invoerverbindings te luister (IPv4 / IPv6)

Luister = *, ::
Dovecot -konfigurasielêer

As u haastig is, sien http://wiki2.dovecot.org/quickconfiguration

"Doveconf -N" -opdrag gee 'n skoon uitset van die veranderde instellings. Gebruik dit
ping femmebabe.com # In plaas daarvan om lêers te kopieer en te plak wanneer u na die Dovecot -poslys gepos word.
'Karakter en alles nadat dit as opmerkings behandel word. Ekstra ruimtes

en oortjies word geïgnoreer. As u een van hierdie eksplisiete wil gebruik, plaas die

char en agterruimte "

Die meeste (maar nie alle) instellings kan deur verskillende protokolle en/of

Bron/bestemming IPS deur die instellings binne gedeeltes te plaas, byvoorbeeld:

protokol imap {}, plaaslik 127.0.0.1 {}, afstand 10.0.0.0/8 {}

Standaardwaardes word vir elke instelling getoon, dit is nie nodig om te kom nie
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
daai. Dit is egter uitsonderings hierop: geen afdelings nie (bv. Naamruimte {})

Of instellings word standaard bygevoeg, dit word slegs as voorbeelde gelys.

Paaie is ook net voorbeelde met die regte standaard wat gebaseer is op Configure
nano yourproject/settings.py
opsies. Die paaie wat hier gelys word, is vir Configure --Prefix =/USR

--sysconfdir =/etc--localstatedir =/var

Aktiveer geïnstalleerde protokolle
# 'N Komma -geskeide lys van IP's of gashere waar u moet luister vir verbindings.
"*" Luister in alle IPv4 -koppelvlakke, "::" Luister in alle IPv6 -koppelvlakke.

As u nie-gebrekpenspoorte of iets meer ingewikkeld wil spesifiseer,

wysig conf.d/master.conf.
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Luister = *, ::

Basisgids Waar om runtime -data te stoor.

base_dir =/var/run/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>
Naam van hierdie instansie. In multi-instansie-opstelling Doveadm en ander opdragte

kan -i <instance_name> gebruik om te kies watter instansie gebruik word ('n alternatief

na -c <config_path>). Die naam van die instansie word ook by Dovecot -prosesse gevoeg
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
in PS -uitset.

instansie_name = Dovecot

Groetboodskap vir kliënte.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
login_greeting = Dovecot gereed.

Ruimte -geskeide lys van betroubare netwerkreekse. Verbindings hiervan

IP's word toegelaat om hul IP -adresse en poorte te ignoreer (vir houtkap en
cd projectname
source venv/bin/activate
python manage.py check
vir verifikasie -tjeks). deaktiveer_plaintext_auth word ook geïgnoreer vir

hierdie netwerke. U sal gewoonlik u IMAP Proxy -bedieners hier spesifiseer.

login_trusted_networks =
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Ruimte -geskeide lys van aanmeldtoegangskontrole -voetstukke (bv. TCPWrap)

login_access_sockets =

Moenie doen met 'n proxy_maybe = ja as proxy -bestemming ooreenstem met een van hierdie IP's nie
                # volmag. Dit is normaalweg nie nodig nie, maar kan nuttig wees as die bestemming
                # IP is bv. 'N Load Balancer se IP.
# Auth_proxy_self =
Toon meer verbose prosesstitels (in PS). Wys tans gebruikersnaam en

IP -adres. Nuttig om te sien wie die IMAP -prosesse gebruik

(bv. Gedeelde posbusse of as dieselfde UID vir verskeie rekeninge gebruik word).
python manage.py check
Verbose_proctitle = NEE

As alle prosesse doodgemaak word wanneer die Dovecot -meesterproses afskakel.

Om dit op "nee" in te stel, beteken dat Dovecot opgegradeer kan word sonder
                # die bestaande kliëntverbindings te dwing om te sluit (hoewel dit ook kan wees
                # 'N Probleem as die opgradering bv. as gevolg van 'n sekuriteitsoplossing).
# shutdown_clients = ja
As dit nie nul is nie, voer e-posopdragte via hierdie vele verbindings na Doveadm Server uit,

in plaas daarvan om dit direk in dieselfde proses te laat loop.

doveadm_worker_count = 0
sudo systemctl reload apache2
Unix Socket of Host: Port wat gebruik word om aan Doveadm Server te koppel

doveadm_socket_path = doveadm-server

Ruimte -geskeide lys van omgewingsveranderlikes wat op Dovecot bewaar word

begin en oorgedra na al sy kinderprosesse. Jy kan ook gee

Sleutel = Waardepare om altyd spesifieke instellings in te stel.

Import_en omgewings = tz

ip -6 addr
Woordeboekbedienerinstellings

Woordeboek kan gebruik word om sleutel = waardeslyste te stoor. Dit word deur verskeie gebruik

plugins. Die woordeboek kan direk óf verkry word óf 'n

Woordeboekbediener. Die volgende DICT -blokkaarte -woordeboekname aan URI's

Wanneer die bediener gebruik word. Daar kan dan verwys word met behulp van URI's in formaat

"Proxy :: <naam>".

kwota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext

Hieronder word die meeste van die werklike konfigurasie ingesluit. Die lêernaam is

eers volgens hul ASCII -waarde gesorteer en in daardie volgorde ontleed. Die 00-voorvoegsels

In lêernaam is bedoel om dit makliker te maak om die bestelling te verstaan.

'N Config -lêer kan ook probeer om ingesluit te word sonder om 'n fout te gee indien

Dit word nie gevind nie:

Laat Dovecot toe om na alle invoerverbindings te luister (IPv4 / IPv6)

Voeg 'n wagwoord by vir die Dovecot -gebruiker:

nano config/etc_dovecot_passwd

Die eerste deel van die lêer, voor die kolon, is die gebruikersnaam. Die laaste deel, "YourPassword", dui die wagwoord aan wat u wil aan u e -posbediener gee.

Span: {Plain} YourPassword

Vervolgens, die OpenDkim Config
nano config/etc_postfix_main.cf
nano config/etc_opendkim.conf

En voeg hierdie lyne by:

# Dit is 'n basiese opset vir ondertekening en verifiëring. Dit kan maklik wees # Aangepas om by 'n basiese installasie te pas. Sien Opendkim.conf (5) en # /usr/share/doc/opendkim/examples/opendkim.conf.sample vir volledig # Dokumentasie van beskikbare konfigurasieparameters. Syslog ja Syslogsuccess ja #Logwaarder nee # Algemene ondertekening en verifikasieparameters. In Debian is die 'van' kop # oorgeteken, want dit is dikwels die identiteitsleutel wat deur reputasiestelsels gebruik word # en dus ietwat sekuriteitsgevoelig. Kanonisalisering ontspanne/eenvoudig Modus s Subdomeine nee OverinTheaders van # Ondertekening van domein, selector en sleutel (vereis). Voer byvoorbeeld ondertekening uit # vir domein "voorbeeld.com" met selector "2020" (2020._domainkey.example.com), # Gebruik die privaat sleutel wat in /etc/dkimkeys/example.privaat gestoor is. Meer korrelvormig # Stelopsies kan gevind word in /usr/share/doc/opendkim/readme.opendkim. #Domain voorbeeld.com #Selector 2020 #Keyefile /etc/dkimkeys/example.privaat # In Debian loop Opendkim as gebruiker "Opendkim". 'N umask van 007 is nodig wanneer # Gebruik 'n plaaslike sok met MTA's wat toegang tot die sok as 'n nie-bevoorregte # Gebruiker (byvoorbeeld postfix). Miskien moet u die gebruiker "postfix" by die groep voeg # "Opendkim" in daardie geval. Userid Opendkim Umask 007 # Socket vir die MTA -verbinding (benodig). As die MTA in 'n chroot -tronk is, # Daar moet verseker word dat die aansluiting toeganklik is. In Debian hardloop Postfix in # 'n chroot in/var/spoel/postfix, daarom sal 'n unix -aansluiting moet wees # gekonfigureer soos getoon op die laaste reël hieronder. #Socket local: /run/opendkim/opendkim.sock #Socket inet: 8891@localhost #Socket inet: 8891 Socket plaaslik: /var/spool/postfix/opendkim/opendkim.sock Pidfile /run/opendkim/opendkim.pid # Gashere waarvoor om te onderteken eerder as om te verifieer, is standaard 127.0.0.1. Sien die # Operasie -afdeling van Opendkim (8) vir meer inligting. #Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12 # Die trustanker stel DNSSEC in staat. In Debian word die trustankerlêer voorsien # Deur die pakket DNS-Root-data. Trustanchorfile /usr/share/dns/root.key #Nameservers 127.0.0.1 # Map domeine van adresse na sleutels wat gebruik word om boodskappe te onderteken KeyTable Refil: /etc/opendkim/key.table Ondertekeningstabel hervorm: /etc/opendkim/signing.table # 'N stel interne gashere wie se pos onderteken moet word Internehosts /etc/opendkim/trusted.hosts
# Dit is 'n basiese opset vir ondertekening en verifiëring. Dit kan maklik wees
# aangepas om by 'n basiese installasie te pas. Sien Opendkim.conf (5) en
# /usr/share/doc/opendkim/examples/opendkim.conf.sample vir volledig
# Dokumentasie van beskikbare konfigurasieparameters.
# Log, waarom nee
# Algemene ondertekening en verifikasieparameters. In Debian is die 'van' kop
# oorgeteken, omdat dit dikwels die identiteitsleutel is wat deur reputasiestelsels gebruik word
# en dus ietwat sekuriteitsgevoelig.
# Onderteken domein, selector en sleutel (vereis). Voer byvoorbeeld ondertekening uit
# vir domein "voorbeeld.com" met selector "2020" (2020._domainkey.example.com),
# Gebruik die privaat sleutel gestoor in /etc/dkimkeys/example.private. Meer korrelvormig
# Opstellingsopsies kan gevind word in /usr/share/doc/opendkim/readme.opendkim.
Domein voorbeeld.com

Selector 2020

Keyfile /etc/dkimkeys/example.privaat
nano config/etc_postfix_master.cf
In Debian werk Opendkim as gebruiker "Opendkim". 'N umask van 007 is nodig wanneer

Gebruik 'n plaaslike sok met MTA's wat toegang tot die sok as 'n nie-bevoorregte

Gebruiker (byvoorbeeld Postfix). Miskien moet u die gebruiker "postfix" by die groep voeg
# "Opendkim" in daardie geval.
# Sok vir die MTA -verbinding (benodig). As die MTA in 'n chroot -tronk is,
# Daar moet verseker word dat die aansluiting toeganklik is. In Debian hardloop Postfix in
# 'n chroot in/var/spoel/postfix, daarom sal 'n unix -aansluiting moet wees
# gekonfigureer soos getoon op die laaste reël hieronder.
# SOCKET Local: /run/opendkim/opendkim.sock
# Socket Inet: 8891@localhost
# SOCKET INET: 8891
# Die gasheer waarvoor u moet onderteken eerder as om te verifieer, is 127.0.0.1. Sien die
# Operasie -afdeling van Opendkim (8) vir meer inligting.
# Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Die trustanker stel DNSSEC in staat. In Debian word die trustankerlêer voorsien
# deur die pakket DNS-Root-data.
# Nameservers 127.0.0.1
# Kaartdomeine van adresse na sleutels wat gebruik word om boodskappe te onderteken
# 'N stel interne gashere wie se pos onderteken moet word
# nano config/etc_default_opendkim
# En voeg hierdie lyne by
# # Opmerking: dit is 'n nalatenskapskonfigurasielêer. Dit word nie deur die Opendkim gebruik nie
# SystemD -diens. Gebruik die ooreenstemmende konfigurasieparameters in
# /etc/opendkim.conf in plaas daarvan.
#
# Voorheen sou 'n mens die standaardinstellings hier wysig en dan uitvoer
# /lib/opendkim/opendkim.service.genereer om stelsels te genereer
# /etc/systemd/system/opendkim.service.d/override.conf en
# /etc/tmpfiles.d/opendkim.conf. Alhoewel dit nog moontlik is, is dit nou
# word aanbeveel om die instellings direk aan te pas in /etc/opendkim.conf.
#
#Daemon_opts = ""
# Verander na/var/spoel/postfix/run/opendkim om 'n unix -sok met
# postfix in 'n chroot:
#Rundir =/var/spool/postfix/run/opendkim
Rundir =/run/opendkim
#
# Ontkoppeling om 'n alternatiewe sok te spesifiseer
# Let daarop dat die instelling daarvan enige sokwaarde in OpenDkim.conf sal ignoreer
# standaard:
Sok = "plaaslik: /var/spool/postfix/opendkim/opendkim.sock"
# Luister op alle koppelvlakke op poort 54321:
#Sok = inet: 54321
# Luister op Loopback op poort 12345:
#Sok = inet: 12345@localhost
# Luister op 192.0.2.1 op poort 12345:
#Socket = inet: 12345@192.0.2.1
Gebruiker = Opendkim
Groep = Opendkim
Pidfile = $ rundir/$ name.pid
Extraafter =
# Opmerking: dit is 'n nalatenskapskonfigurasielêer. Dit word nie deur die Opendkim gebruik nie
# SystemD -diens. Gebruik die ooreenstemmende konfigurasieparameters in
# /etc/opendkim.conf in plaas daarvan.
# 
# Voorheen sou 'n mens die standaardinstellings hier wysig en dan uitvoer
# /lib/opendkim/opendkim.service.
# /etc/systemd/system/opendkim.service.d/override.conf en
# /etc/tmpfiles.d/opendkim.conf. Alhoewel dit nog moontlik is, is dit nou
# aanbeveel om die instellings direk aan te pas in /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Verander na/var/spoel/postfix/run/opendkim om 'n unix -sok met
# Postfix in 'n chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Onkomment om 'n alternatiewe sok te spesifiseer
# Let daarop dat die instelling daarvan enige sokwaarde in OpenDkim.conf sal ignoreer
# verstek:
# Luister op alle koppelvlakke op hawe 54321:
# Sok = inet: 54321
# Luister op Loopback op poort 12345:
# Sok = inet: 12345@localhost
# Luister op 192.0.2.1 op poort 12345:
# Sok = inet: 12345@192.0.2.1
# As ons gereed is om ons postfix -bediener op te stel, sal ons die onderstaande kode uitvoer, met die toepaslike domeinnaam ingebed. Begin deur 'n draaiboek te skep
# Raak skrifte/postfixsetUp
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
# Nou, in Nano, die teksredakteur, wysig hierdie lêer, sodat dit u domeinnaam bevat in plaas van femmebabe.com.
# #!/bin/bash
# Stel postfix op
CD $ dir
eggo "Mail Services Configuration"
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.backup
sudo cp config/etc_postfix_main.cf /etc/postfix/main.cf
sudo cp config/etc_postfix_master.cf /etc/postfix/master.cf
sudo cp config/etc_default_opendkim/etc/default/opendkim
sudo cp config/etc_dovecot_conf.d_10-auth.conf /etc/dovecot/conf.d/10-auth.conf
sudo cp config/etc_dovecot_conf.d_10-master.conf /etc/dovecot/conf.d/10-master.conf
sudo cp config/etc_dovecot_dovecot.conf /etc/dovecot/dovecot.conf
sudo cp config/etc_dovecot_passwd/etc/dovecot/passwd
sudo cp config/etc_opendkim.conf /etc/opendkim.conf
sudo cp config/etc_default_opendkim/etc/default/opendkim
sudo adduser postfix opendkim
Sudo Mkdir /etc /Opendkim
sudo mkdir/etc/opendkim/sleutels
sudo mkdir /etc/opendkim/keys/femmebabe.com
sudo mkdir/var/spool/postfix/opendkim
sudo echo "*@femmebabe.com sendonly._domainkey.femmebabe.com" | sudo tee -a /etc/opendkim/signing.table
sudo echo "sendonly._domainkey.femmebabe.com femmebabe.com:sendonly:/etc/opendkim/keys/femmebabe.com/sendonly.private" | sudo tee -a /etc/opendkim/key.table
sudo eggo "127.0.0.1" | sudo tee -a /etc/opendkim/trusted.hosts
sudo eggo "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/sleutels
Sudo Chown Opendkim: Opendkim /etc/opendkim/keys/femmebabe.com/sendonly.private
Sudo Chown Opendkim: Postfix/Var/Spool/Postfix/Opendkim
CD $ dir
Sudo CP Mailbox/*/var/Mail/
Sudo Chown: gebruikers/var/e -pos/*
sudo chmod -r a+rwx/var/pos/*
Sudo Systemctl herbegin Opendkim Postfix Dovecot
sudo cat /etc/opendkim/keys/femmebabe.com/sendonly.txt | tr -d '\ n' | Sed 'S/\ S // G' | Sed 'S/"" // G' | awk -f '[) (]' '{druk $ 2}'
# !/bin/bash
# Stel postfix op
# Begin nou die voltooide skrif om Postfix, Opendkim en Dovecot op te stel.
# ./scripts/postfixsetup
# Sodra hierdie skrip uitgevoer is, kopieer die laaste reël wat dit afdruk en plak dit in u DNS -konfigurasie as die waarde vir SendOnly._Domainkey. Dit is die OpenDkim -sleutel wat gebruik word om u domein te identifiseer wanneer u veilige pos stuur.
# Awesome! Binne 'n paar dae moet u e -pos vanaf die bediener kan stuur, mits alles korrek gekonfigureer is.
# As u net die DNS vir u e -posbediener gekonfigureer het, moet dit minder as 72 uur duur voordat die rekords opdateer. Dit is gewoonlik baie vinniger. U kan kyk of u bediener werk deur hierdie opdrag te gebruik, u e -pos voorsien:
# eggo "toets" | pos -s "toets e -pos" jouemail@gmail.com
# As alles lyk of dit reg werk, moet u e -pos met u bediener kan stuur. As dit nie werk nie, probeer dan om na die logs te kyk om te sien wat die fout kan wees.
# stert –lines 150 /var/log/mail.log
# Dit sal mondelinge inligting bied oor e -pos wat deur die bediener gestuur word en of dit goed werk. U moet ook die e -pos in u inkassie kan sien, as dit nie daar is nie, kyk na u spammap.
# U moet ook u instellings in u instellings.py opstel, sodat u e -posbediener met u Django -app, die projek, kan praat. Voeg of vervang hierdie lyne in u instellings
# E -pos_host = domein
E -pos_port = 587
E -pos_use_tls = waar
E -pos_address = 'span@femmebabe.com'
E -pos_host_user = 'Team' #'love@mamasheheen.com '
E -pos_host_password = config ['e -pos_host_password']
DEFAULLE_FROM_EMAIL = '{} <{}>'. Formaat (Site_Name, e -pos_host_user)
# 'Love@mamasheheen.com'
# Let op dat ons 'n config -lêer gebruik om die wagwoord te kry. Kom ons laai hierdie lêer in die instellings soos so, aan die begin van die lêer:
# invoer os
voer JSON in

# Open en laai Config
met oop ('/etc/config.json') as config_file:
    config = json.load (config_file)
# Oop en laai Config
# Kom ons skep hierdie lêer en voeg 'n geheime sleutel daarby, sowel as die poswagwoord. Om 'n geheime sleutel te genereer, gebruik hierdie opdrag, met watter lengte u aan die einde wil hê:
# OpenSSL Rand -Base64 64
# Kopieer nou die teks wat OpenSSL gegenereer en redigeer /etc/config.json
# sudo nano /etc/config.json
# Voeg die volgende reëls by u lêer, met die sleutel wat OpenSSL as die geheime sleutel gegenereer word.
# {
	"Secret_Key": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx-gegenereerde-gebruik-openssl)",
	"E -pos_host_password": "yourpassword"
}
# JSON -formaat is eenvoudig en maklik om te gebruik, ons kan ook ander sleutels wat ons in ons projek wil gebruik, ook op hierdie manier verklaar en hulle apart van ons projekgids hou, sodat ander gebruikers nie aan hulle kan skryf nie en dat hulle nie alleen van ons projekgids gelees kan word nie. Dit word aanbevole praktyk vir API -sleutels, waarvan ons meer as 'n paar hier sal gebruik.
# U sal ook u projek wil rugsteun om seker te maak dat alles gestoor is en dat u later u werk kan herstel, selfs as u nie meer 'n bediener wil huur nie.
# Sudo -rugsteun
# Probeer nou om 'n HTML -e -pos van die webbediener te stuur, mits die stuur van een van die opdragreël werk. Vra u gebruikersinstansie in die dop, en stuur 'n HTML -e -pos aan die gebruiker via django. Verander my naam in die kode, Charlotte, na u gebruikersnaam.
# Python Manage.py Shell
van django.contrib.auth.modelle invoergebruiker
u = user.objects.get (gebruikersnaam = 'charlotte')
van gebruikers.email invoer send_welcome_email
send_welcome_email (u)
Uitgang ()
# As die eerste opdrag nie werk nie, maak seker dat u dit gebruik
# bron venv/bin/aktiveer
# Mits alles korrek opgestel is, kry u nou 'n welkome e -pos in u posbus wat deur u webprogram gestuur word. Goeie werk! Jy het 'n lang pad gekom.
# Ek wou byvoeg, as u ooit met enige foute sukkel terwyl u aan 'n projek soos hierdie werk, moet u huiwer om antwoorde te soek en hulp te vra. Google, onder andere soekenjins, is wonderlike hulpbronne om na programmeringshulp te soek. Soek eenvoudig na die fout wat u kry, en u kan sien hoe ander mense die probleem oplos. U is ook welkom om my, u opvoeders (onderwysers, professore, tutors), enige eweknieë op die internet wat beskikbaar is vir programmeringshulp, of weer hierdie boek of ander bronne te raadpleeg om oplossings te vind vir die probleme wat u ervaar. Ek verstaan ​​dat dit nie maklik is nie, maar selfs as u in hierdie verre gelees het en geen kode skryf nie, leer u baie oor die bou van 'n webapp van nuuts af. Pat jouself agterop, jy doen 'n goeie werk.
# Dankie dat u die tyd geneem het om hierdie derde uitgawe webontwikkelingsgids te lees. In toekomstige uitgawes sal ek meer van die belangrike voorbeelde wat aan die begin van die dokument bespreek is, insluit, en ons sal baie dieper in die wêreld van sagteware en hardeware -ontwikkeling duik. Bly ingeskakel vir wat gaan kom, en ek sien uit daarna om u te leer hoe om ongelooflike sagteware te bou. Sien jou in die volgende uitgawe!
# Besoek hierdie skakel (dit sal u buite Lotte Harper neem)








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






Dig
Bladsy 1
Spring
Sien volledige artikel
Gaan voort met die lees

Koop met kripto



https://glamgirlx.com/af/practical-web-based-deep-learning-and -


Professionele vermaak, foto's, video's, klank, lewende stroom en toevallige spel, sowel as ID -skandering, webontwikkeling en surrogasiedienste.

Laat my 'n wenk in Bitcoin met behulp van hierdie adres: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Diensvoorwaardes