Nyheder - Besøg webstedet
Tre tretten - online kortspil Spil tre tretten med en ven ved at klikke på nedenstående link for at generere en invitationskode eller deltage i et spil.Inviter med kode Deltag i spil ***
Køb videre

ved Daisy / Udsigt | Købe | Køb med cryptocurrency



Spil Color Sudoku Online - Gratis Colordoku -spil Dette er et gratis at spille Color Sudoku (Colordoku) -spil. ***

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Praktisk webbaseret dyb læring og sikkerhed ved et eksempel Tredje udgave Charlotte Harper 3. juli 2024 Forord: Sikkerhedsovervejelser i opbygning af software til Internettet er en vigtig del af enhver webudviklers plan og udførelse, mens man teknik en prototype, der er pålidelig, stabil og nyttig til praktiske formål. DOM (Document Object Markup), med dets implementering af HTML, JavaScript og CSS samt backend -software, der implementerer Python, C/C ++, Java og Bash, giver webudviklere friheden og magten til at skabe en lang række projekter, der udtrykker kreativitet, giver let brug og funktionalitet, portrætter ydmyghed og karakter og giver let at bruge brugen af ​​brug og vigtige tjenester, der er ved attraktive til gennemsnittet, tilslutningen, det gennemsnitlige sammenhæng, i slutningen af ​​brugen, i slutningen af ​​brug Bruger, der ønsker at dræbe tid eller få noget gjort på Internettet, normalt på en berøringsskærms -smartphone -enhed. De fleste mennesker ville ikke engang vide, hvor de skal starte, når de vil bygge et websted fra bunden, deville have en tendens til at starte på en anden persons websted og opbygge noget begrænset i funktionalitet, pålidelighed, brugervenlighed og især kreativitet, når de kunne have haft alle de nyeste kraftfulde værktøjer til deres rådighed for at opbygge noget nyttigt uden at spilde tid på at trykke på knapper, og især spilder penge på at betale for dyre abonnementer på software, som få mennesker ville bruge, da det er begrænset, at det er begrænsninger i brugervenlighed og fleksibilitet. Hvis du har et par minutter til at læse gennem denne bog og lære, hvad jeg vil lære dig, eller endda tale med mig personligt om dine mål og få en vis vejledning i den rigtige retning, og er motiverede til at lære at kode og skrive din egen software, skal du tage denne bog hjem og afsætte noget tid til at lære at opbygge det næste indflydelsesrige, magtfulde, strømlinede og vigtige webapplikation, et websted, der er alt sammen på dig og gør nøjagtigt, hvad du ønsker og imødekommer behovet for dit publikum. Om mig: Jeg er softwareudvikler med en bred viftef Erfaring i C/C ++, Java, Python, HTML, CSS og JavaScript. Jeg bygger websteder, som folk vil bruge, vil besøge og endda blive afhængige af at bruge bare for at lære, genskabe og dræbe tid, og vigtigst af alt, jeg sælger software. Hvis du havde en idé om nøjagtigt, hvordan du ville have et websted til at se og fungere, var du villig til at støtte mig, så jeg kan imødekomme mine egne behov, mens jeg opfylder din, og du er villig til at dække omkostningerne ved at køre et websted selv, jeg ville bygge dig den næste YouTube, Tiktok, Twitter, Google eller endda en højteknisk sikkerhedsapp, kun du kan få adgang til. I stedet for at prøve at sælge dig min tid, prøver jeg at købe din: Jeg vil tale dig om at opbygge en app (hjemmeside) selv med de oplysninger, der allerede findes, og lære dig, hvad du har brug for for at være en uafhængig softwareudvikler, iværksætter, der fører en succesrig karriere inden for det felt, du ønsker. Og lad mig være klar, den uddannelse, jeg giver dig, vil være uformel. Du kunne gå i skole og lære alt dette med en formelDucation, eller endda læser denne bog i skolen, fuldfør dine opgaver og tag meget væk fra din uddannelse, men jeg vil ikke formelt sætte dig i det varme sæde og bede dig om at udføre opgaver. Jeg er ikke din professor, du kan tænke på mig som en ven, der vil guide dig mod en karriere drevet af din egen personlige succes. Og jeg sælger heller ikke dig succes, du bliver nødt til at købe den med din tid. At lære at kode har en stejl indlæringskurve og var aldrig let eller endda skulle være det. Du er nødt til at arbejde så hårdt som du muligvis kan og fortsætte med at prøve at mislykkes og prøve igen, selv når du er frustreret for at lære og opbygge apps selv. Det er i naturen af ​​selve koden. Kode køres af en compiler, der er designet til at give programmererfejlmeddelelserne, og disse vil lære dig, hvordan du koder, selvom du blot kopierer fejlen i din søgemaskine og læser andre menneskers eksempler. Og jeg må sige, du behøver ikke at være ekstremt rig, smart, succesrig ellerDetaljeret orienteret eller organiseret til at opbygge en app. Computeren tager sig af denne organisation for dig. Du skal bare holde ud gennem forsøget og fejlen, opretholde fokus og arbejde hårdt på det, du gør, og du vil have en meget succesrig karriere i hele det, du gør. Hvem er jeg: Jeg er klar over, at det sidste afsnit handlede mere om at lære og dine måder fra denne bog. Hvem er jeg nøjagtigt? Det er et kompliceret spørgsmål. Jeg er uklar på det selv, da jeg lider af medicinske tilstande, der kan gøre det vanskeligt for mig at endda kode eller skrive denne bog til tider, mens jeg præsenterer udfordringer med socialisering og identitetsproblemer, der gør mit liv vanskeligere, når det kommer til at introducere mig selv. Kort sagt, hvis du læser denne bog, bragte du den hjem, fordi du vippede gennem den og troede, at den var nyttig, eller endda hvis du lige læste så langt ind, for dig er jeg en ligesindet person, der vil se dig lykkes med alt hvad du gør. Jeg er selv ingeniør, en softwareEloper og en studerende, og jeg skriver denne bog til andre studerende, der ønsker at gøre deres liv lettere ved at have en håndbog om den software, de har brug for, at gøre deres liv lettere ved at give eksempler til at kopiere, der passer sammen som et stort puslespil til et fungerende, nyttigt, stort, funktionelt, sammenhængende og engagerende app, der kan få succes uanset forretningslinjen. Stort set er det, hvad jeg gør: Jeg bygger apps til at hjælpe mig selv og andre mennesker med succes. Jeg er også forfatter, selvom dette er min første publikation, som jeg agter at gennemføre for at sætte min portefølje sammen i et nyttigt dokument, og jeg er også en kunstner. Jeg må indrømme dette for dig, jeg er slags en mærkelig person. Jeg er ikke perfekt, jeg har kørt ind med loven, der endda førte mig til at forlade colleges og universiteter og forlade stater for at prøve at give et navn til mig selv med mere succes. Jeg er en kvinde ved fødslen, jeg bærer makeup, tager billeder af mig selv, bærer kjoler og andet kvindes tøj, og jeg forbliver bevidst om mig selv som en kvindeature. Jeg har haft problemer med andre mennesker i fortiden, der førte til kampe med at skrive og bygge webapps, og jeg undskylder, at jeg ikke har været i stand til at få denne bog i dine hænder før: Du havde brug for dette. Du vil gerne læse og skrive kode, der ligner min og fungerer som min og gør det samme, men endnu bedre, for hvis du har råd til at købe denne bog i stedet for at mash dit tastatur, som jeg gør bare for at oprette en bog selv, der beder penge til det, har du de ressourcer, du har brug for for at få succes i dit liv. Jeg havde alle slags problemer med familien, der voksede op, sundhedsmæssige forhold, læger, medierne og loven, og min kode afspejler dybt den kamp, ​​der er feminisme og kvindelig natur i en delt og frustreret verden. Imidlertid er denne bog noget, jeg dybt bryder mig om, min baby, min portefølje og mit levebrød, så jeg værdsætter din overvejelse, når du tager teksten hjem og omhyggeligt pore over den for at lære af mig. Husk, at jeg ikke er perfekt, detteOOK vil have fejl, revisioner og nye udgaver, og du bliver nødt til at tænke med din logiske hjerne så godt du kan for at få en vellykket oplevelse med min skrivning. Forstå også, at jeg mener godt for dig, selv når du står over for udfordringer, når du skriver. Tænk over det som dette: Når du bare kan leje et computersystem for at gøre alt, hvad du muligvis kan forestille dig i det digitale rum, skal du gemme alle de oplysninger, du støder på, #$%! Yze og organisere det og forstå det, vil du uundgåeligt støde på vanskeligheder med de oplysninger, du indtager og endda offentliggøres. Jeg fortæller dig dette, fordi jeg støder på de samme vanskeligheder. Brug denne bog på din egen risiko, arbejde med dit samfund og samfund til rådighed for dig for at opbygge software inden for en sikker indstilling, og tag ikke ting til personligt, når du fejler eller endda lykkes på den forkerte måde: det er sådan jeg kom så langt, og hvorfor jeg kan bringe dig denne tekst og hjælpe digUined, revet og flosset, mens jeg støder på de almindelige problemer, som alle gør på verdensplan takket være den paralellistiske globale skala på det netværk, som vi vil arbejde på, Internettet. Du er måske ikke meget fortrolig med, hvem jeg er med bare et par ord, men jeg opfordrer dig til at læse videre, du vil lære mig at kende, når du fortsætter med at læse og forstå mig, mens du bygger dine egne projekter for at afslutte dit arbejde. Der vil ikke være noget hjemmearbejde med denne bog, så længe dine professorer eller lærere ikke tildeler dig nogen, men jeg opfordrer dig meget til at opbygge en portefølje af projekter selv, mens du læser sammen, samt et Capstone -projekt, der viser, hvordan du kan anvende det, du har lært. Mit Capstone -projekt er grundlaget for det meste af det, du vil læse i denne bog, da det indeholder kode fra mine tidligere projekter, kode, jeg har oprettet og lært at skrive metodisk for hånd, og en bred vifte af ideer og tip, der har hjulpet mig med at lykkes med det punkt, hvor jeg kan spin en simpel app, der er fuldt udAttured og ser ud og opfører sig som en populær app, som du måske kan se din ven eller familie bruge på Internettet, annonceret til dig eller i nyhederne. Hvad denne bog er: Denne bog er en tutorial ved et eksempel. Du kan finde kode her, instruktioner til, hvordan du lærer at kode, information om fejlsøgning af kode og fastlæggelse af fejl, fejlfindingstrin, instruktioner om, hvordan du sikkerhedskopierer og gemmer din kode, geninstitution, hvis nogen bryder din kode, sikrer din kode, implementerer din kode, bygger interaktive websteder, der selv underholder, din app og firma, og det er afhængigt, og du vil få en følelse af, hvem jeg er, hvorfor dett...
Praktisk webbaseret dyb læring og sikkerhed ved et eksempel

Praktisk webbaseret dyb læring og sikkerhed ved et eksempel Tredje udgave Charlotte Harper 3. juli 2024 Forord: Sikkerhedsovervejelser i opbygning af software til Internettet er en vigtig del af enhver webudviklers plan og udførelse, mens man teknik en prototype, der er pålidelig, stabil og nyttig til praktiske formål. DOM (Document Object Markup) med sin implementering af HTML, JavaScript og CSS samt backend -software, der implementerer Python, C/C ++, Java og Bash, giver webudviklere frihed og magt til at skabe en lang række projekter, der udtrykker Kreativitet, giver brugervenlighed og funktionalitet, skildrer ydmyghed og karakter og giver brugervenlighed samt bekvemmelighed og vigtige tjenester, der alle er attraktive for den gennemsnitlige Joe, slutningen Bruger, der ønsker at dræbe tid eller få noget gjort på Internettet, normalt på en berøringsskærms -smartphone -enhed. De fleste mennesker ville ikke engang vide, hvor de skal starte, når de vil bygge et websted fraScratch, de ville have en tendens til at starte på en anden persons websted og opbygge noget begrænset i funktionalitet, pålidelighed, brugervenlighed og især kreativitet, når de kunne have haft alle de nyeste kraftfulde værktøjer til deres rådighed for at opbygge noget nyttigt uden at spilde tid på at trykke på knapper , og især at spilde penge på at betale for dyre abonnementer på software, som få mennesker ville bruge alligevel, da de er begrænsninger i brugervenlighed og fleksibilitet. Hvis du har et par minutter til at læse gennem denne bog og lære, hvad jeg vil lære dig, eller endda tale med mig personligt om dine mål og få nogle vejledninger i den rigtige retning og er motiverede til at lære at kode og skrive din egen software , tag denne bog hjem og læg dig til side til at lære at opbygge den næste indflydelsesrige, kraftfulde, strømlinede og vigtige webapplikation, et websted, der er alt sammen på dig og gør nøjagtigt, hvad du vil, og imødekommer dit publikums behov. Om mig: Jeg er softwareudvikler medOmråde af erfaring i C/C ++, Java, Python, HTML, CSS og JavaScript. Jeg bygger websteder, som folk vil bruge, vil besøge og endda blive afhængige af at bruge bare for at lære, genskabe og dræbe tid, og vigtigst af alt, jeg sælger software. Hvis du havde en idé om nøjagtigt, hvordan du ville have et websted til at se og fungere, var du villig til at støtte mig, så jeg kan imødekomme mine egne behov, mens jeg opfylder din, og du er villig til at dække omkostningerne ved at køre et websted selv, Jeg ville bygge dig den næste YouTube, Tiktok, Twitter, Google eller endda en højteknologisk sikkerhedsapp, som kun kan få adgang til. I stedet for at prøve at sælge dig min tid, prøver jeg at købe din: Jeg vil tale dig til at bygge en app (websted) selv med de oplysninger, der allerede findes, og lære dig, hvad du har brug for for at være en uafhængig softwareudvikler, Iværksætter, der fører en succesrig karriere inden for det felt, du ønsker. Og lad mig være klar, den uddannelse, jeg giver dig, vil være uformel. Du kunne gå i skole og lære alt dette med enFormel uddannelse eller endda læse denne bog i skolen, afslutte dine opgaver og fjerne meget fra din uddannelse, men jeg vil ikke formelt sætte dig i det varme sæde og bede dig om at udføre opgaver. Jeg er ikke din professor, du kan tænke på mig som en ven, der vil guide dig mod en karriere drevet af din egen personlige succes. Og jeg sælger heller ikke dig succes, du bliver nødt til at købe den med din tid. At lære at kode har en stejl indlæringskurve og var aldrig let eller endda skulle være det. Du er nødt til at arbejde så hårdt som du muligvis kan og fortsætte med at prøve at mislykkes og prøve igen, selv når du er frustreret for at lære og opbygge apps selv. Det er i naturen af ​​selve koden. Kode køres af en compiler, der er designet til at give programmererfejlmeddelelserne, og disse vil lære dig, hvordan du koder, selvom du blot kopierer fejlen i din søgemaskine og læser andres eksempler. Og jeg må sige, du behøver ikke at være ekstremt rig, smart,Essul eller endda detaljeret orienteret eller organiseret til at opbygge en app. Computeren tager sig af denne organisation for dig. Du skal bare holde ud gennem forsøget og fejlen, opretholde fokus og arbejde hårdt på det, du gør, og du vil have en meget succesrig karriere i hele det, du gør. Hvem er jeg: Jeg er klar over, at det sidste afsnit handlede mere om at lære og dine måder fra denne bog. Hvem er jeg nøjagtigt? Det er et kompliceret spørgsmål. Jeg er uklar på det selv, da jeg lider af medicinske tilstande, der kan gøre det vanskeligt for mig at endda kode eller skrive denne bog til tider, mens jeg præsenterer udfordringer med socialisering og identitetsproblemer, der gør mit liv vanskeligere, når det kommer til at introducere mig selv . Kort sagt, hvis du læser denne bog, bragte du den hjem, fordi du vippede gennem den og troede, at den var nyttig, eller endda hvis du lige læste så langt ind, for dig er jeg en ligesindet person, der vil se dig lykkes i Alt hvad du gør. Jeg er selv ingeniørUdvikler og studerende, og jeg skriver denne bog til andre studerende, der ønsker at gøre deres liv lettere ved at have en håndbog om den software, de har brug for at gøre deres liv lettere ved , nyttige, store, funktionelle, sammenhængende og engagerende app, der kan skabe succes uanset forretningslinjen. Stort set er det, hvad jeg gør: Jeg bygger apps til at hjælpe mig selv og andre mennesker med succes. Jeg er også forfatter, selvom dette er min første publikation, som jeg agter at gennemføre for at sætte min portefølje sammen i et nyttigt dokument, og jeg er også en kunstner. Jeg indrømmer dette for dig, jeg er slags en mærkelig person. Jeg er ikke perfekt, jeg har haft ins med loven, der endda førte mig til at forlade colleges og universiteter og forlade stater for at prøve at give et navn til mig selv med mere succes. Jeg er en kvinde ved fødslen, jeg bærer makeup, tager billeder af mig selv, bærer kjoler og andet kvinders tøj, og jeg forbliver bevidst om mig selv som enKvinde af natur. Jeg har haft problemer med andre mennesker i fortiden, der førte til kampe med at skrive og bygge webapps, og jeg undskylder, at jeg ikke har været i stand til at få denne bog i dine hænder før: Du havde brug for dette. Du vil gerne læse og skrive kode, der ligner min og fungerer som min og gør det samme, men endnu bedre, for hvis du har råd til at købe denne bog i stedet for at mash dit tastatur, som jeg gør bare for at oprette en bog selv, der spørger penge For det har du de ressourcer, du har brug for for at få succes i dit liv. Jeg havde alle slags problemer med familien, der voksede op, sundhedsmæssige forhold, læger, medierne og loven, og min kode afspejler dybt den kamp, ​​der er feminisme og kvindelig natur i en delt og frustreret verden. Imidlertid er denne bog noget, jeg dybt bryder mig om, min baby, min portefølje og mit levebrød, så jeg værdsætter din overvejelse, når du tager teksten hjem og omhyggeligt pore over den for at lære af mig. Husk, at jeg ikke erECT, denne bog vil have fejl, revisioner og nye udgaver, og du bliver nødt til at tænke med din logiske hjerne så godt du kan for at få en vellykket oplevelse med min skrivning. Forstå også, at jeg mener godt for dig, selv når du står over for udfordringer, når du skriver. Tænk over det som dette: Når du bare kan leje et computersystem for at gøre alt, hvad du muligvis kan forestille dig i det digitale rum, opbevare alle de oplysninger, du støder på, #$%! Yze og organiser det og kom til at forstå det, vil du Uundgåeligt støder på vanskeligheder med de oplysninger, du indtager og endda udgiver. Jeg fortæller dig dette, fordi jeg støder på de samme vanskeligheder. Brug denne bog på din egen risiko, arbejde med dit samfund og samfund til rådighed for dig for at opbygge software inden for en sikker indstilling, og tag ikke ting til personligt, når du fejler eller endda lykkes på den forkerte måde: det er sådan jeg kom så langt , og hvorfor jeg kan bringe dig denne tekst og hjælpe dig med at lykkes udenAves mig ødelagt, revet og flosset, mens jeg støder på de almindelige problemer, som alle gør på verdensplan takket være den paralellistiske globale skala på det netværk, som vi vil arbejde på, Internettet. Du er måske ikke meget fortrolig med, hvem jeg er med bare et par ord, men jeg opfordrer dig til at læse videre, du vil lære mig at kende, når du fortsætter med at læse og forstå mig, mens du bygger dine egne projekter for at afslutte dit arbejde. Der vil ikke være noget hjemmearbejde med denne bog, så længe dine professorer eller lærere ikke tildeler dig nogen, men jeg opfordrer dig meget til at opbygge en portefølje af projekter selv, mens du læser sammen, samt et Capstone -projekt, der viser, hvordan du kan Anvend det, du har lært. Mit Capstone -projekt er grundlaget for det meste af det, du vil læse i denne bog, da det indeholder kode fra mine tidligere projekter, kode, jeg har oprettet og lært at skrive metodisk i hånden, og en bred vifte af ideer og tip, der har hjulpet mig lykkes til det punkt, hvor jeg kan dreje op en simpel app, derFuldt med og ser ud og opfører sig som en populær app, som du måske kan se din ven eller familie bruge på Internettet, annonceret til dig eller i nyhederne. Hvad denne bog er: Denne bog er en tutorial ved et eksempel. Du kan finde kode her, instruktioner til, hvordan man lærer at kode, information om fejlsøgning af kode og fastsættelse af fejl, fejlfindingstrin, instruktioner om, hvordan du sikkerhedskopierer og gemmer din kode, genindførelse, hvis nogen bryder din kode, sikr din kode, implementerer Din kode, opbyg interaktive websteder, der er underholdende, engagerende og vanedannende, og du får en fornemmelse af, hvem jeg er, hvorfor dette er vigtigt, og hvordan du fremstiller dig selv, din app og firmabillede samt softwaren Du bygger i det absolut bedste lys til at være det mest attraktive som muligt for dine slutbrugere, dit websteds besøgende. I denne bog vil jeg demonstrere en række eksempler på softwaredesign med fokus på nettet som platform såvel som sikkerhed. Vi vil starte læringsoplevelsen ved at opbygge en grundlæggendeOject ved hjælp af UNIX -skallen med sikkerhedskopierings- og scriptingfunktioner. Derefter vil vi undersøge et grundlæggende blogwebsted, opgradere vores blog med foto- og videofunktioner samt bruge disse funktioner til at anvende sikkerhedsløsninger ved hjælp af gratis software og sikre vores server ved hjælp af et pluggable godkendelsesmodul (PAM). Vi vil derefter gennemgå filhåndtering og behandling, udforske videoredigering, stemmedonation, stregkodescanning og optisk karaktergenkendelse, blandt andre koncepter. Undervejs vil vi undersøge API'er, som vil hjælpe os med at gøre vores software mere nyttig og sikker med gratis og betalte muligheder. Undervejs vil vi udforske fysiske sikkerheds- og militante værktøjer såsom skydevåben og ammunitionsdesign og fremstilling inklusive tønde og repeaterdesign, tårn og drone -design og andre rektorer, vi vil integrere med vores software på det eksisterende netværk for at beskytte vores software og demonstrere selvforsvar og resillience. Vi tager pauser undervejs for at bygge spil, 2d og 3dEndering -motorer og arbejde med indlejret hardware i casestudieeksempler på grundlæggende dimensionel gengivelsessoftware og en elektronisk vibrerende massager støbt i henholdsvis silikonegummi. Undervejs vil vi også anvende maskinlæringsløsninger, der allerede er tilgængelige for bedre at sikre vores software. Vi vil også anvende lagerværktøjer til rådighed for Internettet for at strømline og sikre processen. Denne bog er en guide til din succes med at opbygge en webapplikation og integrere den med et professionelt netværk af computer og indlejrede mekaniske systemer, og generelt en guide til bygningssoftware og indlejret hardware uden baggrundsviden eller tidligere erfaring. Hvad denne bog ikke er: Hvis du virkelig vil have et websted, kan du bare oprette en simpel butik og sælge det, du har brug for, sende en blog, sende fotos eller videoer eller på anden måde uden nogensinde at skrive en enkelt kodelinie. Denne bog er ikke det. Denne bog lærer dig, hvordan du bygger software, der er mere nyttig, fuldt udFremhævet, funktionel og sikker end enhver software, du allerede kan finde, fordi den implementerer den nyeste software, der stadig er prototyper, kan være dyrt at køre i en skala, som ældre virksomheder opererer på, og appellerer ikke til baglæns, indviklede virksomheder, der er oprettet til Tjen penge til folk, der ikke rigtig gør noget. Hvis du følger denne bog nøje, vil du skrive kode, forskningskode, opbygge dine egne apps, og du vil tjene penge på det, du gør. Jeg vil tjene penge på denne bog, selv i tidlige faser, fordi den indeholder information, som folk har brug for og vil læse, og køber allerede, når de køber eller bruger mine apps. Denne bog bygger ikke en app til dig, men den vil pege dig i den rigtige retning og armere dig med de værktøjer, du har brug for, og de færdigheder og tip, der vil lette din egen succes med at opbygge software til Internettet, med hver linje af Kode, du bliver nødt til at skrive som et eksempel, klar til at blive samlet i software, du og dine tilhængere, gæster, klientel,Riends, familie, besøgende, entreprenører og befolkningen på Internettet ønsker at bruge og støtte. Hvad du lærer: Denne bog vil lære dig, hvordan du bygger og sælger software, virkelig funktionel, nyttig software, medieoptagelse, sikkerhedsfunktioner som ansigtsgenkendelse, maskinlæselig zone stregkodescanning, web -API'er til at autentificere, optage og gengive video og fotos og udveksle beskeder som Bluetooth og nær felt (NFC) kommunikation. Denne bog vil lære dig, hvordan du bruger en netværkscomputer med fokus på Debian Linux, hvordan man bygger bash -kode til at gøre installation og sikkerhedskopiering af din software til en problemfri, automatiseret brise, hvordan man bygger python -kode som en backend til at tjene dynamiske meddelelser, stil Ting, der pænt bruger CSS -stilarter med bootstrap, aktiver bruger login og interaktivitet gennem netværksenheder, bygg interaktive medier og netværk med andre websteder for at tilbyde sikkerhedsfunktioner som tekst Meddelelser til verifikation eller andre formål, ID -scanning, image og videomoderation, dataRansaktioner for at holde din software sikker, betalingsbehandling, cryptocurrency -handel, asynkrone opgaver og mere. Du lærer, hvordan du bygger dine egne Bluetooth -enheder, med batterier, opladere, mikrokontrollere, kredsløb, motorer og sensorer ved hjælp af lodde, tråd og 3D -trykt samt støbt materialer. Jeg vil demonstrere 3D Design Principals anvendt til additivfremstilling og værktøj og dørfremstilling, så du er i stand til at fremstille dine egne indlejrede, hardwareenheder med integrerede batterier, opladere, elektroniske kredsløb og funktionelle output. og netværk dem med Bluetooth og Internettet. Specifikt vil vi undersøge to casestudier, en vibrerende massager og en hjemmelavet skydevåben, begge programmeret i OpenSCAD, som er tilgængelig som en grafisk grænseflade eller kommandolinjeværktøj og kan integreres i et web for hurtigere resultater. Du lærer, hvordan man bygger og implementerer et websted fra bunden uden forudgående erfaring, gør det funktionelt, sikkert, smukt, nyttigt og mestMportant praktisk. Du lærer, hvordan du bruger maskinlæring og computervision til at gøre et websted sikkert og mere praktisk, indspil video og lyd fra dit websted, donere din stemme, lave musik og modulere lyd for at skabe nyttige prøver, og hvordan man bryder igennem støjen med Udnyttelse af andre websteder til at opbygge det bedst mulige netværk af websteder, som du kan linke direkte til dit for at dele alle de nyttige oplysninger, du har at tilbyde, og endnu vigtigere bringer folk til din software og virksomhed. Denne bog vil være mest fokuseret på medier, sikkerhed og maskinlæring, som er de vigtigste tre komponenter, der hjælper dig med at opbygge nyttig software til internettet ved at engagere de rigtige brugere og frigøre de forkerte på en måde, der er realistiske, praktiske, Hands på og engagerende mens de også er automatisk og robust. Denne bog underviser i Unix, specifikt Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript og en række nyttige softwarepakker tiln Ligesom anmodninger såvel som nyttig Bash -software som Git og FFMPEG. Jeg vil også lære dig, hvordan du handler med cryptocurrency automatisk og tager betalinger i cryptocurrency eller fra almindelige betalingskort, mens du endda udbetaler dine besøgende en andel af din indtægt, hvis du vælger at gøre det. Jeg vil lære dig, hvordan du også tjener penge på dit websted gennem reklame søgninger som muligt. Jeg vil lære dig, hvordan du sælger din software, annoncerer den, appellerer til klienter, der leder efter dine tjenester, og giver et navn til dig selv på internettet gennem veje, der allerede findes, er billige og fungerer godt. Jeg vil lære dig, hvordan du gemmer dine data på cloudcomputere, der fungerer for dig og gemmer dine data billigt, hvordan du planlægger og bygger et websted, der gør, hvad dine brugere vil have, og hvad du vil, og hvordan du holder dine brugere engagerede iing dit websted et tryk væk på deres telefoner med meddelelser, e -mail, tekstbeskeder, telefonopkald og flere muligheder for at bringe dine brugere tilbage til dit websted til din rådighed bag klik på en knap, der er sikret til dig. Denne bog vil fokusere på det praktiske ved udgivelse og distribution af medier i store mængder, fra tekst til fotos til videoer til lyd, gøre et godt indtryk på slutbrugere (dit klientel) og sælge dig selv på enhver måde, du gør for at oprette Et websted, en app, der er repræsentativt for dig og kun dig, og gør dig, din software og din virksomhed ser godt ud på den bedst mulige måde. Du lærer også et par tip og tricks fra mig, fra kodningstips, praktisk forfængelighed som makeup og fotografering, modellering og skuespil og mere, hvilket vil være vigtigt for at fremstille dig selv og din virksomhed i det bedst mulige lys ved hjælp af alle tilgængelige værktøjer til dig, mens du distribuerer så meget indhold, som du har brug for på tværs af en sund balance mellem platforme for at bringe dine til at udføre uden mere indsats, arbejde eller penge end nødvendigt. Denne bog kaldes "Praktisk webbaseret dyb læring og sikkerhed som eksempel" af en grund: den handler om at lære at kode, specifikt til internettet, specifikt med fokus på sikkerhed, fra et praktisk synspunkt, med eksempler på arbejdskode, der tjener De praktiske formål, der er beskrevet i teksten. Læringskomponenten i denne tekst omfatter også maskinlæring, den kode, jeg vil vise dig, hvordan du kører på nettet, der vil håndtere computervision, ansigtsgenkendelse, billede og videomoderation, billedforbedring, opløsningsforbedring, billedtekst og andre opgaver som Forudsigelsesmetrics hentet fra billeder, såsom arten af ​​billedet som et autentisk, computeroverført billede eller en optisk kopi (et foto af et billede eller trykt foto). Maskinindlæring er meget vigtig, når det kommer til websikkerhed og softwaresikkerhed, fordi det kan præformere opgaver, der ellers var umulige. Din computerLog dig ind med en adgangskode, men det kan være mere sikkert at bruge den, hvis den logger dig ind med dit ansigt. Du kan lave en servercomputer til denne pengeskab, en computer, der normalt vil bede dig om et brugernavn og adgangskode og logge dig ind, måske med et bekræftelsestoken for hvert nyt login eller en ny IP -adresse, men hvis du bygger storskala, er let at Brug, grundlæggende sikker og kraftfuld software, kan dette være nok. At binde din software for tæt på en andens software, som en e -mail -service eller tekstmeddelelsestjeneste, er ikke nok til at gøre din software sikker eller nogens (ethvert websted, du bruger). Enhver, der bygger software, der er upåklageligt sikker, har en vis fornemmelse af, hvad dette indebærer. Software er i sagens natur usikker, fordi de enheder og konti, vi bruger til at få adgang til det, ikke altid er til rådighed, de kan være i hænderne på enhver med syg forsæt på softwaren og derfor kan udgøre en risiko for selve softwaren. Dette er noget af fokus i denne bog. En netværkscomputer er som standardSikret med en lang nøgle -token, kaldet og SSH eller Secure Shell Key, og er ellers bedst sikret med en webserver, fordi webserveren giver åben adgang såvel som avancerede sikkerhedsværktøjer, der kører på selve serveren. Webserveren har adgang til brugerens webbrowser, som uden tvivl er den mest kraftfulde del af brugerens enhed, fordi det er det sted, hvor brugeren kan få adgang til netværkssoftware. Dette værktøjssæt kan gengive tekst, de websider, du ser, og kan også optage billeder, lyd og video (som et foto af et ansigt eller et stats -id), kan læse og skrive til Bluetooth -radioenheder og kan læse og skrive til nær felt Transponder -tags, billige nøglekort, fobs, klistermærker, ringe og endda chipimplantater med unikke serienumre, der kan læses og skrives til med data genereret og valideret af en webserver bundet til internettet sted. Ved hjælp af alle de værktøjer, du har til rådighed, med denne bog vil du udstyre dig selv med viden til at opbygge et sikkert websted og samlet set aURE Networked Computer System, der fungerer for dig, gør dit bud og ser og føles rigtigt. Hvor skal man starte: Du er velkommen til at springe forbi det afsnit, jeg begynder denne bog med eller ethvert afsnit, til den nøjagtige kode, du har brug for, især hvis du har erfaring med kodning før eller et af de nævnte værktøjer, jeg vil beskrive i detaljer i denne bog som såvel som at dokumentere brugssager og praktiske eksempler deraf. Hvis du ikke har erfaring med at skrive kode, kan jeg varmt anbefale, at du læser al denne bog, og især anbefaler, at du læser de foregående sektioner, for at sikre dig, at denne bog er den rigtige for dig. Hvis denne bog ikke er rigtig for dig, skal du overveje at give den til en ven eller slægtning, der måske er interesseret i at lære om webudvikling selv, og endda overveje at låne den tilbage og lære af dem for at udfylde huller lærer eller andre lærere gjorde før mig. Start hvor du vil, vil hver del af denne bog være nyttig, hvis du har til hensigt at opbygge en nyttigPP, og overvej, at de bedste apps er bygget med slutbrugeren i tankerne: Kend din kunde. Nu kender du mig, du kender denne bog, og du er klar til at begynde. For at starte, skal du gribe en computer (endda den billigste bærbare computer fra en kassebutik, Amazon eller et gammelt desktop, og indstille den på en måde, der fungerer for dig. Hvordan man læser denne bog: Tekst fremhævet, angiver, at teksten hører hjemme i en kommandoprompt, hvor du vil skrive den kode, du kører. Kommandoprompten er stærkt tastaturfokuseret og kræver lidt til ingen klik, der fremskynder din arbejdsgang og gør tingene lettere for dig. Kom godt i gang: Lad os dykke ind. Vi starter med at bygge kode på en lokal maskine og begynde uden at bygge et websted, der er tilsluttet internettet. Dette er mere sikkert at starte med, koster intet og er let for dig. Afhængigt af dit operativsystem vil det være lidt anderledes at komme ind i en bash -skal. Til Mac OS anbefaler jeg at installere en virtuel maskine på dette tidspunkt, da du får den mest kompatibilitet medVirtuel maskine. Forskellige udbydere som VirtualBox og Paralells kan køre en virtuel maskine til dig, skønt det også er muligt at installere Ubuntu direkte på maskinen, hvis du foretrækker at bruge et indfødt miljø, der anbefales for at skabe en hurtig, strømlinet oplevelse. Hvis du bruger Linux eller Windows, som jeg anbefaler, skal det være ret let at oprette et projekt. Åbn din terminal, juster størrelsen, som du finder passende, og start følgende trin 2.. Hvis du bruger Windows, skal du følge trin 1. Trin 1: - Kun Windows -brugere I Windows, åben kommandoprompt som administrator og type WSL –installer Trin 2: - Fortsæt her, eller spring trin 1 til her, hvis du ikke bruger Windows I en åben terminal (afhængigt af dit operativsystem, kaldet Ubuntu i Windows, Terminal i Mac eller Linux eller et lignende navn), begynder med at oprette et projekt. Vi gør dette med mkdir -kommandoen, der opretter et bibliotek. Hvis du har brug for at oprette et bibliotek for at gemme dit projekt, som anbefales, skal du brugeCD -kommando til at ændre sig til biblioteket og og cd/sti/til/bibliotek - stien er mapperne (filer), der går forud for dit destinationsmappe, din standardsti er ~ eller/home/brugernavn (hvor brugernavn er dit brugernavn). For at ændre til standardmappen, skal du skrive CD eller CD ~ MKDIR -eksempel - Udskift “Eksempel” med navnet på biblioteket Nu har du et arbejdsmappe til dit projekt. At være som det er så vigtigt at have gemt dette bibliotek, hvis du har brug for at skifte til en anden maskine eller implementere den kode, du skriver, så den er klar til internettet, vi bygger et script til at sikkerhedskopiere dit bibliotek i de næste par trin. Men at opbygge et script tager lidt kode, og koden skal automatiseres for at være så nyttig som muligt. Så lad os opbygge et script til først at opbygge scripts. Lad os starte med at oprette scriptet og gøre det eksekverbart. Vi bruger sudo, chmod og berøring til dette og kalder manuskriptet


sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Nu har vi oprettet manuskriptet, gjort det eksekverbart og er klar til at redigere det. Nano er en teksteditor, der giver dig mulighed for at redigere tekst uden at klikke, hvilket er meget lettere end at bruge en grafisk brugergrænseflade. For at redigere en fil med Nano skal du bruge Nano og derefter stien til filen. For at lave et script, der laver et script, ligner det temmelig at lave vores script i første omgang. Vi bruger den samme kode som ovenfor og erstatter navnet på scriptet, "Ascript" med en argumentparameter, $ 1. Dette lader os kalde scriptet ved at skrive simpelthen sudo ascript Newscript, på hvilket tidspunkt vi kan oprette ethvert nyt script ved at udskifte “Newscript” med navnet på dit script. Koden i Nano skal se ud:

sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
Og for at lukke Nano kan vi holde kontroltasten nede og trykke på X, så y for at betegne, at vi gemmer filen og rammer retur. Nu i stedet for at skrive disse tre kommandoer for at redigere et script, vil vi være i stand til at skrive sudo ascript ascript for at redigere scriptet igen. Dette fungerer! Og ethvert nyt script kan let køres ved at kalde det i skallen. Lad os gemme vores arbejde nu: Lad os skrive et backup -script for at gemme vores nye script og derefter sikkerhedskopiere det i vores projektkatalog, mens vi også sikkerhedskopierer backup -scriptet.

sudo ascript backup
Nu i Nano:

sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Hvor/sti/til/bibliotek er vejen til det projekt, du oprettede med mkdir. Senere lærer vi, hvordan man kopierer gentagne stier som denne med en løkke og en liste, som er mindre kode, men lad os nu holde det enkelt og have et par linjer. For at køre dette script og sikkerhedskopiere din kode skal du gemme filen i Nano med kontrol+x, y og returnere og indtaste nedenstående i din skal

backup
Hvis du overhovedet bliver bedt om en adgangskode, mens du læser denne bog og følger med i skallen, skal du indtaste din brugeradgangskode korrekt, har du tre forsøg, før du har brug for at køre kommandoen igen. Du kan bruge pilene op og ned til at køre kommandoer og redigere dem, hvis du har brug for at køre noget to gange. Enkel tryk op og ned med mellemrum for at vælge en kommando, før du redigerer kommandoen med højre, venstre pile og slet nøgle såvel som tastaturet og kører den med retur. Tillykke! Det lykkedes dig at oprette et fantastisk backup -script, der sikkerhedskopierer to vigtige shell -scripts i dit arbejdsmappe. Vi flytter måske tingene senere, når projektet bliver større, men dette fungerer for nu. Lad os gå videre med at tage backup af i skyen, vi bruger GitHub til dette (selvom der er adskillige andre Git -løsninger til sikkerhedskopi, de er alt sammen om det samme.) Git er en Verision Control -software, der giver dig mulighed for at sikkerhedskopiere redigeringer til din software, mens du laver dem til en server, mensGør det også muligt for dig at downloade hele kopier af din software bag en adgangskode eller nøgle. Det er medvirkende til at gemme din software, især når vi migrerer til sikrede Linux -forekomster, der undertiden går i stykker, når en enkelt kodelinje mislykkes, hvilket efterlader dig låst, mens din kode muligvis ikke er sikkerhedskopieret, hvis du ikke får en chance for at støtte den op automatisk, som vi vil dække. Hvis du ikke allerede bruger en Ubuntu -virtuel maskine på dette tidspunkt, anbefaler jeg at bruge en Ubuntu -virtuel maskine på dette tidspunkt, fordi det vil gøre dit liv lettere, når jeg installerer alle de nødvendige pakker for at opbygge et arbejdswebsted og præform dybt læring operationer på din computer. Vi flytter koden til en webserver i den nærmeste fremtid, men vi vil sikre os, at der er mindst et par lag af sikkerhed bag vores webserver, der er modstandsdygtige over for phishing, og ansætter et antal Linux -pakker for at gøre denne. Hvis du stadig vil bruge Mac OS, er du velkommen til at søge og installereE Nødvendige pakker online, men der er muligvis ikke alternativer til hver pakke, denne bog eller serie vil dække. Lad os tilføje et par kommandoer til at forpligte vores arbejde med backup -scriptet ved at køre kommandoen sudo ascript
# ...
Endnu en gang skal du kontrollere X for at gemme. Nu er vi nødt til at lave en gang -konfiguration til dette projekt. Fordi det snart vil være et GIT -projekt, behøver vi ikke at skrive enhver kommando hver gang vi implementerer fra et Git -arkiv, men vi får fat på dette, når vi skriver vores implementeringsskripts. For at starte, lad os sørge for, at vi er i det rigtige bibliotek og initialiserer Git -lageret og genererer SSH -nøgler.

cd /path/to/directory
git init
git branch -m master
ssh-keygen
Når vi skriver ssh-tasten, skal den nye nøgle gemmes i hjemmemappen under en mappe kaldet .sssh. Det kaldes id_rsa.pub. Lad os finde denne nøgle og kopiere den. At se det,

cd ~
cat .ssh/id_rsa.pub
Kopier den tekst, der returneres af den sidste kommando, og opret en konto hos din GIT -udbyder (ideelt GitHub), før du tilføjer SSH -tasten til din konto. Når du har en konto, skal du klikke på den øverste højre menu og indtaste indstillinger, før du tilføjer din SSH -nøgle i SSH- og GPG -nøgler under adgang i menuen. Vælg Tilføj en SSH -nøgle, og tilføj din ved at indsætte den ind og give den en titel, inden du gemmer og vender tilbage til GitHub for at oprette et nyt depot. Dette ligner for andre GIT -udbydere, du bliver nødt til at læse deres dokumentation. I den nye depotkonfiguration skal du give dit depot et beskrivende navn og beslutte, om du vil offentliggøre det, og sørg for at konfigurere endnu ikke filer til optagelse. Når depotet er oprettet, skal du kopiere klonen med SSH URL og indsætte den i følgende kommando.

git remote add git://… (your remote URL)
Nu kan du flytte tilbage til dit depot med CD, du er bekendt med dette. Prøv dit backup -script nu med backup Stor! Nu kan vi virkelig få kodning. Lad os installere Django nu, hvor vi har et godt greb om bash og git. Django vil lade os automatisk sikkerhedskopiere vores software, Bash kan også gøre dette, men Django skal have en enklere mere sikker implementering (den kan deaktiveres og konfigureres lettere). For at installere software i Ubuntu bruger vi kommandoen sudo apt-get. Lad os først opdatere og opgradere den software, vi allerede havde. Dette kan gøres med sudo apt-get-opdatering og sudo apt-get opgradering -y. Lad os derefter installere Python og vores virtuelle miljø, hjemmet til vores kode, med følgende kommando: sudo apt-get installer python-is-python3 python3-venv Dette er alt hvad du behøver for at komme i gang med Django med hensyn til softwareinstallationer i Ubuntu -instansen. For Windows og Linux skal dette være ret ligetil, men for Mac kan du muligvis installere en virtuel maskine ogLinux på det ved hjælp af et gratis eller betalt virtuelt miljø som VirtualBox eller Paralells desktop og genskabe trinnene ovenfor for at opsætte et Ubuntu -miljø. Ubuntu er kritisk i dette tilfælde, fordi det er softwaren, som websteder kører, og det giver dem mulighed for at være vært for websteder med al den ovennævnte software. Lad os grave ind i Django. I vores bibliotek igen med
python -m venv venv # Opretter det virtuelle miljø, hvor koden er gemt
source venv/bin/activate # Aktiverer det virtuelle miljø
django-admin startproject mysite . # Hvor Mysite er det projekt, jeg starter i mit nuværende bibliotek.
Django er lige ved at komme os i gang, fordi Django er vært for webserveren og gør alt, hvad vi har brug for for at få et grundlæggende lokalt websted i gang. Nu hvor vi har Django installeret, lad os redigere indstillingerne lidt for at få det til at fungere, hvordan vi har brug for. Lad os først oprette en ny app

python manage.py startapp feed
Du vil bemærke, at den første app kaldes Feed. Appen skal kaldes, hvad du vil, og vi opretter nye apps, men navnet på hver app skal være konsistent, hver gang appen henvises til i koden. For at tilføje en ny app vil vi altid redigere indstillingerne. Brug af nano,

nano app/settings.py
I indstillingerne skal du finde installeret_apps og opdele [] i 3 linjer. Brug fire mellemrum på den tomme midtlinie, tilsæt 'feed' eller navnet på din app. Dette afsnit af indstillingerne.py skal se ud:

INSTALLED_APPS = [
    'feed',
]
Før vi glemmer, lad os teste, at Django fungerer. Ved hjælp af kommandoen Python Manage.Py Runserver 0.0.0.0:8000 kan vi køre serveren og derefter navigere i en webbrowser på computeren, der kører koden til http: // localhost: 8000 og se et eksempel på webside (det fungerer!) Afslut serveren med kontrol C, det samme som enhver anden kommando. Lad os nu grave i at skrive nogle Python -kode. Django har tre hovedkomponenter, som alle sammen kører af kode. Komponenterne kaldes model, visning og skabelon, og hver er på henholdsvis et højere og lavere niveau, før websiden leveres til brugeren. Modellen er den kode, der gemmer information i databasen til hentning, sortering og gengivelse. Udsigten beslutter, hvordan modellen gengives, manipuleres og ændres, næsten enhver visning vil bruge en model direkte. Skabelonen er HTML -koden med nogle ekstra klokker og fløjter kaldet skabelonsprog. Skabelonen gengives af det synspunkt, hvor den er fyldt med Python -kode ogKontekst såsom modeller og information (usuallstrenge og heltal) fra visningen. Django har også andre komponenter, herunder men ikke begrænset til: Indstillinger, der konfigurerer appen, som vi diskuterede. URL'er, som er mønstre, som brugeren følger for at få adgang til specifikke dele af webapplikationen. Formularer, der definerer, hvordan oplysninger, der sendes til serveren, håndteres og gengives til databasen såvel som til brugeren. Dette er grundlaget for behandling af information på serversiden og kan acceptere enhver form for information, som computerlagre, især tekststrenge, tal og ægte/falske boolere (normalt afkrydsningsfelter). Skabeloner, der er HTML -kode og skabelonsprog og bro mellem kløften mellem Python og HTML, hvilket betyder, at Python -oplysninger kan betjenes som HTML -kode, som enhver kan få adgang til og kan sikre et websted med begrænset adgang, mens Python -kode er tilgængelig for internettet og nyttigt til forskellige formål på en ekstern enhed, der ikke gør deteed til at være i nærheden af ​​serveren. Statiske filer, som normalt er JavaScript, og det er biblioteker, som serveren serverer og er forbundet med skabelonen. Mediefiler, som serveren serverer eller er eksternt vært, eller bare skrevet til serveren, før de behandles og sendes til en anden server (en spand) til hosting. Middleware, som er kodestykker, der køres på samme tid som enhver visning og betragtes som "inkluderet" i visningen. Kontekstprocessorer, der behandler konteksten for hver visning og bruges til at tilføje ekstra kontekst. Tests, der validerer, at brugeren eller anmodningen overfører visse krav, før visningen er gengivet. Forbrugere, der dikterer, hvordan WebSockets håndterer og reagerer på kommunikation. Admin, der bruges til at registrere modeller, så de kan manipuleres detaljeret inden for Django -administratorsiden, hvor databasen kan administreres gennem en grafisk grænseflade. Selleri, der definerer asynkrone opgaver, som Django -koden kan begyndenning før straks fortsætter til den næste opgave eller kodelinje. Django kan have mange andre komponenter, som vi vil diskutere detaljeret her. Der er masser af måder at gøre Django mere funktionelle, tilføje websockets, som er hurtige, strømlinede kommunikationskanaler, selleri, der udfører asynkrone opgaver og en række andre stykker software til at udvide Django, især i visningsfunktionerne, hvor de fleste af Koden udføres. Se funktioner er nøglen, fordi de normalt erklærer hvert stykke kode, der er specifikt for et specifikt URL -mønster, eller et afsnit af serveren. Lad os først udforske visningsfunktioner. Se funktioner begynder med import, der angiver kode, der vil blive brugt i visningen, og defineres ved hjælp af regelmæssige funktionsdefinitioner eller klasser. De enkleste synspunkter defineres af funktionsdefinitionen def og returnerer en httpresponse med en grundlæggende skabelon. Lad os starte med at definere en grundlæggende visning for at returnere teksten “Hello World”. Husk, at hver gang du tilføjerFter en erklæring som def, hvis du, for osv. Du skal tilføje 4 pladser til hver af de foregående definitioner, du gerne vil anvende til din funktion. Vi kommer snart ind på, hvad hver af disse betyder. Fra vores websteds bibliotek skal du redigere filen Feed/Views.py ved hjælp af Nano og tilføje følgende linjer til slutningen af

from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world')
Djangos HttPresponse reagerer med en tekststreng, betegnet med åbningen og lukningen '. Hver gang du videregiver information til en funktion eller klasse, som anmodning eller en streng, skal du bruge parentes (, åbning og lukning). Dette er ikke alt, hvad vi har brug for for at se vores synspunkt endnu. Selvfølgelig har vi ikke fortalt serveren, hvor udsigten er nøjagtigt, vi er stadig nødt til at definere en sti, hvormed udsigten skal gengives. Lad os starte med at definere en grundlæggende sti i app/urls.py, og vi vil komme ind i sti -grupper senere. Tilføj en linje i app/urls.py efter importopgørelserne efter begyndelsen af ​​importen af ​​det synspunkt, vi lige har oprettet.

from feed import views as feed_views
Lad os nu definere visningsmønsteret. Visningsmønstre har tre komponenter, sti -komponenten, der fortæller serveren, hvor visningen eksisterer inden for serveren (den URL -sti, som brugeren indtaster i navigationslinjen for at komme ind på websiden), visningskomponenten, hvor visningen er specificeret, og en Venligt navn på udsigten, så det er let at hente dets mønster, når du arbejder med en skabelon, især så det kan navnet ændres og opdateres om nødvendigt for at få plads til en anden visning eller påtage sig et mere logisk navn. Det giver mening at gøre tingene på denne måde og være fleksibel, fordi din kodebase vil være et stadigt skiftende miljø, der har brug for fleksibilitet og improvisation for at være værdifuld og let at arbejde med. Her er, hvordan din visning vil se ud, du kan tilføje dette til urlPatterns = [sektionen af ​​app/urls.py. Visningsmønsteret defineres med de tre komponenter beskrevet ovenfor, og en funktion kaldet sti. Dine URL -mønstre er en liste, så sørg for altid at afslutte hvert emne i demmed et komma, fordi dette adskiller hver enkelt. Hver vare skal også gå på en ny linje, igen med fire mellemrum før den, ligesom appen i indstillinger.py. Vi definerer den første komponent i visningen med en tom strengfunktion for at oprette en visning, der kører på rodkataloget på webserveren. Dine urls.py skal nu se ud

from feed import views as feed_views

urlpatterns = [
    path('', feed_views.hello, name='hello'),
]
Dette er grundlaget for at oprette et websted med Django, der er helt statisk. For at lave et mere dynamisk websted, hvor vi kan begynde cacheinformation, som billeder, videoer, lyd og mere, bliver vi nødt til at bruge modeller, som vi vil udforske næste. Lad os nu tjekke vores kode og køre serveren. For at kontrollere koden for fejl skal du køre:

python manage.py check
Hvis der er nogen fejlmeddelelser, skal du omhyggeligt gennemgå de ændringer, du har foretaget til din app, og se, om der er noget, der skal rettes, som en ekstern eller manglende plads, en ekstra karakter, en uklasset streng, enhver skrivefejl, enhver ved et uheld Slettet karakter eller noget andet. Når du læser gennem fejlmeddelelsen (hvis du har en), skal du være i stand til at se stien til en fil, du oprettede eller redigeret sammen med et linjenummer, så se på den fil og linje og se, om du kan løse alt, hvad der er der . Hvis du har løst problemet, skal du køre ovenstående kommando igen. Når din software er klar til at køre og arbejder, vil du se output "Systemcheck identificerede ingen problemer." Nu er du klar til at gå. Kør serveren med:

python manage.py runserver 0.0.0.0:8000
Åbn nu en webbrowser og naviger til http: // localhost: 8000. Du skal se teksten returneret i parentes og citater af HTTPResponse -funktionen efter din opfattelse. Dette er bare et grundlæggende eksempel, men hvis du nåede det så langt, forstår du det grundlæggende om, hvordan Linux, Bash, Python og Django fungerer. Lad os grave dybere ned i en eller anden databasemodellering og udforske kraften i en Python -klasse ved lagring af information. Derefter begynder vi at få fat i HTML og CSS, før vi gør vores websted fuldt ud med, fleksibelt og sikkert ved hjælp af JavaScript og Machine Learning. Klasser gemmes i modellerne. Brug af Nano, rediger app/modeller.py og tilføj en ny klasse. En klasse er defineret med klassedefinitionen og overføres en superklasse, som den arver fra, i dette tilfælde modeller.model. Navnet på klassen kommer efter klassedefinitionen, og efter klassens definition a: (colon) bruges, før attributterne og funktionsdefinitionerne, der er knyttet til klassen, er betegnet nedenfor. Vores klasseBrug for et ID, vi kan bruge til at hente det og holde det unikt, og det har også brug for et tekstfelt for at gemme nogle oplysninger. Senere kan vi tilføje en tidsstempel, filer, boolere (sande eller falske definitioner, der kan hjælpe vores kode med at tage beslutninger om, hvad de skal gøre med modellen, og kan bruges til at sortere den), et eksempel på at binde modellen til en bruger, der er logget ind på serveren og mere. Lad os pakke koden ud
from django.db import models # Den import, der bruges til at definere vores klasse, og det er attributter
class Post(models.Model): # Definitionen af ​​vores klasse selv
    id = models.AutoField(primary_key=True) # ID for vores model, en automatisk genereret nøgle, der vil lade os spørge modellen, holde den unik og er nyttig, når vi er nødt til at interagere med modellen, når den er blevet oprettet.
    text = models.TextField(default='') # Attributten vores klassebutikker, i dette tilfælde, nogle tekst, som er standard til en tom streng.
Luk og gem filen, som vi gjorde før for at afslutte. Der er mange andre felter og indstillinger, vi vil udforske, når vi opdaterer denne klasse, når vores app udvikler sig, men dette er de grundlæggende nødvendigheder ved at oprette en app til at sende en tekst. Imidlertid fungerer denne model ikke alene. Som beskrevet tidligere har vi brug for en brugerdefineret visning og brugerdefineret URL -mønster for at få denne model til at fungere, og vi har også brug for en formular sammen med en skabelon. Lad os udforske formularen først. For at definere en formular skal du redigere app/formular. Py med Nano og tilføje følgende linjer. Vi har brug for to import, vores formersklasse samt den model, vi oprettede (Feed.Models.post), en klassedefinition, der ligner modellen, og et felt sammen med en underklasse kaldet meta, der definerer modellen, som formen interagerer med. Formularen kan også have en initialiseringsfunktion, der indstiller den baseret på oplysninger i anmodningen, modellen eller på anden måde, vi vil udforske dette senere. Modelformularer er så nyttige, fordi de kan oprette en model eller også redigere en model,Så vi vil bruge dem til begge. Lad os definere en i form.py

from django import forms
from feed.models import Post

class PostForm(forms.ModelForm):
    text = forms.CharField(widget=forms.Textarea)
    class Meta:
        model = Post
        fields = ('text',)
Dette er det grundlæggende i, hvordan en form og model ser ud. Denne modelform kan bruges til at instantiere eller redigere et indlæg, ændre den tekst, den indeholder. Vi ser på at integrere denne formular i en visning næste. Lad os først lave migrationerne og migrere databasen, så vores kode kan interagere med modellen, når den kører. For at gøre dette skal du køre følgende kommandoer:

python manage.py makemigrations
python manage.py migrate
Dette vil tage et minut at udføre, men når det først er gjort, giver det dig adgang til modellen i visningerne, middleware eller andre steder i softwaren. Lad os fortsætte med at se, hvor vi kan se vores model. Rediger feed/visninger.py og tilføj følgende kode, som nævnt. Du behøver ikke at tilføje noget efter # tegnet, at koden er kommentarer, der bruges til at betegne oplysninger om koden. Vi starter med at importere vores model i visningerne og tilføje den til en kontekst, hvor vi kan gengive den i en skabelon som en liste til visning. Dernæst tilføjer vi en skabelon, hvor vi kan gengive formularen og modellen med en knap for at oprette et nyt objekt baseret på modellen og sende den til serveren. Dette lyder kompliceret, så lad os bare tage det trin for trin. Før vi er færdige med udsigten, lad os oprette en skabelon, der bare gengiver modellen og sørger for, at vi kan se den ved at oprette et nyt indlæg i skallen. Sådan skal denne opfattelse se ud:
    posts = Post.objects.all() # Forespørg alle indlæg i databasen indtil videre
Alt dette ser temmelig enkelt ud, indtil vi kommer til bunden. Render, den værdi, der er returneret af funktionen i stedet for i et HTTP -svar som det forrige eksempel, tager altid en anmodning som dens første input, accepterer en kontekst (i dette tilfælde indlægene i databasen), som nu kan fremsættes i skabelonen , og returnerer skabelonen defineret i funktionen. Skabelonen bliver et HTML -dokument med lidt af et sprog kaldet Jinja2, der gør Python -oplysninger til HTML. For at begynde at oprette skabeloner skal du lave to mapper i feed.

mkdir feed/templates
mkdir feed/templates/feed
Rediger derefter en skabelon i biblioteket ovenfor, feed/skabeloner/feed, og tilføj koden til dette eksempel. Lad os se på skabelonen for dette eksempel.
Dette er en meget simpel skabelon. Det definerer åbning og lukning af HTML -tags, et dokumenttypemærke, et kropsmærke med en legende titel, et brudmærke, der tilføjer en lille linje på tværs skabelonen. Dette er alt, hvad det kræver for at gengive indlæg, men der er endnu ingen i databasen. Lad os skabe nogle med skallen. Vi kan køre skallen med administration.py

python manage.py shell
Lad os nu importere vores postmodel

from feed.models import Post
Dernæst opretter vi et simpelt indlæg med en streng og afslutter skallen. Strengen kan være hvad som helst, så længe det er gyldigt tekst.

Post.objects.create(text='hello world')
exit()
Til sidst bliver vi nødt til at tilføje et URL -mønster til vores feed. Fordi vores feed -app vil bruge flere webadresser, og vi ønsker at holde filstørrelser små, lad os oprette en lokal webadres. PY i vores feed -app, der ser sådan ud:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.feed, name='feed'),
]
Vi bliver også nødt til at redigere urls.py i basisappen, uanset hvad vi besluttede at kalde det, var dette det første bibliotek, vi oprettede. Rediger app/app.py og tilføj følgende til URL -mønstrene
from django.urls import include # øverst
    # ... Tidligere kode her
Nu, når vi kører serveren med Python Manage.Py RunServer, vil vi se den side, vi oprettede, fordi vi har modellen, visningen og skabelonen såvel som URL -mønster sammen med varer i databasen. Lad os derefter implementere den formular, vi oprettede, og begynde at oprette vores egne indlæg. Men inden vi skriver for meget kode, lad os lave en sikkerhedskopi ved hjælp af det script, vi skrev tidligere, backup. Kør dette script i skallen, vent et par øjeblikke, og al koden vil blive sikkerhedskopieret til vores git -arkiv.

backup
Implementering af formularen er relativt enkel. Vi importerer vores formular, tilføjer en postanmodningshåndterer til visningen og gemmer indlægget i databasen, inden du omdirigerer til den samme visning. Vi kan bruge den omdirigeringsfunktion, vi allerede har importeret, og en anden funktion kaldet omvendt for at få URL'en til visningsmønsteret. Vi vil forespørge dette med strengen 'Feed: Feed', fordi navneområdet på det inkluderede mønster er foder, og visningen kaldes også foder.
    posts = Post.objects.all() # Forespørg alle indlæg i databasen indtil videre
    if request.method == 'POST': # Håndter anmodningen om posten
        form = PostForm(request.POST) # Opret en forekomst af formularen og gem dataene på den
        if form.is_valid(): # Valider formularen
            form.save() # Gem det nye objekt
        return redirect(reverse('feed:feed')) # Omdirigere til den samme URL med en GET -anmodning
        'form': PostForm(), # Sørg for at videregive formularen i konteksten, så vi kan gengive den.
Nu skal vi opdatere skabelonen for at redegøre for den nye form. Vi kan gøre dette ved at bruge
Tag i HTML og gengiv formen i HTML -skabelonen med en indsendelsesknap. Vi har også brug for et CSRF -token, et token, der forhindrer eksterne websteder i at placere til formularen uden først at indlæse en side.
Lad os nedbryde dette. Der er en ny formklasse, et token, selve formularen og en indsendelsesknap. Temmelig enkel, men når vi ser på det, vil vi måske få det til at se bedre ud. Det fungerer, vi kan sende nye indlæg med formularen, og de gemmes nu i databasen. Der er et par ting, der foregår her. Vi bruger HTML -tags til at erklære, at dokumentet er et HTML -dokument, vi bruger et skabelon -tag ({ %… %}) til at gengive tokenet til formularen og et andet, {{…}} til at gengive formularen. Vi har også en løkke til at gengive teksten ved hjælp af blokmærker og et skabelonmærke. Blokkoder er virkelig vigtige, fordi vi kan definere, hvordan sektioner af skabelonen gengives med dem, og skabelonmærker er grundlaget for, hvordan vi sætter variabler i vores kode. Nu er vi nødt til at få vores app til at se bedre ud, for i øjeblikket ser det virkelig grundlæggende ud. Vi kan gøre dette ved at bruge CSS, enten inline eller i klasser bundet til hvert objekt i dokumentet. CSS er virkelig rart, fordi det fortæller alt på siden, hvordan det skal se ud,Og kan få det til at se rigtig godt ud. Der er et par biblioteker, der kan gøre dette, men min personlige gå til er bootstrap. Bootstrap kan downloades fra deres websted,getbootstrap.com/. Når du er der, skal du trykke på knappen for at læse installationsdokumenterne og kopiere koden fra INCLUDE via CDN -sektionen. Du har brug for denne kode øverst på dit HTML -dokument i et tag kaldet Head. Lad os også gå videre og oprette en baseskabelon, så vi behøver ikke at genskabe disse links i hver skabelon. Lav et nyt bibliotek kaldet skabeloner med MKDIR -skabeloner, og rediger derefter skabeloner/base.html. Det skal se sådan ud:
Sørg for at kopiere CSS og JavaScript, .CSS- og .JS -filer, fordi vi har brug for JavaScript for at gøre vores websted mere funktionelt i fremtiden. Lad os nu vende tilbage til Bash Shell og køre en hurtig kommando. Husk, at hvis du nogensinde har brug for at få adgang til det virtuelle miljø, skal du skrive kilde VENV/bin/aktivere. Dette giver dig mulighed for at installere Python -pakker lokalt på en måde, der lader Django få adgang til dem. For at give vores formularer genereret af Django Bootstrap -klasser, bruger vi en Python -pakke kaldet Crispy Forms. Vi kan downloade dette med følgende kommando

pip install django-crispy-forms
Når dette er installeret, skal du tilføje det til indstillingerne.py
    # … Tidligere kode her
Nu, tilbage i vores feedskabelon, kan vi fjerne nogle ting. Lad os fjerne begyndelsen og slutningen af ​​dokumentet og udskifte det med arv fra vores baseskabelon ved hjælp af udvidelse og blokdefinitionen. Vi tilføjer også en skabelonfilterimport med belastning og et skabelonfilter til formularen. Til sidst, lad os tilføje en bootstrap -klasse til knappen på formularen for at få den til at ligne en knap. Det skulle se sådan ud:
Smuk! Det er allerede en hel del kode. Dernæst skal vi teste det ud og sørge for, at vi kan se, at alt ser godt ud, og at være sikker på, at alt fungerer korrekt. Kør serveren i henhold til tidligere instruktioner, og sørg for, at webstedet ser ud og fungerer i orden. Fantastisk job! Du er klar til at gå videre til det næste trin, hvor vi tilføjer bruger login -funktionalitet ved hjælp af lignende webadresser, formularer, visninger og skabeloner. Baseskabelonen er vigtig, og vi vil fortsætte med at ændre den og foretage ændringer efter behov, men lad os nu fokusere på at gøre vores websted mere sikkert ved at give brugerne mulighed for at logge ind med et brugernavn og adgangskode, og til sidst endnu vigtigere oplysninger om det Hjælper med at holde din app sikker og din egen konto kun tilgængelig af dig. For at gøre dette skal vi bruge brugermodellen indbygget i Django. Brugermodellen er en databasemodel, ligesom vores indlæg, der kan gengives til at logge en bruger på webstedet. I fremtiden, inden vi implementerer webstedet til internettet, vil viUdvid denne model med andre modeller, der tilskrives den, og opbyg yderligere sikkerhedsforanstaltninger for det login, der er modstandsdygtige over for phishing. Vi begynder med at bruge nogle indbyggede loginformularer, som Django leverer. Lad os først oprette en ny app, som vi vil bruge til at gengive skabeloner og visninger til den grundlæggende login -side. Vi vil også oprette andre apps til at repræsentere de fortsatte loginudfordringer for at sikre appen, herunder en pincode, ansigtsgenkendelse, nær feltkommunikation, eksterne enheder, multi -faktor -godkendelse og fingeraftrykgenkendelse. Vi har allerede talt om at starte en app. Fra vores bibliotek, inde i det virtuelle miljø, pas administrere.py disse

python manage.py startapp users
Nu skal vi have et bibliotek til den nye app. Lad os starte med at oprette en visning i det bibliotek, der svarer til brugerlogin. Django har indbygget visninger til brugerlogin, men disse er ikke egnede til os, fordi vi har brug for en brugerdefineret visning, hvilket fortrinsvis er gjort med en definition. I denne opfattelse starter vi med at kontrollere for en postanmodning, overføre anmodning.post til en loginform importeret fra Django, autentificere brugerkontoen og logge brugeren ind, inden du omdirigerer dem til vores feed -app. Tilføj følgende kode i brugere/visninger.
        username = request.POST['username'] # Få brugernavnet og adgangskoden fra POST -anmodningen
        password = request.POST['password'] # Autentificer brugeren
Dette er alt hvad du behøver for en grundlæggende loginvisning. Lad os nu oprette en formular til visningen ved at udvide baseskabelonen. Vi starter med at oprette et nyt bibliotek til skabeloner i mappen Bruger.

mkdir users/templates
mkdir users/templates/users
Nu skal vi være i stand til at redigere brugere/skabeloner/brugere/login.html. Mens vi er ved det, opretter vi en skabelon, der giver brugeren mulighed for at tilmelde sig.

nano users/templates/users/login.html
Nu i skabelonen
Dette er det grundlæggende i en login -skabelon. Det er virkelig ligesom den anden skabelon i struktur, men den ser lidt anderledes ud, når den er gengivet. Vi kan kopiere denne kode for at opbygge en anden meget lignende skabelon kaldet Register.html, hvor vi ændrer ordlyden og bruger en ny formular, vi bygger. Lad os lave skabelonen først. Rediger brugere/skabeloner/brugere/register.html og tilføj følgende kode:
Lad os nu opbygge en formular til vores brugerregistrering og cirkel tilbage til visningerne, før vi opgraderer vores bruger login med en model. Vi vil gøre denne form til grundlæggende til at begynde med, men indarbejde flere detaljer og sikkerhedsfunktioner såsom aftaler og CAPTCHA i fremtiden. Rediger formularerne med Nano -brugere/formular. Py, og tilføj følgende kode.

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']
Så vi har en anden form her, der fungerer temmelig enkelt. Det er en brugerregisterformular med et brugernavn, e -mail og adgangskode samt et bekræftende adgangskodefelt. Bemærk, at denne formular ikke udvider den almindelige form.formklasse, det er en modelform, hvilket betyder, at den har en meta. Et felt defineres lige det samme, og klassen meta definerer den model, formularen svarer til resten af ​​de oplysninger, der vil blive skrevet til formularen. Det meste af dette findes allerede i Djangos indbyggede brugercreationform, så vi vil bruge det som grundlag for klassen (bestået i parentesen). Dernæst undersøger vi visningen for at registrere en bruger, nu hvor vi har en formular og en skabelon. Dette er en Modelform, ligesom den i den nye eftervisning. Rediger brugere/visninger.py og tilføj følgende kode:
# ... import
Dette er alt, hvad vi har brug for for at få en bruger registreret, men vi bør have mere information. Vi vil gerne vide den tid, som brugeren registrerede, hvornår de var sidst på webstedet, nogle oplysninger om dem, som en biografi, tidszone osv. Også, vi bliver nødt til at opdatere vores feed -model, post, for at redegøre for brugeren Model og attributindlæg til hver bruger. For at gøre det, opdaterer vi modellerne.py i begge apps. Lad os starte med at redigere fodermodellen. Det skal se sådan ud nu:
from django.db import models # ... import
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Tilføj i denne linje
Vær opmærksom på den anden linje, der blev føjet til filen. Dette er en fremmed nøgle, der tilskriver hvert indlæg til en enkelt bruger pr. Indlæg, så vi kan sørge for, at vi gemmer indlægene på en bruger-per-bruger-basis, og der kan ikke laves noget indlæg uden at tilskrive det til en bruger. Vi definerer denne udenlandske nøgle med den klasse, den repræsenterer, et slettargument for at sikre, at indlæg slettes med brugere, nul og tomme argumenter for at sikre, at vi kan fjerne brugeren om nødvendigt, og for at imødekomme for manglen på en bruger på indlæg, vi allerede Oprettet og et relateret navn, som vi kan bruge til at henvise til de post -objekter, som brugeren opretter. Dette relaterede navn, i modsætning til Post.Author, forfatteren af ​​The Post, giver os bruger, der sendte selve posten. Vi kan nu få de indlæg, en bruger lavet af at køre bruger.posts.all () eller forfatter.posts.all (). Lad os nu gøre vores login mere modstandsdygtige. Vi kan allerede gøre vores websted meget mindre sårbart over for phishing ved blot at begrænse antallet af gange, vi tillader et login tilSite, dette er ret let. Lad os også begynde at gemme nogle oplysninger om hver bruger før, når vi fortsætter med at udvikle vores app. Redigering af brugere/modeller.py, tilføj følgende

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='')
Bemærk, at denne model temmelig ligner postmodellen. Vi har en ekstra import, tidszone, som giver os mulighed for at indstille misligholdelser på datetime -felterne, og vi har også en karakterfeild og textfield som indlægget. Brug af alle disse tidsstempler hjælper os med at sikre webstedet og forstå dets anvendelse, og tekstfelterne lader os give information om hver bruger eller forfatter på webstedet. OneToonefield skal være den eneste mindre overvejelse, det opfører sig nøjagtigt det samme som en forudgående, men med kun en pr. Efterfølgende model. På denne måde har brugeren kun en profil, mens de muligvis har mange indlæg. Lad os nu forbedre vores login og registrere visninger for at redegøre for profilen. Rediger først brugere/views.py og fokuser på registervisningen:
# ... import
            Profile.objects.create(user=user) # Sørg for at tilføje denne linje for at oprette en profil for brugeren
Dette skaber simpelthen en profil for brugeren uden at udfylde nogen af ​​oplysningerne. Nu ønsker vi at sikre, at brugerkontoen ikke kan logges ind for ofte, eller i det mindste kan adgangskoder ikke prøves for ofte, så lad os opdatere login -visningen.
# ... import
        if user and user.profile.can_login < timezone.now(): # Bemærk, at vi nu kontrollerer, om brugeren kan logge ind
        else: # Hvis login ikke lykkedes,
            user = User.objects.filter(username=username).first() # Dette er den del, hvor vi opdaterer brugerprofilen
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Så de kan ikke logge ind igen i et par sekunder
Dette er det grundlæggende grundlæggende af sikkerhed. Sørg for, at webstedet ikke er sårbart over for nogen, der blot prøver enhver mulig adgangskodekombination, eller endda et par af dem på samme tid. Dette vil ikke være frustrerende for den almindelige bruger, der kender deres adgangskode og bare logger på et par enheder, men det vil holde adskillige phishing -robotter ude af appen. Bemærk, at vi tilføjede en IF -sætning med en variabel, can_login, det skulle være en tid i fortiden og opdatere den med hvert mislykket login ved hjælp af det samme brugernavn. På denne måde kan en ondsindet bruger ikke gætte en adgangskode hvor som helst i nærheden af ​​så hurtigt. Antallet af sekunder i datetime.timedelta () kan også opdateres, og webstedet vil være mere elastisk, men alligevel lidt mindre anvendeligt med flere sekunder. Jeg anbefaler 15 til at starte med. Husk, at vi byggede et backup -script for at gemme vores arbejde, så lad os gå videre og tilbage op, hvad vi har hidtil for at sikre, at vi har alt gemt. Kør kommandoen:

sudo backup
Endnu en gang sparer dette dit arbejde indtil videre. Jeg anbefaler at køre hyppige sikkerhedskopier for at gemme dit arbejde, og du vil måske endda køre et backupjob automatisk. Du kan gøre dette ved hjælp af et UNIX -værktøj kaldet Cron. For at aktivere dette værktøj skal du køre følgende kommando og indtaste din adgangskode:

sudo crontab -e
Hvis du ikke allerede har valgt mulighed 1 til Nano, skal den teksteditor, du allerede skal være bekendt med, og rulle til bunden af ​​filen ved hjælp af piletasterne. Tilføj følgende linje:

0 * * * * sudo backup
Cron bruger formatintet, time, dag i måned, måned, ugedag, hvor et * eller et nummer repræsenterer, hvornår man skal køre kommandoen. Ved hjælp af en 0 til minut og * for resten af ​​indstillingerne kan vi køre en kommando i det første minut af hver time i starten af ​​minut. Dette giver os mulighed for automatisk at tage backup af koden. Alle Crons job, når de udføres med Sudo Run som rod, så vi behøver ikke at indtaste en adgangskode hver time. For at gøre det lettere at sikkerhedskopiere vores kode uden at bruge en adgangskode, lad os deaktivere adgangskoden til vores backup -kommando. Vi vil gøre dette ved at udføre følgende kommando og indtaste en adgangskode:

sudo visudo
Lad os nu rulle til bunden af ​​filen og tilføje en anden linje:

ALL ALL=NOPASSWD: /bin/backup
Dette lader os køre kommandoen "backup" som enhver bruger uden en adgangskode. Formatet til dette er let, bare præfiks linjen med “alle alle = nopasswd:/bin/” og slutter med kommandoen, for eksempel/bin/backup, der findes i/usr/bin/. Lad os nu begynde at arbejde med e -mail. E -mail er virkelig vigtig for websteder, fordi det er en måde at holde et websted mere sikkert på, verificere, at brugerne er rigtige mennesker og endda markedsprodukter eller tjenester til kunderne. Mange mennesker, der hyppige internettet, tjekker deres e -mail dagligt og modtager alle mulige marketing -e -mailer om produkter og tjenester, de er interesseret i. Der er et par muligheder, når det kommer til at aktivere e -mail på et Django -websted, og du er velkommen til at vælge Uanset hvad der fungerer bedst for dig. Først kan du betale for en e -mail -service, der giver dig mulighed for at sende e -mail fra dit domæne og kræver minimal kode. Der er mange tjenester, der tilbyder dette, såsom Google Workspace, SendInblue, MailGun og mere. Ellers er du godt uden for at byggeDin egen e -mail -service på din server fra bunden. Jeg anbefaler denne mulighed, selvom den er mere kode og kan kræve særlig hosting. Du vil ikke være i stand til at starte en mailserver fra din hjemmecomputer sandsynligvis, så lad os gå videre og undersøge konfigurationen og koden for at sende e -mail, før vi starter en server i skyen og opretter vores egen mailserver inden for. Rediger først indstillinger.py med følgende

nano app/settings.py
Hvor app er navnet på den app, du oprettede med StartApp. Tilføj følgende linjer:

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)
Sørg for at ændre disse, når du er klar til at implementere din app, vi vil besøge dette senere. Indstillingen for e -mail_address skal være den e -mail, du gerne vil sende fra, og adgangskoden (e -mail_host_password) skal indstilles til den adgangskode, du genererer til serveren. Jeg indlæser adgangskoden fra en konfigurationsfil for at holde den ude af koden ved hjælp af følgende logik over disse linjer i indstillinger.py:

import os
import json
with open('/etc/config.json') as config_file:
    config = json.load(config_file)
Derefter har jeg oprettet en JSON -fil med konfigurationen i /etc/config.json ved hjælp af Nano som følger. For at redigere filen:

sudo nano /etc/config.json
Tilføj følgende linjer:

{
	“EMAIL_HOST_PASSWORD”: “<some password here>”
}
Vi vil fortsætte med at redigere konfigurationsfilen og tilføje alle de adgangskoder og nøgler, vi vil bruge i appen. Lad os for tiden hurtigt undersøge, hvordan du sender e -mail ved hjælp af Python. Lad os først oprette en skabelon til en verifikations -e -mail, vi kan sende til vores brugere, og placere den i mappen Brugerskabeloner. Denne skabelon skrives i HTML.

nano users/templates/users/verification_email.html
Denne e -mail er ret enkel. Det tager en kontekst af en bruger, basis -URL'en til webstedet og et bruger -id og token, der bruges til at verificere brugerens e -mail. Sørg for at definere basis -URL'en i indstillinger.py, før vi skriver nogle Python -kode for at gengive skabelonen. Gå videre og tilføj følgende linjer til app/indstillinger.py, nær starten.

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

BASE_URL = PROTOCOL + '://' + DOMAIN
Til sidst, når dit websted er klar til internettet og du implementerer det, vil du definere dit domæne som det domænenavn, du køber for at repræsentere webstedet. Dette er det navn, du vil indtaste Navbar for at få adgang til dit websted. I øjeblikket kan du forlade domænet tomt eller bruge en pladsholder. Du vil også ændre webstedet_navnet til et navn, du vil give dit websted, efter at du vælger. Før vi sender e -mail, lad os oprette en tokengenerator, så vi kan have en kontosaktiveringstoken, der aldrig udløber. Vi kan gøre dette ved at opbygge og importere en kontosaktiveringstoken, der ligner følgende. Rediger filen:

nano users/tokens.py
Tilføj følgende kode:

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()
Denne grundlæggende tokengenerator genererer et token, vi kan sende brugeren i en URL, og brugeren kan bruge til at verificere deres e -mail og aktivere deres konto. Lad os derefter se, hvordan vi sender en e -mail. Brug af Nano, rediger brugere/e -mail.py.

nano users/email.py
At sende verifikationen HTML -e -mail vil se sådan ud:

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)
Dette er ret enkelt. Vi importerer de funktioner, vi har brug for for at sende e -mailen, gengive e -mailen med skabeloner og vores indstillinger, og derefter definerer vi e -mailen med skabelonnavnet og sender den til brugeren ved hjælp af en funktion. Du vil bemærke, at vi ikke har defineret funktionen til at sende mailen, send_html_email, men lad os skrive dette under koden, vi allerede har tilføjet brugere/e -mail.py

def send_html_email(user, mail_subject, html_message):
    to_email = user.email
    username = user.username
    if to_email == '':
        return None
    unsub_link = settings.BASE_URL + user.profile.create_unsubscribe_link()
    html_message = html_message + "<p><a href=\"" + unsub_link +  "\" + title=\"Unsubscribe from " + settings.SITE_NAME + " emails\">Unsubscribe</a></p></body></html>"
    msg = EmailMultiAlternatives(mail_subject, strip_tags(html_message), settings.DEFAULT_FROM_EMAIL, [to_email], headers={'List-Unsubscribe' : '<' + unsub_link + '>'},)
    msg.attach_alternative(html_message, "text/html")
    profile = user.profile
    try:
        msg.send(fail_silently=False)
        if not profile.email_valid:
            profile.email_valid=True
            profile.save()
    except:
        profile.email_valid=False
        profile.save()
Dette er lidt mere kompliceret, og vi er ikke klar til at køre al denne kode endnu. Bemærk, at vi definerer en usub_link, det link, som brugeren kan bruge til at afmelde dig fra vores e -mails. Dette er vigtigt, fordi brugerne bliver nødt til at være i stand til at fravælge vores e -mails, medmindre de vil se dem til enhver tid. Vi tilføjer også et tekstalternativ til vores meddelelse, som er HTML -meddelelsen strippet af HTML -tags. Til sidst kontrollerer vi, om den sendte e -mail, og hvis den ikke gjorde det, markerer vi i brugerens profil, at deres e -mail ikke er gyldig. Lad os flytte tilbage til brugermodellerne, så vi kan få alt dette til at fungere. Vi er nødt til at definere en funktion til at generere et link til afmelding og definere et boolsk felt for at markere, at brugerens e -mail ikke er gyldig. Tilføj først følgende import til toppen af ​​brugere/modeller.py

nano users/models.py
# ...
Lad os derefter tilføje funktioner til brugermodellen for at lave token og kontrollere det token, der bruges til at aktivere e -mailen, såvel som feltet for at gemme, om brugeren med succes modtager deres mail. Tilføj følgende kode til slutningen af ​​modellen (indrykket kode) i brugere/modeller.
# ...
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Gyldig i 30 dage
Dette er temmelig enkelt, vi bruger en tidsstempler, som er et grundlæggende kryptografiske værktøj, til at skabe et token, der udløber efter en bestemt tidsperiode, og vi bruger også en anden funktion til at kontrollere, om den er gyldig. Vi bruger disse tokens to gange, en gang til at verificere e -mailen og en gang til et afmeldingslink. Nu hvor vi har disse, er den sidste af det arbejde, vi skal gøre, i visningerne. Inden for brugere/visninger. Py, lad os tilføje visninger for at verificere e -mail -adressen og til at afmelde dig.

nano users/views.py
Tilføj først følgende import. Jeg kastede et par ekstra, så vi behøver ikke at importere flere genstande igen senere.
from .email import send_verification_email # Sørg for at importere bekræftelsesfunktionen til verifikations e -mail
Du har muligvis allerede nogle af disse import, men det skader ikke at gentage dem. Du bliver nødt til at importere bekræftelsesfunktionen for verifikations -e -mail såvel som Account_Activation_Token fra Brugere.Tokens, blandt andre import. Tilføj nu i bunden af ​​filen følgende kode:
        # Afmeld dem
    # Ellers omdirigere til login -siden
# SendWelcomeEmail (anmodning, bruger)
Dette er en masse kode. Lad os nedbryde det. Den første funktion, rene og enkle, afmelder brugeren fra mailinglisten. Den anden funktion aktiverer deres e -mail, og du vil bemærke, at jeg tilføjede en kommenteret funktion, SendWelcomeEmail. Du er velkommen til at bruge en e -mail -skabelon og funktionsdefinition for at sende en velkomst -e -mail, jeg har bare ikke endnu. Den sidste funktion, jeg kastede ind, er vigtig, fordi aktivering -e -mails udløber. Derfor bliver vi nødt til at sende aktiverings -e -mailen noget af tiden. Vi kan bruge en grundlæggende formular til dette og ringe til funktionen for at sende verifikations -e -mailen. Før vi gør dette, lad os sørge for, at det bliver sendt i første omgang ved at tilføje et funktionsopkald til registervisningen. Tilføj denne linje lige før omdirigeringen i registervisningen, DEF Register, i brugere/visninger.py.

nano users/views.py
# ... (efter) def -register (anmodning):
# ... (før) Omdirigering (
Du behøver ikke at tilføje de første og sidste linjer i dette kodestykket, bare sørg for, at registervisningen sender verifikations -e -mailen til brugeren. Det skal se sådan ud:
# ... import
            send_verification_email(user) # Sørg for at tilføje denne linje!
Nu skal vi tilføje en formular for at sende aktiverings -e -mailen igen. Tilføj følgende formular i brugere/formular.
# ... (import)
Vi har også brug for en skabelon, der svarer til denne formular til e -mail -aktivering. Lad os tilføje denne skabelon i. Rediger filen:

nano users/templates/users/resend_activation.html
Tilføj derefter følgende kode til filen.

{% extends 'base.html' %}
{% block content %}
{% load crispy_forms_tags %}
        <form method="POST">
            {% csrf_token %}
            <fieldset class="form-group">
                <legend class="border-bottom mb-4">Resend activation email</legend>
                {{ form|crispy }}
            </fieldset>
            <div class="form-group">
                <button class="btn btn-outline-secondary" type="submit">Resend activation email</button>
            </div>
        </form>
{% endblock %}
Whew, det er meget! Nu, når vi implementerer koden til vores server, vil vi være i stand til at sende HTML -e -mail og aktivere brugerkonti med et klik i e -mailen. Vi ønsker måske også at sende en simpel velkomst -e -mail, så lad os se, hvordan du gør det. Tilbage i brugere/e -mail.py, tilføj følgende kode:

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)
Vi har også brug for en skabelon til at give alle disse oplysninger. På min hjemmeside ligner skabelonen nedenfor, men du er velkommen til at formatere den, som du vil.
Bemærk, at vi ikke har lukkekrop eller HTML -tags, fordi vi tilføjer disse, når vi tilføjer HTML -afmeldingslinket. Disse er vigtige, men vi ønsker ikke at definere dem to gange. Så hvad er det næste? Vi er nået langt. Vi skal virkelig være klar til at implementere webstedet til en server. Vi kan tilføje @Login_Required Decorator og gøre vores synspunkter sikre, tage brugertilmeldinger, sende kompatibel e -mail og cacheinformation, som er grundlaget for, hvad et websted skal gøre for at forblive relevant. Vi tilføjer et par flere nyttige funktioner og bygger derefter et grundlag for at implementere vores kode til en fjernserver, opsætte en mailserver, domænekonfiguration og filtre for at gøre vores websted sikkert og passende. Vi har også brug for en visning af adgangskode nulstilling, så lad os tilføje det virkelig hurtigt. Djangos indbyggede visning af nulstilling af adgangskode er brudt i nogle funktioner, men vi ser på, hvordan man skriver vores egen visning, e -mail -skabelon, formularer og URL -mønstre. Sådan ser udsigten ud, i brugere/visninger.py
# ... import
Denne formular er indbygget til Django, men vi har brug for en skabelon for at bekræfte nulstilling af adgangskoden, brugere/skabeloner/brugere/adgangskode_reset_confirm.html
Vi har også en skabelon til at sende en e -mail til nulstilling af adgangskode med en simpel form, i brugere/skabeloner/brugere/password_reset.html
Skabelonen til selve e -mailen er enkel, det er en grundlæggende HTML -fil, der gengiver et link til at nulstille adgangskoden, i brugere/skabeloner/brugere/password_reset_email.html. Django fortolker automatisk denne fil.
Vi har også brug for yderligere to skabeloner. Den første er at bekræfte, at e -mailen er sendt. Synspunkter for disse er allerede i Django, så vi er bare nødt til at adressere dem i urls.py. Denne skabelon er placeret på brugere/skabeloner/brugere/password_reset_done.html
Og til sidst for at bekræfte, at nulstilling af adgangskoden er komplet, brugere/skabeloner/brugere/adgangskode_reset_komplet.html
Nu har vi brug for URL -mønstre til disse visninger. Tilføj følgende URL -mønstre i brugere/urls.py:
    # ... Tidligere URL'er her
Fire skabeloner, det er meget! Men nu kan vi være sikre på at være i stand til at nulstille brugerens adgangskode, når som helst vi har brug for, alt sammen fra webbrowseren. Jeg forstår, at dette er en masse kode. Hvis det virker lidt over dit hoved, er det OK. Du vil forbedre dig, din forståelse vil blive bedre, og du bliver meget mere kompetent med kode meget snart. Hvis du er helt tabt, anbefaler jeg at vende tilbage til denne software senere efter at have arbejdet med en selvtempoet Lær at kode kursus online. Disse er normalt gratis at komme i gang og vil guide dig gennem alt hvad du har brug for for at få succes, når du kommer tilbage til dette projekt. Hvis du har lyst til at du er klar til at fortsætte, læse videre, næste, dækker vi implementering af din kode til en ekstern server og opretter en mailserver, samt automatisering Et par enkle kommandoer. Den sidste ting, vi skal gøre, før vi implementeres til en fjernserver, er at gøre vores websted lidt mere sikker. Du vilBemærk, at loginvisningen kun tager et brugernavn og adgangskode, og der er ingen multi -faktor -godkendelse eller en gangskode. Dette er en let løsning, og med den samme kode kan vi få vores websted til at sende tekstbeskeder og endda være lydhøre over for tekstbeskeder, der sendes til serveren. For at starte med vil vi gå tilbage til brugermodellerne og tilføje en tidsstempel -underskriver, der repræsenterer hvert login. Vi tilføjer også en unik, roterende identifikator til brugermodellen, der vil blive brugt til at tilføje ekstra sikkerhed til vores login. Redigering af brugermodeller, brugere/modeller.py, tilføj følgende
# Sørg for at importere UUID, TIMESTAMP Signer og URL Generator (omvendt)
    # Tilføj denne kode her
    # Og tilføj denne funktion
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Gyldig i 3 minutter
Sørg for, at dine brugere/modeller.py ser sådan ud, udover kommentarerne (kode på linjerne med #). At bryde dette ned, det er enkelt. Vi har et par import, en tidsstempler, der er et kryptografisk værktøj, der kan generere en sikker kode og verificere den for at sikre, at den er gyldig, kun blevet brugt én gang og ikke ældre end et vist antal sekunder. Vi bruger også en UUID, som er en unik identifikator, der identificerer vores bruger i underskrivelsen af ​​tokenet, og i URL'en, hvor token sendes til brugeren. Vi bruger denne grundlæggende kryptografi til at opbygge en to faktor -godkendelsesvisning. Før vi gør noget andet, lad os køre migrationerne, så vores brugermodeller opdateres. Kør følgende kommandoer for at lave og afslutte migrationerne i biblioteket med administration.py.

source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Dette er vigtigt, for hver gang vi foretager ændringer i modellerne, er vi nødt til at oprette tabellerne og opdatere databasen med standardindstillinger, før vi faktisk kan bruge modellerne. Lad os derefter improvisere vores loginvisning for at omdirigere til en sekundær godkendelsesvisning. Fjern loginfunktionen i brugere/visninger.
# ... import
        if user and user.profile.can_login < timezone.now(): # Bemærk, at vi nu kontrollerer, om brugeren kan logge ind
            # Fjern funktionen Auth_login, der var her
                return redirect(user.profile.create_auth_url()) # Bemærk, vi omdirigerer til en ny URL her
            else: # Hvis brugeren ikke bruger multifaktor-godkendelse, skal du bare logge dem ind.
        else: # Hvis login ikke lykkedes,
            user = User.objects.filter(username=username).first() # Dette er den del, hvor vi opdaterer brugerprofilen
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Så de kan ikke logge ind igen i et par sekunder
Så dette er temmelig enkelt, vi har nu en måde at omdirigere til den to faktorautentificeringsvisning, når vi opretter den. Vi har også et tilbagefald, hvis brugeren ikke har tilføjet et telefonnummer. Vi tilføjer en grundlæggende visning for at tilføje et telefonnummer snart og logge ind med en sms snart. Først har vi brug for en nem måde at sende en sms fra vores kode. For at gøre dette kan vi vælge mellem et antal API'er, men den nemmeste efter min mening er Twilio. De tilbyder også gode priser til mindre projekter såvel som bulkrabatter. Opret en konto på Twilio.com, udfyld nogle detaljer om dit projekt, køb et telefonnummer og kopier dine API -nøgler til dine indstillinger.py. Tilføj derefter denne kode under en ny fil, brugere/sms.py.

nano users/sms.py
# Importer alle de nødvendige pakker
# Denne kode sender teksten med Twilio
# En hjælperfunktion for at få et nummer med så mange cifre
# Send teksten for at bekræfte brugeren
# Send en bruger enhver tekst med denne funktion
# Valider koden med denne funktion
# Validerer tiden
Sørg for at ændre dine indstillinger korrekt og tilføje disse linjer med dine nøgler:
# Sørg for at kopiere disse fra dit Twilio Dashboard
AUTH_VALID_MINUTES = 3 # Antallet af minutter, som TFA -siden er aktivt, når den er instantieret
Først har vi brug for formularer til vores to faktorgodkendelsesvisninger. Redigering af brugere/formular. Py, tilføj følgende kode.
# ... import
# En formular til indtastning af vores telefonnummer
# En formular til autentificering
Lad os derefter oprette visningerne i brugere/visninger.py
# ... import
Vi har også brug for skabeloner til begge disse synspunkter. Lad os tilføje MFA -skabelonen først.

nano users/templates/users/mfa.html
Føj denne HTML -kode til skabelonen
Dette er temmelig selvforklarende. Formularen sender enten en kode eller en tom kode, og du vil bemærke i visningen, at vi sender koden, hvis vi modtager en tom kode. Så har vi bare to indsendelsesknapper, og på denne måde kan vi sende koden med begge knap. Dernæst tilføjer vi en enkel formular til at tilføje et telefonnummer.

nano users/templates/users/mfa_onboarding.html
Tilføj følgende HTML:
Denne formular er meget enklere, den gengiver bare den telefonnummer, vi oprettede, og lader brugeren tilføje et telefonnummer. Dette ser rigtig godt ud! Så længe alt er indstillet korrekt, skal vi være i stand til at sende meddelelser og logge brugeren ind med deres telefonnummer, så snart vi tilføjer URL -mønstre. Den sidste ting, vi har brug for at konfigurere, er en profilvisning, så vi kan sørge for, at brugeren kan ændre deres telefonnummer uden “Stop” for at fravælge fremtidige tekstbeskeder. Lad os tilføje en profilvisning til brugerne/visningen.py. Denne visning opdaterer brugerens bio, e -mail, brugernavn og telefonnummer samt giver os mulighed for at aktivere multi -faktor -godkendelse. Først har vi brug for yderligere to former i brugere/form.
# ... import
Dernæst kan vi oprette en visning for at bruge begge disse former. Rediger brugere/visninger.py og tilføj visningen.
# Tilføj disse import
Vi har også brug for en skabelon til denne visning.

nano users/templates/users/profile.html
Du vil bemærke, at dette er en forholdsvis enkel form, men har noget JavaScript i det, der automatisk poster indholdet af formularen, når de opdateres. Dette er nyttigt at have, så du er i stand til at foretage redigeringer uden at skulle presse indsend hver gang. Dernæst har vi brug for webadresser, der repræsenterer alle disse visninger i brugerens URL -patters. Rediger brugere/urls.py og tilføj denne kode:
# … Tidligere kode, import
# … URL -mønstre, vi tidligere har indtastet, tilføj de næste tre linjer
Nu er det et godt tidspunkt at teste vores projekt. Men først, lad os køre en anden sikkerhedskopi.

backup
Og kør serveren. Inden vi implementerer til en Linux -server, er det en god ide at muliggøre to faktorautentisering på kontoen. Vi gør dette til vores profil -URL,/brugere/profil/, og markeret feltet for at aktivere godkendelse efter indtastning af vores telefonnummer og derefter indsende formularen.

python manage.py runserver localhost:8000
Besøg websiden ved at gå til din webbrowser, jeg bruger Google Chrome i dette eksempel og indtaster url https: // localhost: 8000/konti/profil/ Du vil være i stand til at logge ind om nødvendigt og aktivere to faktorgodkendelse. Dette projekt har brug for en server til at køre på, så det virkelig kan sende mail. Men først har vi brug for en måde at se fejl på. Du vil bemærke, at hvis du kører serveren i Debug -tilstand, med indstillinger.debug lig med sandt, viser serveren fejl automatisk. For at vise fejl uden at bruge Debug -tilstand, som er utrygt på en produktionsserver, skal vi tilføje en visning til det. De vigtigste fejl, vi har brug for at kunne håndtere, er: Fejl 500 - Et problem med vores kode Fejl 404 - En side, der ikke blev fundet (brudt URL) Fejl 403 - En tilladelse nægtet fejl Lad os tilføje en ny app til at håndtere disse fejl, kaldet fejl.

python manage.py startapp errors
Føj dette til indstillingerne.py, som vi gjorde før, i indstillingen Installer_Apps, og start med at tilføje henvisninger til nogle visninger i app/urls.py, hvor app er navnet på dit Django -projekt.

handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Dette er alt, hvad vi har brug for udover fejlvisninger, skabeloner og en lille smule middleware. Lad os definere dem som så:
# Opret dine synspunkter her.
Lad os derefter definere middleware til at håndtere disse fejl. Vi vil gøre dette ved først at tilføje til Middleware_Classes i indstillinger.py, med navnet på vores middleware.
    # ... Tidligere middleware
Lad os derefter tilføje middleware.

from threading import local
import traceback
from django.utils.deprecation import MiddlewareMixin

_error = local()

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

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

def set_current_exception(exception):
    try:
        _error.value = exception
    except AttributeError:
        print('Attribute error setting exception.')
Vi tilføjer en funktion for at få den aktuelle undtagelse ved at bruge en trådlokal, som hjælper os med at spore eventuelle fejl i vores kode. Med hensyn til skabeloner har vi kun brug for en, fordi vi dynamisk definerer titlen i visningen. Skabelonen er bare nødt til at gengive titlen og "spor", vores fejl traceback fra konteksten.

nano errors/templates/errors/error.html
Dette er vores enkleste skabelon endnu, men det er hvor let det er at se fejlene i vores projekt. Lad os derefter deaktivere debug i indstillinger.

nano app/settings.py
Find denne linje, hvor den er indstillet til sand, og skift den til falsk

DEBUG = False
Gå videre og sikkerhedskopier appen nu. Vi er klar til at implementere til en fjerntliggende Linux -server og fortsætter med at tilføje funktioner derfra.

sudo backup
Inden vi poster denne kode på en server, skal vi overveje, at der kan være nogle problemer med koden. Afhængig af sagen, vil websteder, der accepterer oplysninger, der er lagt ud til dem, have problemer med, at spam bliver sendt og vanskeligheder med at fjerne spam. Dette skulle ikke ske med det samme, men hvis det sker, vil vi senere undersøge, hvordan man automatisk modererer spam på webstedet og gør det sværere for robotter at få adgang til webstedet sammen med, hvordan man deaktiverer brugerkonti og verificerer en brugers identitet med En scanning af deres ID eller en biometrisk scanning, som et fingeraftryk eller ansigtsgenkendelse. Ser man på det flerfaktorautentificeringseksempel, vi undersøgte, i produktion, kan tingene være forskellige. Bemærk, hvordan vi er begrænsende login og udløber tokens. Hvis robotter får adgang til et websted, kan to faktorgodkendelse være vanskeligere, da de kan indtaste koder på samme tid, som brugeren er. For at bekæmpe dette, lad os bruge en model i brugermodellerne og erklære, hvordan vi interagerer med webstedet, når vi erAutentificering ved hjælp af multi faktor -godkendelse med et telefonnummer. Vi tilføjer også en mulighed for at autentificere med e -mail. Start med at redigere brugermodellerne med

nano users/models.py
Dette er, hvordan den model, vi tilføjer, skal se ud. Vi har ikke brug for nogen metoder, bare variabler til at gemme et ID, brugeren, tidsstemplet, udløb, længde og forsøg mod enhver multi -faktor -godkendelse (en kode som 123456 sendt til en telefon eller e -mail).
# Et grundlæggende token, der blev brugt til at logge på webstedet
Lad os også tilføje et privilegium til vores bruger, og vi vil indstille det manuelt i øjeblikket, før vi til sidst migrerer til at få privilegerede brugere automatisk. I brugermodellerne skal du tilføje denne linje i profilen:

    vendor = models.BooleanField(default=False)
Som med eventuelle ændringer i databasen, er vi nødt til at lave migrationer og migrere databasen, hver gang vi redigerer en modeller.py -fil i Django. Husk at gøre dette bruger vi først kilde (hvis det ikke allerede er blevet brugt, siden terminalen var åben) og derefter python management.py for at gøre migrationerne og migrere.
cd project-directory-you-named # (hvis nødvendigt)
For øjeblikket kan du indrømme alle konti, du har oprettet som leverandører ved hjælp af skallen.

python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Lad os nu udvikle vores multifaktor -godkendelsesvisning for at bruge dette token. Først er vi nødt til at ændre vores MFA Helper Utilities. Brug af nano,

nano users/mfa.py

from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken

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

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

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

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

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

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

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result
# Autentificer brugeren ved hjælp af deres e -mail eller telefonnummer
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filtrer tokenet efter den værdi, der er sendt i URL'en (en UUID)
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Hvis denne session ikke er oprettet, skal du oprette den
    user = User.objects.filter(id=token.user.id).first() # Få brugeren fra token
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Hvis de allerede er godkendt, skal du logge dem ind
    if not user: raise PermissionDenied() # Benægte, hvis der ikke blev fundet nogen bruger
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Kontroller autoren token
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Log ind brugeren, hvis de ikke allerede er logget ind
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Indstil udløbet af deres multifaktor -godkendelse
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Omdirigere brugeren til næste side
    if not user.profile.mfa_enabled: # Kontroller, om MFA er aktiveret
        if not check_verification_time(user, token): # Kontroller tiden
            user.profile.mfa_enabled = False # Ryd telefonnummeret
            user.profile.enable_two_factor_authentication = True # Aktivér MFA
            user.profile.phone_number = '+1' # Deaktiver telefonnummeret
            user.profile.save() # Gem profilen
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Log brugeren ind, hvis deres MFA ikke er aktiveret
    if request.method == 'POST' and not fraud_detect(request, True): # Hvis anmodningen er en anmodning om indlæg
        form = TfaForm(request.POST) # Instant formularen
        code = str(form.data.get('code', None)) # Få koden
        if code and code != '' and code != None: # Sørg for, at det ikke er tomt
            token_validated = user.profile.check_auth_token(usertoken) # Kontroller autoren token
            is_verified = check_verification_code(user, token, code) # Kontroller koden
            if token_validated: # Hvis alt
                if is_verified: # Er i orden
                    user.profile.mfa_enabled = True # Aktivér MFA (hvis ikke allerede aktiveret)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Log ind brugeren
                    for key, value in request.GET.items(): # Byg en forespørgselsstring til den næste parameter (hvis nogen)
                        return HttpResponseRedirect(next) # Omdirigere
            elif not token_validated: # Hvis tokenet var ugyldigt
            if p.mfa_attempts > 3: # Hvis der var for mange forsøg
            if form.data.get('send_email', False): # Send e -mailen (eller teksten)
    # Gengiv formularen (til få anmodninger)
Når vi tilføjer denne kode, skal du sørge for at importere funktionen til at sende en e -mail. Øverst på filen tilføjer brugeren (med anden import)

from .mfa import send_verification_email as send_mfa_verification_email
Nu er vi nødt til at skrive denne funktion, før noget af dette fungerer. Det skal udvide vores Send -e -mail -funktion og blot sende en e -mail til brugeren med verifikationskoden.

nano users/mfa.py

def send_verification_email(user, token):
    length = user.profile.verification_code_length
    code = random.randint(get_num_length(1, length), get_num_length(9, length));
    token.token = code
    token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
    token.save()
    send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
Så alt dette fungerer godt, nu har vi et multi -faktor -godkendelsessystem, der afhænger af et telefonnummer eller e -mail til at logge ind. Men vi har også brug for en måde at fjerne eller i det mindste skjule brugere, der ikke samarbejder med vores betingelser. Dette kan være spammere, robotter eller enhver, der ikke betyder godt for vores arbejde. Se på en visning, jeg har for at overvåge brugere på min hjemmeside:
# import
from .tests import is_superuser_or_vendor # Vi bliver nødt til at oprette denne test
    # Få liste over brugere
    return render(request, 'users/users.html', { # Returner brugere i en skabelon
Bemærk, at denne kode bruger en test, vi bliver nødt til at erklære denne test i en tests.py -fil og importere den. Redigering af brugere/tests.Py, lad os oprette testen.

def is_superuser_or_vendor(user):
    return user.profile.vendor or user.is_superuser
Dette er i forbindelse med brugerne/brugerne.html -skabelonen, der ligner sådan:
Bemærk, at skabelonen indeholder en anden skabelon, brugere/_user.html. Når du bruger en skabelon, der har en undertemplate og ikke bruger udvidelser, er det en god ide at tilføje en understregning (_) før navnet på filen, der skal udvides, for at skelne skabeloner. Bemærk, at dette er en masse Jinja, du har muligvis ikke alle disse variabler defineret. Men sådan ser min kode ud.
      <small># {{user.id}} </small>
Vi har også brug for en anden undertemplate, Toggle_active.html. Denne skabelon skal være en form, der giver os mulighed for at skifte, om en bruger er aktiv.
Vi bliver også nødt til at tilføje en visning for at skifte brugeraktivitet og passende URL -mønstre. Mens vi er ved det, lad os tilføje en visning for at slette en bruger, hvis vi har brug for det.
# Import
    success_url = '/' # Omdirigering af succes -URL
    def test_func(self): # Test, hvis brugeren er superbruger og har tilladelse til at slette
Selvom dette er praktisk, når det er nødvendigt, skal sletning af en bruger ikke være nødvendig for det meste af tiden, kan vi bare skifte synligheden af ​​brugere, der besøger webstedet, hvis vi har brug for at afvise dem. De URL -mønstre, vi tilføjede, ser sådan ud. Med Nano, rediger brugere/urls.py og tilføj disse linjer:

nano users/urls.py
Linjerne skal gå på listen over stier i brugervisningen, inden afslutningen “]”, men efter begyndelsen “[”.
# ...
# ...
Sørg nu for at tage backup af webstedet, så du kan downloade det på webserveren, vi fortsætter med at arbejde på. Fra kommandolinjen,

sudo backup
Nu er vores side sikkerhedskopieret. Så nu har vi et par mere nyttige funktioner. Men hvad med det store billede her? Denne kode er stadig ikke tilgængelig fra internettet, vi har endnu ingen mailserver, og vi er nødt til at udvide vores app til at omfatte omfattende verifikationsproces såvel som glatte layouts for at hjælpe os med . Vi kommer til alt dette. Den vigtigste ting for nu vil bare være at få denne kode online, som vi kan gøre med kun et par linjer med bash på en Ubuntu -server. Du bliver dog nødt til at leje en server til dette, medmindre du har en server derhjemme og et forretningsinternet -abonnement, der giver dig mulighed for at åbne porte. Jeg kører personligt min hjemmeside på en HP Z440, der er installeret i min lejlighed, men det er normalt meget billigere for grundlæggende behov for at leje en virtuel privat server (VPS). Husk, at den kode, vi kører nu, er relativt tynd, den skal opretholdes og forbedres, før vi erKlar til at bruge det, vi har til at opbygge et produkt. Sørg for at være forsigtig med, hvad du gør med internettet, sørg for, at hvis du implementerer dette websted offentligt på nettet på en Linux -server, har du en plan for at blokere uønskede interaktioner med dit websted. Dette vil sandsynligvis ikke være et problem i starten, men vi vil undersøge en række løsninger til at bekæmpe dette, herunder maskinlæring, kunstig intelligens og computervision. Når det bliver et problem, skal du se yderligere på denne tekst for en løsning. Med hensyn til leje af en VPS er der mange steder, du kan gå. Google Cloud har VPS -servere, Ionos, Kamatera, Amazon AWS og flere udbydere tilbyder cloud -serverløsninger, der passer til vores behov. Du skal klikke gennem deres formularer og vælge en plan for at komme i gang. Du kan gå med en grundlæggende plan med enhver udbyder, men sørg for, at udbyderen giver dig mulighed for at åbne Port Mail Server -porte til at sende e -mail (dette skal være port 587 og port 25), nogle udbydere blokerer disse porte. Indtil videre har jeg haftEST -erfaring med Ionos og Kamatera, begge af dem tillader mig at sende ubegrænset e -mail, og deres prisfastsættelse er ret billig. Du opretter forbindelse til din nye server over en protokol kaldet SSH eller Secure Shell, som giver dig mulighed for at eksternt interface med serveren nøjagtigt som din personlige computer, fra din personlige computer. Når du opretter serveren, vil hostingudbyderen sandsynligvis bede dig om at tilføje en SSH -nøgle, eller de giver dig et brugernavn og adgangskode. SSH -nøglen er, hvordan du logger ind på serveren fra kommandolinjen for at redigere koden. Brug nedenstående ssh-tastegenmuligheder til at generere en SSH

ssh-keygen
Gem filen og overskriv den, hvis du har brug for det, er det godt at rotere dine SSH -nøgler, hvis du ikke allerede har gjort det. Nu kan du bruge følgende kommando til at se din SSH -nøgle. Du vil kopiere den til din eksterne server, så du kan bruge den til at autentificere.

cat ~/.ssh/id_rsa.pub
Hvis du ikke kunne se en SSH-nøgle, når du skriver denne kommando (en lang række cifre og bogstaver, der starter med "SSH-RSA AAA"), kan du prøve .) Følgende kode genererer en 4096 bit RSA SSH -nøgle.

ssh-keygen -t rsa -b 4096
Opret en VPS, der kører Ubuntu, men du planlægger at gøre dette. Når du har oprettet en VPS ved at klikke via formularerne på udbyders websted (kamatera.com, ionos.com eller lignende), vil du logge ind. For at gøre dette skal du bruge SSH -kommandoen med din IP -adresse (adressen Det ligner xx.xx.xx.xx). Du skal også være følsom over for standardbrugernavnet på den server, vi oprettede, for eksempel Ubuntu.

ssh ubuntu@XX.XX.XX.XX
Du bliver muligvis bedt om en adgangskode, hvis du bliver bedt om en adgangskode, skal du indtaste den i. Vi bruger ikke standard brugernavn, så lad os starte med at oprette en ny bruger og tilføje en SSH -nøgle til deres konto. Lad os starte med at tilføje en ny SSHD_CONFIG -fil, der fortæller serveren, hvordan du bruger SSH.

nano sshd_config
# Dette er SSHD Server-systemdækkende konfigurationsfil.  Se
# sshd_config (5) for mere information.
# Denne sshd blev samlet med sti =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/spil
# Strategien, der bruges til indstillinger i standard SSHD_CONFIG, der er sendt med
# OpenSSH er at specificere optioner med deres standardværdi, hvor
# muligt, men lad dem kommentere.  Ukommiterede indstillinger tilsidesætter
# Standardværdi.
# Port 22
# Adressefamilie enhver
# LytAddress 0.0.0.0
# LytAddress ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Cifre og indtastning
# Rekeylimit Standard ingen
# Logning
# Syslogfacility Auth
# Loglevel info
# Autentificering:
# LogingRacetime 2m
# Tilladrootlogin Prohibit-Password
# Strenge moder ja
# Maxauthies 6
# MaxSessions 10
# Forvent .ssh/autoriserede_keys2 vil blive ignoreret som standard i fremtiden.
# AuthorizedPrincipalSfile Ingen
# AutoriseretKeysCommand ingen
# AutoriseretKommanduser Ingen
# For at dette kan fungere, har du også brug for værtsnøgler i/etc/ssh/ssh_kendte_hosts
# Hostbasedauthentication nr
# Skift til ja, hvis du ikke stoler på ~/.ssh/kendte_hosts til
# Hostbasedauthentication
# Ignororuser kendtehosts nr
# Læs ikke brugerens ~/.rhosts og ~/.shosts -filer
# Ignorerhosts ja
# For at deaktivere tunnelede klare tekstadgangskoder skal du ændre sig til Nej her!
# Tilladtemptypasswords nr
# Skift til ja for at muliggøre adgangskoder til udfordringsresponser (pas på problemer med
# Nogle PAM -moduler og tråde)
# Kerberos -muligheder
# Kerberosauthentication nr
# Kerberosorlocalpasswd Ja
# KerberosticketCleanup Ja
# Kerberosgetafstoken nr
# GSSAPI -indstillinger
# GSSapiauthentication NO
# GSSAPICLEANUPCREDIENTIALS JA
# GSSAPISTRICTACCEPTORCHECK JA
# GSSAPIKEYEXCHANGE NR
# Indstil dette til 'ja' for at aktivere PAM -godkendelse, kontobehandling,
# og sessionbehandling. Hvis dette er aktiveret, vil PAM -godkendelse
# være tilladt gennem kbdinteractiveauthentication og
# Adgangskodeauthentication.  Afhængig af din PAM -konfiguration,
# PAM -godkendelse via KBDInterActiveAuthentication kan omgå
# Indstillingen af ​​"tilladelsesrootlogin uden passord".
# Hvis du bare vil have PAM -kontoen og sessionskontrollerne til at køre uden
# PAM -godkendelse, aktiver derefter dette, men indstil adgangskodeauthentication
# og kbdinteractiveauthentication til 'nej'.
# AllowAgentforwarding Ja
# Allowtcpforwarding ja
# Gatewayports nr
# X11DisplayOffset 10
# X11USELOCALHOST JA
# Permittty Ja
# Printlastlog Ja
# Tcpkeepalive ja
# Tilladelse til miljønummer nr
# Komprimering forsinket
# Clientaliveinterval 0
# ClientaliveCountMax 3
# Brugt nr
# Pidfile /run/ssshd.pid
# MaxStartups 10: 30: 100
# Permittunnel nr
# Chrootdirectory ingen
# VersionAddenDum Ingen
# Ingen standard bannersti
# Tillad klienten at videregive de lokale miljøvariabler
# Tilsidesættelsestandard for ingen delsystemer
# Eksempel på tilsidesættende indstillinger pr. Brugerbasis
# Match bruger Anoncvs
# X11FORWARDING NR
# Allowtcpforwarding nr
# Permittty nr
# Forcecommand CVS Server
Husk, Ctrl+X og Y for at gemme filen. Lad os derefter skrive et grundlæggende script kaldet Initialize (alt sammen i standardhjemkataloget for vores bruger).

nano initialize
Føj disse linjer til filen, udskiftningMed din SSH -nøgle fandt du ved hjælp af CAT. (.ssh/id_rsa.pub)
# !/bin/bash
For at lede dig gennem denne fil, lad os starte linje for linje. Den første linje fortæller kompilatoren, at dette er et bash -script. Derefter installerer vi afhængigheder, kopierer sshd_config til det rigtige bibliotek, genstarter SSH, genererer ssh -nøgler til rod, tilføjer brugeren 'team' (du kan vælge et navn, du kan lide til dette, brug addUser -kommandoen med deres navn og deaktiveret adgangskode til adgangskode til nu). Vi tilføjer også team til sudo -gruppen, genererer deres SSH -nøgle, tilføjer også vores nøgle til autoriserede nøgler og deres og udskriver deres nøgle. Denne nye bruger vil være, hvordan vi logger ind på webstedet. I en ny terminal skal du gå videre og åbne serveren igen.

ssh team@XX.XX.XX.XX
Du skal ikke have brug for en adgangskode denne gang, da du har en SSH -nøgle. Vi har også deaktiveret login med adgangskode for at holde webstedet mere sikkert. Nu starter denne server helt tomt uden oplysninger om den. Lad os starte med at klone vores projekt fra Git, så vi kan downloade og køre det på fjernmaskinen. På den eksterne server, der er tilsluttet over SSH, skal du først udskrive din SSH -nøgle:

cat ~/.ssh/id_rsa.pub
Indsæt derefter denne nøgle i Git -indstillingerne, som vi gjorde før for at konfigurere vores Git Repository. Vi kan nu klone vores projekt direkte til serveren. Sørg for, at du har sikkerhedskopieret projektet lokalt først, så det er på Git -serveren at downloade.

git clone git://github.com/you/yourproject.git
Perfektionere. Nu er alle filerne her. Vi kan se dem med LS

ls
Lad os nu begynde at konfigurere serveren. Kopier først dit projektkatalog til et enkelt, mindeværdigt navn, vi vil bruge til projektet.

cp -r yourproject whatyoucalledit
Hvor "Whatyoucalledit" er det nye navn på dit projekt. Dernæst bliver vi nødt til at opbygge et grundlæggende værktøj til at konfigurere serveren. Vi gemmer dette værktøj og bruger det i fremtiden. For at opbygge dette værktøj, lad os oprette en brugerbinær til at definere, hvordan vi redigerer et script. Brug af bash, rediger/usr/bin/ascript

sudo nano /usr/bin/ascript
Sørg for at bruge Sudo der, så du har tilladelser til at redigere filen. Tilføj disse linjer i filen:
# !/bin/bash
    echo "# !/bin/bash ">>/usr/bin/$ 1
Husk, at dette script tager et argument, scriptnavnet, som $ 1. Først kontrollerer den, om filen findes, eller på anden måde opretter den, tilføjer den første linje for at erklære scriptet er bash, ændrer dens tilladelser, redigerer den og tilføjer sit navn til /etc /ascripts, der lader os gemme navnene på manuskripterne vi skaber. Hvis filen allerede findes, skal du blot ændre tilladelser og redigere den. Gem filen, og derefter ændrer vi dens tilladelser. Så længe vi bruger dette script, behøver vi ikke gøre det igen.

sudo chmod a+x /usr/bin/ascript
Perfektionere. Lad os nu oprette et script kaldet Setup. For det første ikke at overvælde dig, men se på, hvordan mit installations script ser ud. Vi går igennem, hvordan dette script skal se ud i dit projekt, du har ikke brug for alt i mit script til at starte med.
# !/bin/bash
# sudo chmod A+X -scripts/brugersitup
# ./scripts/usersetup
# ssh-tasten
# Projektkatalog
# Logkommandoer
# Nano Config
# Git config
# Opdatere og installere
# Aktivér Clamav -antivirus
# Indstil værtsnavn
# Opsætning af postgres
# Setup -database -sikkerhedskopi
# Deaktiver iptables
# Installer bitdefender
# Opsætning Postfix
# Opret Dirs
# Opsætning VirtualEnv
# Få og opbyg afhængigheder
# Indstil firewall -regler
# Installer pypi -afhængigheder
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP Installer OpenCV-Python == 4.5.5.64
# PIP Installer OpenCV-Contrib-Python == 4.5.5.64
# Installer certbot
# Kør certbot
# Genindlæs mailserver
# Kopier certs
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem Privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Patch Venv
# Indstil brugerindstillinger
# Indstil tilladelser
# sudo chown -r team: brugere/var/run/
# sudo chown rod: rod/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: brugere db.sqlite3
# Kopier konfiguration og indstil tilladelser
# Opsætningsdatabase
# Injicer Pam Config og fjern defekt SSH -konfiguration
# sudo sed -i '' -e '$ d' /etc/pam.d/ssshd
# sudo sed -i '' -e '$ d' /etc /profil
# Kopier bin -scripts og indstil tilladelser
# Genindlæs og aktiver tjenester
# Aktivér Apache -moduler
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Deaktiver standardstedet
# Aktivér vores side
# Genindlæs dæmon og genstart Apache, Postfix og Opendkim
# Indstil tilladelser
# Swap -konfiguration
# Init billedtekstmotor
# Opsætning af git
# Vis IPv6 og Opendkim til domænekonfiguration
# Opsætningen afsluttet
Det er en masse opsætning! Kort sagt, denne kode logger kommandoer, konfigurerer nano og git, kopier over filer, downloads og installerer Ubuntu APT -pakker, Python -afhængigheder, konfigurerer postfix, konfigurerer PostgreSQL (databaseserveren) og indlæser databasen, konfigurerer UFW (en ukompliceret firewall), Deaktiverer iptables, downloader en antivirus, laver mapper, kloner Afhængigheder, installerer certifikater og indstiller serveren, installerer konfiguration, starter og aktiverer Sever, tildeler swap, indstiller tilladelser og udskriver IPv6 -adressen og Opendkim -nøglen. Temmelig enkel, men det ligner en masse kode. Vi har ikke brug for meget af dette, fordi vi ikke har afhængighederne, vi bruger ikke selleri, selleri eller Daphne, men vi installerer nogle af dem alligevel for at komme i gang. Bemærk, at denne kode har et domæne erklæret flere gange. Vi bliver også nødt til at købe et domænenavn (som er et lille årligt gebyr). Jeg anbefaler Squarespace til at købe et domæne, deres layout erintuitiv og let at bruge. Du kan købe ethvert domæne efter eget valg, men jeg bruger domænet femmebabe.com i dette eksempel. Når du har købt et domæne, skal du gå til Squarespace DNS -konfigurationspanelet og tilføje et A -rekord, der peger dit domæne til serveren med IP -adresse. Det skal se sådan ud: @ A xx.xx.xx.xx Med @ operatøren som vært, hvilket betyder, at alle underdomæner under dette domæne og roddomænet alle omdirigerer til serveren. Der er flere poster at erklære, men vi kan gå videre til disse, når vi er klar til at sende mail. Husk, at det kan tage flere dage, før du er i stand til at sende mail fra serveren. De DNS -poster, vi indstiller, tager tid at forplantes. Alligevel er den eneste post, vi har brug for at starte, en A -rekord. Så nu kan vi udfylde nedenstående script i henhold til vores projekt og køre det. Lad os starte med et mindre installationsskript for bare at installere det, vi har brug for for en grundlæggende fremgang. Vi bruger ikke så mange afhængigheder eller postgresql endnu, vi vil bareOp en grundlæggende HTTP -server og bekymre dig om at certificere den, når det er gjort. Husk, at for at få et HTTPS -certifikat og køre serveren sikkert, bliver vi nødt til at købe et domæne sammen med leje en server. Udskift nu "Team" i denne fil med navnet på din bruger, "Dir" med biblioteket til dit projekt, og levering din e -mail og domæne i <> tags. Inden vi kører denne kode, er vi nødt til at ændre indstillingerne til den firewall, som hostingudbyderen understøtter, hvis nogen. Normalt er dette i fanen 'Netværk' af din hostingudbyder, eller hvis du er selvhosting, er det i afsnittet 'Port Videresending' af din router. Du vil også oprette en statisk IP gennem din router med adressen på din servermaskine, hvis du bruger selvhosting. Du bliver nødt til at åbne følgende porte for at læse/skriveadgang. 22 (SSH) 25 (mail) 587 (mail) 110 (mailklient) 80 (http) 443
# !/bin/bash
# Logkommandoer
# Nano Config
# Git config
# Opdatere og installere
# Aktivér Clamav -antivirus
# Indstil værtsnavn
# Setup -database -sikkerhedskopi
# Deaktiver iptables
# Opsætning VirtualEnv
# Installer certbot
# Kør certbot
# Indstil brugerindstillinger
# Indstil tilladelser
# sudo chown -r team: brugere/var/run/
# sudo chown rod: rod/run/sudo/ts -r
# Genindlæs og aktiver tjenester
# Aktivér Apache -moduler
# Genindlæs dæmon og genstart Apache, Postfix og Opendkim
# Vis IPv6 og Opendkim til domænekonfiguration
Før du kører denne kode, skal du sørge for, at det domæne, du har købt, er tilsluttet serveren. For at gøre dette skal du åbne en terminal på din lokale maskine og køre denne kommando med dit domæne:
ping femmebabe.com # Indsæt dit domæne her, efter ping
Hvis alt ser godt ud, og serveren sender svar, er vi klar til at køre scriptet og installere pakker samt starte, aktivere og certificere vores Apache -server. Dette er ikke al den opsætning, der er nødvendig for at konfigurere Postfix, vi vil se på den opsætning mere senere. For nu skal du køre denne installationskode, og det skal tage et par minutter at installere og certificere din server. Sørg igen for at udskifte navn, e -mail og domænenavn i scriptet i henhold til det navn, du har købt. Nu hvor serveren er leveret, kan du gå til URL'en i enhver webbrowser og kontrollere for at sikre dig, at serveren kører HTTPS. Hvis det ikke er det, kan du prøve at vente et stykke tid på, at DNS -posterne skal indhente og derefter køre følgende kommando for at prøve certbot -certificering:

sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Så længe du har konfigureret alt korrekt, skal du være i stand til at få adgang til Apache's standardside bare for at vide, at din kode fungerer og viser en live webside. Lad os derefter redigere indstillingerne.PY for at ændre vores standardfejletilstand til produktion. Vi konfigurerer også domænet i indstillingerne såvel som interne IP'er.

nano yourproject/settings.py
I indstillingerne skal du ændre/tilføje disse linjer.
# Webstedskonfiguration
Nu skal vi konfigurere Apache2. Lad os redigere den konfigurationsfil, vi vil implementere med denne linje:

sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Denne konfigurationsfil skal have vores domænenavn i den og navnet på brugeren og projektet. Jeg bruger domænenavnet femmebabe.com, brugernavnetteamet og projektnavnet femmebabe.

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

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

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

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

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

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

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

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

	TimeOut 60000
	LimitRequestBody 0

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

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

	RewriteEngine on
	RewriteCond %{SERVER_NAME} =femmebabe.com
	RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>
Sørg for at udskifte navnet på projektet, mapper og domæne i dette eksempelkode, når du konfigurerer din server. Nu skal vi deaktivere standardwebstedet. Dette kan gøres ved hjælp af bash.

sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Dernæst kan vi aktivere standardwebstedet og genindlæse Apache2, også ved hjælp af bash. Husk at udskifte femmebabe med navnet på den fil, du erklærede, da du redigerede i/etc/Apache2/websteder-tilgængelige/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Gå tilbage til dit domæne i Navbar. Du skal se det websted, du konfigurerede i din webbrowser. Tillykke! Hvis du ikke kan se det, skal du muligvis foretage nogle ændringer. Gennemgå omhyggeligt indstillingerne i dit projekt, Apache -konfiguration, og sørg for, at du ikke har nogen fejl, og kør følgende kommandoer for at kontrollere projektet for fejl.

cd projectname
source venv/bin/activate
python manage.py check
Hvis du har fejl i dit Python -projekt, skal du spore dem, hvor de er, og fikse dem. Du kan muligvis ikke se alle dine fejl afhængigt af hvor de er, så hvis du har en fejl, der simpelthen siger, at "befolkning ikke er reentrant", rediger følgende fil i det virtuelle miljø, Registry.py, for at udsætte det fejl.

nano venv/lib/python3.12/site-packages/django/apps/registry.py
Rul til linje 83, hvor denne runtime -fejl hæves (hæv RuntimeError (“POPULATE () er ikke Reentrant”)), og tilføj en kommentar inden denne linje og derefter tilføje med den samme indrykkning, self.app_configs = {}. Dette ser sådan ud:
                # Forhindre Reentrant -opkald for at undgå at køre appconfig.ready ()
                # metoder to gange.
# hæve runtimeError ("POPULATE () er ikke Reentrant")
Du kan derefter kontrollere projektet igen og udsætte fejlen.

python manage.py check
Derefter kan du se fejlen og løse den. Når du har løst det, og koden kompilerer uden fejl, skal du sørge for at ændre filen tilbage, så den ser sådan ud:
                # Forhindre Reentrant -opkald for at undgå at køre appconfig.ready ()
                # metoder to gange.
# self.app_configs = {}
Forudsat at serveren er online, når vi foretager yderligere ændringer i den, er vi nødt til at bruge følgende kommando til at genindlæse serveren:

sudo systemctl reload apache2
Fantastisk! Men hvad med at sende mail? For at begynde at sende e -mail skal vi først opdatere domænekonfigurationen. Dette skal være i dit DNS -panel i Squarespace, eller hvilket domænenavn Registrator du valgte. Vi bliver også nødt til at installere og tilføje konfiguration og køre et par kommandoer. Lad os først få IPv6 -adressen på serveren. Vi åbner derefter din DNS og tilføjer posterne. Brug denne kommando: for at få serverens IPv6 -adresse: brug denne kommando:

ip -6 addr
Nu kan vi tilføje følgende poster til DNS -indstillingerne. Mine poster ser sådan ud. For dine poster skal du dog erstatte IP -adressen med din IP (ikke 75.147.182.214, det er min). Tilføj også dit domæne i stedet for femmebabe.com, såvel som din IPv6 -adresse, der findes med den forrige kommando (du kan ikke bruge min, Fe80 :: 725A: FFF: FE49: 3E02). Du skal ikke bekymre dig om Domainkey for nu, dette oprettes, når vi konfigurerer Postfix, mailserveren, med Opendkim, og udskriver nøglen. Vi konfigurerer dette sidst. @ EN 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 Standard._bimi Txt N/a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg _dmarc Txt N/a V = DMARC1; p = ingen Sendonly._DomainKey Txt N/aNu skal vi tilføje en vedvarende konfiguration til Postfix. Alt, hvad vi skal gøre, er at sikre, at vi udskifter domænenavnet, femmebabe.com, med det domænenavn, du bruger. Lad os se på alle konfigurationsfiler en efter en, og installere dem i et bibliotek kaldet config i vores projekt, til installation til OS.

nano config/etc_postfix_main.cf
Føj denne tekst til filen
# Se /usr/share/postfix/main.cf.dist for en kommenteret, mere komplet version
# Debian -specifik: Specificering af et filnavn vil forårsage det første
# linje af den fil, der skal bruges som navn.  Debian -standard
# er /etc /mailname.
# myorigin = /etc /mailName
# Ledning. Domain er MUAs job.
# Uproment den næste linje for at generere "forsinkede mail" -advarsler
# forsinkelse_warning_time = 4h
# Se http://www.postfix.org/compatibility_readme.html - standard til 3,6 på
# Friske installationer.
# TLS -parametre
# Milterkonfiguration
Næste konfiguration!

nano config/etc_postfix_master.cf
Tilføj disse linjer:
# 
# Postfix Master Process Configuration File.  For detaljer om formatet
# Af filen, se Master (5) Manuel side (kommando: "Man 5 Master" eller
# Online: http://www.postfix.org/master.5.html).
# 
# Glem ikke at udføre "Postfix Reload" efter redigering af denne fil.
# 
# ================================================ ========================
# Servicetype privat upriv chroot wakeup maxproc kommando + args
# (ja) (ja) (nej) (aldrig) (100)
# ================================================ ========================
# SMTP INET N - Y - 1 postskærm
# SMTPD PASS - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# Tlsproxy Unix - - Y - 0 TLSProxy
# Vælg en: Aktivér kun indsendelse for loopback -klienter eller for enhver klient.
# 127.0.0.1:Submission inet N - Y - - SMTPD
# -o syslog_name = postfix/indsendelse
# -o smtpd_tls_security_level = kryptering
# -o smtpd_sasl_auth_enable = ja
# -o smtpd_tls_auth_only = ja
# -o smtpd_reject_unlisted_recipient = nr
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restrictions = tilladelse_sasl_authenticeret, afvis
# -o milter_macro_daemon_name = oprindelse
# Vælg en: Aktivér SMTPS kun for loopback -klienter eller for enhver klient.
# 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 = nr
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restrictions = tilladelse_sasl_authenticeret, afvis
# -o milter_macro_daemon_name = oprindelse
# 628 inet n - y - - qmqpd
# QMGR UNIX N - N 300 1 OQMGR
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
# 
# ================================================ ==================
# Grænseflader til ikke-postfix-software. Sørg for at undersøge manualen
# Sider på ikke-postfix-softwaren for at finde ud af, hvilke muligheder den ønsker.
# 
# Mange af følgende tjenester bruger levering af postfix -røret (8)
# agent.  Se røret (8) Kvindens side for information om $ {modtager}
# og andre meddelelseskonvolutindstillinger.
# ================================================ ==================
# 
# Maildrop. Se filen Postfix MailDrop_Readme for detaljer.
# Angiv også i Main.cf: MailDrop_Destination_Recipient_Limit = 1
# 
# 
# ================================================ ==================
# 
# Nylige Cyrus -versioner kan bruge den eksisterende "LMTP" Master.CF -post.
# 
# Specificer i cyrus.conf:
# lmtp cmd = "lmtpd -a" lyt = "localhost: lmtp" proto = tcp4
# 
# Specificer i main.cf en eller flere af følgende:
# Mailbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
# 
# ================================================ ==================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Angiv også i main.cf: cyrus_destination_recipient_limit = 1
# 
# Cyrus Unix - N N - - Rør
# flag = DRX user = cyrus argv =/cyrus/bin/levering -e -r $ {afsender} -m $ {udvidelse} $ {bruger}
# 
# ================================================ ==================
# Gamle eksempel på levering via Cyrus.
# 
# Old -Cyrus Unix - N N - - Rør
# flag = r user = cyrus argv =/cyrus/bin/levering -e -m $ {udvidelse} $ {bruger}
# 
# ================================================ ==================
# 
# Se filen Postfix UUCP_README for konfigurationsdetaljer.
# 
# 
# Andre eksterne leveringsmetoder.
# 
Og Opendkim -konfigurationen. Opendkim identificerer e -mail -servere med domænetaster for at gøre dem mere sikre. Uden det er mail ikke underskrevet og kommer muligvis ikke til en indbakke.

nano config/etc_default_opendkim
Tilføj disse linjer:
# Bemærk: Dette er en ældre konfigurationsfil. Det bruges ikke af opendkim
# Systemd Service. Brug venligst de tilsvarende konfigurationsparametre i
# /etc/opendkim.conf i stedet.
# 
# Tidligere ville man redigere standardindstillingerne her og derefter udføre
# /lib/opendkim/opendkim.service.generate for at generere systemd -tilsidesættelse af filer på
# /etc/systemd/system/opendkim.service.d/override.conf og
# /etc/tmpfiles.d/opendkim.conf. Selvom dette stadig er muligt, er det nu
# anbefales at justere indstillingerne direkte i /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Skift til/var/spole/postfix/run/opendkim til at bruge en Unix -stik med
# postfix i en chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Ukommentere for at specificere en alternativ stikkontakt
# Bemærk, at indstilling af dette vil tilsidesætte enhver stikkontakt i opendkim.conf
# misligholdelse:
# Lyt på alle grænseflader på port 54321:
# Socket = inet: 54321
# Lyt på loopback på port 12345:
# Socket = inet: 12345@localhost
# Lyt den 192.0.2.1 på port 12345:
# Socket = inet: 12345@192.0.2.1

nano config/etc_dovecot_conf.d_10-master.conf
Tilføj disse linjer:
# standard_process_limit = 100
# Standard_client_limit = 1000
# Standard VSZ (virtuel hukommelsesstørrelse) grænse for serviceprocesser. Dette er hovedsageligt
# beregnet til at fange og dræbe processer, der lækker hukommelse, før de spiser op
# alt.
# Standard_vsz_limit = 256m
# Loginbruger bruges internt af loginprocesser. Dette er den mest ikke -betroede
# Bruger i Dovecot System. Det skulle overhovedet ikke have adgang til noget.
# Standard_login_user = Davenull
# Intern bruger bruges af uprivilegerede processer. Det skal være adskilt fra
# Loginbruger, så login -processer ikke kan forstyrre andre processer.
# standard_internal_user = dovecot
    # Port = 143
    # Port = 993
    # SSL = ja
  # Antal forbindelser, der skal håndteres, inden du starter en ny proces. Typisk
  # De eneste nyttige værdier er 0 (ubegrænset) eller 1. 1 er mere sikker, men 0
  # er hurtigere. <doc/wiki/loginprocess.txt>
  # service_count = 1
  # Antal processer, der altid fortsætter med at vente på flere forbindelser.
  # Process_min_avail = 0
  # Hvis du indstiller service_count = 0, er du sandsynligvis nødt til at vokse dette.
  # vsz_limit = $ standard_vsz_limit
    # Port = 110
    # Port = 995
    # SSL = ja
    # Port = 587
  # Opret INET -lytter kun, hvis du ikke kan bruge ovenstående UNIX -stikkontakt
  # inet_listener lmtp {
    # Undgå at gøre LMTP synlig for hele internettet
    # adresse =
    # port =
  # }
  # De fleste af hukommelsen går til mmap () ing -filer. Du skal muligvis øge dette
  # Begræns, hvis du har enorme postkasser.
  # vsz_limit = $ standard_vsz_limit
  # Maks. Antal IMAP -processer (forbindelser)
  # Process_limit = 1024
  # Maks. Antal POP3 -processer (forbindelser)
  # Process_limit = 1024
  # Maks. Antal SMTP -indsendelsesprocesser (forbindelser)
  # Process_limit = 1024
  # auth_socket_path peger som standard på denne UserDB -stikkontakt. Det er typisk
  # Brugt af dovecot-lda, doveadm, muligvis IMAP-proces osv. Brugere, der har
  # Fuld tilladelser til denne stikkontakt er i stand til at få en liste over alle brugernavne og
  # Få resultaterne af alles UserDB -opslag.
  # 
  # Standard 0666 -tilstand giver enhver mulighed for at oprette forbindelse til stikket, men
  # userdb -opslag vil kun lykkes, hvis userdb returnerer et "uid" felt, der
  # Matcher opkaldsprocessens UID. Også hvis opkalds UID eller GID matcher
  # Socket's UID eller GID, opslagen lykkes. Alt andet forårsager en fiasko.
  # 
  # For at give den, der ringer til fulde tilladelser til at slå alle brugere op, skal du indstille tilstanden til
  # noget andet end 0666 og dovecot lader kernen håndhæve
  # Tilladelser (f.eks. 0777 tillader alle fulde tilladelser).
  # Author -arbejdsprocessen køres som rod som standard, så den kan få adgang til
  # /etc/skygge. Hvis dette ikke er nødvendigt, skal brugeren ændres til
  # $ standard_internal_user.
  # bruger = rod
  # Hvis dict proxy bruges, skal mail -processer have adgang til dens stikkontakt.
  # For eksempel: tilstand = 0660, gruppe = vmail og global mail_access_groups = vmail
    # Mode = 0600
    # bruger =
    # gruppe =
Sørg igen for at udskifte domænet i alle disse filer, femmebabe.com, med det domæne, du valgte. Rediger den næste fil, Dovecot's Config,

nano config/etc_dovecot_dovecot
Og tilføj disse linjer
## Dovecot -konfigurationsfil
# Hvis du har travlt, kan du se http://wiki2.dovecot.org/quickconfiguration
# "Doveconf -N" -kommando giver en ren output af de ændrede indstillinger. Brug det
# I stedet for at kopiere og indsætte filer, når du offentliggør til Dovecot -mailinglisten.
# '# 'Karakter og alt efter det er behandlet som kommentarer. Ekstra rum
# og faner ignoreres. Hvis du vil bruge en af ​​disse eksplicit, skal du sætte
# value inside quotes, eg.: key = "# char og bagefter whitespace "
# De fleste (men ikke alle) indstillinger kan tilsidesættes af forskellige protokoller og/eller
# Kilde/destination IPS ved at placere indstillingerne i sektioner, for eksempel:
# Protocol IMAP {}, lokal 127.0.0.1 {}, fjernbetjening 10.0.0.0/8 {}
# Standardværdier vises for hver indstilling, det kræves ikke at fjerne
# dem. Dette er dog undtagelser fra dette: ingen sektioner (f.eks. Navneområde {})
# Eller pluginindstillinger tilføjes som standard, de er kun anført som eksempler.
# Stier er også kun eksempler, hvor de reelle standarder er baseret på konfiguration
# muligheder. De stier, der er anført her, er til konfiguration -Prefix =/usr
# --SysConfDir =/etc--LocalStatedir =/var
# Aktivér installerede protokoller
# En komma -adskilt liste over IP'er eller værter, hvor man skal lytte til forbindelser.
# "*" lytter i alle IPv4 -grænseflader, "::" lytter i alle IPv6 -grænseflader.
# Hvis du vil specificere ikke-default-porte eller noget mere komplekst,
# Rediger conf.d/master.conf.
# Lyt = *, ::
# Basiskatalog, hvor man skal gemme runtime -data.
# base_dir =/var/run/dovecot/
# Navn på denne instans. I multi-instans-opsætning Doveadm og andre kommandoer
# kan bruge -i <instance_name> til at vælge, hvilken forekomst der bruges (et alternativ
# til -c <config_path>). Forekomstnavnet tilføjes også til Dovecot -processer
# I PS -output.
# Instance_name = dovecot
# Hilsen besked til klienter.
# login_greeting = dovecot klar.
# Rum adskilt liste over betroede netværksområder. Forbindelser fra disse
# IPS har lov til at tilsidesætte deres IP -adresser og porte (til logning og
# til godkendelseskontrol). deaktiver_plaintext_auth ignoreres også for
# Disse netværk. Typisk vil du specificere dine IMAP -proxy -servere her.
# login_trusted_networks =
# Rum adskilt liste over loginadgangskontrolstik (f.eks. TCPWRAP)
# login_access_sockets =
# Med proxy_maybe = ja Hvis proxy destination matcher nogen af ​​disse IP'er, skal du ikke gøre
# Proxying. Dette er normalt ikke nødvendigt, men kan være nyttigt, hvis destinationen
# IP er f.eks. En belastningsbalancers IP.
# auth_proxy_self =
# Vis flere ordrette processtitler (i PS). Viser i øjeblikket brugernavn og
# IP -adresse. Nyttigt til at se, hvem der faktisk bruger IMAP -processerne
# (f.eks. Delt postkasser, eller hvis det samme UID bruges til flere konti).
# Verbose_proctitle = nr
# Skulle alle processer dræbes, når Dovecot -masterprocessen lukker ned.
# At indstille dette til "ingen" betyder, at dovecot kan opgraderes uden
# at tvinge eksisterende klientforbindelser til at lukke (selvom det også kunne være
# Et problem, hvis opgraderingen er f.eks. På grund af en sikkerhedsfix).
# shutdown_clients = ja
# Hvis du ikke er nul, skal du køre mail-kommandoer via disse mange forbindelser til DOVEADM-server,
# I stedet for at køre dem direkte i den samme proces.
# doveadm_worker_count = 0
# UNIX Socket eller vært: Port brugt til oprettelse til DoveAdm -server
# doveadm_socket_path = doveadm-server
# Rum adskilt liste over miljøvariabler, der er bevaret på Dovecot
# opstart og overført til alle sine børneprocesser. Du kan også give
# nøgle = værdi par for altid at indstille specifikke indstillinger.
# import_en miljø = tz
## 
## Indstillinger for ordbogsserver
## 
# Ordbog kan bruges til at gemme nøgle = værdi lister. Dette bruges af flere
# plugins. Ordbogen kan fås enten direkte eller skønt en
# Ordbogserver. Følgende Dict Block Maps ordbognavne til URIS
# Når serveren bruges. Disse kan derefter henvises til ved hjælp af URI'er i format
# "Proxy :: <navn>".
  # kvote = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# De fleste af den faktiske konfiguration bliver inkluderet nedenfor. Filnavne er
# Sorteret først efter deres ASCII -værdi og analyseret i den rækkefølge. 00-præfikser
# I filnavne er beregnet til at gøre det lettere at forstå bestillingen.
# En konfigurationsfil kan også forsøgte at blive inkluderet uden at give en fejl, hvis
# det er ikke fundet:
# Tillader Dovecot at lytte til alle inputforbindelser (IPv4 / IPv6)
Tilføj en adgangskode til Dovecot -brugeren:

nano config/etc_dovecot_passwd
Den første del af filen, før tyktarmen, er brugernavnet. Den sidste del, "YourPassword", angiver den adgangskode, du gerne vil give din mailserver.

team:{plain}yourpassword
Dernæst opendkim config

nano config/etc_opendkim.conf
Og tilføj disse linjer:
# Dette er en grundlæggende konfiguration til underskrift og verifikation. Det kan let være
# Tilpasset til en grundlæggende installation. Se opendkim.conf (5) og
# /usr/share/doc/opendkim/examples/opendkim.conf.sample for komplet
# Dokumentation af tilgængelige konfigurationsparametre.
# Logwhy nej
# Almindelige signerings- og verifikationsparametre. I Debian er "fra" header
# Oversegnet, fordi det ofte er identitetsnøglen, der bruges af omdømme systemer
# og dermed noget sikkerhedsfølsomme.
# Signering af domæne, vælger og nøgle (påkrævet). For eksempel skal du udføre signering
# For domæne "Eksempel.com" med vælger "2020" (2020._domainkey.example.com),
# Brug af den private nøgle, der er gemt i /etc/dkimkeys/example.private. Mere granulær
# Opsætningsmuligheder findes i /usr/share/doc/opendkim/readme.opendkim.
# Domæneeksempel.com
# Vælger 2020
# KeyFile /etc/Dkimkeys/Example.Private
# I Debian kører Opendkim som bruger "Opendkim". En umask på 007 er påkrævet, når
# Brug af en lokal stikkontakt med MTA'er, der får adgang til stikket som en ikke-privilegeret
# Bruger (for eksempel Postfix). Du skal muligvis tilføje brugeren "postfix" til gruppe
# "Opendkim" i dette tilfælde.
# Socket til MTA -forbindelsen (påkrævet). Hvis MTA er inde i et Chroot -fængsel,
# Det skal sikres, at stikket er tilgængeligt. I Debian løber Postfix ind
# En chroot i/var/spool/postfix, derfor skulle en Unix -stik være
# Konfigureret som vist på den sidste linje nedenfor.
# Socket Local: /run/Opendkim/opendkim.sock
# Socket Inet: 8891@localhost
# Socket Inet: 8891
# Værter, som de skal underskrives i stedet for at verificere, standard er 127.0.0.1. Se
# Betjeningssektion af Opendkim (8) for mere information.
# InternalHosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Tillidsankeret muliggør DNSSEC. I Debian leveres tillidsankerfilen
# Af pakken DNS-ROOT-DATA.
# Nameservers 127.0.0.1
# Kortdomæner fra adresser til nøgler, der bruges til at underskrive beskeder
# Et sæt interne værter, hvis mail skal underskrives

nano config/etc_default_opendkim
Og tilføj disse linjer
# Bemærk: Dette er en ældre konfigurationsfil. Det bruges ikke af opendkim
# Systemd Service. Brug venligst de tilsvarende konfigurationsparametre i
# /etc/opendkim.conf i stedet.
# 
# Tidligere ville man redigere standardindstillingerne her og derefter udføre
# /lib/opendkim/opendkim.service.generate for at generere systemd -tilsidesættelse af filer på
# /etc/systemd/system/opendkim.service.d/override.conf og
# /etc/tmpfiles.d/opendkim.conf. Selvom dette stadig er muligt, er det nu
# anbefales at justere indstillingerne direkte i /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Skift til/var/spole/postfix/run/opendkim til at bruge en Unix -stik med
# postfix i en chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Ukommentere for at specificere en alternativ stikkontakt
# Bemærk, at indstilling af dette vil tilsidesætte enhver stikkontakt i opendkim.conf
# misligholdelse:
# Lyt på alle grænseflader på port 54321:
# Socket = inet: 54321
# Lyt på loopback på port 12345:
# Socket = inet: 12345@localhost
# Lyt den 192.0.2.1 på port 12345:
# Socket = inet: 12345@192.0.2.1
Når vi er klar til at konfigurere vores Postfix -server, kører vi nedenstående kode med det relevante domænenavn indlejret. Start med at oprette et script

touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Nu, i Nano, teksteditoren, redigerer denne fil, så den inkluderer dit domænenavn i stedet for femmebabe.com.
# !/bin/bash
# Opsætning Postfix
Kør nu det færdige script for at konfigurere Postfix, Opendkim og Dovecot.

./scripts/postfixsetup
Når dette script er kørt, skal du kopiere den sidste linje, den udskriver, og indsætte den i din DNS -konfiguration som værdien for Sendonly._DomainKey. Dette er Opendkim -nøglen, der bruges til at identificere dit domæne, når du sender sikker mail. Fantastisk! Inden for et par dage skal du være i stand til at sende mail fra serveren, forudsat at alt er konfigureret korrekt. Hvis du bare konfigurerede DNS til din mailserver, skal det tage mindre end 72 timer, før posterne opdateres. Det er normalt meget hurtigere. Du kan kontrollere, om din server fungerer ved at bruge denne kommando, leveret din e -mail:

echo “test” | mail -s “Test Email” youremail@gmail.com
Hvis alt ser ud til at fungere korrekt, skal du være i stand til at sende e -mail med din server. Hvis det ikke fungerer, kan du prøve at se på logfilerne for at se, hvad fejlen kan være.

tail –lines 150 /var/log/mail.log
Dette vil tilbyde ordret information om mail, der sendes af serveren, og om den fungerer korrekt. Du skal også være i stand til at se e -mailen i din indbakke, hvis den ikke er der, skal du tjekke din spam -mappe. Du bliver også nødt til at konfigurere dine indstillinger i dine indstillinger. PY Så din e -mail -server kan tale med din Django -app, projektet. Tilføj eller udskift disse linjer i dine indstillinger
EMAIL_HOST_USER = 'team' # 'Love@mamasheen.com'
Bemærk, at vi bruger en konfigurationsfil til at få adgangskoden. Lad os indlæse denne fil i indstillingerne som så i starten af ​​filen.:
# Åbn og indlæs config
Lad os oprette denne fil og tilføje en hemmelig nøgle til den såvel som mailadgangskoden. For at generere en hemmelig nøgle skal du bruge denne kommando med den længde, du kan lide i slutningen:

openssl rand -base64 64
Kopier nu teksten, der åbner, der er genereret og redigering /etc/config.json

sudo nano /etc/config.json
Føj følgende linjer til din fil med den nøgle, der åbner, der er genereret som den hemmelige nøgle.

{
	"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
	"EMAIL_HOST_PASSWORD": "yourpassword"
}
JSON -format er enkelt og let at bruge, vi kan erklære andre nøgler, vi også vil bruge i vores projekt på denne måde, og hold dem adskilt fra vores projektkatalog, så andre brugere ikke kan skrive til dem, så de kan ikke læses Fra vores projektkatalog alene. Dette anbefales praksis for API -nøgler, som vi vil bruge mere end et par her. Du vil også tage sikkerhedskopi af dit projekt for at sikre dig, at alt er gemt, og at du kan gendanne dit arbejde senere, selvom du ikke længere ønsker at leje en server.

sudo backup
Prøv nu at sende en HTML -e -mail fra webserveren, forudsat at sende en fra kommandolinjen fungerer. Spørg din brugerinstans i skallen, og send en HTML -e -mail til den bruger via Django. Skift mit navn i koden, Charlotte, til dit brugernavn.

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()
Hvis den første kommando ikke fungerer, skal du sørge for at bruge

source venv/bin/activate
Forudsat at alt er konfigureret korrekt, får du nu en velkomst -e -mail i din postkasse sendt med din webapp. Godt job! Du er nået langt. Jeg ville tilføje, hvis du nogensinde kæmper med fejl overhovedet, mens du arbejder på et projekt som dette, tøv ikke med at søge efter svar og bede om hjælp. Google, blandt andre søgemaskiner, er gode ressourcer til at søge efter programmeringshjælp. Bare søg efter den fejl, du får, og du vil være i stand til at se, hvordan andre mennesker løser problemet. Du er også velkommen til at kontakte mig, dine undervisere (lærere, professorer, tutorer), eventuelle kammerater på Internettet, der er tilgængelige til programmeringshjælp, eller konsultere denne bog igen eller andre ressourcer for at finde løsninger på de problemer, du oplever. Jeg forstår, at dette ikke er let, men selvom du har læst i så langt og ikke skriver nogen kode, lærer du meget om at opbygge en webapp fra bunden. Klap dig selv på bagsiden, du laver en godjob. Tak fordi du tog dig tid til at læse denne tredje udgave Web Development Guide. I fremtidige udgaver vil jeg medtage flere af de vigtige eksempler, der diskuteres i begyndelsen af ​​dokumentet, og vi vil dykke meget dybere ind i verdenen af ​​software og hardwareudvikling. Hold øje med hvad der skal komme, og jeg ser frem til at lære dig, hvordan du bygger utrolig software. Vi ses i den næste






Tæt
Side 1
Springe
Se hele artiklen
Fortsæt med at læse

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


To spillerfarve Sudoku online gratis Spil samarbejdsfarve Sudoku med en ven gratis.Inviter en ven Deltag i et spil ***
Køb videre

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvordan vokser kryptomarkedet så hurtigt?


Der er flere faktorer, der bidrager til den hurtige vækst af cryptocurrency -markedet. 


1. Forøget opmærksomhed og vedtagelse: Efterhånden som flere mennesker bliver opmærksomme på cryptocurrencies og deres potentielle fordele, er efterspørgslen efter cryptocurrency -investeringer vokset markant. Denne øgede interesse har ført til en stigning i antallet af brugere og investorer, der deltager i markedet.


2. Institutionel involvering: I løbet af de sidste par år har vi set et stigende antal institutionelle investorer, såsom hedgefonde, banker og andre finansielle institutioner, der bliver involveret i cryptocurrency -markedet. Dette har tilføjet markedet troværdighed og tiltrukket endnu flere investorer.


3. teknologiske fremskridt: Den teknologiske udvikling i blockchain -rummet har gjort det lettere for nye cryptocurrencies at oprettes og handles. Derudover har fremskridt i sikkerhedsforanstaltninger og lovgivningsmæssige rammer gjort markedet mere tiltalende for investorer.


4. markedsvolatilitet: Den meget ustabile karakter af cryptocurrency -markedet har tiltrukket handlende og investorer, der ønsker at udnytte prisudsving og tjene betydelige overskud i en relativt kort periode.


5. Global accept: Cryptocurrencies accepteres nu som en form for betaling af et stigende antal købmænd og virksomheder over hele verden. Dette har bidraget til at legitimere cryptocurrencies som et levedygtigt alternativ til traditionelle fiat -valutaer.


Samlet set har disse faktorer bidraget til den hurtige vækst af cryptocurrency -markedet og vil sandsynligvis fortsætte med at køre sin ekspansion i fremtiden.


ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvordan er jeg vært for en webserver fra mit hjem?


At være vært for en webserver fra dit hjem kan udføres ved at følge disse trin:


1. Vælg en serversoftware: Du kan vælge mellem forskellige serversoftwareindstillinger som Apache, Nginx, Microsoft Internet Information Services (IIS) osv. Vælg en der passer til dine krav.


2. Opret en statisk IP -adresse: Kontakt din internetudbyder (ISP) og anmod om en statisk IP -adresse til din internetforbindelse. Dette vil sikre, at dit websted forbliver tilgængeligt, selvom din IP -adresse ændres.


3. Konfigurer din router: Log ind på din routers administrationspanel og fremadrettet port 80 (standardporten for HTTP -trafik) til den interne IP -adresse på din server. Dette vil give ekstern trafik mulighed for at nå din webserver.


4. Installer og konfigurer serversoftwaren: Installer serversoftwaren på din servermaskine og konfigurer den efter dine behov, såsom opsætning af virtuelle værter, SSL -certifikater osv.


5. Test dit websted: Kontroller, om dit websted er tilgængeligt ved at indtaste din statiske IP -adresse i en webbrowser. Du kan også teste det ved hjælp af online -værktøjer som Pingdom eller GTMetrix.


6. Domænenavn og DNS -opsætning: Registrer et domænenavn til dit websted, og indstil DNS -posterne for at pege på din statiske IP -adresse.


7. Sikkerhedsforanstaltninger: Implementere sikkerhedsforanstaltninger som firewalls, kryptering, regelmæssige sikkerhedskopier osv. For at beskytte din webserver mod cybertrusler.


8. Monitor og vedligehold: Overvåg regelmæssigt din server for ydelsesproblemer, sikkerhedstrusler og softwareopdateringer. Hold din serversoftware og applikationer opdateret for at sikre glat funktion.


Bemærk, at det at være vært for en webserver fra dit hjem muligvis ikke er egnet til websteder med høj trafik eller følsomme data på grund af potentielle sikkerhedsrisici og begrænset båndbredde. Overvej at bruge en professionel webhostingtjeneste til sådanne krav.


ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvordan får jeg reklame og organisk trafik til et websted?


1. Søgemaskineoptimering (SEO): Optimer dit websted til søgemaskiner for at forbedre synligheden og rangeringen på søgemaskinens resultater.


2. indholdsmarkedsføring: Opret værdifuldt og relevant indhold, der tiltrækker og engagerer din målgruppe. Dette kan omfatte blogindlæg, artikler, videoer, infografik og andre former for indhold.


3. markedsføring af sociale medier: Fremme dit websted på sociale medieplatforme som Facebook, Twitter, Instagram og LinkedIn for at nå et bredere publikum og føre trafik til dit websted.


4. Betalt reklame: Overvej at køre betalte reklamekampagner på søgemaskiner (Google AdWords), sociale medieplatforme og andre relevante websteder for at drive målrettet trafik til dit websted.


5. Influencer Marketing: Partner med påvirkere i din niche for at hjælpe med at promovere dit websted og nå et større publikum.


6. E -mail -marketing: Byg en e -mail -liste over abonnenter og send regelmæssige opdateringer, kampagner og indhold for at få trafik tilbage til dit websted.


7. Netværk: Opret forbindelse med andre webstedsejere, bloggere og påvirkere i din branche for at samarbejde, gæstepost eller udveksle links for at øge dit websteds synlighed.


8. Public Relations: Nå ud til journalister, bloggere og medier for at slå nyhedsværdige historier eller meddelelser relateret til dit websted for at generere reklame og trafik.


9. Gæsteblogging: Skriv gæsteposter af høj kvalitet til andre websteder og inkluder et link tilbage til dit websted i forfatterbio eller indhold for at drive trafik.


10. Onlinesamfund og fora: Deltag i online -samfund og fora relateret til din niche og engagere sig med medlemmer ved at dele værdifuld indsigt, besvare spørgsmål og promovere dit websted, når det er relevant.

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvorfor implanterer folk NFC -implantater i deres hænder?


Der er flere grunde til, at folk vælger at implantere NFC (nær feltkommunikation) implantater i deres hænder:


1. Bekvemmelighed: NFC -implantater giver enkeltpersoner mulighed for let at få adgang til information, åbne døre, foretage betalinger og udføre andre opgaver med en simpel bølge af deres hånd. Dette kan være mere praktisk end at bære nøgler, ID -kort eller smartphones.


2. Sikkerhed: NFC -implantater kan give et ekstra lag af sikkerhed, da de kræver, at fysisk adgang til den enkeltes krop skal aktiveres. Dette kan hjælpe med at forhindre uautoriseret adgang til enheder eller følsomme oplysninger.


3. Teknologisk eksperimentering: Nogle mennesker vælger at implantere NFC -chips som en måde at eksperimentere med nye teknologier og integrere dem i deres daglige liv.


4. Personlig identifikation: NFC -implantater kan bruges til personlige identifikationsformål, såsom lagring af medicinsk information eller kontaktoplysninger, der let kan fås adgang til i tilfælde af nødsituationer.


5. Biohacking: Nogle individer betragter NFC -implantater som en form for biohacking, hvor de øger deres kroppe med teknologi for at forbedre deres evner eller oplevelser.


Generelt er beslutningen om at implanterer NFC -chips i deres hænder et personligt valg, der varierer fra person til person baseret på deres individuelle præferencer og overbevisninger.


Køb videre

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Er sukker virkelig usundt?


Overdreven forbrug af sukker kan føre til forskellige sundhedsmæssige problemer, såsom vægtøgning, fedme, diabetes, hjertesygdomme og tandproblemer. Det anbefales at begrænse indtagelse af tilsat sukker i vores diæt for at opretholde et godt helbred. Naturlige sukkerarter, der findes i frugt og grøntsager, betragtes imidlertid ikke som skadelige i moderate mængder og kan være en del af en sund kost. Moderation er nøglen, når det kommer til sukkerforbrug.


ved Daisy / Udsigt | Købe | Køb med cryptocurrency



Hvordan finder jeg kunder til min webudvikling af små virksomheder?


Her er nogle strategier, du kan bruge til at tiltrække kunder til din webudviklingsvirksomhed:


1. Opbyg en stærk online tilstedeværelse: Opret et professionelt websted, der viser dine tjenester, portefølje og klientudtalelser. Brug sociale mediekanaler til at markedsføre din virksomhed og samarbejde med potentielle kunder.


2. Netværk: Deltag i branchearrangementer, konferencer og møder for at få forbindelse til andre fagfolk inden for området og potentielle kunder. Deltag i onlinesamfund og fora relateret til webudvikling for at udvide dit netværk.


3. Tilbud henvisningsincitamenter: Tilskynd tilfredse klienter til at henvise dine tjenester til andre ved at tilbyde rabatter eller andre incitamenter til vellykkede henvisninger.


4. Samarbejd med andre virksomheder: Partner med digitale marketingbureauer, grafiske designere eller andre fagfolk, der muligvis har brug for webudviklingstjenester til deres klienter.


5. Annoncering: Invester i online -reklame via Google AdWords, sociale medieannoncer eller displayannoncer for at nå et bredere publikum.


6. Cold Outreach: Nå ud til potentielle kunder direkte via e -mail eller telefon, der viser dine tjenester og tidligere arbejde.


7. Indholdsmarkedsføring: Opret værdifuldt indhold såsom blogindlæg, whitepapers eller webinarer, der demonstrerer din ekspertise inden for webudvikling og tiltrækker potentielle kunder gennem søgemaskiner og sociale medier.


8. Deltag i messer og begivenheder: Deltag i branche messer og begivenheder for at oprette forbindelse til potentielle kunder og vise dine tjenester.


9. Tilbyde gratis konsultationer: Giv gratis konsultationer til potentielle kunder for at diskutere deres behov, og hvordan dine tjenester kan hjælpe dem med at nå deres mål.


10. Bed om anmeldelser og vidnesbyrd: Opmuntr tilfredse klienter til at forlade anmeldelser og vidnesbyrd på dit websted eller andre gennemgangsplatforme for at opbygge troværdighed og tiltrække nye kunder.


ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvordan skriver jeg et professionelt blogindlæg?


At skrive et professionelt blogindlæg involverer flere centrale trin til at skabe et veludviklet og engagerende stykke indhold. Her er nogle tip til at hjælpe dig med at skrive et professionelt blogindlæg:

1. Vælg et relevant og engagerende emne: Start med at identificere et emne, der er relevant for dit publikum, og er noget, du er vidende og lidenskabelig med. Sørg for, at emnet er noget, der vil interessere og resonere med dine læsere.

2. Foretag grundig forskning: Før du begynder at skrive, skal du sørge for at udføre grundig undersøgelse af dit valgte emne. Dette vil hjælpe dig med at indsamle relevant information, statistik og fakta, der understøtter dine point og gøre dit blogindlæg mere troværdigt.

3. Opret en oversigt: Organiser dine ideer og nøglepunkter ved at oprette en oversigt til dit blogindlæg. Dette vil hjælpe dig med at strukturere dit indhold på en logisk og sammenhængende måde, hvilket gør det lettere for læserne at følge med.

4. skriv en overbevisende introduktion: Start dit blogindlæg med en stærk og engagerende introduktion, der griber læserens opmærksomhed. Brug en krog til at trække læsere ind og få dem til at ønske at fortsætte med at læse.

5. Brug klart og kortfattet sprog: Undgå at bruge jargon eller alt for teknisk sprog i dit blogindlæg. Skriv på en klar og kortfattet måde for at gøre dit indhold let at forstå for alle læsere.

6. Inkluder visuals: Visuelle elementer som billeder, infografik og videoer kan hjælpe med at nedbryde teksten og gøre dit blogindlæg visuelt tiltalende. De kan også hjælpe med at støtte dine nøglepunkter og gøre dit indhold mere engagerende.

7. Korrekturlæsning og redigering: Før du offentliggør dit blogindlæg, skal du sørge for at korrekturlæse og redigere det for grammatik, stavemåde og formateringsfejl. Overvej at bede en kollega eller en ven om at gennemgå dit indlæg for feedback, før du offentliggør det.

8. Tilføj en opfordring til handling: Afslut dit blogindlæg med en stærk opfordring til handling, der opfordrer læserne til at engagere dig i dit indhold, såsom at abonnere på din blog, kommentere eller dele dit indlæg på sociale medier

Ved at følge disse tip kan du oprette et professionelt og engagerende blogindlæg, der resonerer med dit publikum og etablere dig som en autoritet inden for dit felt.

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvordan bygger jeg en mailserver med postfix?


Følg disse trin for at opbygge en mailserver med Postfix:


1. Installer Postfix: Brug din pakkeadministrator til at installere Postfix på din server. For eksempel på Debian/Ubuntu kan du køre `sudo apt-get install Postfix '.


2. Konfigurer postfix: Postfix -konfigurationsfiler er placeret i `/etc/postfix/`. Hovedkonfigurationsfilen er `Main.cf '. Du kan redigere denne fil for at konfigurere din mailserver i henhold til dine krav. Nogle almindelige konfigurationer, du muligvis skal indstille, inkluderer domænenavnet, indstillinger for mail -relæ, virtuelle domæner osv.


3. Indstil DNS -poster: For at sikre postlevering skal du konfigurere de nødvendige DNS -poster (MX og SPF -poster) for dit domæne. Kontakt din domæneregistrator eller DNS -udbyder for at få hjælp om nødvendigt.


4. Konfigurer virtuelle domæner og brugere: Hvis du vil være vært for flere domæner på din mailserver, skal du konfigurere virtuelle domæner og brugere. Dette kan gøres ved hjælp af indstillingerne `Virtual_alias_maps` og` Virtual_mailbox_maps` i postfix -konfigurationsfilen.


5. Sikre din mailserver: Sørg for, at din mailserver er sikker ved at oprette firewall -regler, bruge TLS -kryptering til indgående og udgående mail, og implementere andre sikkerhedsforanstaltninger, der er anbefalet til mailservere.


6. Test din mailserver: Når alt er konfigureret, skal du teste din mailserver ved at sende og modtage test -e -mails. Brug værktøjer som Telnet eller MailX til manuelt at sende e -mails og kontrollere, om de modtages med succes.


Husk at med jævne mellemrum opdateres og vedligeholde din mailserver for at sikre, at den kører glat og sikkert. Det er også en god ide at overvåge postserverlogfiler for eventuelle problemer eller mistænkelige aktiviteter.

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvad er den bedste måde at koge æg på?


Her er en enkel metode til at koge æg:


1. Læg æggene i en gryde og dæk dem med koldt vand.

2. bring vandet i kog over høj varme.

3. Når vandet er kogende, skal du reducere varmen til lav og lade æggene simre i 9-12 minutter, afhængigt af hvor godt gjort du vil have dem.

4. Fjern æggene fra varmen, og overfør dem straks til en skål med isvand for hurtigt at køle ned.

5. Når den er afkølet, kan du skrælle og nyde dine perfekt kogte æg.


ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvordan skriver jeg en god bog?


1. Udvikle en klar idé eller koncept: Inden du begynder at skrive, skal du sørge for at have en solid idé til din bog. Dette kan være et plot, karakter, tema eller indstilling, som du vil udforske i din skrivning.


2. Opret en oversigt: Skitsér de vigtigste plotpunkter, karakterer og temaer i din bog, inden du begynder at skrive. Dette vil hjælpe dig med at forblive organiseret og fokuseret, mens du skriver.


3. Afsæt dedikeret tid til skrivning: Opret en rutine til skrivning og afsæt dedikeret tid hver dag til at arbejde på din bog. Dette vil hjælpe dig med at forblive motiveret og gøre fremskridt med din skrivning.


4. Begynd bare at skrive: Nogle gange er den sværeste del af at skrive, at en bog er ved at komme i gang. Du skal ikke bekymre dig om perfektion på dette tidspunkt, bare begynd at skrive og få dine ideer ned på papiret.


5. Deltag i en skrivegruppe eller samfund: Overvej at deltage i en skrivegruppe eller samfund for støtte, feedback og motivation. Skrivning kan være en ensom forfølgelse, så det kan være uvurderligt at have et samfund af medforfattere.


6. Rediger og revider: Når du har afsluttet et udkast til din bog, skal du gå tilbage og revidere og redigere den for at forbedre klarheden, strukturen og strømmen af ​​din skrivning. Dette kan involvere flere udkast og revisioner, før din bog er klar til offentliggørelse.


7. Søg feedback: Del dit arbejde med andre, såsom beta -læsere, skrivegrupper eller professionelle redaktører, for at få feedback om din skrivning. Dette kan hjælpe dig med at identificere områder til forbedring og gøre din bog stærkere.


8. Bliv ved med at skrive: At skrive en bog er et maraton, ikke en sprint. Fortsæt med at skubbe fremad, forblive dedikeret og fortsætte med at arbejde på din bog, indtil den er afsluttet.


ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvordan sender jeg e -mail med en kompatibel e -mail -liste og afmeldingslink?


For at sende en e -mail med en kompatibel liste og et strammere afmeldingslink, skal du følge disse trin:


1. Sørg for, at din e-mail-liste er i overensstemmelse med alle relevante regler, såsom CAN-SPAM Act og GDPR. Dette betyder, at alle modtagere skal have valgt at modtage dine e -mails, og at du har deres eksplicitte samtykke til at kontakte dem.


2. Inkluder et klart og fremtrædende afmeldingslink i din e -mail. Sørg for, at det er let at finde og klikke på, og at det tager modtagere direkte til en side, hvor de let kan afmelde dig fra din mailingliste.


3. For at oprette afmeldingslinket "Strammere" kan du bruge en enkelt-klik-afmeldingsmulighed. Dette betyder, at modtagere kan afmelde dig fra dine e -mails med kun et enkelt klik uden at skulle udfylde yderligere formularer eller give personlige oplysninger.


4. Når du sender e -mailen, skal du sørge for at tilpasse meddelelsen og adressere modtageren efter navn, hvis det er muligt. Dette kan hjælpe med at øge engagementet og få e -mailen til at føle sig mere relevant for modtageren.


5. Før du sender e -mailen, skal du teste den for at sikre, at afmeldingslinket fungerer korrekt, og at e -mailen ser godt ud på alle enheder og e -mail -klienter.


Ved at følge disse trin kan du sende en e -mail med en kompatibel liste og et strammere afmeldingslink for at sikre, at dine modtagere har en positiv oplevelse og let kan fravælge at modtage yderligere e -mails fra dig.

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvordan bærer jeg deadlock?


1. Start med at dyrke dit hår ud til den ønskede længde. Dit hår skal være mindst 2-3 inches langt efter de bedste resultater.


2. Afsnit Dit hår i små, endda dele ved hjælp af en kam. Størrelsen på sektionerne bestemmer størrelsen på dine dreadlocks, så sørg for at vælge en størrelse, som du er komfortabel med.


3. Begynd backcombing hver sektion af håret ved at vri og trække det tæt mod rødderne. Dette vil skabe knob i håret, som til sidst vil dannes til dreadlocks.


4. Påfør voks eller gel på hvert hårafsnit for at hjælpe med at holde knobene på plads og opfordre håret til at mat.


5. Fortsæt backcombing og vrid hver sektion af håret, indtil du har afsluttet hele dit hoved. Denne proces kan være tidskrævende, så vær tålmodig og tag pauser efter behov.


6. Når alt dit hår er blevet snoet og backcombed, så lad det sidde i et par dage for at give knobene mulighed for at stramme og dannes til dreadlocks.


7. Efter et par dage kan du begynde at style og vedligeholde dine dreadlocks ved at vaske dem med restfri shampoo og bruge en hæklet krog til at hjælpe med at stramme eventuelle løse knob.


8. For at holde dine dreadlocks ser pæne og ryddelige, skal du overveje at bruge et tørklæde eller bandana til at dække dem, når de sover eller i beskidte miljøer. Regelmæssig vedligeholdelse og vedligeholdelse hjælper dine dreadlocks med at forblive sunde og levende.

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvorfor skal jeg bruge et Apple L ud på L Word?


Brug af et Apple L på L Word kan forbedre din visningsoplevelse på flere måder. Apple L er en populær streamingenhed, der giver dig mulighed for let at få adgang til og se dine yndlingsshow med video og lyd af høj kvalitet. Ved at bruge et æble L ved L -ordet kan du nyde sprøde, klare visuals og fordybende lyd, der får dig til at føle, at du er lige midt i handlingen.


Derudover tilbyder Apple L en brugervenlig grænseflade, der gør det nemt at navigere gennem episoder, pause og spole scener tilbage og tilpasse din visningsoplevelse. Du kan også drage fordel af funktioner som stemmesøgning og personaliserede anbefalinger for at hjælpe dig med at opdage nyt indhold at nyde.


Generelt kan brug af et Apple L på L Word give dig en premium -streamingoplevelse, der giver dig mulighed for fuldt ud at fordybe dig i showets fængslende verden.

ved Daisy / Udsigt | Købe | Køb med cryptocurrency



Hvad forårsager migræne, og hvordan behandles de?


Migræne er alvorlig hovedpine, der ofte ledsages af andre symptomer, såsom kvalme, følsomhed over for lys og lyd og synsforstyrrelser. Den nøjagtige årsag til migræne forstås ikke helt, men det antages at være relateret til ændringer i blodgennemstrømning og kemikalier i hjernen.


Behandling af migræne involverer typisk en kombination af livsstilsændringer, medicin og alternative terapier. Nogle almindelige behandlingsmuligheder inkluderer:


1. tager over-the-counter smertestillende midler såsom ibuprofen eller acetaminophen

2. receptpligtig medicin specifikt designet til behandling af migræne, såsom triptaner og ergotaminer

3. at undgå triggere som visse fødevarer, stress, mangel på søvn eller hormonelle ændringer

4. øve afslapningsteknikker såsom dyb vejrtrækning eller meditation

5. Anvendelse af varme eller kolde pakker på hovedet eller nakken

6. Få regelmæssig træning og vedligeholdelse af en sund kost


Det er vigtigt for personer, der lider af migræne at arbejde sammen med deres sundhedsudbyder for at udvikle en behandlingsplan, der er skræddersyet til deres specifikke behov og triggere. I nogle tilfælde kan der være behov for en kombination af terapier for effektivt at styre migræne og forbedre livskvaliteten.

ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvorfor er det mere sikkert at bære en maske offentligt?


At bære en maske offentligt er mere sikker, fordi det hjælper med at forhindre spredning af luftvejsdråber, der indeholder vira, såsom Covid-19. Når nogen med en virus bærer en maske, forhindrer den, at deres åndedrætsdråber frigøres i luften og potentielt inficerer andre. Derudover kan iført en maske også beskytte bæreren mod at indånde luftvejsdråber fra andre, der kan blive inficeret. Dette er især vigtigt i situationer, hvor social distancering er vanskelig at vedligeholde, såsom i overfyldte indendørs rum eller på offentlig transport. Generelt er det en enkel og effektiv måde at hjælpe med at reducere transmission af vira og beskytte både dig selv og dem omkring dig.


ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvordan bygger jeg en fuld stak webapp med Django?


At opbygge en fuld stak webapp med Django involverer flere trin. Her er en generel oversigt over processen:


1. Opsæt django: Installer først Django ved at køre `Pip Installer Django` i din kommandolinje. Opret derefter et nyt Django-projekt ved at køre `Django-Admin StartProject MyProject '.


2. Opret Django -apps: Django -apps er modulære komponenter i dit projekt, der tjener specifikke formål. Du kan oprette flere apps i dit projekt til at håndtere forskellige funktionaliteter.


3. Definer modeller: Modeller i Django bruges til at definere strukturen i dine databasetabeller. Opret dine modeller ved at definere klasser i modellerne.py -filen for hver app.


4. Opret visninger: Visninger i Django er Python -funktioner, der håndterer brugeranmodninger og returnerer svar. Definer visninger til din app ved at oprette funktioner i visningen.PY -filen for hver app.


5. Opsætning af URL'er: URL'er i Django bruges til at kortlægge brugeranmodninger til specifikke visninger. Definer URL -mønstre til din app ved at oprette en URLS.PY -fil i hver app og inklusive dem i den vigtigste URLS.PY -fil i dit projekt.


6. Opret skabeloner: Skabeloner i Django bruges til at generere HTML -sider, der sendes til brugerens browser. Opret HTML -skabeloner til din app ved at oprette en skabelonmappe i hver app og skrive HTML -kode i separate skabelonfiler.


7. Server statiske filer: Statiske filer såsom CSS, JavaScript og billeder serveres separat fra dynamisk indhold i Django. Konfigurer de statiske filerindstillinger i dit projekts indstillinger.py -fil til at tjene statiske filer fra den statiske mappe i hver app.


8. Konfigurer databasen: Opret dine databaseindstillinger i indstillingerne.py -filen til dit projekt, inklusive databasemotoren, navn, bruger, adgangskode og vært.


9. Migrere databasen: Kør `Python Manage.Py Makemigrations` efterfulgt af` Python Management.Py Migrate 'i din kommandolinje for at oprette og anvende databasemigrationer baseret på dine modeller.


10. Kør serveren: Start Django -udviklingsserveren ved at køre `Python Manage.Py RunServer` i din kommandolinje. Du skal nu være i stand til at få adgang til din webapp på `http: //127.0.0.1: 8000/` i din browser.


Dette er de grundlæggende trin til at opbygge en fuld stak webapp med Django. Herfra kan du tilpasse og udvide din app yderligere ved at tilføje godkendelse, autorisation, API -endepunkter, test og mere.


ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Hvad er fordelene ved at have et sikkerhedskamera?


1. afskrækkelse af kriminel aktivitet - Sikkerhedskameraer kan fungere som en afskrækkende virkning for potentielle kriminelle, da de er mindre tilbøjelige til at begå en forbrydelse, hvis de ved, at de bliver overvåget.


2. Overvågning og overvågning - Sikkerhedskameraer giver dig mulighed for at overvåge din ejendom og holde øje med enhver mistænksom aktivitet i realtid, hvilket hjælper med at forhindre tyveri, hærværk eller andre forbrydelser.


3. Bevis I tilfælde af en forbrydelse - I den uheldige begivenhed, at en forbrydelse forekommer på din ejendom, kan sikkerhedskameraoptagelser give afgørende bevis for lovhåndhævelse og forsikringskrav.


4. Fjernadgang - Mange sikkerhedskameraer tilbyder nu fjernsynsfunktioner, så du kan tjekke ind på din ejendom hvor som helst ved hjælp af din smartphone eller computer.


5. Peace of Mind - At have sikkerhedskameraer installeret kan give ro i sindet, vel vidende, at din ejendom overvåges, og potentielle trusler opdages og registreres.


ved Daisy / Udsigt | Købe | Køb med cryptocurrency


Jeg begyndte lige at tage fødselsbekæmpelse. Hvad er de mest almindelige bivirkninger?


De mest almindelige bivirkninger af p -piller inkluderer:


1. kvalme

2. bryst ømhed

3. Hovedpine

4. vægtøgning

5. Humørændringer

6. Spotting eller gennembrud

7. Ændringer i libido 

8. Acne 

9. oppustethed 


Det er vigtigt at bemærke, at enhver person kan opleve forskellige bivirkninger, og nogle personer oplever muligvis overhovedet ikke noget. Hvis du er bekymret for bivirkningerne af din prævention, er det bedst at tale med din sundhedsudbyder.

ved Daisy / Udsigt | Købe | Køb med cryptocurrency




https://glamgirlx.com -


(Klik eller tryk på for at downloade billede)
Professionel underholdning, fotos, videoer, lyd, livestreaming og afslappet gameplay samt ID -scanning, webudvikling og surrogacy -tjenester.

Efterlad mig et tip i bitcoin ved hjælp af denne adresse: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Servicevilkår