Praktisch webgebaseerd diep leren en beveiliging bij voorbeeld Derde editie Charlotte Harper 3 juli 2024 Bijgewerkt/geconverteerd op 3 juni 2025
Voorwoord:
Beveiligingsoverwegingen in het bouwen van software voor internet zijn een belangrijk onderdeel van het plan en de uitvoering van elke webontwikkelaar, terwijl een prototype engineering van een prototype dat betrouwbaar, stabiel en nuttig is voor praktische doeleinden. De DOM (Document Object Markup), met de implementatie van HTML, JavaScript en CSS, evenals backend -software die Python, C/C ++, Java en Bash implementeert, geven webontwikkelaars de vrijheid en macht om een breed scala van projecten te creëren, het gemiddelde gebruik van de gemiddelde, het gemiddelde van de gemiddelde, het gemiddelde gebruik van de gemiddelde, het gemiddelde van de gemiddelde als het gemiddelde van de gemiddelde gebruik te maken van de gemiddelde. Dood tijd of laat iets gedaan op internet, meestal op een touchscreen -smartphone -apparaat. De meeste mensen zouden niet eens weten waar ze moeten beginnen als ze een website helemaal opnieuw willen bouwen, ze zouden de neiging hebben om op de website van een ander te beginnen en iets te bouwen dat beperkt is in functionaliteit, betrouwbaarheid, gebruiksgemak en vooral creativiteit wanneer ze de nieuwste krachtige tools hadden die de limiet van het gebruik van gebruik en flexibiliteit in het gemak konden gebruiken, wat de limiet van het gemak in gebruik en flexibiliteit in het gemak zou hebben om te gebruiken. Als je een paar minuten de tijd hebt om dit boek te lezen en te leren wat ik je wil leren, of zelfs met mij persoonlijk over je doelen wil praten en wat begeleiding in de goede richting krijgt en gemotiveerd bent om te leren coderen en te schrijven van je eigen software, neem je dit boek mee naar huis en zet je wat tijd opzij om de volgende invloed, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige, krachtige en belangrijke webtoepassing ook te maken en je wil en te schrijven, precies te nemen wat je wilt en de behoeften van je doelgroep opbouwt.
Over mij: Ik ben een softwareontwikkelaar met een breed scala aan ervaring in C/C ++, Java, Python, HTML, CSS en JavaScript. Ik bouw websites die mensen willen gebruiken, willen bezoeken en zelfs verslaafd raken aan het gebruik alleen om tijd te leren, te herscheppen en te doden, en vooral, ik verkoop software. Als je een idee had om precies te hebben hoe je wilde dat een website eruit zou zien en functioneren, was je bereid me te ondersteunen, zodat ik aan mijn eigen behoeften kan voldoen terwijl ik de jouwe ontmoet, en je bent bereid om de kosten van het runnen van een website zelf te dekken, ik zou je de volgende YouTube, Tiktok, Twitter, Google, Google, Google of zelfs een high-tech beveiligings-app alleen u toegang hebben. In plaats van te proberen je mijn tijd te verkopen, probeer ik de jouwe te kopen: ik wil je er zelf over hebben om een app (website) te bouwen met de informatie die al bestaat, en je te leren wat je nodig hebt om een onafhankelijke softwareontwikkelaar, ondernemer te zijn, die een succesvolle carrière leidt op elk gewenste vakgebied. En laat me duidelijk zijn, de opleiding die ik je geef, zal informeel zijn. Je zou naar school kunnen gaan en dit allemaal leren met een formele opleiding, of dit boek zelfs op school lezen, je opdrachten voltooien en veel wegnemen van je opleiding, maar ik zal je niet formeel op de hot stoel zetten en je vragen om opdrachten te voltooien. Ik ben niet je professor, je kunt aan mij denken als een vriend die je wil begeleiden naar een carrière gedreven door je eigen persoonlijke succes. En ik verkoop je succes ook niet, je moet het met je tijd kopen. Leren te coderen heeft een steile leercurve en was nooit gemakkelijk, of zou zelfs moeten zijn. Je moet zo hard werken als je kunt en blijven proberen te falen en opnieuw te proberen, zelfs als je gefrustreerd bent om zelf apps te leren en te bouwen. Dat is in de aard van de code zelf. Code wordt uitgevoerd door een compiler die is ontworpen om de programmeerfoutmeldingen te geven, en deze zullen u leren hoe u moet coderen, zelfs als u de fout eenvoudigweg in uw zoekmachine kopieert en de voorbeelden van andere mensen leest. En ik moet zeggen dat je niet extreem rijk, slim, succesvol of zelfs gedetailleerd georiënteerd of georganiseerd hoeft te zijn om een app te bouwen. De computer zorgt voor die organisatie voor u. Je hoeft alleen maar door de vallen en opstaan te volharden, de focus te behouden en hard te werken aan wat je doet, en je zult een zeer succesvolle carrière hebben in het geheel van wat je doet.
Wie ik ben: Ik realiseer me dat het laatste deel meer ging over leren en je neemt een manier uit dit boek. Wie ben ik precies? Dat is een ingewikkelde vraag. Ik ben daar zelf onduidelijk over, omdat ik last heb van medische aandoeningen die het voor mij moeilijk kunnen maken om dit boek soms te coderen of te schrijven, terwijl ik uitdagingen presenteert met socialisatie- en identiteitsproblemen die mijn leven moeilijker maken als het gaat om het introduceren van mezelf. Kortom, als je dit boek leest, bracht je het naar huis omdat je er doorheen draaide en dacht dat het nuttig was, of zelfs als je net zo ver erin leest, ben ik een gelijkgestemde persoon die je wil zien slagen in alles wat je doet. Ik ben zelf een ingenieur, een softwareontwikkelaar en een student, en ik schrijf dit boek voor andere studenten die hun leven gemakkelijker willen maken door een handboek te hebben van de software die ze nodig hebben om hun leven gemakkelijker te maken door voorbeelden te geven die in elkaar passen als een grote puzzel in een werkende, nuttige, grote, functionele, samenhangende, samenhangende en boeiende app die het succes van de lijn van zaken kan stimuleren. Grotendeels, dit is wat ik doe: ik bouw apps om mezelf en andere mensen te helpen slagen. Ik ben ook een auteur, hoewel dit mijn eerste publicatie is die ik van plan ben te voltooien om mijn portfolio samen te stellen in een nuttig document, en ik ben ook een kunstenaar. Ik zal je dit toegeven, ik ben een soort vreemd persoon. Ik ben niet perfect, ik heb de wet gehad met de wet, zelfs ertoe leiden dat ik hogescholen en universiteiten verlaten en staten verlaten om te proberen een naam voor mezelf te maken met meer succes. Ik ben een vrouw van geboorte, ik draag make -up, maak foto's van mezelf, draag jurken en andere dameskleding en ik blijf me bewust van mezelf als een vrouw van nature. Ik heb in het verleden problemen gehad met andere mensen die hebben geleid tot worstelingen met het schrijven en bouwen van webapps, en ik bied mijn excuses aan dat ik dit boek niet eerder in handen heb kunnen krijgen: je had dit nodig. Je zult code willen lezen en schrijven die op mij lijkt en werkt als de mijne en hetzelfde doet, maar nog beter, want als je het je kunt veroorloven om dit boek te kopen in plaats van je toetsenbord te pureren zoals ik gewoon om een boek te maken om er zelf geld voor te vragen, heb je de bronnen die je nodig hebt om succesvol te zijn in je leven. Ik had allerlei problemen met het opgroeien van familie, gezondheidstoestand, artsen, de media en de wet, en mijn code weerspiegelt diep de strijd die feminisme en vrouwelijke natuur is in een verdeelde en gefrustreerde wereld. Dit boek is echter iets waar ik diep om geef, mijn baby, mijn portfolio en mijn levensonderhoud, dus ik waardeer je overweging wanneer je de tekst naar huis neemt en er zorgvuldig overheen portrelt om van mij te leren. Houd er rekening mee dat ik niet perfect ben, dit boek zal fouten, revisies en nieuwe edities hebben, en je moet zo goed mogelijk met je logische brein denken om een succesvolle ervaring met mijn schrijven te hebben. Begrijp ook dat ik goed voor je bedoel, zelfs als je voor uitdagingen wordt geconfronteerd tijdens het schrijven. Denk er zo over na: wanneer u gewoon een computersysteem kunt huren om alles te doen wat u zich kunt voorstellen in de digitale ruimte, alle informatie opslaat die u tegenkomt, analyseert en organiseren, en het komen begrijpen, zult u onvermijdelijk problemen ondervinden met de informatie die u inneemt en zelfs publiceert. Ik vertel je dit omdat ik dezelfde moeilijkheden tegenkom. Gebruik dit boek op eigen risico, werk samen met uw community en communities die voor u beschikbaar zijn om software te bouwen binnen een veilige setting, en neem dingen niet persoonlijk aan wanneer u faalt of zelfs op de verkeerde manier slaagt: zo ben ik zo ver gekomen, en waarom ik u deze tekst kan brengen en u kan slagen zonder de werking van de netwerk te doen. zal werken, internet. Je bent misschien niet erg bekend met wie ik ben met slechts een paar woorden, maar ik moedig je aan om verder te lezen, je zult me leren kennen terwijl je me blijft lezen en begrijpen tijdens het bouwen van je eigen projecten om je werk te voltooien. Er zal geen huiswerk zijn met dit boek, zolang je professoren of leraren je niet toewijzen, maar ik moedig je ten zeerste aan om zelf een portfolio van projecten te bouwen terwijl je meegaat, evenals een Capstone -project dat laat zien hoe je kunt toepassen wat je hebt geleerd. Mijn Capstone -project is de basis voor het grootste deel van wat je in dit boek gaat lezen, omdat het code van mijn vorige projecten, code opneemt, die ik heb gemaakt en geleerd om methodisch met de hand te schrijven, en een breed scala aan ideeën en tips die me hebben geholpen om te slagen tot het punt waar ik een eenvoudige app kan spinnen die je volledig kan uitstrekken en lijkt en gedraagt en gedraagt een populaire app die je vriend of familie gebruikt, op het internet, op het internet, op het internet, of in het nieuws, of in het nieuws, of in het nieuws kunnen worden geactiveerd.
Wat dit boek is: Dit boek is een tutorial bij voorbeeld. U kunt hier code vinden, instructies om te leren coderen, informatie over foutopsporingcode en fouten op het oplossen van stappen, instructies voor het oplossen van een back-up van en opslaan van uw code, opnieuw inzetten als iemand uw code doorbreekt, uw code beveiligt, uw code beveiligt, uw code implementeert, uw code build, uw app en uzelf Software die u opbouwt in het absoluut beste licht om de meest aantrekkelijke mogelijk te zijn voor uw eindgebruikers, de bezoekers van uw website. In dit boek zal ik een aantal voorbeelden van softwareontwerp demonstreren met een focus op internet als platform en beveiliging. We zullen de leerervaring initiëren door een basisproject te bouwen met behulp van de UNIX -shell, met back -up- en scriptfuncties. Vervolgens zullen we een basisblogwebsite onderzoeken, onze blog upgraden met foto- en videofuncties en deze functies gebruiken om beveiligingsoplossingen te gebruiken met behulp van gratis software en onze server beveiligen met behulp van een pluggable authenticatiemodule (PAM). We zullen dan bestuderen en verwerken van bestanden, het verkennen van videobewerking, spraakdonatie, barcodescanning en optische karakterherkenning, naast andere concepten. Onderweg zullen we API's onderzoeken die ons zullen helpen onze software nuttiger en veiliger te maken, met gratis en betaalde opties. Onderweg zullen we fysieke beveiligings- en militante tools onderzoeken, zoals vuurwapens en munitieontwerp en -productie, waaronder vat- en repeaterontwerp, torentje en drone -ontwerp en andere opdrachtgevers die we zullen integreren met onze software op het bestaande netwerk om onze software te beschermen en zelfverdediging en weerbaarheid te tonen. We zullen onderweg pauzes nemen om games, 2D- en 3D -renderingmotoren te bouwen, en werken met ingebedde hardware in case study -voorbeelden van basisdimensionale renderingsoftware en een elektronische vibrerende massager die respectievelijk in siliconenrubber wordt gegoten. Onderweg zullen we ook machine learning -oplossingen gebruiken die al beschikbaar zijn om onze software beter te beveiligen. We zullen ook aandelenhulpmiddelen gebruiken die beschikbaar zijn voor het web om het proces te stroomlijnen en te beveiligen. Dit boek is een handleiding voor uw succes bij het bouwen van een webtoepassing en het integreren ervan met een professioneel netwerk van computer en ingebedde mechanische systemen, en over het algemeen een gids voor het bouwen van software en ingebedde hardware zonder achtergrondkennis of eerdere ervaring.
Wat dit boek niet is: Als je echt een website wilt hebben, kun je gewoon een eenvoudige winkel opzetten en verkopen wat je nodig hebt, een blog posten, foto's of video's posten, of anderszins zonder ooit een enkele regel code te schrijven. Dit boek is dat niet. Dit boek leert u hoe u software kunt bouwen die nuttiger, volledig uitgelicht, functioneel en veilig is dan alle software die u al kunt vinden, omdat het de nieuwste software implementeert die nog steeds prototypes is, kan duur zijn om te worden uitgevoerd op een schaal die oudere bedrijven werken en niet achteruit aanspreken, ingerichte bedrijven die zijn opgezet om geld te verdienen voor mensen die niet echt iets doen. Als u dit boek nauwlettend volgt, wilt u code, onderzoekscode schrijven, uw eigen apps bouwen en u zult geld verdienen met wat u doet. Ik zal geld verdienen uit dit boek, zelfs in vroege stadia, omdat het informatie bevat die mensen nodig hebben en willen lezen, en al kopen wanneer ze mijn apps kopen of gebruiken. Dit boek zal geen app voor u bouwen, maar het zal u in de goede richting wijzen en u bewapenen met de tools die u nodig hebt en de vaardigheden en tips die uw eigen succes zullen vergemakkelijken bij het bouwen van software voor internet, met elke regel code die u moet schrijven als voorbeeld, klaar om te worden samengevoegd tot software die u en uw supporters, klanten, families, familie, familie, families, en de mensen van de internet willen gebruiken.
Wat je zult leren: Dit boek leert u hoe u software kunt bouwen en verkopen, echt functionele, nuttige software, media -opname, beveiligingsfuncties zoals gezichtsherkenning, machine -leesbare zone barcodescannen, web -API's om video en foto's te verifiëren, op te nemen en te renderen en berichten te wisselen zoals Bluetooth en Near Field (NFC) -communicatie. In dit boek leert u hoe u een netwerkcomputer kunt gebruiken, gericht op Debian Linux, hoe u BASH -code kunt bouwen om het installeren en back -up van uw software een naadloze, geautomatiseerde bries te maken, hoe u Python -code kunt bouwen als backend om dynamische berichten te bedienen, style dingen gebruiken Natuurlijk gebruik van CSS -styles met BootStrap, en interactiviteit door netwerk -apparaten om te aanbieden. Andere doeleinden, ID -scannen, beeld- en video -moderatie, gegevensmicrotransacties om uw software veilig te houden, betalingsverwerking, cryptocurrency -handel, asynchrone taken en meer. U leert hoe u uw eigen Bluetooth -apparaten kunt bouwen, met batterijen, opladers, microcontrollers, circuits, motoren en sensoren, met soldeer, draad en 3D -geprinte evenals gegoten materialen. Ik zal demonstreren van 3D -ontwerpprincipes die zijn toegepast op additieve productie en gereedschap en het maken van die, zodat u uw eigen ingebedde, hardware -apparaten kunt produceren met geïntegreerde batterijen, opladers, elektronische circuits en functionele uitgangen. en netwerk ze met Bluetooth en het web. In het bijzonder zullen we twee casestudy's onderzoeken, een vibrerende massager en een zelfgemaakte vuurwapen, beide geprogrammeerd in OpenSCAD, die beschikbaar is als een grafische interface of opdrachtregelhulpprogramma en kan worden geïntegreerd in een web voor snellere resultaten. U leert hoe u een website vanaf de grond kunt bouwen en implementeren zonder voorafgaande ervaring, het functioneel, veilig, mooi, nuttig en vooral praktisch maakt. U leert hoe u machine learning en computer vision kunt gebruiken om een site veilig en praktischer te maken, video en audio van uw website op te nemen, uw stem te doneren, muziek te maken en audio te moduleren om nuttige voorbeelden te maken, en hoe u de ruis doorbreekt door andere websites te gebruiken om het best mogelijke netwerk van websites te bouwen die u rechtstreeks aan u kunt koppelen om alle nuttige informatie te delen om alle nuttige informatie te delen om alle nuttige informatie te delen om alle nuttige informatie te delen, en nog meer belangrijker zijn om uw software en zaken te bieden. Dit boek zal het zwaarst gericht zijn op media, beveiliging en machine learning, de belangrijkste drie componenten die u zullen helpen nuttige software voor het web te bouwen door de juiste gebruikers te betrekken en de verkeerde te ontdoen op een manier die realistisch, praktisch, praktisch, hands on en boeiend is, hoewel ook automatisch en stevig. Dit boek leert Unix, met name Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript en een aantal nuttige softwarepakketten voor Python -achtige verzoeken, evenals nuttige Bash -software zoals Git en FFMPEG. Ik zal je ook leren hoe je Cryptocurrency automatisch kunt verhandelen en betalingen moet doen in cryptocurrency of van reguliere betaalpassen, terwijl je zelfs je bezoekers een deel van je inkomsten betaalt als je ervoor kiest om dit te doen. Ik zal u leren hoe u ook via advertenties geld kunt verdienen met uw website, hoe u uw app voor zoekmachines kunt klaarmaken en het snel kunt maken, gerangschikt in de eerste rangorde voor wat uw klanten zullen zoeken om u te vinden, en zo veel mogelijk gemeenschappelijke zoekopdrachten te rangschikken. Ik zal u leren hoe u uw software kunt verkopen, adverteren, klanten aanspreken die op zoek zijn naar uw services en een naam voor uzelf op internet maken via wegen die al bestaan, zijn goedkoop en werken goed. Ik zal u leren hoe u uw gegevens kunt opslaan op cloudcomputers die voor u werken en uw gegevens goedkoop opslaan, hoe u een website kunt plannen en bouwen die doet wat uw gebruikers willen en wat u wilt, en hoe u uw gebruikers betrokken kunt houden door uw site een tik weg te nemen op hun telefoons met meldingen, e -mail, sms -berichten, telefoontjes, telefoontjes, telefoontjes, telefoongesprekken en meer mogelijkheid om uw gebruikers weer te geven aan uw website. Dit boek zal zich richten op de bruikbaarheid van het publiceren en distribueren van media in grote hoeveelheden, van tekst tot foto's tot video's tot audio, een goede indruk maken op eindgebruikers (uw klanten) en uzelf op elke manier verkopen die u doet om een website te maken, een app die representatief is voor u en u, en maakt u, uw software en uw bedrijf op de best mogelijke manier. Je leert ook een paar tips en trucs van mij, van het coderen van tips, praktische ijdelheid zoals make -up en fotografie, modellering en acteren, en meer, wat belangrijk zal zijn om jezelf en uw bedrijf af te beelden in het best mogelijke licht met behulp van alle tools die u beschikbaar maakt terwijl u evenveel content nodig hebt als u een gezonde balans hebt om uw software te brengen om uw software te bewerkstelligen met geen meer inspanning, werk, werk, of geld, werk, werk, of geld, werk, werk dan nodig. Dit boek wordt "praktisch genoemdWebgebaseerd diep leren en beveiliging bij voorbeeld "Om een reden: het gaat over leren coderen, specifiek voor het web, specifiek met een focus op beveiliging, vanuit een praktisch standpunt, met voorbeelden van werkende code die de praktische doelen bedient in de tekst. Verbetering, beeldtiteling en andere taken zoals voorspellingsstatistieken afkomstig van afbeeldingen, zoals de aard van de afbeelding als een authentieke, computer-overgedragen afbeelding, of een optische kopie (een foto van een afbeelding of afgedrukte foto). Face. Iedereen die software bouwt die onberispelijk veilig is, heeft enig idee van wat dit impliceert. Software is inherent onzeker omdat de apparaten en accounts die we gebruiken om deze te openen niet altijd tot onze beschikking zijn, ze kunnen in handen zijn van iedereen met slechte intentie voor de software en kunnen daarom een risico vormen voor de software zelf. Dit is iets van de focus van dit boek. Een netwerkcomputer is standaard beveiligd met een lange sleuteltoken, genaamd en SSH of Secure Shell -sleutel, en is anders het best beveiligd met een webserver, omdat de webserver de open toegang biedt en de status van de kunstbeveiligingshulpmiddelen op de server zelf. De webserver heeft toegang tot de webbrowser van de gebruiker, wat misschien wel het krachtigste deel van het apparaat van de gebruiker is, omdat het de plaats is waar de gebruiker toegang heeft tot netwerksoftware. Deze toolkit kan tekst weergeven, de webpagina's die u ziet en kan ook afbeeldingen, audio en video opnemen (zoals een foto van een gezicht of een status -ID), kan lezen en schrijven naar Bluetooth -radio -apparaten en kunnen lezen en schrijven naar bijna veld transponder tags, goedkope sleutelkaarten, fobs, stickers, ringen, ringen, ringen, ringen en zelfs chip -implanties met unieke serie die wordt gelezen en getalateerd door een websites. Met behulp van alle tools tot uw beschikking, met dit boek zult u uzelf uitrusten met de kennis om een veilige website te bouwen, en over het algemeen een veilig netwerk computersysteem dat voor u werkt, uw bieding doet en uiterlijk en voelt
Waar te beginnen: U bent van harte welkom om de sectie over te slaan waarmee ik dit boek begin, of een andere sectie, tot de exacte code die u nodig hebt, vooral als u ervaring hebt met codering voor of een van de bovengenoemde tools die ik in dit boek in detail zal beschrijven en use cases en praktische voorbeelden daarvan zal documenteren. Als je geen ervaring hebt met het schrijven van code, raad ik je ten zeerste aan al dit boek te lezen, en raad je vooral aan de vorige secties te lezen, om ervoor te zorgen dat dit boek geschikt is voor jou. Als dit boek niet geschikt is voor u, overweeg dan om het aan een vriend of familielid te schenken die misschien geïnteresseerd is in het leren over webontwikkeling, en overweeg zelfs te overwegen het terug te lenen en van hen te leren om de gaten in te vullen waar ik u als leraar faalde, of andere leraren deden voor mij. Begin waar u wilt, elk deel van dit boek zal nuttig zijn als u van plan bent een nuttige app te bouwen en bedenk dat de beste apps zijn gebouwd met de eindgebruiker in gedachten: ken uw klant. Nu ken je me, je kent dit boek en je bent klaar om te beginnen. Om te beginnen, pak je een computer (zelfs de goedkoopste laptop van een box -winkel, Amazon of een oude desktop werkt en zet hem op een manier die voor jou werkt.
Hoe dit boek te lezen: Tekst gemarkeerd, geeft aan dat de tekst in een opdrachtprompt hoort, waar u de code die u uitvoert, schrijft. De opdrachtprompt is zwaar op het toetsenbord gericht en vereist weinig om niet te klikken, uw workflow te versnellen en dingen gemakkelijker te maken.
Aan de slag: Laten we erin duiken. We beginnen met het bouwen van code op een lokale machine en beginnen zonder een website te bouwen die is verbonden met internet. Dit is veiliger om mee te beginnen, kost niets en is gemakkelijk voor u. Afhankelijk van uw besturingssysteem zal het in een bash -shell gaan een beetje anders zijn. Voor Mac OS raad ik aan om op dit moment een virtuele machine te installeren, omdat u de meeste compatibiliteit krijgt met een virtuele machine. Verschillende providers zoals VirtualBox en Paralells kunnen een virtuele machine voor u uitvoeren, hoewel het ook mogelijk is om Ubuntu rechtstreeks op de machine te installeren, als u liever een native omgeving gebruikt die wordt aanbevolen om een snelle, gestroomlijnde ervaring te creëren. Als u Linux of Windows gebruikt, die ik aanbeveel, moet het vrij eenvoudig zijn om een project te maken. Open uw terminal, pas de maatstaf aan zoals u wilt en begin met het volgen van stap 2. Als u Windows gebruikt, volg dan stap 1.
Stap 1: - alleen Windows -gebruikers Open de opdrachtprompt in Windows als beheerder en type wsl –stall
Stap 2: - Ga hier verder of sla stap 1 over als u Windows geen Windows gebruikt In een open terminal (afhankelijk van uw besturingssysteem, Ubuntu genaamd in Windows, Terminal in Mac of Linux, of een vergelijkbare naam), begint u met het maken van een project. We doen dit met het MKDIR -opdracht, dat een map creëert. Als u een map moet maken om uw project op te slaan, die wordt aanbevolen, gebruikt u de CD -opdracht om te wijzigen in de map en en en
CD/PATH/TO/DIRECTORY - Het pad is de mappen (bestanden) die voorafgaan aan uw bestemmingsmap, uw standaardpad is ~ of/home/gebruikersnaam (waarbij gebruikersnaam uw gebruikersnaam is). Typ CD of CD ~ om te wijzigen in de standaardmap ~ MKDIR Voorbeeld - Vervang "Voorbeeld" door de naam van de map
Nu heb je een werkmap voor je project. Omdat het zo belangrijk is om deze map te laten opslaan voor het geval u moet overschakelen naar een andere machine of de code die u schrijft moet implementeren, zodat het klaar is voor het web, zullen we een script bouwen om uw directory in de volgende stappen te ondersteunen. Maar het bouwen van een script kost een beetje code en code moet worden geautomatiseerd om zo nuttig mogelijk te zijn. Laten we dus een script bouwen om eerst scripts te bouwen. Laten we beginnen met het maken van het script en het uitvoerbaar maken. We zullen Sudo, Chmod en Touch hiervoor gebruiken en het script "Ascript" noemen.
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Nu hebben we het script gemaakt, het uitvoerbaar gemaakt en zijn we klaar om het te bewerken. Nano is een teksteditor waarmee u tekst kunt bewerken zonder te klikken, wat veel eenvoudiger is dan het gebruik van een grafische gebruikersinterface. Gebruik Nano en vervolgens het pad naar het bestand om een bestand met nano te bewerken. Om een script te maken dat een script maakt, is het redelijk vergelijkbaar met het maken van ons script in de eerste plaats. We zullen dezelfde code gebruiken als hierboven, ter vervanging van de naam van het script, "Ascript" door een argumentparameter, $ 1. Hierdoor kunnen we het script aanroepen door eenvoudig Sudo Ascript Newscript te typen, op welk moment we elk nieuw script kunnen maken door "Newscript" te vervangen door de naam van uw script. De code in Nano zou eruit moeten zien als:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
En om Nano te sluiten, kunnen we de besturingstoets ingedrukt houden en op X drukken, dan y om aan te geven dat we het bestand opslaan en rendement raken. Nu in plaats van deze drie opdrachten te typen om een script te bewerken, kunnen we sudo ascript AScript typen om het script opnieuw te bewerken. Dit werkt! En elk nieuw script kan eenvoudig worden uitgevoerd door het in de shell aan te roepen. Laten we ons werk nu opslaan: laten we een back -upscript schrijven om ons nieuwe script op te slaan en het vervolgens te ondersteunen in onze projectmap, terwijl het ook een back -up van het back -upscript back -up maakt.
sudo ascript backup
Nu, in Nano:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Waar/pad/naar/directory is het pad naar het project dat je hebt gemaakt met MKDIR. Later zullen we leren hoe we dergelijke herhaalde paden kunnen kopiëren met een lus en een lijst, die minder code is, maar laten we het voorlopig eenvoudig houden en een paar regels hebben. Sla het bestand op om dit script uit te voeren en back -up van uw code in nano met controle+x, y en retourneer en typ de onderstaande in uw shell
backup
Als u überhaupt wordt gevraagd voor een wachtwoord tijdens het lezen van dit boek en het volgen van de shell, voer dan uw gebruikerswachtwoord correct in, u hebt drie pogingen voordat u de opdracht opnieuw moet uitvoeren. U kunt de pijlen op en neer gebruiken om opdrachten te herstellen en te bewerken, als u alles twee keer moet uitvoeren. Eenvoudig op en neer druk op en neer om een opdracht te selecteren, voordat u de opdracht bewerkt met de rechter, linker pijlen en verwijderde toets en toetsenbord en het uitvoeren met retour.
Gefeliciteerd! Je bent erin geslaagd om een geweldig back -upscript te maken dat twee belangrijke shell -scripts in je werkmap maakt. We kunnen de dingen later verplaatsen naarmate het project groter wordt, maar dit werkt voor nu. Laten we verder gaan met een back -up in de cloud, we zullen GitHub hiervoor gebruiken (hoewel er nog tal van andere Git -oplossingen zijn voor back -up, ze zijn allemaal over hetzelfde.) Git is een waaringscontrolesoftware waarmee u een back -up kunt maken van bewerkingen voor uw software terwijl u ze naar een server maakt, terwijl u ook in staat bent om hele kopieën van uw software achter een wachtwoord of sleutel te downloaden. Het is een belangrijke rol bij het opslaan van uw software, vooral omdat we migreren naar beveiligde Linux -instanties die soms breken wanneer een enkele regel code mislukt, waardoor u wordt vergrendeld terwijl uw code mogelijk niet wordt ondersteund als u geen kans krijgt om deze automatisch te ondersteunen, wat we zullen dekken.
Als u op dit moment nog geen Ubuntu -virtuele machine gebruikt, raad ik op dit moment aan dat u een Ubuntu -virtuele machine gebruikt, omdat het uw leven gemakkelijker zal maken bij het installeren van alle benodigde pakketten om een werkende website te bouwen en de diepe leerbewerkingen op uw computer te preferent. We zullen de code in de nabije toekomst naar een webserver verplaatsen, maar we willen ervoor zorgen dat er minstens een paar beveiligingslagen achter onze webserver zijn die bestand zijn tegen phishing en een aantal Linux -pakketten gebruiken om dit te doen. Als u nog steeds Mac OS wilt gebruiken, bent u van harte welkom om de benodigde pakketten online te zoeken en te installeren, maar er zijn mogelijk geen alternatieven voor elk pakket dat dit boek of serie zal behandelen.
Laten we een paar opdrachten toevoegen om ons werk te plegen met het back -upscript door de opdracht Sudo ASCRIPT -back -up uit te voeren.
# …
Breng nogmaals de controle van X om op te slaan.
Nu moeten we eenmalige configuratie uitvoeren voor dit project. Omdat het binnenkort een GIT -project zal zijn, hoeven we niet elke commando te typen telkens wanneer we vanuit een Git -repository worden geïmplementeerd, maar we zullen dit onder de knie krijgen wanneer we onze implementatievaringen schrijven. Laten we ervoor zorgen dat we ons in de juiste map bevinden en de GIT -repository initialiseren en SSH -toetsen genereren.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Nadat we SSH-keygen hebben getypt, moet de nieuwe sleutel worden opgeslagen in de huizenmap onder een map genaamd .ssh. Het wordt id_rsa.pub genoemd. Laten we deze sleutel vinden en kopiëren. Om het te zien,
cd ~
cat .ssh/id_rsa.pub
Kopieer de tekst die wordt geretourneerd door de laatste opdracht en maak een account aan bij uw GIT -provider (idealiter GitHub), voordat u de SSH -toets aan uw account toevoegt. Zodra u een account hebt, klikt u op het menu Rechtsboven en voert u instellingen in, voordat u uw SSH -toets toevoegt in SSH- en GPG -toetsen onder toegang in het menu. Selecteer een SSH -toets toevoegen en voeg de uwe toe door deze in te plakken en een titel te geven, voordat u opslaan en terugkeren naar GitHub om een nieuwe repository te maken. Dit is vergelijkbaar voor andere GIT -providers, u moet hun documentatie lezen. Geef uw repository in de nieuwe repository -configuratie een beschrijvende naam en beslis of u deze wilt publiceren, en zorg ervoor dat u nog geen bestanden voor opname configureert. Nadat de repository is gemaakt, kopieert u de kloon met SSH -URL en plakt u deze in de volgende opdracht.
git remote add git://… (your remote URL)
Nu kunt u teruggaan naar uw repository met CD, u zult hiermee bekend zijn. Probeer nu uw back -upscript met back -up
Geweldig! Nu kunnen we echt coderen. Laten we Django installeren nu we een goede greep hebben op bash en git. Django laat ons onze software automatisch een back -up maken, Bash kan dit ook doen, maar Django moet een eenvoudiger veiligere implementatie hebben (het kan gemakkelijker worden uitgeschakeld en geconfigureerd).
Om software in Ubuntu te installeren, zullen we de sudo apt-get-opdracht gebruiken. Laten we eerst de software bijwerken en upgraden die we al hadden. Dit kan worden gedaan met sudo apt-get update en sudo apt-get-upgrade -y. Laten we vervolgens Python en onze virtuele omgeving, de thuisbasis van onze code, installeren met de volgende opdracht: sudo apt-get install python-is-python3 python3-venv
Dit is alles wat je nodig hebt om met Django aan de slag te gaan in termen van software -installaties in de Ubuntu -instantie. Voor Windows en Linux zou dit vrij eenvoudig moeten zijn, maar voor Mac wilt u misschien een virtuele machine en Linux erop installeren met een gratis of betaalde virtuele omgeving zoals VirtualBox of Paralells Desktop en de bovenstaande stappen opnieuw te creëren om een Ubuntu -omgeving in te stellen. Ubuntu is in dit geval van cruciaal belang omdat het de software is die de websites uitvoeren en hiermee websites kunnen hosten met alle bovengenoemde software.
Laten we in de Django graven.
Opnieuw in onze map, met CD:
python -m venv venv # Creëert de virtuele omgeving waar code wordt opgeslagen
source venv/bin/activate # Activeert de virtuele omgeving
django-admin startproject mysite . # Waar Mysite het project is dat ik begin in mijn huidige map.
Django laat ons net op weg gaan, omdat Django de webserver host en alles doet wat we nodig hebben om een eenvoudige lokale website in gebruik te nemen. Nu we Django hebben geïnstalleerd, laten we de instellingen een beetje bewerken om het te laten werken hoe we nodig zijn. Laten we eerst een nieuwe app maken
python manage.py startapp feed
U zult merken dat de eerste app feed wordt genoemd. De app moet worden genoemd wat u maar wilt, en we zullen nieuwe apps maken, maar de naam van elke app moet consistent zijn telkens wanneer de app in de code wordt verwezen. Om een nieuwe app toe te voegen, zullen we altijd de instellingen.py in de andere map bewerken, de app die is gemaakt, genaamd in StartProject, hierna app. Nano gebruiken,
nano app/settings.py
Zoek in de instellingen Installed_Apps en scheid de [] in 3 regels. Voeg 'feed' of de naam van uw app met vier spaties op de lege middellijn toe. Dit gedeelte van de instellingen.py moet eruit zien als:
INSTALLED_APPS = [
'feed',
]
Voordat we het vergeten, laten we testen dat Django werkt. Met behulp van de opdracht python management.py runserver 0.0.0.0:8000, kunnen we de server uitvoeren en vervolgens navigeren in een webbrowser op de computer die de code uitvoert naar http: // localhost: 8000 en een voorbeeldwebpagina zien (deze werkt!) Verhaalt de server met controle C, dezelfde als elke andere opdracht.
Laten we nu een python -code schrijven. Django heeft drie hoofdcomponenten, ze zijn allemaal volledig uitgevoerd door code. De componenten worden model, weergave en sjabloon genoemd en elk bevindt zich respectievelijk op een hoger en lager niveau voordat de webpagina aan de gebruiker wordt geleverd.
Het model is de code die informatie opslaat in de database voor het ophalen, sorteren en renderen.
De weergave bepaalt hoe het model wordt weergegeven, gemanipuleerd en gewijzigd, bijna elke weergave zal een model rechtstreeks gebruiken.
De sjabloon is de HTML -code met wat extra toeters en fluitjes genaamd sjabloontaal. De sjabloon wordt weergegeven door de weergave waar deze gevuld is met pythoncode en context zoals modellen en informatie (usuall strings en gehele getallen) uit de weergave.
Django heeft ook andere componenten, waaronder maar niet beperkt tot:
Instellingen, die de app configureren zoals we hebben besproken.
URL's, die patronen zijn die de gebruiker volgt om toegang te krijgen tot specifieke delen van de webtoepassing.
Formulieren, die bepalen hoe informatie die naar de server wordt verzonden, wordt behandeld en weergegeven aan de database en aan de gebruiker. Dit vormen de basis van het verwerken van informatie aan de serverzijde en kunnen elk type informatie accepteren dat de computer slaat, met name tekstreeksen, nummers en true/false booleans (meestal selectievakjes).
Sjablonen, die HTML -code en sjabloontaal zijn en de kloof tussen Python en HTML overbruggen, wat betekent dat Python -informatie kan worden gediend als HTML -code die iedereen kan openen en een website met beperkte toegang kan beveiligen, terwijl Python -code toegankelijk maakt voor het web en nuttig voor verschillende doeleinden op een externe apparaat die niet in de buurt van de server hoeft te zijn.
Statische bestanden, die meestal JavaScript zijn en de bibliotheken die de server bedient en zijn gekoppeld aan de sjabloon.
Mediabestanden, die de server serveert of extern wordt gehost, of gewoon naar de server worden geschreven voordat ze worden verwerkt en op een andere server (een emmer) voor hosting worden geplaatst.
Middleware, dat stukjes code is die tegelijkertijd met elke weergave worden uitgevoerd en worden beschouwd als "opgenomen" in de weergave.
Contextprocessors, die de context van elke weergave verwerken en worden gebruikt om extra context toe te voegen.
Tests, die valideren dat de gebruiker of het verzoek aan bepaalde vereisten voldoet voordat de weergave wordt weergegeven.
Consumenten, die bepalen hoe websockets omgaan en reageren op communicatie.
Admin, die wordt gebruikt om modellen te registreren, zodat ze in detail kunnen worden gemanipuleerd op de Django -admin -pagina, waar de database kan worden beheerd via een grafische interface.
Selderij, die asynchrone taken definieert, kunnen delen van de Django -code beginnen te draaien voordat ze onmiddellijk doorgaan naar de volgende taak of regel van code.
Django kan veel andere componenten hebben, die we hier in detail zullen bespreken. Er zijn tal van manieren om Django functioneler te maken, websockets toe te voegen, die snel, gestroomlijnde communicatiekanalen, selderij zijn, die asynchrone taken uitvoert, en een veelvoud aan andere stukken software voor het uitbreiden van Django, vooral in de viewfuncties, waar het grootste deel van de code wordt uitgevoerd. Bekijkfuncties zijn belangrijk omdat ze meestal elk stuk code verklaren dat specifiek is voor een specifiek URL -patroon of een gedeelte van de server.
Laten we eerst de view -functies verkennen. Bekijkfuncties beginnen met importcode die in de weergave wordt gebruikt en worden gedefinieerd met behulp van reguliere functiedefinities of klassen. De eenvoudigste weergaven worden gedefinieerd door de functiedefinitie DEF en retourneer een HTTPRESPONE met een basissjabloon. Laten we beginnen met het definiëren van een basisweergave om de tekst "Hallo wereld" te retourneren. Vergeet niet dat elke keer dat u code toevoegt na een instructie zoals def, als u, voor, enz., 4 spaties moet toevoegen voor elk van de voorgaande definities die u op uw functie wilt toepassen. We zullen ingaan op wat elk van deze betekent binnenkort.
Bewerk vanuit de map van onze site het bestand feed/views.py met nano en voeg de volgende regels toe aan het einde van het bestand.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
Django's HttPresponse reageert met een tekstreeks, aangegeven met de opening en sluiting '. Telkens wanneer u informatie doorgeeft aan een functie of klasse, zoals aanvraag of een tekenreeks, moet u haakjes (, openen en sluiten) gebruiken.
Dit is niet alles wat we nodig hebben om onze mening nog te zien. Natuurlijk hebben we de server niet verteld waar de weergave precies is, we moeten nog steeds een pad definiëren waarmee de weergave moet worden weergegeven. Laten we beginnen met het definiëren van een basispad in app/urls.py en we zullen later in padgroepen komen.
Voeg in app/urls.py een regel toe na de importverklaringen na het begin met het importeren van de weergave die we zojuist hebben gemaakt.
from feed import views as feed_views
Laten we nu het weergavepatroon definiëren. Bekijkpatronen hebben drie componenten, de padcomponent, die de server vertelt waar de weergave bestaat binnen de server (het URL -pad dat de gebruiker in de navigatiebalk typt om de webpagina in te voeren), de weergavecomponent waar de weergave is opgegeven, en een vriendelijke naam voor een andere weergave of een andere weergave voor een andere weergave. Het is logisch om dingen op deze manier te doen en flexibel te zijn, omdat uw codebase een steeds veranderende omgeving zal zijn die flexibiliteit en improvisatie nodig heeft om waardevol en gemakkelijk mee te werken. Dit is hoe uw weergave eruit zal zien, u kunt dit toevoegen aan de urlpatterns = [sectie van app/urls.py. Het weergavepatroon wordt gedefinieerd met de drie hierboven beschreven componenten en een functie die pad wordt genoemd. Uw URL -patronen zijn een lijst, dus zorg ervoor dat u elk item er altijd in beëindigt met een komma, omdat dit elk scheidt. Elk item moet ook op een nieuwe regel gaan, opnieuw met vier spaties ervoor, net als de app in instellingen.py. We definiëren het eerste onderdeel van de weergave met een lege stringfunctie om een weergave te maken die op de hoofdmap van de webserver wordt uitgevoerd. Uw urls.py zou er nu zo uit moeten zien:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
Dit is de basis voor het maken van een website met Django die volledig statisch is. Om een meer dynamische website te maken waar we kunnen beginnen met het cachen van informatie, zoals afbeeldingen, video's, audio en meer, moeten we modellen gebruiken, die we vervolgens zullen verkennen. Laten we voor nu onze code controleren en de server uitvoeren. Voer de code op om de code te controleren:
python manage.py check
Als er foutmeldingen zijn, moet u zorgvuldig de wijzigingen in uw app bekijken en kijken of er iets is dat moet worden opgelost, zoals een vreemde of gebrek aan ruimte, een extra teken, een niet -afgesloten string, een typefout, elk per ongeluk verwijderd teken of iets anders. Als je de foutmelding doorleest (als je er een hebt), zou je het pad moeten kunnen zien naar een bestand dat je hebt gemaakt of bewerkt met een regelnummer, dus kijk in dat bestand en regel en kijk of je alles kunt repareren dat er is. Als u het probleem hebt opgelost, voert u de bovenstaande opdracht opnieuw uit. Wanneer uw software klaar is om uit te voeren en werkt, ziet u de uitvoer "Systeemcontrole die geen problemen heeft geïdentificeerd". Nu ben je klaar om te gaan. Voer de server uit met:
python manage.py runserver 0.0.0.0:8000
Open nu een webbrowser en navigeer naar http: // localhost: 8000. In uw weergave zou de tekst moeten worden geretourneerd in de haakjes en citaten van de HTTPRESPONSE -functie. Dit is slechts een fundamenteel voorbeeld, maar als je het zo ver hebt gehaald, begrijp je de basisprincipes van hoe Linux, Bash, Python en Django werken. Laten we dieper ingaan op wat databasemodellering en de kracht van een Python -klasse verkennen bij het opslaan van informatie. Vervolgens beginnen we een grip te krijgen op HTML en CSS voordat we onze site volledig aanbevolen, flexibel en veilig maken met behulp van JavaScript en Machine Learning.
Klassen worden opgeslagen in de modellen.py van uw app. Nano gebruiken, app/modellen.py bewerken en een nieuwe klasse toevoegen. Een klasse wordt gedefinieerd met de klassendefinitie en wordt doorgegeven aan een superclass waar deze van, in dit geval modellen.model. De naam van de klasse komt na de klassendefinitie en na de klassendefinitie A: (colon) wordt gebruikt, voordat de attributen en functiedefinities die aan de klasse zijn gekoppeld hieronder worden aangegeven. Onze klas heeft een ID nodig die we kunnen gebruiken om deze op te halen en uniek te houden, en het heeft ook een tekstveld nodig om wat informatie op te slaan. Later kunnen we een tijdstempel, bestanden, booleans toevoegen (echte of valse definities die onze code kunnen helpen beslissingen te nemen over wat te doen met het model, en kunnen worden gebruikt om het te sorteren), een instantie om het model te binden aan een gebruiker die is aangemeld in de server, en meer. Laten we de onderstaande code uitpakken:
from django.db import models # De import die wordt gebruikt om onze klasse en de attributen te definiëren
class Post(models.Model): # De definitie van onze klas zelf
id = models.AutoField(primary_key=True) # De ID van ons model, een automatisch gegenereerde sleutel waarmee we het model kunnen opvragen, uniek houden en nuttig zijn wanneer we met het model moeten communiceren zodra het is gemaakt.
text = models.TextField(default='') # Het kenmerk onze klasse -opslag, in dit geval, wat tekst, die in gebreke zijn gebleven naar een lege tekenreeks.
Sluit en sla het bestand op zoals we eerder deden om te voltooien.
Er zijn veel andere velden en opties die we zullen onderzoeken wanneer we deze klasse bijwerken naarmate onze app evolueert, maar dit is de basisbehoeften om een app te maken om wat tekst te plaatsen. Dit model werkt echter niet alleen. Zoals eerder beschreven, hebben we een aangepaste weergave en aangepast URL -patroon nodig om dit model te laten werken, en we hebben ook een formulier nodig samen met een sjabloon. Laten we eerst het formulier verkennen.
Om een formulier te definiëren, bewerkt u app/forms.py met nano en voegt u de volgende regels toe. We hebben twee import nodig, onze formulierenklasse, evenals het model dat we hebben gemaakt (feed.models.post), een klassendefinitie vergelijkbaar met het model en een veld samen met een subklasse genaamd meta die het model zal definiëren waarmee de vorm samenwerkt. Het formulier kan ook een initialisatiefunctie hebben die deze instelt op basis van informatie in het verzoek, model of anderszins, we zullen dit later verkennen.
Modelformulieren zijn zo nuttig omdat ze een model kunnen maken of ook een model kunnen bewerken, dus we zullen ze voor beide gebruiken. Laten we er een in vormen definiëren. Py hieronder.
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',)
Dit is de basisprincipes van hoe een vorm en model eruit zien. Dit modelformulier kan worden gebruikt om een bericht te instantiëren of te bewerken, waarbij de tekst die het bevat te wijzigen. We zullen kijken naar de integratie van dit formulier in een weergave hierna. Laten we eerst de migraties maken en de database migreren, zodat onze code kan communiceren met het model wanneer het wordt uitgevoerd. Om dit te doen, voert u de volgende opdrachten uit:
python manage.py makemigrations
python manage.py migrate
Dit duurt een minuut om uit te voeren, maar zodra dit het geval is, kunt u toegang krijgen tot het model in de weergaven, middleware of ergens anders in de software. Laten we doorgaan door te bekijken waar we ons model kunnen zien. Bewerk feed/views.py en voeg de volgende code toe, zoals opgemerkt. U hoeft niets toe te voegen na het # -teken, die code is opmerkingen die worden gebruikt om informatie over de code aan te geven. We beginnen met het importeren van ons model in de weergaven en het toevoegen aan een context waarin we het in een sjabloon kunnen weergeven als een lijst voor weergave. Vervolgens zullen we een sjabloon toevoegen waarbij we het formulier en het model kunnen weergeven met een knop om een nieuw object te maken op basis van het model en het op de server te plaatsen. Dit klinkt ingewikkeld, dus laten we het stap voor stap zetten. Voordat we de weergave voltooien, laten we een sjabloon maken die het model gewoon weergeeft en ervoor zorgen dat we het kunnen zien door een nieuwe post in de shell te maken. Hier is hoe die weergave eruit moet zien:
posts = Post.objects.all() # Vraag alle berichten tot nu toe in de database
Dit ziet er allemaal vrij eenvoudig uit totdat we tot de bodem zijn. Render, de waarde die wordt geretourneerd door de functie in plaats van in een HTTP -reactie zoals het vorige voorbeeld, neemt altijd een verzoek als de eerste invoer, accepteert een context (in dit geval de berichten in de database), die nu in de sjabloon kan worden weergegeven, en retourneert de sjabloon die in de functie is gedefinieerd. De sjabloon wordt een HTML -document met een beetje een taal genaamd Jinja2, die Python -informatie naar de HTML maakt.
Om te beginnen met het maken van sjablonen, maak je twee mappen in feed.
mkdir feed/templates
mkdir feed/templates/feed
Bewerk vervolgens een sjabloon in de bovenstaande map, feed/sjablonen/feed en voeg de code toe voor dit voorbeeld. Laten we eens kijken naar de sjabloon voor dit voorbeeld.
Dit is een heel eenvoudige sjabloon. Het definieert het openen en sluiten van HTML -tags, een documenttype -tag, een body -tag met een legendetitel, een break -tag die een kleine lijn over het scherm toevoegt, en een voor lus die elk bericht in de lijst met berichten weergeeft als paragraaf in de sjabloon. Dit is alles wat nodig is om berichten weer te geven, maar er zijn er nog geen in de database. Laten we wat maken met de shell. We kunnen de shell uitvoeren met management.py
python manage.py shell
Laten we nu ons postmodel importeren
from feed.models import Post
Vervolgens zullen we een eenvoudige post maken met een string en de shell verlaten. De string kan alles zijn, zolang het geldige tekst is.
Post.objects.create(text='hello world')
exit()
Ten slotte moeten we een URL -patroon aan onze feed toevoegen. Omdat onze feed -app meerdere URL's gebruikt en we de bestandsgroottes klein willen houden, laten we een lokale urls.py maken in onze feed -app die er zo uitziet:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
We zullen ook de urls.py in de basis -app moeten bewerken, wat we ook besloten het te noemen, dit was de eerste directory die we hebben gemaakt. Bewerk app/app.py en voeg het volgende toe aan de URL -patronen
from django.urls import include # bovenaan
# ... vorige code hier
Wanneer we de server nu uitvoeren met python management.py runserver, zien we de pagina die we hebben gemaakt omdat we het model, de weergave en het url -patroon hebben, samen met items in de database. Laten we vervolgens het formulier implementeren dat we hebben gemaakt en beginnen met het maken van onze eigen berichten. Maar voordat we te veel code schrijven, laten we een back -up maken met het script dat we eerder hebben geschreven, back -up. Voer dit script in de shell uit, wacht een paar ogenblikken en alle code wordt ondersteund door onze GIT -repository.
backup
Het implementeren van het formulier is relatief eenvoudig. We zullen ons formulier importeren, een post -aanvraaghandler toevoegen aan de weergave en het bericht opslaan in de database voordat we naar dezelfde weergave worden gericht. We kunnen de omleidingsfunctie gebruiken die we al hebben geïmporteerd, en een andere functie genaamd Reverse om de URL voor het weergavepatroon te krijgen. We zullen dit opvragen met de tekenreeks 'Feed: Feed' omdat de naamruimte van het opgenomen patroon feed is en de weergave ook Feed wordt genoemd.
posts = Post.objects.all() # Vraag alle berichten tot nu toe in de database
if request.method == 'POST': # Behandel het postverzoek
form = PostForm(request.POST) # Maak een exemplaar van het formulier en sla de gegevens op
if form.is_valid(): # Valideer het formulier
form.save() # Sla het nieuwe object op
return redirect(reverse('feed:feed')) # Direct door naar dezelfde URL met een GET -verzoek
'form': PostForm(), # Zorg ervoor dat u de vorm in de context doorgeeft, zodat we het kunnen weergeven.
Nu moeten we de sjabloon bijwerken om rekening te houden met het nieuwe formulier. We kunnen dit doen door de
Laten we dit afbreken. Er is een nieuwe formulierklasse, een token, het formulier zelf en een verzendknop. Vrij eenvoudig, maar als we er naar kijken, willen we het misschien beter laten lijken. Het werkt, we kunnen nieuwe berichten met het formulier plaatsen en ze zijn nu opgeslagen in de database. Er zijn hier een paar dingen aan de hand. We gebruiken HTML -tags om te verklaren dat het document een HTML -document is, we gebruiken een sjabloon -tag ({ %… %}) om het token voor het formulier weer te geven, en een andere, {{…}} om het formulier weer te geven. We hebben ook een lus om de tekst weer te geven met behulp van bloktags en een sjabloon -tag. Bloktags zijn echt belangrijk omdat we kunnen definiëren hoe secties van de sjabloon worden weergegeven, en sjabloontags vormen de basis van hoe we variabelen in onze code plaatsen.
Nu moeten we onze app er beter uit laten zien, want voor nu ziet het er echt eenvoudig uit. We kunnen dit doen door CSS te gebruiken, inline, of in klassen die aan elk object in het document zijn gekoppeld. CSS is echt leuk omdat het alles op de pagina vertelt hoe het eruit moet zien en het er echt goed uit kan laten zien. Er zijn een paar bibliotheken die dit kunnen doen, maar mijn persoonlijke is bootstrap.
Bootstrap kan worden gedownload van hun website,getBootstrap.com/. Eenmaal daar, druk op de knop om de installatiedocumenten te lezen en kopieer de code uit de sectie Inclusief innemen via CDN. U hebt deze code bovenaan uw HTML -document nodig, in een tag genaamd Head. Laten we ook doorgaan en een basissjabloon maken, zodat we deze links niet in elke sjabloon opnieuw hoeven te maken.
Maak een nieuwe map genaamd sjablonen met MKDIR -sjablonen en bewerk vervolgens sjablonen/base.html.
Het zou er zo uit moeten zien:
Zorg ervoor dat u de CSS en JavaScript, de .css- en .js -bestanden kopieert, omdat we het JavaScript nodig hebben om onze site in de toekomst functioneler te maken.
Laten we nu terugkeren naar de bash -shell en een snelle opdracht uitvoeren. Vergeet niet dat als u ooit toegang moet krijgen tot de virtuele omgeving, de bron Venv/Bin/Activeer Typ. Hiermee kunt u Python -pakketten lokaal installeren op een manier waarmee Django toegang heeft. Om onze formulieren te geven die worden gegenereerd door Django Bootstrap -klassen, zullen we een Python -pakket gebruiken genaamd Crispy Forms. We kunnen dit downloaden met de volgende opdracht
pip install django-crispy-forms
Zodra dit is geïnstalleerd, voegt u het toe aan de instellingen.py
# … Vorige code hier
Nu, terug in onze toevoersjabloon, kunnen we enkele dingen verwijderen. Laten we het begin en einde van het document verwijderen en vervangen door overerving uit onze basissjabloon, met behulp van Extends en de blokdefinitie. We zullen ook een sjabloonfilter importeren met load en een sjabloonfilter aan het formulier toevoegen. Laten we ten slotte een bootstrap -klasse toevoegen aan de knop op het formulier om deze meer op een knop te laten lijken. Dat zou er zo uit moeten zien:
Mooi! Dat is al nogal wat code. Vervolgens moeten we het testen en ervoor zorgen dat we kunnen zien dat alles er mooi uitziet, en er ook zeker van dat alles goed werkt. Voer de server uit volgens eerdere instructies en zorg ervoor dat de site er uitziet en goed werkt. Geweldig werk! U bent klaar om door te gaan naar de volgende stap, waarin we gebruikersaanmeldingsfunctionaliteit toevoegen met vergelijkbare URL's, formulieren, weergaven en sjablonen. De basissjabloon is belangrijk, en we zullen deze blijven wijzigen en wijzigingen aanbrengen als dat nodig is, maar laten we ons nu concentreren op het veiliger maken van onze site, door gebruikers in staat te stellen in te loggen met een gebruikersnaam en toegangscode, en uiteindelijk nog belangrijker informatie die uw app beveiligd houdt en uw eigen account alleen toegankelijk door u.
Om dit te doen, moeten we het gebruikersmodel gebruiken ingebouwd in Django. Het gebruikersmodel is een databasemodel, zoals onze post, dat kan worden weergegeven om een gebruiker op de website te loggen. In de toekomst, voordat we de site op internet implementeren, zullen we dit model uitbreiden met andere modellen die eraan worden toegeschreven en extra beveiligingsmaatregelen bouwen voor de login die bestand zijn tegen phishing. We zullen beginnen met het gebruik van enkele ingebouwde inlogformulieren die Django biedt. Laten we eerst een nieuwe app maken die we zullen gebruiken om de sjablonen en weergaven voor de Basic Login -pagina weer te geven. We zullen ook andere apps maken om de voortdurende inloguitdagingen weer te geven om de app te beveiligen, waaronder een pincode, gezichtsherkenning, nabije veldcommunicatie, externe apparaten, multi -factor authenticatie en vingerafdrukherkenning.
We hebben het al gehad over het starten van een app. Van onze directory, binnen de virtuele omgeving, pass beheren.py deze argumenten
python manage.py startapp users
Nu moeten we een directory hebben voor de nieuwe app. Laten we beginnen met het maken van een weergave in die map die overeenkomt met de gebruikersaanmelding. Django heeft ingebouwde weergaven voor gebruikersaanmeldingen, maar deze zijn niet geschikt voor ons omdat we een aangepaste weergave nodig hebben, die bij voorkeur met een definitie wordt gedaan.
In deze weergave zullen we beginnen met het controleren van een postverzoek, PASS -verzoek. Post naar een Loginform geïmporteerd vanuit Django, de gebruikersaccount verifiëren en de gebruiker inloggen voordat u deze naar onze feed -app omgeleid.
Voeg in gebruikers/views.py de volgende code toe
username = request.POST['username'] # Haal de gebruikersnaam en het wachtwoord uit het postverzoek
password = request.POST['password'] # Authenticeer de gebruiker
Dit is alles wat je nodig hebt voor een basisaanmeldingsweergave. Laten we nu een formulier voor de weergave maken door de basissjabloon uit te breiden. We beginnen met het maken van een nieuwe map voor sjablonen in de map Gebruikers.
mkdir users/templates
mkdir users/templates/users
Nu moeten we gebruikers/sjablonen/gebruikers/login.html kunnen bewerken. Terwijl we bezig zijn, maken we een sjabloon om de gebruiker ook aan te melden.
nano users/templates/users/login.html
Nu, in de sjabloon,
Dit is de basisprincipes van een inlogsjabloon. Het is echt net als de andere sjabloon in structuur, maar het ziet er een beetje anders uit wanneer het wordt weergegeven. We kunnen deze code kopiëren om een andere zeer vergelijkbare sjabloon te bouwen genaamd Register.html, waar we de formulering zullen wijzigen en een nieuw formulier gebruiken dat we bouwen. Laten we eerst de sjabloon maken. Gebruikers/sjablonen/gebruikers/register.html bewerken en de volgende code toevoegen:
Laten we nu een formulier bouwen voor onze gebruikersregistratie en teruggaan naar de weergaven voordat we onze gebruikersaanmeldingen upgraden met een model. We zullen dit formulier fundamenteel maken om mee te beginnen, maar nemen in de toekomst meer details en beveiligingsfuncties op, zoals overeenkomsten en Captcha. Bewerk de formulieren met nano -gebruikers/formuliers.py en voeg de volgende code toe.
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']
Dus we hebben hier nog een vorm, wat redelijk eenvoudig werkt. Het is een gebruikersregisterformulier met een gebruikersnaam, e -mail en wachtwoord, evenals een bevestigingswachtwoordveld. Merk op dat dit formulier de reguliere vorm niet uitbreidt. Eén veld is precies hetzelfde gedefinieerd en de klasse meta definieert het model dat de vorm overeenkomt met de rest van de informatie die naar de vorm wordt geschreven. Het meeste hiervan bestaat al in Django's ingebouwde UserCreationForm, dus we zullen dat gebruiken als basis voor de klasse (doorgegeven in de haakjes).
Vervolgens zullen we de weergave onderzoeken om een gebruiker te registreren, nu we een formulier en een sjabloon hebben. Dit is een modelform, net als die in de nieuwe postweergave. Gebruikers/views.py bewerken en de volgende code toevoegen:
# … Importeren
Dit is alles wat we nodig hebben om een gebruiker te laten registreren, maar we moeten meer informatie hebben. We willen weten hoe de gebruiker zich heeft geregistreerd, hoe laat ze voor het laatst op de site waren, wat informatie over hen, zoals een biografie, tijdzone, enz. Ook moeten we ons feedmodel bijwerken, post, om rekening te houden met het gebruikersmodel en een toeschouwingsberichten aan elke gebruiker. Om dat te doen, zullen we de modellen.py bijwerken in beide apps. Laten we beginnen met het bewerken van het voedingsmodel. Het zou er nu zo uit moeten zien:
from django.db import models # … Importeren
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Voeg deze regel toe
Let op de tweede regel die aan het bestand is toegevoegd. Dit is een buitenlandse sleutel, die elk bericht per bericht per bericht toeschrijft, zodat we ervoor kunnen zorgen dat we de berichten op een gebruikers-per-gebruikersbasis opslaan en er kan geen bericht worden gemaakt zonder deze aan een gebruiker toe te schrijven. We definiëren deze buitenlandse sleutel met de klasse die het vertegenwoordigt, een verwijderen van argument om ervoor te zorgen dat berichten worden verwijderd met gebruikers, nul- en lege argumenten om ervoor te zorgen dat we de gebruiker indien nodig kunnen verwijderen en om tegemoet te komen aan het ontbreken van een gebruiker op berichten die we al hebben gemaakt, en een gerelateerde naam, die we kunnen gebruiken om te verwijzen naar de postobjecten die de gebruiker maken. Deze gerelateerde naam, in tegenstelling tot Post.Author, de auteur van het bericht, geeft ons de gebruiker die het bericht zelf heeft gepost. We kunnen nu de berichten krijgen die een gebruiker heeft gemaakt door gebruiker.posts.all () of author.posts.all ().
Laten we nu onze aanmeldingen veerkrachtiger maken. We kunnen onze site al veel minder kwetsbaar maken voor phishing door eenvoudigweg het aantal keren te beperken dat we een inloggen op de site toestaan, dit is vrij eenvoudig. Laten we ook eerder wat informatie over elke gebruiker opslaan terwijl we onze app blijven ontwikkelen. Gebruikers/modellen.py bewerken, voeg de volgende code toe.
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='')
Merk op dat dit model redelijk vergelijkbaar is met het postmodel. We hebben een extra import, tijdzone, waarmee we standaardinstellingen kunnen instellen op de datetime -velden, en we hebben ook een Characterfeild en Textfield zoals het bericht. Het gebruik van al deze tijdstempels helpt ons om de site te beveiligen en het gebruik ervan te begrijpen, en de tekstvelden laten ons informatie over elke gebruiker of auteur op de website weergeven. Het OnetoOneField moet de enige kleine overweging zijn, het gedraagt zich precies hetzelfde als een Foreockey, maar met slechts één per daaropvolgend model. Op deze manier heeft de gebruiker slechts één profiel, terwijl hij misschien veel berichten heeft.
Laten we nu onze login verbeteren en weergaven voor het profiel registreren. Bewerk eerst gebruikers/views.py en focus op de registerweergave:
# … Importeren
Profile.objects.create(user=user) # Zorg ervoor dat u deze regel toevoegt om een profiel voor de gebruiker te maken
Dit maakt eenvoudig een profiel voor de gebruiker, zonder een van de informatie in te vullen. Nu willen we ervoor zorgen dat het gebruikersaccount niet te vaak kan worden ingelogd, of in ieder geval niet te vaak worden geprobeerd, dus laten we de inlogweergave bijwerken.
# … Importeren
if user and user.profile.can_login < timezone.now(): # Merk op dat we nu controleren of de gebruiker kan inloggen
else: # Als de login niet succesvol was,
user = User.objects.filter(username=username).first() # Dit is het deel waar we het gebruikersprofiel bijwerken
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Dus ze kunnen niet opnieuw inloggen voor een paar seconden
Dit is het fundamentele fundamentele beveiliging. Zorg ervoor dat de site niet kwetsbaar is voor iemand die gewoon elke mogelijke wachtwoordcombinatie probeert, of zelfs een paar daarvan tegelijkertijd. Dit zal niet frustrerend zijn voor de gewone gebruiker die hun toegangscode kent en gewoon inlogt op een paar apparaten, maar het zal talloze phishing -robots uit de app houden. Merk op dat we een IF -instructie hebben toegevoegd met een variabele, can_login, dat zou een tijd in het verleden moeten zijn en deze bijwerken met elke mislukte login met dezelfde gebruikersnaam. Op deze manier kan een kwaadaardige gebruiker geen wachtwoord nergens zo snel raden. Het aantal seconden in de DateTime.Timedelta () kan ook worden bijgewerkt en de website zal veerkrachtiger zijn en toch iets minder bruikbaar met meer seconden. Ik raad 15 aan om mee te beginnen.
Vergeet niet dat we een back -upscript hebben opgebouwd om ons werk op te slaan, dus laten we doorgaan en een back -up maken van wat we tot nu toe hebben om ervoor te zorgen dat we alles hebben opgeslagen. Voer de opdracht uit:
sudo backup
Nogmaals, dit zal uw werk tot nu toe besparen. Ik raad aan om frequente back -ups uit te voeren om uw werk op te slaan en u wilt misschien zelfs automatisch een back -upopdracht uitvoeren. U kunt dit doen met behulp van een UNIX -hulpprogramma genaamd Cron. Om dit hulpprogramma te activeren, voert u de volgende opdracht uit en voert u uw wachtwoord in:
sudo crontab -e
Als u nog niet optie 1 voor Nano selecteert, moet de teksteditor waarmee u al bekend bent en naar de onderkant van het bestand bladert met behulp van de pijltoetsen. Voeg de volgende regel toe:
0 * * * * sudo backup
Cron gebruikt het formaat minuut, uur, dag van maand, maand, dag van de week, waarbij een * of een nummer vertegenwoordigt wanneer het commando moet worden uitgevoerd. Met behulp van een 0 voor de minuut en * voor de rest van de opties kunnen we een opdracht uitvoeren op de eerste minuut van elk uur aan het begin van de minuut. Hierdoor kunnen we de code automatisch maken. Alle taken van Cron wanneer ze worden uitgevoerd met Sudo Run als root, dus we hoeven niet elk uur een wachtwoord in te typen.
Om het gemakkelijker te maken om onze code te ondersteunen zonder een wachtwoord te gebruiken, laten we het wachtwoord voor onze back -upopdracht uitschakelen. We zullen dit doen door de volgende opdracht uit te voeren en een wachtwoord in te voeren:
sudo visudo
Laten we nu naar de onderkant van het bestand bladeren en een andere regel toevoegen:
ALL ALL=NOPASSWD: /bin/backup
Hiermee kunnen we de opdracht "back -up" als elke gebruiker uitvoeren, zonder een wachtwoord. Het formaat hiervoor is eenvoudig, prefix gewoon de lijn met "all all = nopasswd:/bin/" en eindig met de opdracht, bijvoorbeeld/bin/backup, die bestaat in/usr/bin/.
Laten we nu gaan werken met e -mail. E -mail is echt belangrijk voor websites, omdat het een manier is om een website veiliger te houden, te controleren of gebruikers echte mensen zijn, en zelfs marktproducten of diensten aan klanten. Veel mensen die internet bezoeken, controleren dagelijks hun e -mail en ontvangen allerlei marketingmails over producten en diensten waarin ze geïnteresseerd zijn. Er zijn een paar opties als het gaat om het inschakelen van e -mail op een Django -website, en u bent van harte welkom om te kiezen welke het beste voor u werkt.
Eerst kunt u betalen voor een e -mailservice waarmee u e -mail vanuit uw domein kunt verzenden en minimale code vereist. Er zijn veel services die dit aanbieden, zoals Google Workspace, SendinBlue, MailGun en meer.
Anders bent u goed uit het bouwen van uw eigen e -mailservice op uw server helemaal opnieuw. Ik raad deze optie aan, hoewel het meer code is en mogelijk speciale hosting vereist. U kunt waarschijnlijk niet een e -mailserver starten vanaf uw thuiscomputer, dus laten we doorgaan en de configuratie en code onderzoeken om e -mail te verzenden voordat we een server in de cloud starten en onze eigen mailserver erin maken.
Bewerk eerst instellingen.py met de volgende opdracht:
nano app/settings.py
Waar App de naam is van de app die u hebt gemaakt met StartApp.
Voeg de volgende regels toe:
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)
Zorg ervoor dat u deze wijzigt wanneer u klaar bent om uw app te implementeren, we zullen dit later opnieuw bezoeken. De instelling E -mail_adress moet de e -mail zijn die u wilt verzenden en het wachtwoord (e -mail_host_password) moet worden ingesteld op het wachtwoord dat u voor de server genereert. Ik laad het wachtwoord uit een configuratiebestand om het uit de code te houden met behulp van de volgende logica, boven deze regels in settings.py:
import os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
Vervolgens heb ik een JSON -bestand ingesteld met de configuratie in /etc/config.json met behulp van nano als volgt.
Om het bestand te bewerken:
sudo nano /etc/config.json
Voeg de volgende regels toe:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
We zullen het configuratiebestand blijven bewerken en alle wachtwoorden en toetsen toevoegen die we in de app zullen gebruiken. Laten we voor nu snel onderzoeken hoe we e -mail kunnen verzenden met Python. Laten we eerst een sjabloon maken voor een verificatie -e -mail die we naar onze gebruikers kunnen verzenden en deze in de map Gebruikerssjablonen kunnen plaatsen. Deze sjabloon wordt geschreven in HTML.
nano users/templates/users/verification_email.html
Deze e -mail is vrij eenvoudig. Het neemt een context van een gebruiker, de basis -URL voor de site en een gebruikers -ID en token die worden gebruikt om de e -mail van de gebruiker te verifiëren. Zorg ervoor dat u de basis -URL in instellingen definieert.py voordat we wat Python -code schrijven om de sjabloon weer te geven. Ga je gang en voeg de volgende regels toe aan app/instellingen.py, nabij het begin.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
Uiteindelijk, wanneer uw site klaar is voor internet en u deze implementeert, wilt u uw domein definiëren als de domeinnaam die u koopt om de site te vertegenwoordigen. Dit is de naam die u de NAVBAR typt om toegang te krijgen tot uw site. Voor nu kunt u het domein leeg laten of een tijdelijke aanduiding gebruiken. U wilt ook de site -naam wijzigen in een naam die u uw site wilt geven, naar keuze.
Voordat we e -mail verzenden, laten we een tokengenerator maken, zodat we een accountactiveringstoken kunnen hebben dat nooit verloopt. We kunnen dit doen door een accountactiveringstoken te bouwen en te importeren dat op het volgende lijkt. Bewerk het bestand:
nano users/tokens.py
Voeg de volgende code toe:
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()
Deze basistokengenerator genereert een token dat we de gebruiker in een URL kunnen sturen en de gebruiker kan gebruiken om hun e -mail te verifiëren en hun account te activeren.
Laten we vervolgens kijken hoe u een e -mail kunt verzenden. Gebruik gebruikers/e -mail.py met behulp van nano.
nano users/email.py
Het verzenden van de verificatie HTML -e -mail ziet er zo uit:
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)
Dit is vrij eenvoudig. We importeren de functies die we nodig hebben om de e -mail te verzenden, de e -mail weer te geven met sjablonen en onze instellingen, en vervolgens definiëren we de e -mail met de sjabloonnaam en verzenden deze naar de gebruiker met behulp van een functie. U zult merken dat we de functie niet hebben gedefinieerd om de e -mail te verzenden, send_html_email, dus laten we dit hieronder schrijven hieronder de code die we al hebben toegevoegd aan gebruikers/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()
Dit is een beetje complexer en we zijn nog niet klaar om al deze code uit te voeren. Merk op dat we een UNSUB_LINK definiëren, de link die de gebruiker kan gebruiken om zich af te melden bij onze e -mails. Dit is belangrijk, omdat gebruikers zich moeten kunnen afmelden voor onze e -mails, tenzij ze ze op elk moment willen zien. We voegen ook een tekstalternatief toe aan ons bericht, het HTML -bericht dat is ontdaan van HTML -tags. Ten slotte controleren we of de e -mail verzonden, en als dit niet het geval is, markeren we het profiel van de gebruiker dat hun e -mail niet geldig is.
Laten we teruggaan naar de gebruikersmodellen, zodat we dit allemaal kunnen laten werken. We moeten een functie definiëren om een link naar afmelden te genereren en een Booleaans veld definiëren om te markeren dat de e -mail van de gebruiker niet geldig is.
Voeg eerst de volgende import toe bovenaan gebruikers/modellen.py
nano users/models.py
# …
Laten we vervolgens functies toevoegen aan het gebruikersmodel om het token te maken en het token te controleren dat wordt gebruikt om de e -mail te activeren, evenals het veld om op te slaan of de gebruiker zijn e -mail met succes ontvangt. Voeg in gebruikers/modellen.py opnieuw de volgende code toe aan het einde van het model (ingesprongen code)
# …
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Geldig voor 30 dagen
Dit is vrij eenvoudig, we gebruiken een tijdstempel, wat een basiscryptografietool is, om een token te maken dat na een bepaalde tijd afloopt, en we gebruiken ook een andere functie om te controleren of deze geldig is. We gebruiken deze tokens twee keer, eenmaal om de e -mail te verifiëren, en eenmaal voor een afmeldlink.
Nu we deze hebben, is het laatste werk dat we moeten doen in de opvattingen. Laten we binnen gebruikers/views.py views toevoegen om het e -mailadres te verifiëren en om af te schrijven.
nano users/views.py
Voeg eerst de volgende import toe. Ik heb er een paar extra in gegooid, dus we hoeven later niet meer items te importeren.
from .email import send_verification_email # Zorg ervoor dat u de verzendfunctie van de verificatie -e -mail importeert
Je hebt misschien al een aantal van deze import, maar het doet geen pijn om ze te herhalen. U moet onder andere de verzendende e -mail verzendfunctie importeren, evenals Account_Activation_Token van gebruikers.tokens, onder andere import.
Voeg nu, onderaan het bestand, de volgende code toe:
# mafschrijven ze
# Anders verleid de inlogpagina
# SendWelcomeMail (verzoek, gebruiker)
Dit is veel code. Laten we het afbreken. De eerste functie, schoon en eenvoudig, maft de gebruiker af van de mailinglijst. De tweede functie activeert hun e -mail en u zult merken dat ik een becommentareerde functie, SendWelcomeMail heb toegevoegd. U bent van harte welkom om een e -mailsjabloon en functiedefinitie te gebruiken om een welkome e -mail te verzenden, dat heb ik gewoon nog niet gedaan. De laatste functie waarin ik heb gooide is belangrijk, omdat activerings -e -mails vervallen. Daarom moeten we de activeringsmail enig van de tijd opnieuw verzenden. We kunnen hiervoor een basisformulier gebruiken en de functie aanroepen om de verificatie -e -mail te verzenden. Voordat we dit doen, laten we ervoor zorgen dat het in de eerste plaats wordt verzonden, door een functieaanroep toe te voegen aan de registerweergave. Voeg deze regel toe vlak voor de omleiding in de registerweergave, def register, in gebruikers/views.py.
nano users/views.py
# … (Na) def register (verzoek):
# … (Eerder) omleiden (
U hoeft de eerste en laatste regels niet toe te voegen in dat codefragment, zorg ervoor dat de registerweergave de verificatie -e -mail naar de gebruiker verzendt. Het zou er zo uit moeten zien:
# … Importeren
send_verification_email(user) # Zorg ervoor dat u deze regel toevoegt!
Nu moeten we een formulier toevoegen om de activerings -e -mail te verzenden. Voeg in gebruikers/forms.py het volgende formulier toe:
# … (Imports)
We hebben ook een sjabloon nodig die overeenkomt met dit verzonden e -mailactiveringsformulier. Laten we deze sjabloon toevoegen. Bewerk het bestand:
nano users/templates/users/resend_activation.html
Voeg vervolgens de volgende code toe aan het bestand.
Oef, dat is veel! Wanneer we de code op onze server implementeren, kunnen we HTML -e -mail verzenden en gebruikersaccounts activeren met een klik in de e -mail. We willen misschien ook een eenvoudige welkome e -mail verzenden, dus laten we eens kijken hoe we dat moeten doen. Terug in gebruikers/e -mail.py, voeg de volgende code toe:
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)
Ook hebben we een sjabloon nodig om al deze informatie weer te geven. Op mijn website ziet de sjabloon eruit als hieronder, maar u bent van harte welkom om het te formatteren zoals u leuk vindt.
Merk op dat we geen sluitende body- of HTML -tags hebben, omdat we deze toevoegen wanneer we de HTML -afmelding -link toevoegen. Deze zijn belangrijk, maar we willen ze niet twee keer definiëren.
Dus wat is het volgende? We hebben een lange weg afgelegd. We moeten echt klaar zijn om de site op een server te implementeren. We kunnen de @Login_Required Decorator toevoegen en onze weergaven beveiligen, gebruikersaanmeldingen nemen, conforme e -mail en cache -informatie verzenden, die de basis vormt van wat een website moet doen om relevant te blijven. We voegen een paar meer nuttige functies toe en bouwen vervolgens een basis voor het implementeren van onze code op een externe server, het instellen van een e -mailserver, domeinconfiguratie en filters om onze site veilig en geschikt te maken.
We hebben ook een weergave -weergave nodig, dus laten we dat heel snel toevoegen. Django's ingebouwde wachtwoordresetweergave is verbroken in sommige functies, maar we zullen kijken hoe we onze eigen weergave, e -mailsjabloon, formulieren en URL -patronen kunnen schrijven. Dit is hoe de weergave eruit ziet, in gebruikers/views.py
# ... Importeren
Dit formulier is ingebouwd in Django, maar we hebben een sjabloon nodig om de wachtwoordreset te bevestigen, gebruikers/sjablonen/gebruikers/wachtwoord_reset_confirm.html
We hebben ook een sjabloon om een wachtwoordreset -e -mail te verzenden, met een eenvoudig formulier, in gebruikers/sjablonen/gebruikers/wachtwoord_reset.html
De sjabloon voor de e -mail zelf is eenvoudig, het is een basis HTML -bestand dat een link weergeeft om het wachtwoord te resetten, in gebruikers/sjablonen/gebruikers/wachtwoord_reset_email.html. Django zal dit bestand automatisch interpreteren.
We hebben ook nog twee sjablonen nodig. De eerste is om te bevestigen dat de e -mail is verzonden. Weergaven hiervoor zijn al in Django, dus we moeten ze gewoon aanspreken in de urls.py. Deze sjabloon bevindt zich bij gebruikers/sjablonen/gebruikers/wachtwoord_reset_done.html
En ten slotte, om te bevestigen dat de wachtwoordreset is voltooid, is gebruikers/sjablonen/gebruikers/wachtwoord_reset_complete.html
Nu hebben we URL -patronen nodig voor deze weergaven. Voeg bij gebruikers/urls.py de volgende URL -patronen toe:
# ... eerdere URL's hier
Vier sjablonen, dat is veel! Maar nu kunnen we zeker zijn om het wachtwoord van de gebruiker te resetten wanneer we moeten, allemaal vanuit de webbrowser.
Ik begrijp dat dit veel code is. Als het een beetje over je hoofd lijkt, is dat oké. Je zult verbeteren, je begrip zal verbeteren en je zult snel veel competenter worden met code. Als je helemaal verloren bent, raad ik aan om later terug te keren naar deze software na te hebben gewerkt aan een zelf-leren om online te coderen. Deze zijn meestal gratis om aan de slag te gaan en zullen je door alles begeleiden wat je nodig hebt om succesvol te zijn wanneer je terugkomt naar dit project. Als u het gevoel hebt dat u klaar bent om door te gaan, verder te lezen, dan zullen we de implementatie van uw code naar een externe server behandelen en een e -mailserver instellen, evenals het automatiseren van uw implementatie met behulp van BASH, zodat u altijd een nieuw project kunt instellen met een paar eenvoudige opdrachten.
Het laatste wat we moeten doen voordat we naar een externe server worden geïmplementeerd, is onze site een beetje veiliger maken. U zult merken dat de inlogweergave alleen een gebruikersnaam en wachtwoord nodig heeft, en er is geen multi -factor authenticatie of eenmalige code. Dit is een eenvoudige oplossing en met dezelfde code kunnen we onze site sms -berichten laten verzenden en zelfs reageren op sms -berichten die naar de server zijn verzonden. Om te beginnen gaan we terug naar de gebruikersmodellen en voegen we een tijdstempel -ondertekenaar toe die elke login vertegenwoordigt. We zullen ook een unieke, roterende ID toevoegen aan het gebruikersmodel dat zal worden gebruikt om extra beveiliging aan onze login toe te voegen. De gebruikersmodellen bewerken, gebruikers/modellen.py, voeg de volgende code toe:
# Zorg ervoor dat u de UUID, Timestamp Signer en URL -generator (achteruit) importeert
# Voeg deze code hier toe
# En voeg deze functie toe
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Geldig voor 3 minuten
Zorg ervoor dat uw gebruikers/modellen.py er zo uitziet, naast de reacties (code op de regels met #). Dit afbreken, het is eenvoudig. We hebben een paar import, een tijdstempel, een cryptografisch hulpprogramma dat een veilige code kan genereren en deze kan verifiëren om ervoor te zorgen dat het geldig is, slechts eenmaal wordt gebruikt en niet ouder dan een bepaald aantal seconden. We gebruiken ook een UUID, een unieke identificatie die onze gebruiker identificeert bij het ondertekenen van het token, en in de URL waar het token naar de gebruiker wordt verzonden. We zullen deze basiscryptografie gebruiken om een weerweergave met twee factoren authenticatie te bouwen. Voordat we iets anders doen, laten we de migraties uitvoeren, zodat onze gebruikersmodellen worden bijgewerkt. Voer in de map met management.py de volgende opdrachten uit om de migraties te maken en te voltooien.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Dit is belangrijk omdat elke keer dat we wijzigingen aanbrengen in de modellen, we de tabellen moeten maken en de database moeten bijwerken met standaardwaarden voordat we de modellen daadwerkelijk kunnen gebruiken.
Laten we vervolgens onze inlogweergave improviseren om een secundaire authenticatieweergave om te leiden. Verwijder in gebruikers/views.py de inlogfunctie en leid naar de URL die we zojuist hebben gegenereerd in de gebruikersmodellen.
# … Importeren
if user and user.profile.can_login < timezone.now(): # Merk op dat we nu controleren of de gebruiker kan inloggen
# Verwijder de Auth_Login -functie die hier was
return redirect(user.profile.create_auth_url()) # Let op dat we hier doorgaan naar een nieuwe URL
else: # Als de gebruiker multi-factor authenticatie niet gebruikt, logt u ze gewoon in.
else: # Als de login niet succesvol was,
user = User.objects.filter(username=username).first() # Dit is het deel waar we het gebruikersprofiel bijwerken
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Dus ze kunnen niet opnieuw inloggen voor een paar seconden
Dus dit is vrij eenvoudig, we hebben nu een manier om de Two Factor -verificatieweergave om te leiden wanneer we deze maken. We hebben ook een fallback voor het geval de gebruiker geen telefoonnummer heeft toegevoegd. We zullen een basisweergave toevoegen om binnenkort een telefoonnummer toe te voegen en binnenkort in te loggen met een sms -bericht.
Eerst hebben we een eenvoudige manier nodig om een sms -bericht van onze code te verzenden. Om dit te doen, kunnen we kiezen uit een aantal API's, maar de gemakkelijkste is naar mijn mening Twilio. Ze bieden ook goede prijzen voor kleinere projecten, evenals bulkkortingen. Maak een account aan op twilio.com, vul enkele details over uw project in, koop een telefoonnummer en kopieer uw API -toetsen naar uw instellingen.py. Voeg vervolgens deze code toe onder een nieuw bestand, gebruikers/sms.py.
nano users/sms.py
# Importeer alle benodigde pakketten
# Deze code verzendt de tekst met Twilio
# Een helperfunctie om een nummer te krijgen met zoveel cijfers
# Stuur de tekst om de gebruiker te verifiëren
# Stuur een gebruiker elke tekst met deze functie
# Valideer de code met deze functie
# Valideer de tijd
Zorg ervoor dat u uw instellingen op de juiste manier wijzigt en deze regels toevoegt met uw sleutels:
# Zorg ervoor dat u deze van uw Twilio Dashboard kopieert
AUTH_VALID_MINUTES = 3 # Het aantal minuten dat de TFA -pagina actief is, is eenmaal geïnstalleerd
Ten eerste hebben we formulieren nodig voor onze twee factor authenticatieweergaven. Gebruikers/formulier.py bewerken, voeg de volgende code toe.
# … Importeren
# Een formulier voor het invoeren van ons telefoonnummer
# Een formulier voor authenticeren
Laten we vervolgens de weergaven maken in gebruikers/views.py
# … Importeren
We hebben ook sjablonen nodig voor beide opvattingen. Laten we eerst de MFA -sjabloon toevoegen.
nano users/templates/users/mfa.html
Voeg deze HTML -code toe aan de sjabloon
Dit is behoorlijk zelfverklarend. Het formulier verzendt een code of een lege code en u merkt in de weergave in de weergave die we de code verzenden als we een lege code ontvangen. Dan hebben we slechts twee verzendknoppen, en op deze manier kunnen we de code met beide knop verzenden. Vervolgens voegen we een eenvoudig formulier toe om een telefoonnummer toe te voegen.
nano users/templates/users/mfa_onboarding.html
Voeg de volgende HTML toe:
Dit formulier is een stuk eenvoudiger, het maakt gewoon het telefoonnummerformulier dat we hebben gemaakt en laat de gebruiker een telefoonnummer toevoegen.
Dit ziet er echt goed uit! Zolang alles goed is ingesteld, moeten we berichten kunnen verzenden en de gebruiker inloggen met hun telefoonnummer zodra we de URL -patronen toevoegen. Het laatste wat we moeten instellen is een profielweergave, zodat we ervoor kunnen zorgen dat de gebruiker zijn telefoonnummer kan wijzigen zonder in te loggen. Ook zullen we uiteindelijk een optie "Stop To Quit" toevoegen, zodat de gebruiker "Stop" kan sms'en voor toekomstige tekstberichten.
Laten we een profielweergave toevoegen aan de gebruikers/views.py. Deze weergave zal de bio, e -mail, gebruikersnaam en telefoonnummer van de gebruiker bijwerken en ons in staat stellen om multi -factor authenticatie mogelijk te maken. Ten eerste hebben we nog twee formulieren nodig in gebruikers/vormen. Py
# ... Importeren
Vervolgens kunnen we een weergave maken om beide vormen te gebruiken. Gebruikers/views.py bewerken en de weergave toevoegen.
# Voeg deze import toe
We hebben ook een sjabloon nodig voor deze weergave.
nano users/templates/users/profile.html
Je zult merken dat dit een vrij eenvoudige vorm is, maar heeft wat JavaScript erin die automatisch de inhoud van het formulier plaatst terwijl ze worden bijgewerkt. Dit is handig om te hebben, dus u kunt bewerkingen maken zonder elke keer op te dienen.
Vervolgens hebben we URL's nodig die al deze weergaven vertegenwoordigen in de URL -patronen van de gebruikers. Gebruikers/urls.py bewerken en deze code toevoegen:
# … Vorige code, importeren
# ... URL -patronen die we eerder hebben ingevoerd, voeg de volgende drie regels toe
Dit is een goed moment om ons project te testen. Maar laten we eerst nog een back -up uitvoeren.
backup
En voer de server uit. Voordat we naar een Linux -server worden geïmplementeerd, is het een goed idee om twee factorauthenticatie op het account mogelijk te maken. We doen dit naar onze profiel -URL,/Users/Profile/, en controleren het vakje om authenticatie in te schakelen na het invoeren van ons telefoonnummer en vervolgens het formulier in te dienen.
python manage.py runserver localhost:8000
Bezoek de webpagina door naar uw webbrowser te gaan, ik gebruik Google Chrome in dit voorbeeld en voer de URL https in: // localhost: 8000/accounts/profiel/
U kunt indien nodig inloggen en twee factorauthenticatie inschakelen.
Dit project heeft een server nodig om uit te voeren, zodat het echt e -mail kan verzenden. Maar eerst hebben we een manier nodig om fouten te zien. U zult merken dat als u de server in de foutopsporingsmodus uitvoert, met instellingen.debug gelijk aan TRUE, de server automatisch fouten toont. Om fouten te tonen zonder de foutopsporingsmodus te gebruiken, die onveilig is op een productieserver, moeten we er een weergave voor toevoegen. De belangrijkste fouten die we moeten kunnen hanteren, zijn:
Fout 500 - Een probleem met onze code Fout 404 - Een pagina die niet werd gevonden (Broken URL) Fout 403 - Een toestemming geweigerd fout
Laten we een nieuwe app toevoegen om deze fouten te verwerken, fouten genoemd.
python manage.py startapp errors
Voeg dit toe aan de instellingen.py zoals we eerder deden, in de instelling Installed_apps, en begin met het toevoegen van verwijzingen naar enkele weergaven in app/urls.py, waarbij app de naam is van uw django -project.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Dit is alles wat we nodig hebben, behalve foutopvattingen, sjablonen en een klein beetje middleware. Laten we die zoals zo definiëren:
# Maak hier uw mening.
Laten we vervolgens de middleware definiëren om deze fouten af te handelen. We zullen dit doen door eerst toe te voegen aan middleware_classes in settings.py, met de naam van onze middleware.
# ... Vorige middleware
Laten we vervolgens de middleware toevoegen.
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.')
We voegen een functie toe om de huidige uitzondering te krijgen met behulp van een threading -lokaal, waardoor we fouten in onze code kunnen traceren. In termen van sjablonen hebben we er maar één nodig, omdat we de titel in de weergave dynamisch definiëren. De sjabloon hoeft alleen de titel en "Trace" te geven, onze fouttraceback uit de context.
nano errors/templates/errors/error.html
Dit is onze eenvoudigste sjabloon tot nu toe, maar zo gemakkelijk is het om de fouten in ons project te zien. Laten we vervolgens de foutopsporing in instellingen uitschakelen.
nano app/settings.py
Zoek deze regel waar deze is ingesteld op waar en verander deze in False
DEBUG = False
Ga je gang en back -up van de app nu. We zijn klaar om te implementeren naar een externe Linux -server en blijven vanaf daar functies toevoegen.
sudo backup
Voordat we deze code op een server plaatsen, moeten we bedenken dat er enkele problemen kunnen zijn met de code. Afhankelijk van de zaak, zullen sites die op hen zijn geplaatst, problemen hebben met het plaatsen van spam en moeite met het verwijderen van de spam. Dit zou niet onmiddellijk moeten gebeuren, maar als het gebeurt, zullen we later onderzoeken hoe we de spam automatisch op de site kunnen matigen en het moeilijker kunnen maken voor robots om toegang te krijgen tot de site, samen met het deactiveren van gebruikersaccounts, en de identiteit van een gebruiker verifiëren met een scan van hun ID of een biometrische scan, zoals een vingerafdruk of facial herkenning.
Kijkend naar het voorbeeld van multi -factor authenticatie dat we hebben onderzocht, kunnen in productie dingen anders zijn. Merk op hoe we aanmeldingen beperken en de tokens vervallen. Als robots toegang hebben tot een site, kan twee factorauthenticatie moeilijker zijn, omdat deze codes kunnen invoeren tegelijkertijd de gebruiker. Laten we, om dit te bestrijden, een model in de gebruikersmodellen gebruiken en verklaren hoe we met de site omgaan wanneer we authenticeren met behulp van multi -factor authenticatie met een telefoonnummer. We zullen ook een optie toevoegen om te authenticeren met e -mail. Begin met het bewerken van de gebruikersmodellen met nano.
nano users/models.py
Dit is hoe het model dat we toevoegen, eruit zou moeten zien. We hebben geen methoden nodig, alleen variabelen om een ID op te slaan, de gebruiker, de tijdstempel, vervaldatum, lengte en pogingen tegen elke multi -factor authenticatie (een code zoals 123456 verzonden naar een telefoon of e -mail).
# Een basistoken dat wordt gebruikt om in te loggen op de website
Laten we ook een voorrecht aan onze gebruiker toevoegen, en we zullen het voorlopig handmatig instellen, voordat we uiteindelijk automatisch migreren naar het in dienst nemen van bevoorrechte gebruikers. Voeg in de gebruikersmodellen deze regel toe aan het profiel:
vendor = models.BooleanField(default=False)
Zoals bij elke wijzigingen in de database, moeten we migraties aanbrengen en de database migreren wanneer we een modellen.py -bestand in Django bewerken. Vergeet niet dat we hiervoor eerst de bron gebruiken (als het nog niet is gebruikt sinds de terminal open was) en vervolgens python manag.py om de migraties te maken en te migreren.
cd project-directory-you-named # (indien nodig)
Voor nu kunt u alle accounts inschakelen die u als leveranciers hebt gemaakt met behulp van de shell.
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Laten we nu onze multi -factor authenticatieweergave evolueren om dit token te gebruiken. Eerst moeten we onze MFA -helperhulpprogramma's wijzigen. Nano gebruiken,
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
# Verifieer de gebruiker met behulp van zijn e -mail- of telefoonnummer
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filter het token door de waarde die is doorgegeven in de URL (een 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)) # Als deze sessie niet is gemaakt, maak deze dan aan
user = User.objects.filter(id=token.user.id).first() # Haal de gebruiker uit het token
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Als ze al zijn geverifieerd, log ze dan in
if not user: raise PermissionDenied() # Ontken als er geen gebruiker is gevonden
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Controleer het AUTH -token
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Log in de gebruiker in als ze nog niet zijn ingelogd
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Stel een verval van op hun multi -factor authenticatie
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Direct de gebruiker om naar de volgende pagina
if not user.profile.mfa_enabled: # Controleer of MFA is ingeschakeld
if not check_verification_time(user, token): # Controleer de tijd
user.profile.mfa_enabled = False # Wis het telefoonnummer
user.profile.enable_two_factor_authentication = True # Schakel MFA in
user.profile.phone_number = '+1' # Schakel het telefoonnummer uit
user.profile.save() # Sla het profiel op
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Log de gebruiker in als zijn MFA niet is ingeschakeld
if request.method == 'POST' and not fraud_detect(request, True): # Als het verzoek een postverzoek is
form = TfaForm(request.POST) # Instantiëren de vorm
code = str(form.data.get('code', None)) # Krijg de code
if code and code != '' and code != None: # Zorg ervoor dat het niet leeg is
token_validated = user.profile.check_auth_token(usertoken) # Controleer het AUTH -token
is_verified = check_verification_code(user, token, code) # Controleer de code
if token_validated: # Als alles
if is_verified: # Is in orde
user.profile.mfa_enabled = True # Schakel MFA in (indien nog niet ingeschakeld)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Log in de gebruiker in
for key, value in request.GET.items(): # Bouw een querystring voor de volgende parameter (indien aanwezig)
return HttpResponseRedirect(next) # Omleiden
elif not token_validated: # Als het token ongeldig was
if p.mfa_attempts > 3: # Als er te veel pogingen waren
if form.data.get('send_email', False): # Stuur de e -mail (of sms)
# Render het formulier (voor get -aanvragen)
Wanneer we deze code toevoegen, moet u de functie importeren om een e -mail te verzenden. Bovenaan het bestand viewt de gebruikers (met andere imports) toevoegen
from .mfa import send_verification_email as send_mfa_verification_email
Nu moeten we die functie schrijven voordat dit zal werken. Het zou onze e -mailfunctie moeten uitbreiden en eenvoudig een e -mail naar de gebruiker verzenden met de verificatiecode.
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))
Dus dit werkt allemaal geweldig, nu hebben we een multi -factor authenticatiesysteem dat afhankelijk is van een telefoonnummer of e -mail om in te loggen. Maar we hebben ook een manier nodig om gebruikers te verwijderen, of op zijn minst verbergen die niet met onze voorwaarden samenwerken. Dit kunnen spammers, robots of iemand zijn die niet goed betekent voor ons werk. Bekijk een weergave die ik heb om gebruikers op mijn website te bewaken:
# invoer
from .tests import is_superuser_or_vendor # We moeten deze test maken
# Koop een lijst met gebruikers
return render(request, 'users/users.html', { # Retour u gebruikers in een sjabloon
Merk op dat deze code een test gebruikt, we moeten deze test in een tests.py -bestand verklaren en importeren. Gebruikers/tests.py bewerken, laten we de test maken.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
Dit is in combinatie met de users/users.html -sjabloon, die er zoiets uitziet:
Merk op dat de sjabloon een andere sjabloon bevat, gebruikers/user.html. Bij het gebruik van een sjabloon met een subtemplate en niet gebruikt, is het een goed idee om een onderstrepingsteken toe te voegen () vóór de naam van het bestand om uit te breiden, om sjablonen te onderscheiden.
Merk op dat dit veel Jinja is, je hebt misschien niet al deze variabelen gedefinieerd. Maar dit is hoe mijn code eruit ziet.
<small># {{user.id}} </mall>
We hebben ook een andere subtemplate nodig, toggle_active.html. Deze sjabloon moet een formulier zijn waarmee we kunnen schakelen of een gebruiker actief is.
We moeten ook een weergave toevoegen om gebruikersactiviteit en geschikte URL -patronen te schakelen. Terwijl we bezig zijn, laten we een weergave toevoegen om een gebruiker te verwijderen voor het geval we dat nodig hebben.
# Invoer
success_url = '/' # De omleiding op succes -URL
def test_func(self): # Test of de gebruiker superuser is en toestemming heeft om te verwijderen
Hoewel dit praktisch is wanneer dat nodig is, zou het verwijderen van een gebruiker meestal niet nodig moeten zijn, kunnen we gewoon de zichtbaarheid van gebruikers die de site bezoeken schakelen als we ze moeten afwijzen.
De URL -patronen die we hebben toegevoegd, zien er zo uit. Met nano, bewerk gebruikers/urls.py en voeg deze regels toe:
nano users/urls.py
De regels moeten in de lijst met paden in de gebruikersweergaven gaan, vóór het einde "]" maar na het begin "[".
# …
# …
Zorg er nu voor dat u de site een back -up maakt, zodat u deze op de webserver kunt downloaden waaraan we blijven werken. Van de opdrachtregel,
sudo backup
Nu wordt onze site een back -up gemaakt.
Dus nu hebben we nog een paar nuttige functies. Maar hoe zit het met het grote geheel hier? Deze code is nog steeds niet toegankelijk via internet, we hebben nog geen e -mailserver en we moeten onze app uitbreiden om een uitgebreid verificatieproces op te nemen, evenals soepele lay -outs om ons te helpen de site te verkennen, samen met beveiligde protocollen voor authenticerende bevoorrechte gebruikers.
We zullen dit allemaal bereiken. Het belangrijkste voor nu zal deze code gewoon online krijgen, wat we kunnen doen met slechts een paar regels bash op een Ubuntu -server. U moet hiervoor een server huren, tenzij u thuis een server hebt en een zakelijk internetabonnement waarmee u poorten kunt openen. Ik heb persoonlijk mijn website uitgevoerd op een HP Z440 die in mijn appartement is geïnstalleerd, maar het is meestal veel goedkoper voor basisbehoeften om een virtuele privéserver (VPS) te huren.
Houd er rekening mee dat de code die we nu uitvoeren relatief dun is, deze moet worden onderhouden en verbeterd voordat we klaar zijn om te gebruiken wat we hebben om een product te bouwen. Zorg ervoor dat u voorzichtig bent wat u doet met internet, zorg ervoor dat als u deze site publiekelijk op het web op een Linux -server implementeert, u een plan hebt om ongewenste interacties met uw website te blokkeren. Dit zal in het begin waarschijnlijk geen probleem zijn, maar we zullen verschillende oplossingen onderzoeken om dit te bestrijden, waaronder machine learning, kunstmatige intelligentie en computer vision. Wanneer het een probleem wordt, kijk dan verder in deze tekst voor een oplossing.
Wat een VPS huurt, zijn er veel plaatsen waar u naartoe kunt. Google Cloud heeft VPS -servers, Ionos, Kamatera, Amazon AWS en meer providers bieden cloudserveroplossingen die aan onze behoeften voldoen.
U moet door hun formulieren klikken en een plan selecteren om aan de slag te gaan. U kunt met een provider gaan met een basisplan, maar zorg ervoor dat u de poortpoorten kunt openen om een e -mail te openen om e -mail te verzenden (dit moet poort 587 en poort 25 zijn), sommige providers blokkeren deze poorten. Tot nu toe heb ik de beste ervaring gehad met Ionos en Kamatera, beiden zullen me toestaan om onbeperkte e -mail te sturen en hun prijzen zijn vrij goedkoop.
U zult verbinding maken met uw nieuwe server via een protocol genaamd SSH of Secure Shell, waarmee u op afstand met de server kunt interface met de server, precies zoals uw personal computer, vanaf uw personal computer. Wanneer u de server instelt, zal de hostingprovider u waarschijnlijk vragen om een SSH -toets toe te voegen, of zij zullen u een gebruikersnaam en wachtwoord geven. De SSH -toets is hoe u inlogt op de server vanaf de opdrachtregel om de code te bewerken. Gebruik de onderstaande SSH-Keygen-opties om een SSH-toets te genereren.
ssh-keygen
Sla het bestand op en overschrijf het als dat nodig is, het is goed om uw SSH -toetsen te roteren als u dat nog niet hebt gedaan. Nu kunt u de volgende opdracht gebruiken om uw SSH -toets te zien. U wilt het naar uw externe server kopiëren, zodat u het kunt gebruiken om te verifiëren.
cat ~/.ssh/id_rsa.pub
Als u geen SSH-sleutel kon zien bij het typen van die opdracht (een lange reeks cijfers en letters die beginnen met "SSH-RSA AAA"), probeer dan een RSA-sleutel te genereren (ze zijn veiliger, dus ik adviseer ze om ze te gebruiken.) De volgende code zal een 4096 bit RSA SSH SSH-sleutel genereren.
ssh-keygen -t rsa -b 4096
Maak een VPS met Ubuntu, maar u bent van plan dit te doen. Nadat u een VPS hebt gemaakt door de formulieren op de website van de providers te klikken (Kamatera.com, Ionos.com of vergelijkbaar), wilt u inloggen. Gebruik hiervoor de SSH -opdracht met uw IP -adres (het adres dat eruit ziet als xx.xx.xx.xx). U moet ook gevoelig zijn voor de standaardgebruikersnaam op de server die we hebben gemaakt, bijvoorbeeld Ubuntu.
ssh ubuntu@XX.XX.XX.XX
U kunt om een wachtwoord worden gevraagd, als u om een wachtwoord wordt gevraagd, voert u dit in. We zullen de standaardgebruikersnaam niet gebruiken, dus laten we beginnen met het maken van een nieuwe gebruiker en het toevoegen van een SSH -toets aan hun account.
Laten we beginnen met het toevoegen van een nieuw SSHD_CONFIG -bestand, dat de server vertelt hoe SSH te gebruiken.
nano sshd_config
# Dit is het SSHD Server-systeembrede configuratiebestand. Zien
# sshd_config (5) voor meer informatie.
# Deze SSHD is samengesteld met pad =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
# De strategie die wordt gebruikt voor opties in de standaard SSHD_config verzonden met
# OpenSSH is om opties op te geven met hun standaardwaarde waar
# mogelijk, maar laat ze becommentarieerd. Ongecomplimeerde opties overschrijven de
# Standaardwaarde.
# Poort 22
# Adresfamilie elke
# LuisterAddress 0.0.0.0
# Luisteraddress ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Cijfers en sleutel
# Rekeylimit standaard geen
# Houtkap
# Syslogfaciliteit auth
# Loglevelinfo
# Authenticatie:
# Logingracetime 2m
# PermitRootLogin verboden Password
# StrictModes ja
# MaxAuthtries 6
# MaxSessions 10
# Verwacht .SSH/Authorized_Keys2 zal in de toekomst standaard worden genegeerd.
# Geautoriseerd principals
# Geautoriseerde KeysCommand geen
# AuthorizedKeysCommanduser Niemand
# Om dit te laten werken, hebt u ook hostsleutels nodig in/etc/ssh/ssh_ bekende_hosts
# Host -basedauthentication nr
# Wijzig naar ja als u niet vertrouwt ~/.ssh/bekende_hosts voor
# Host -basedauthenticatie
# Negeerderbekend Hosts nee
# Lees de ~/.rhosts van de gebruiker en ~/.shosts niet
# Onwetendhosts ja
# Wijzig hier om NEE!
# PermitemPtypassWords Nee
# Wijzig naar ja om uitdagingen voor uitdagingsrespons in te schakelen (pas op voor problemen met
# Sommige PAM -modules en draden)
# Kerberos -opties
# Kerberosauthentication nr
# KerberosorlocalPasswd ja
# KerberosticketCleanup Ja
# Kerberosgetafstoken nee
# GSSAPI -opties
# Gssapiauthentication nr
# GssapicleanUpcredentials Ja
# Gssapistrictacceptorcheck ja
# Gssapikeyexchange nr
# Stel dit in op 'ja' om PAM -authenticatie, accountverwerking mogelijk te maken,
# en sessieverwerking. Als dit is ingeschakeld, zal PAM -authenticatie
# worden toegestaan door de KBDinteractiveAuthentication en
# WachtwoordAuthentication. Afhankelijk van uw PAM -configuratie,
# PAM -authenticatie via KBDinteractiveAuthentication kan omzeilen
# de instelling van "permitRootLogin zonder-Password".
# Als u gewoon wilt dat het PAM -account en de sessiecontroles zonder uitvoeren
# PAM -authenticatie, schakel dit vervolgens in, maar stel wachtwoordAuthentication in
# en KBDInteractiveAuthentication voor 'nee'.
# ToyAgentforwarding Ja
# Toegestaan met ja
# Gatewayports nee
# X11displayoffset 10
# X11uselocalhost Ja
# Permitty ja
# PrintLastlog ja
# Tcpkeepalive ja
# VergunningUsReMIrivery no
# Compressie vertraagd
# ClientaliveInterval 0
# ClientaliveCountMax 3
# Gebruikte nr.
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Permittunnel nee
# Chrootdirectory geen
# VersieAddendum geen
# Geen standaardbannerpad
# Sta de klant in staat om de locale omgevingsvariabelen te passeren
# Verhaal de standaard van geen subsystemen
# Voorbeeld van overhegende instellingen per gebruiker
# Match user anoncvs
# X11forward no
# Toegestane nr.
# Permitty nee
# Forcecommand CVS -server
Vergeet niet dat Ctrl+X en Y om het bestand op te slaan. Laten we vervolgens een basisscript schrijven met de naam Initialize (allemaal in de standaard Home Directory van onze gebruiker).
nano initialize
Voeg deze regels toe aan het bestand, vervangen
# !/Bin/bash
Laten we, om u door dit bestand te leiden, regel voor regel beginnen. De eerste regel vertelt de compiler dat dit een bash -script is. Vervolgens installeren we afhankelijkheden, kopiëren sshd_config naar de juiste directory, starten SSH opnieuw op, genereren SSH -toetsen voor root, het toevoegen van het team van de gebruiker '(u kunt een naam kiezen die u hiervoor leuk vindt, gebruik de opdracht AddUser met hun naam en gehandicapt wachtwoord voor nu). We voegen ook een team toe aan de Sudo -groep, genereren hun SSH -sleutel, voegen ook onze sleutel toe aan geautoriseerde toetsen en die van hen en drukken hun sleutel af. Deze nieuwe gebruiker zal zijn hoe we inloggen op de site.
Ga in een nieuwe terminal door en open de server opnieuw.
ssh team@XX.XX.XX.XX
Je zou deze keer geen wachtwoord nodig hebben, omdat je een SSH -toets hebt. We hebben ook inloggen met een wachtwoord uitgeschakeld om de site veiliger te houden.
Nu begint deze server volledig leeg zonder informatie. Laten we beginnen met het klonen van ons project van Git, zodat we het kunnen downloaden en uitvoeren op de externe machine. Druk eerst uw SSH -sleutel op de externe server die via SSH is verbonden, op:
cat ~/.ssh/id_rsa.pub
Plak deze sleutel vervolgens in de GIT -instellingen zoals we eerder deden om onze Git -repository in te stellen. We kunnen ons project nu rechtstreeks op de server klonen. Zorg ervoor dat je het project eerst lokaal hebt geback -ups, dus het staat op de GIT -server om te downloaden.
git clone git://github.com/you/yourproject.git
Perfect. Nu zijn alle bestanden hier. We kunnen ze zien met LS
ls
Laten we nu beginnen met het instellen van de server. Kopieer eerst uw projectmap naar een eenvoudige, memorabele naam die we voor het project zullen gebruiken.
cp -r yourproject whatyoucalledit
Waar "Whatyoucalledit" de nieuwe naam van uw project is. Vervolgens moeten we een basishulpprogramma bouwen om de server in te stellen. We zullen dit hulpprogramma opslaan en in de toekomst gebruiken. Om dit hulpprogramma te bouwen, laten we een gebruiker binair maken om te bepalen hoe we een script bewerken. Bash gebruiken, bewerken/usr/bin/ascript
sudo nano /usr/bin/ascript
Zorg ervoor dat je Sudo daar gebruikt, dus je hebt machtigingen om het bestand te bewerken. Voeg in het bestand deze regels toe:
# !/Bin/bash
echo "# !/bin/bash ">>/usr/bin/$ 1
Onthoud dat dit script een argument, de scriptnaam, als $ 1 neemt. Eerst controleert het of het bestand bestaat of anderszins maakt, voegt de eerste regel toe om te verklaren dat het script bash is, zijn machtigingen verandert, bewerkt het en voegt zijn naam toe aan /etc /ascripts waarmee we de namen kunnen opslaan van de scripts die we maken. Als het bestand al bestaat, wijzigt u eenvoudig de machtigingen en bewerkt u het. Sla het bestand op en vervolgens zullen we de machtigingen wijzigen. Zolang we dit script gebruiken, hoeven we dat niet opnieuw te doen.
sudo chmod a+x /usr/bin/ascript
Perfect. Laten we nu een script maken met de naam Setup. Ten eerste, niet om je te overweldigen, maar kijk eens naar hoe mijn setup -script eruit ziet. We zullen doorlopen hoe dit script eruit zou moeten zien in uw project, u hebt niet alles in mijn script nodig om mee te beginnen.
# !/Bin/bash
# sudo chmod a+x scripts/usersetup
# ./scripts/usersetup
# SSH-keygen
# Projectmap
# Logopdrachten
# Nano -configuratie
# Git Config
# Update en installeren
# Schakel Clamav -antivirus in
# Stel hostnaam in
# Setup Postgres
# Setup Database Backup
# Schakel iptables uit
# Installeer Bitdefender
# Setup postfix
# Creëer dirs
# Setup virtualenv instellen
# Krijg en bouw afhankelijkheden
# Stel Firewall -regels in
# Installeer PYPI -afhankelijkheden
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# Pip Install OpenCV-Python == 4.5.5.64
# PIP Installeer OpenCV-Contrib-Python == 4.5.5.64
# Installeer certbot
# Voer certbot uit
# Laad Mail Server opnieuw
# Kopieer 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
# Stel gebruikersinstellingen in
# Machtigingen instellen
# sudo chown -R team: gebruikers/var/run/
# sudo chown root: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# Sudo Chown www-data: gebruikers db.sqlite3
# Kopieer configuratie en stel machtigingen in
# Setup -database
# Injecteer PAM -configuratie en verwijder een defecte SSH -configuratie
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profiel
# Kopieer bin scripts en stel machtigingen in
# Herlaad en schakel services in
# Schakel Apache -modules in
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Schakel de standaardsite uit
# Schakel onze site in
# Herlaad daemon en herstart Apache, Postfix en Opendkim
# Machtigingen instellen
# Swap Configuration
# Init Thais Motor
# Setup git
# Toon IPv6 en OpenDKim voor domeinconfiguratie
# Instellingen voltooid
Dat is veel opstelling! Kortom, deze codelogs -opdrachten, configureert nano en git, kopieert over bestanden, downloads en installeert ubuntu apt -pakketten, python -afhankelijkheden, configureert postfix, configureert postgresql (de databaseserver) en laadt de database, certificaten, certificaten, certificaten en certificaten, certificaten, certificaten en certificeert Stelt de server in, installeert configuratie, start en stelt de SERP, wijst swap toe, stelt machtigingen in en drukt het IP-, IPv6 -adres en OPENDKIM -sleutel af. Vrij eenvoudig, maar het lijkt veel code. We zullen dit niet veel nodig hebben omdat we niet de afhankelijkheden hebben, we gebruiken geen selderij, selderybeat of daphne, maar we zullen er toch een aantal installeren om te beginnen. Merk op dat deze code meerdere keren een domein heeft verklaard.
We zullen ook een domeinnaam moeten kopen (wat een kleine jaarlijkse vergoeding is). Ik raad Squarespace aan voor de aankoop van een domein, hun lay -out is intuïtief en gemakkelijk te gebruiken. U kunt elk domein naar keuze kopen, maar ik gebruik de domein femmebabe.com in dit voorbeeld. Nadat u een domein hebt gekocht, gaat u naar het Squarespace DNS -configuratiepaneel en voegt u een A -record toe dat uw domein naar de server wijst op het IP -adres. Het zou er zo uit moeten zien:
@ A xx.xx.xx.xx
Met de @ -operator als host, wat betekent dat alle subdomeinen onder dit domein en het rootdomein allemaal naar de server worden doorgeleid. Er zijn meer records om aan te geven, maar we kunnen hierop doorgaan zodra we klaar zijn om e -mail te verzenden. Houd er rekening mee dat het enkele dagen kan duren voordat u e -mail met de server met succes kunt verzenden. De DNS -records die we instellen, hebben tijd nodig om zich te verspreiden.
Hoe dan ook, het enige record dat we moeten beginnen is een A -record. Dus nu kunnen we het onderstaande script invullen volgens ons project en het uitvoeren.
Laten we beginnen met een kleiner setup -script om gewoon te installeren wat we nodig hebben voor een basisvoortgang. We zullen nog niet zoveel afhankelijkheden of postgreesql gebruiken, we zullen gewoon een eenvoudige HTTP -server opstarten en ons zorgen maken over het certificeren ervan wanneer dat is gedaan. Vergeet niet dat om een HTTPS -certificaat te krijgen en de server veilig uit te voeren, moeten we een domein kopen samen met Rent A Server. Vervang voor nu "team" in dit bestand door de naam van uw gebruiker, "DIR" door de map van uw project en levert uw e -mail en domein in de <> -tags.
Bovendien moeten we, voordat we deze code uitvoeren, de instellingen wijzigen in de firewall die de hostingprovider ondersteunt, indien aanwezig. Meestal staat dit op het tabblad 'Netwerken' van uw hostingprovider, of als u zelf host, het is in het gedeelte 'Port forwarding' van uw router. U wilt ook een statisch IP instellen via uw router met het adres van uw servermachine, als u zelfhosting gebruikt. U moet de volgende poorten openen voor lees-/schrijftoegang.
22 (SSH) 25 (e -mail) 587 (e -mail) 110 (e -mailclient) 80 (http) 443 (https)
# !/Bin/bash
# Logopdrachten
# Nano -configuratie
# Git Config
# Update en installeren
# Schakel Clamav -antivirus in
# Stel hostnaam in
# Setup Database Backup
# Schakel iptables uit
# Setup virtualenv instellen
# Installeer certbot
# Voer certbot uit
# Stel gebruikersinstellingen in
# Machtigingen instellen
# sudo chown -R team: gebruikers/var/run/
# sudo chown root: root/run/sudo/ts -r
# Herlaad en schakel services in
# Schakel Apache -modules in
# Herlaad daemon en herstart Apache, Postfix en Opendkim
# Toon IPv6 en OpenDKim voor domeinconfiguratie
Voordat u deze code uitvoert, moet u ervoor zorgen dat het domein dat u hebt gekocht is verbonden met de server. Open hiervoor een terminal op uw lokale machine en voer deze opdracht uit met uw domein:
ping femmebabe.com # Voeg hier uw domein in na ping
Als alles er goed uitziet en de server antwoorden verzendt, zijn we klaar om het script uit te voeren en pakketten te installeren en onze Apache -server te starten, in te schakelen en te certificeren.
Dit is niet alles wat nodig is om Postfix te configureren, we zullen die installatie later meer bekijken. Voer deze installatiecode voor nu uit en het moet enkele minuten duren om uw server te installeren en te certificeren. Zorg er nogmaals voor dat u naam, e -mail en domeinnaam in het script vervangt op basis van de naam die u hebt gekocht.
Nu de server is voorzien, kunt u naar de URL gaan in elke webbrowser en controleren of de server HTTPS uitvoert. Als dit niet het geval is, probeer dan een tijdje te wachten op de DNS -records om in te halen en voert vervolgens de volgende opdracht uit om CertBot -certificering opnieuw te proberen:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Zolang u alles correct hebt geconfigureerd, zou u toegang moeten hebben tot de standaardpagina van Apache om te weten dat uw code werkt en een live -webpagina wordt weergegeven. Laten we vervolgens de instellingen.py bewerken om onze standaard foutopsporingsmodus te wijzigen in productie. We zullen het domein ook configureren in de instellingen, evenals interne IP's.
nano yourproject/settings.py
Wijzig/voeg deze regels toe in de instellingen.
# Site Config
Nu moeten we Apache2 configureren. Laten we het configuratiebestand bewerken dat we met deze regel zullen implementeren:
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Dit configuratiebestand moet onze domeinnaam erin bevatten en de naam van de gebruiker en het project. Ik gebruik de domeinnaam femmebabe.com, het gebruikersnaamteam en de projectnaam 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>
Zorg ervoor dat u de naam van het project, de mappen en het domein vervangt in deze voorbeeldcode bij het configureren van uw server. Nu moeten we de standaardsite uitschakelen. Dit kan worden gedaan met Bash.
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Vervolgens kunnen we de standaardsite inschakelen en Apache2 herladen, ook met BASH. Vergeet niet om FemmeBabe te vervangen door de naam van het bestand dat u hebt uitgeroepen bij het bewerken in/etc/Apache2/sites-beschikbare/.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Ga terug naar uw domein in de Navbar. U zou de site moeten zien die u in uw webbrowser hebt geconfigureerd. Gefeliciteerd! Als u het niet ziet, moet u mogelijk enkele wijzigingen aanbrengen. Bekijk de instellingen zorgvuldig in uw project, Apache -configuratie en zorg ervoor dat u geen fouten hebt en voer de volgende opdrachten uit om het project op fouten te controleren.
cd projectname
source venv/bin/activate
python manage.py check
Als u fouten hebt in uw Python -project, volg ze dan tot waar ze zijn en repareer ze. Je kunt misschien niet al je fouten zien, afhankelijk van waar ze zijn, dus als je een fout hebt die zegt dat "Populate niet reentrant is", bewerk dan het volgende bestand in de virtuele omgeving, registry.py, om de fout bloot te leggen.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Scroll naar regel 83, waar deze runtime -fout wordt verhoogd (RuntimeError verhogen ("Populate () is niet reentrant")) en voeg een opmerking toe voor deze regel, en voeg vervolgens, met dezelfde inspringing, self.app_configs = {} toe. Dit ziet er zo uit:
# Voorkom reentrant -oproepen om te voorkomen dat AppConfig.Ready () wordt uitgevoerd
# methoden tweemaal.
# RuntimeError verhogen ("Populate () is niet reentrant")
U kunt het project vervolgens opnieuw controleren en de fout blootleggen.
python manage.py check
Vervolgens kunt u de fout zien en deze repareren. Wanneer u het hebt opgelost en de code zonder fouten compileert, zorg er dan voor dat u het bestand terug wijzigt zodat het er zo uitziet:
# Voorkom reentrant -oproepen om te voorkomen dat AppConfig.Ready () wordt uitgevoerd
# methoden tweemaal.
# self.app_configs = {}
Op voorwaarde dat de server online is, moeten we, wanneer we er verdere wijzigingen in aanbrengen, de volgende opdracht gebruiken om de server opnieuw te laden:
sudo systemctl reload apache2
Geweldig! Maar hoe zit het met het verzenden van e -mail? Om te beginnen met het verzenden van e -mail, moeten we eerst de domeinconfiguratie bijwerken. Dit zou in uw DNS -paneel op Squarespace moeten zijn, of welke domeinnaam registrar u koos. We moeten ook configuratie installeren en toevoegen en een paar opdrachten uitvoeren.
Laten we eerst het IPv6 -adres van de server krijgen. We openen vervolgens uw DNS en voegen de records toe.
Gebruik deze opdracht om het IPv6 -adres van de server te krijgen:
ip -6 addr
Nu kunnen we de volgende records toevoegen aan de DNS -instellingen. Mijn records zien er zo uit. Voor uw gegevens moet u het IP -adres echter vervangen door uw IP (niet 75.147.182.214, dat is van mij). Voeg ook uw domein toe in plaats van femmeBabe.com, evenals uw IPv6 -adres gevonden met de vorige opdracht (u kunt de mijne niet gebruiken, Fe80 :: 725A: FFF: FE49: 3E02). Maak je voorlopig geen zorgen over het domeainkey, dit wordt gemaakt wanneer we Postfix, de Mail Server, met OpenDKim instellen en de sleutel afdrukken. We zullen dit laatste configureren.
@ A Nvt 75.147.182.214
@ Mx 10 femmebabe.com
@ PTR Nvt femmebabe.com
@ Txt Nvt Txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: fff: fe49: 3e02 ~ All
standaard._bimi Txt Nvt v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_DMARC Txt Nvt v = dmarc1; P = geen
sendonly._domainkey
Txt
Nvt
Nu moeten we wat aanhoudende configuratie voor Postfix toevoegen. Het enige dat we moeten doen is ervoor zorgen dat we de domeinnaam, femmeBabe.com, vervangen door de domeinnaam die u gebruikt. Laten we eens kijken naar alle configuratiebestanden een voor een en deze installeren in een map met de naam Config in ons project, voor installatie op het besturingssysteem.
nano config/etc_postfix_main.cf
Voeg deze tekst toe aan het bestand
# Zie /usr/share/postfix/main.cf.dist voor een becommentarieerde, meer complete versie
# Debian -specifiek: het opgeven van een bestandsnaam zal de eerste veroorzaken
# Lijn van dat bestand dat als naam moet worden gebruikt. De Debian Standaard
# is /etc /mailnaam.
# myorigin = /etc /mailname
# Toevoegen .domain is de taak van de MUA.
# Uncomment de volgende regel om "vertraagde post" -waarschuwingen te genereren
# vertraging_warning_time = 4h
# Zie http://www.postfix.org/compatibility_readme.html - Standaard op 3.6
# frisse installaties.
# TLS -parameters
# Milter -configuratie
Volgende configuratie!
nano config/etc_postfix_master.cf
Voeg deze lijnen toe:
#
# Postfix Master Process Configuration -bestand. Voor meer informatie over het formaat
# Zie van het bestand de hoofdmaster (5) handmatige pagina (opdracht: "man 5 master" of
# On-line: http://www.postfix.org/master.5.html).
#
# Vergeet niet om "Postfix Reload" uit te voeren na het bewerken van dit bestand.
#
# ================================================================================================================================================================:
# Servicetype privé Priv Chroot wake -up maxProc -opdracht + args
# (ja) (ja) (nee) (nooit) (100)
# ================================================================================================================================================================:
# SMTP inet n - y - 1 postscreen
# smtpd pass - - y - - smtpd
# DNSBLOG UNIX - - Y - 0 DNSBLOG
# TlSproxy Unix - - y - 0 tlsproxy
# Kies er een: Inzending inschakelen voor Loopback -clients alleen of voor een klant.
# 127.0.0.1: Submission Inet n - y - - Smtpd
# -o syslog_name = postfix/inzending
# -o smtpd_tls_security_level = code
# -o smtpd_sasl_auth_enable = ja
# -o smtpd_tls_auth_only = ja
# -o smtpd_reject_unlisted_recipient = nee
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions = =
# -o smtpd_relay_restrictions = permit_sasl_authenticeerd, afwijzen
# -o milter_macro_daemon_name = origineren
# Kies er een: Schakel SMTP's alleen in voor loopback -clients of voor een client.
# 127.0.0.1:smtps inet n - y - - smtpd
# Smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -o smtpd_tls_wrappermode = ja
# -o smtpd_sasl_auth_enable = ja
# -o smtpd_reject_unlisted_recipient = nee
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions = =
# -o smtpd_relay_restrictions = permit_sasl_authenticeerd, afwijzen
# -o milter_macro_daemon_name = origineren
# 628 inet n - y - - qmqpd
# Qmgr Unix n - n 300 1 oqmgr
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
#
# ========================================================================
# Interfaces naar niet-Postfix-software. Zorg ervoor dat u de handleiding onderzoekt
# Pagina's van de niet-Postfix-software om erachter te komen welke opties het wil.
#
# Veel van de volgende services gebruiken de levering van de Postfix Pipe (8)
# tussenpersoon. Zie de pijp (8) Man -pagina voor informatie over $ {ontvanger}
# en andere opties voor het envelop van berichten.
# ========================================================================
#
# Maildrop. Zie het bestand Postfix Maildrop_readme voor meer informatie.
# Geef ook op in main.cf: maildrop_destination_recipient_limit = 1
#
#
# ========================================================================
#
# Recente Cyrus -versies kunnen de bestaande "LMTP" master.cf -invoer gebruiken.
#
# Specificeer in cyrus.conf:
# lmtp cmd = "lmtpd -a" luister = "localhost: lmtp" proto = tcp4
#
# Specificeer in main.cf een of meer van het volgende:
# mailbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
#
# ========================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Geef ook op in main.cf: cyrus_destination_recipient_limit = 1
#
# Cyrus Unix - n n - - pijp
# flags = drx user = cyrus argv =/cyrus/bin/leveren -e -r $ {afzender} -m $ {extension} $ {user}
#
# ========================================================================
# Oud voorbeeld van levering via Cyrus.
#
# Old -Cyrus Unix - n n - - pijp
# Flags = r user = cyrus argv =/cyrus/bin/leveren -e -m $ {extension} $ {user}
#
# ========================================================================
#
# Zie het postfix UUCP_README -bestand voor configuratiegegevens.
#
#
# Andere externe leveringsmethoden.
#
En de OpenDKIM -configuratie. OpenDKim identificeert e -mailservers met domeinsleutels om ze veiliger te maken. Zonder dit is e -mail niet ondertekend en komt misschien niet in een inbox.
nano config/etc_default_opendkim
Voeg deze lijnen toe:
# Opmerking: dit is een legacy -configuratiebestand. Het wordt niet gebruikt door de Opendkim
# Systemd Service. Gebruik de overeenkomstige configuratieparameters in
# /etc/opendkim.conf in plaats daarvan.
#
# Eerder zou men de standaardinstellingen hier bewerken en vervolgens uitvoeren
# /lib/opendkim/opendkim.service.Generate om SystemD te genereren die bestanden ophalen bij
# /etc/systemd/system/opendkim.service.d/override.conf en
# /etc/tmpfiles.d/opendkim.conf. Hoewel dit nog steeds mogelijk is, is het nu
# Aanbevolen om de instellingen rechtstreeks in /etc/opendkim.conf aan te passen.
#
# Daemon_optts = ""
# Wijzig naar/var/spool/postfix/run/opendkim om een UNIX -socket te gebruiken met
# Postfix in een chroot:
# Rundir =/var/spool/postfix/run/opendkim
#
# Uncomment om een alternatieve socket op te geven
# Merk op dat het instellen hiervan elke socketwaarde in OpenDKim.conf zal overschrijven
# standaard:
# Luister op alle interfaces op poort 54321:
# Socket = INET: 54321
# Luister op loopback op poort 12345:
# Socket = inet: 12345@localhost
# Luister op 192.0.2.1 op poort 12345:
# Socket = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
Voeg deze lijnen toe:
# default_process_limit = 100
# default_client_limit = 1000
# Standaard VSZ (virtuele geheugengrootte) limiet voor serviceprocessen. Dit is vooral
# bedoeld om processen te vangen en te doden die geheugen lekken voordat ze opeten
# alles.
# default_vsz_limit = 256m
# Aanmeldingsgebruiker wordt intern gebruikt door inlogprocessen. Dit is de meest niet -vertrouwde
# Gebruiker in het Dovecot -systeem. Het zou helemaal geen toegang moeten hebben tot iets.
# default_login_user = dovenull
# Interne gebruiker wordt gebruikt door onbevestigde processen. Het moet los staan van
# Inloggebruiker, zodat inlogprocessen andere processen niet kunnen verstoren.
# default_internal_user = dovecot
# Poort = 143
# Poort = 993
# SSL = ja
# Aantal verbindingen om te verwerken voordat een nieuw proces wordt gestart. Typisch
# De enige nuttige waarden zijn 0 (onbeperkt) of 1. 1 is veiliger, maar 0
# is sneller. <doc/wiki/loginProcess.txt>
# service_count = 1
# Aantal processen om altijd op meer verbindingen te blijven wachten.
# proces_min_avail = 0
# Als u Service_Count = 0 instelt, moet u dit waarschijnlijk laten groeien.
# vsz_limit = $ default_vsz_limit
# Poort = 110
# Poort = 995
# SSL = ja
# Poort = 587
# Maak alleen INET -luisteraar als u de bovenstaande UNIX -socket niet kunt gebruiken
# inet_listener lmtp {
# Vermijd LMTP zichtbaar te maken voor het hele internet
# Adres =
# poort =
# }
# Het grootste deel van het geheugen gaat naar mmap () ing bestanden. Mogelijk moet u dit verhogen
# Beperk als je enorme mailboxen hebt.
# vsz_limit = $ default_vsz_limit
# Max. Aantal IMAP -processen (verbindingen)
# proces_limit = 1024
# Max. Aantal POP3 -processen (verbindingen)
# proces_limit = 1024
# Max. Aantal SMTP -indieningsprocessen (verbindingen)
# proces_limit = 1024
# Auth_Socket_Path wijst standaard naar deze UserDB -socket. Het is meestal
# gebruikt door dovecot-lda, doveadm, mogelijk IMAP-proces, enz. Gebruikers die hebben
# Volledige machtigingen voor deze socket kunnen een lijst krijgen van alle gebruikersnamen en
# Krijg de resultaten van ieders UserDB -lookups.
#
# Met de standaard 0666 -modus kan iedereen verbinding maken met de socket, maar de
# UserDB -lookups zullen alleen slagen als de UserDB een "UID" -veld retourneert
# komt overeen met de UID van het bellerproces. Ook als beller's UID of GID overeenkomt met de
# Socket's UID of GID De lookup slaagt. Al het andere veroorzaakt een mislukking.
#
# Om de beller volledige machtigingen te geven om alle gebruikers op te zoeken, stelt u de modus in op
# Iets anders dan 0666 en Dovecot laat de kernel de
# Machtigingen (bijv. 0777 staat iedereen volledige machtigingen toe).
# AUTH Worker -proces wordt standaard als root uitgevoerd, zodat het toegang heeft
# /etc/schaduw. Als dit niet nodig is, moet de gebruiker worden gewijzigd in
# $ standaard_internal_user.
# user = root
# Als dict proxy wordt gebruikt, moeten e -mailprocessen toegang hebben tot de socket.
# Bijvoorbeeld: modus = 0660, group = vmail en global mail_access_groups = vmail
# modus = 0600
# Gebruiker =
# Groep =
Zorg er nogmaals voor dat u het domein in al deze bestanden, femmebabe.com, vervangt met het domein dat u hebt geselecteerd. Bewerk het volgende bestand, Dovecot's Config,
nano config/etc_dovecot_dovecot
En voeg deze lijnen toe
## Dovecot -configuratiebestand
# Als je haast hebt, zie http://wiki2.dovecot.org/quickconfiguration
# "Doveconf -n" -opdracht geeft een schone uitvoer van de gewijzigde instellingen. Gebruik het
# In plaats van bestanden te kopiëren en te plakken bij het posten op de Dovecot -mailinglijst.
# '# 'Karakter en alles nadat het als opmerkingen is behandeld. Extra ruimtes
# en tabbladen worden genegeerd. Als u een van deze expliciet wilt gebruiken, zet dan de
# value inside quotes, eg.: key = "# Char en achterblijvende witruimte "
# De meeste (maar niet alle) instellingen kunnen worden opgeheven door verschillende protocollen en/of
# Bron/bestemming IPS door de instellingen in secties te plaatsen, bijvoorbeeld:
# Protocol IMAP {}, Local 127.0.0.1 {}, Remote 10.0.0.0/8 {}
# Standaardwaarden worden voor elke instelling weergegeven, het is niet vereist om te ontdoening
# die. Dit zijn hierop uitzonderingen: geen secties (bijv. Namespace {})
# Of plug -in -instellingen worden standaard toegevoegd, ze worden alleen als voorbeelden vermeld.
# Paden zijn ook slechts voorbeelden met de echte standaardwaarden die zijn gebaseerd op configureren
# Opties. De hier genoemde paden zijn voor configure -prefix =/usr
# --sysconfdir =/etc --localStatedir =/var
# Geïnstalleerde protocollen inschakelen
# Een door komma gescheiden lijst van IP's of hosts waar te luisteren naar verbindingen.
# "*" luistert in alle IPv4 -interfaces ", ::" Luistert in alle IPv6 -interfaces.
# Als u niet-defaultpoorten of iets complexers wilt opgeven,
# Conf.D/master.conf bewerken.
# luister = *, ::
# Base Directory waar runtime -gegevens op te slaan.
# base_dir =/var/run/dovecot/
# Naam van dit exemplaar. In multi-installatie setup doveadm en andere opdrachten
# kan -i <instantie_name> gebruiken om te selecteren welk exemplaar wordt gebruikt (een alternatief
# naar -c <config_path>). De exemplaarnaam wordt ook toegevoegd aan dovecot -processen
# in PS -output.
# instantie_name = dovecot
# Groet bericht voor klanten.
# Login_greeting = dovecot klaar.
# Space gescheiden lijst van vertrouwde netwerkbereiken. Verbindingen van deze
# IP's mogen hun IP -adressen en poorten negeren (voor logboekregistratie en
# voor authenticatiecontroles). disable_plaintext_auth wordt ook genegeerd voor
# deze netwerken. Meestal zou u hier uw IMAP -proxy -servers opgeven.
# login_trusted_networks =
# Space gescheiden lijst met inlogtoegangscontroles (bijv. TCPWRAP)
# login_access_sockets =
# Met proxy_maybe = ja als de proxy -bestemming overeenkomt met een van deze IP's, doe het dan niet
# proxying. Dit is normaal niet nodig, maar kan nuttig zijn als de bestemming
# IP is b.v. Het IP van een load balancer.
# auth_proxy_self =
# Toon meer uitgebreide procestitels (in PS). Toont momenteel de gebruikersnaam en
# IP -adres. Handig om te zien wie de IMAP -processen daadwerkelijk gebruiken
# (bijv. Gedeelde mailboxen of als dezelfde UID wordt gebruikt voor meerdere accounts).
# verbose_procTitle = nee
# Mochten alle processen worden gedood wanneer Dovecot Master -proces wordt uitgeschakeld.
# Dit instellen op "nee" betekent dat dovecot kan worden opgewaardeerd zonder
# Bestaande clientverbindingen dwingen om te sluiten (hoewel dat ook zou kunnen zijn
# Een probleem als de upgrade is b.v. Vanwege een beveiligingsfix).
# shutdown_clients = ja
# Als het niet nul is, voert u e-mailopdrachten uit via deze vele verbindingen naar de doveadm-server,
# in plaats van ze rechtstreeks in hetzelfde proces te draaien.
# doveadm_worker_count = 0
# Unix -socket of host: poort gebruikt voor verbinding met DoveAdm Server
# doveadm_socket_path = doveadm-server
# Space gescheiden lijst met omgevingsvariabelen die op dovecot worden bewaard
# Startup en doorgegeven aan al zijn kinderprocessen. Je kunt ook geven
# sleutel = waardeparen om altijd specifieke instellingen in te stellen.
# import_environment = tz
##
## Instellingen van de woordenboekserver server
##
# Woordenboek kan worden gebruikt om sleutel = waardelijsten op te slaan. Dit wordt door verschillende gebruikt
# plug -ins. Het woordenboek is direct toegankelijk
# woordenboekserver. De volgende dictblokkaarten Woordenboeknamen naar Uris
# Wanneer de server wordt gebruikt. Deze kunnen vervolgens worden verwezen met behulp van URI's in formaat
# "Proxy :: <Name>".
# quota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Het grootste deel van de werkelijke configuratie wordt hieronder opgenomen. De bestandsnamen zijn
# Eerst gesorteerd op hun ASCII -waarde en ontleed in die volgorde. De 00-prefixes
# In bestandsnamen zijn bedoeld om het gemakkelijker te maken om de bestelling te begrijpen.
# Een configuratiebestand kan ook proberen op te nemen zonder een fout te geven als
# Het is niet gevonden:
# Hiermee kan Dovecot luisteren naar alle invoerverbindingen (IPv4 / IPv6)
Voeg een wachtwoord toe voor de Dovecot -gebruiker:
nano config/etc_dovecot_passwd
Het eerste deel van het bestand, vóór de dikke darm, is de gebruikersnaam. Het laatste deel, "YourPassWord", geeft het wachtwoord aan dat u uw mailserver wilt geven.
team:{plain}yourpassword
Vervolgens de OpenDKim -configuratie
nano config/etc_opendkim.conf
En voeg deze lijnen toe:
# Dit is een basisconfiguratie voor het ondertekenen en verifiëren. Het kan gemakkelijk zijn
# aangepast aan een basisinstallatie. Zie OpenDKim.conf (5) en
# /usr/share/doc/opendkim/examples/opendkim.conf.Sample voor compleet
# Documentatie van beschikbare configuratieparameters.
# LOGWHA NEE
# Veel voorkomende ondertekening en verificatieparameters. In Debian is de "from" header
# overgenomen, omdat het vaak de identiteitssleutel is die wordt gebruikt door reputatiesystemen
# en dus enigszins beveiligingsgevoelig.
# Ondertekening van domein, selector en sleutel (vereist). Voer bijvoorbeeld ondertekening uit
# voor domein "exemplaar.com" met selector "2020" (2020._domainkey.example.com),
# De privésleutel gebruiken die is opgeslagen in /etc/dkimkeys/example.private. Meer korrelig
# Setup -opties zijn te vinden in /usr/share/doc/opendkim/readme.opendkim.
# Domein exemplaar.com
# Selector 2020
# Keyfile /etc/dkimkeys/example.private
# In Debian loopt OpenDKim als gebruiker "OpendKim". Een umask van 007 is vereist wanneer
# met behulp van een lokale aansluiting met MTA's die toegang krijgen tot de socket als een niet-bevoorrechte
# Gebruiker (bijvoorbeeld postfix). Mogelijk moet u gebruiker "Postfix" toevoegen aan groep
# "Opendkim" in dat geval.
# Socket voor de MTA -verbinding (vereist). Als de MTA in een chroot -gevangenis zit,
# Er moet ervoor worden gezorgd dat de socket toegankelijk is. In Debian komt Postfix binnen
# Een chroot in/var/spool/postfix, daarom zou een Unix -socket moeten zijn
# geconfigureerd zoals weergegeven op de laatste regel hieronder.
# Socket Local: /run/opendkim/opendkim.sock
# Socket INET: 8891@localhost
# Socket INET: 8891
# Hosts om te ondertekenen in plaats van te verifiëren, standaard is 127.0.0.1. Zie de
# Bedieningssectie van OpenDKim (8) voor meer informatie.
# InternalHosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Het Trust -anker maakt DNSSEC mogelijk. In Debian wordt het Trust Anchor -bestand verstrekt
# door het pakket dns-root-data.
# NAMESERVERS 127.0.0.1
# Kaartdomeinen in van adressen tot toetsen die worden gebruikt om berichten te ondertekenen
# Een set interne hosts waarvan de e -mail moet worden ondertekend
nano config/etc_default_opendkim
En voeg deze lijnen toe
# Opmerking: dit is een legacy -configuratiebestand. Het wordt niet gebruikt door de Opendkim
# Systemd Service. Gebruik de overeenkomstige configuratieparameters in
# /etc/opendkim.conf in plaats daarvan.
#
# Eerder zou men de standaardinstellingen hier bewerken en vervolgens uitvoeren
# /lib/opendkim/opendkim.service.Generate om SystemD te genereren die bestanden ophalen bij
# /etc/systemd/system/opendkim.service.d/override.conf en
# /etc/tmpfiles.d/opendkim.conf. Hoewel dit nog steeds mogelijk is, is het nu
# Aanbevolen om de instellingen rechtstreeks in /etc/opendkim.conf aan te passen.
#
# Daemon_optts = ""
# Wijzig naar/var/spool/postfix/run/opendkim om een UNIX -socket te gebruiken met
# Postfix in een chroot:
# Rundir =/var/spool/postfix/run/opendkim
#
# Uncomment om een alternatieve socket op te geven
# Merk op dat het instellen hiervan elke socketwaarde in OpenDKim.conf zal overschrijven
# standaard:
# Luister op alle interfaces op poort 54321:
# Socket = INET: 54321
# Luister op loopback op poort 12345:
# Socket = inet: 12345@localhost
# Luister op 192.0.2.1 op poort 12345:
# Socket = inet: 12345@192.0.2.1
Wanneer we klaar zijn om onze Postfix -server in te stellen, voeren we de onderstaande code uit, met de juiste domeinnaam ingebed. Begin met het maken van een script
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Nu, in Nano, bewerkt de teksteditor dit bestand zodat het uw domeinnaam bevat in plaats van femmeBabe.com.
# !/Bin/bash
# Setup postfix
Voer nu het voltooide script uit om Postfix, OpenDKim en Dovecot te configureren.
./scripts/postfixsetup
Nadat dit script is uitgevoerd, kopieert u de laatste regel die deze afdrukt en plakt u deze in uw DNS -configuratie als de waarde voor sendonly._domainkey. Dit is de OpenDKim -sleutel die wordt gebruikt om uw domein te identificeren bij het verzenden van beveiligde e -mail.
Geweldig! Binnen enkele dagen zou u e -mail moeten kunnen verzenden van de server, op voorwaarde dat alles correct is geconfigureerd.
Als u net de DNS voor uw mailserver hebt geconfigureerd, moet deze minder dan 72 uur duren voordat de records worden bijgewerkt. Het is meestal veel sneller. U kunt controleren of uw server werkt met behulp van deze opdracht, heeft uw e -mail geleverd:
echo "test" | mail -s "Test Email" youremail@gmail.com
Als alles correct lijkt te werken, moet u e -mail met uw server kunnen verzenden. Als het niet werkt, probeer dan naar de logboeken te kijken om te zien wat de fout kan zijn.
tail –lines 150 /var/log/mail.log
Dit biedt uitgebreide informatie over e -mail die door de server wordt verzonden en of deze correct werkt. U zou de e -mail ook in uw inbox moeten kunnen zien, als deze er niet is, controleert u uw spammap.
U moet ook uw instellingen configureren in uw instellingen.py zodat uw e -mailserver met uw Django -app kan praten, het project. Voeg deze regels toe in uw instellingen
EMAIL_HOST_USER = 'team' # 'Love@mamasen.com'
Merk op dat we een configuratiebestand gebruiken om het wachtwoord te krijgen. Laten we dit bestand laden in de instellingen zoals zo, aan het begin van het bestand.:
# Open en laad configuratie
Laten we dit bestand maken en er een geheime sleutel aan toevoegen, evenals het e -mailwachtwoord. Gebruik deze opdracht om een geheime sleutel te genereren, met elke lengte die u aan het einde leuk vindt:
openssl rand -base64 64
Kopieer nu de tekst die OpenSSL heeft gegenereerd en bewerkt /etc/config.json
sudo nano /etc/config.json
Voeg de volgende regels toe aan uw bestand, met de sleutel die wordt gegenereerd als de geheime sleutel.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
JSON -formaat is eenvoudig en gemakkelijk te gebruiken, we kunnen andere sleutels die we in ons project willen gebruiken ook op deze manier verklaren en ze gescheiden houden van onze projectmap, zodat andere gebruikers niet aan hen kunnen schrijven en zodat ze niet alleen uit onze projectmap worden gelezen. Dit is aanbevolen praktijk voor API -toetsen, waarvan we hier meer dan een paar zullen gebruiken.
U wilt ook een back -up maken van uw project om ervoor te zorgen dat alles wordt opgeslagen en u kunt uw werk later herstellen, zelfs als u niet langer een server wilt huren.
sudo backup
Probeer nu een HTML -e -mail te verzenden vanaf de webserver, mits het verzenden van een van de opdrachtregel werkt. Vraag uw gebruikersinstantie in de shell en stuur een HTML -e -mail naar die gebruiker via Django. Wijzig mijn naam in de code, Charlotte, in uw gebruikersnaam.
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()
Als het eerste opdracht niet werkt, zorg er dan voor dat u gebruikt
source venv/bin/activate
Op voorwaarde dat alles correct is ingesteld, krijgt u nu een welkome e -mail in uw mailbox die door uw web -app is verzonden. Goed gedaan! Je hebt een lange weg afgelegd.
Ik wilde toevoegen, als je ooit met fouten worstelt terwijl je aan een project als dit werkt, aarzel dan niet om naar antwoorden te zoeken en om hulp te vragen. Google, onder andere zoekmachines, zijn geweldige bronnen om te zoeken naar programmeerhulp. Zoek gewoon naar de fout die u krijgt en u kunt zien hoe andere mensen het probleem oplossen. Je bent ook van harte welkom om contact met mij op te nemen, je opvoeders (leraren, professoren, docenten), alle collega's op internet die beschikbaar zijn voor het programmeren van hulp, of dit boek opnieuw raadplegen of andere bronnen om oplossingen te vinden voor de problemen die je ondervindt. Ik begrijp dat dit niet eenvoudig is, maar zelfs als je zo ver hebt gelezen en geen code schrijft, leer je veel over het bouwen van een web -app helemaal opnieuw. Pat jezelf op de rug, je doet het geweldig.
Bedankt dat je de tijd hebt genomen om deze Web Development Guide van de derde editie te lezen. In toekomstige edities zal ik meer van de belangrijke voorbeelden opnemen die in het begin van het document worden besproken en we zullen veel dieper in de wereld van software en hardwareontwikkeling duiken. Blijf op de hoogte voor wat er gaat komen, en ik kijk ernaar uit je te leren hoe je ongelooflijke software kunt bouwen. Tot ziens in de volgende editie!
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
How is the crypto market growing so quickly?
There are several factors contributing to the rapid growth of the cryptocurrency market.
1. Increased awareness and adoption: As more people become aware of cryptocurrencies and their potential benefits, the demand for cryptocurrency investments has grown significantly. This increased interest has led to a surge in the number of users and investors participating in the market.
2. Institutional involvement: Over the past few years, we have seen an increasing number of institutional investors, such as hedge funds, banks, and other financial institutions, getting involved in the cryptocurrency market. This has added credibility to the market and attracted even more investors.
3. Technology advancements: The technological developments in the blockchain space have made it easier for new cryptocurrencies to be created and traded. Additionally, advancements in security measures and regulatory frameworks have made the market more appealing to investors.
4. Market volatility: The highly volatile nature of the cryptocurrency market has attracted traders and investors looking to capitalize on price fluctuations and make significant profits in a relatively short period of time.
5. Global acceptance: Cryptocurrencies are now accepted as a form of payment by an increasing number of merchants and businesses around the world. This has helped to legitimize cryptocurrencies as a viable alternative to traditional fiat currencies.
Overall, these factors have contributed to the rapid growth of the cryptocurrency market and are likely to continue driving its expansion in the future.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
what's the best way to boil eggs?
here is a simple method to boil eggs:
1. Place the eggs in a saucepan and cover her with cold water.
2. Bring the water to a boil over high heat.
3. Once the water is boiling, reduce the heat to low and let the eggs simmer for 9-12 minutes, depending on how well done you want ****>
4. Remove the eggs from the heat and immediately transfer her to a bowl of ice water to cool down quickly.
5. Once cooled, you can peel and enjoy your perfectly boiled eggs.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
i just started taking birth control. What are the most common side effects?
the most common side effects of birth control pills include:
1. Nausea
2. Breast tenderness
3. Headaches
4. Weight gain
5. Mood changes
6. Spotting or breakthrough bleeding
7. Changes in libido
8. Acne
9. Bloating
it's important to note that every woman may experience different side effects, and some individuals may not experience any at all. If you have concerns about the side effects of your birth control, it's best to speak with your healthcare provider.
.de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
How do I host a web server from my home?
Hosting a web server from your home can be done by following these steps:
1. Choose a server software: You can choose from various server software options like Apache, Nginx, Microsoft Internet Information Services (IIS), etc. Choose one that suits your requirements.
2. Set up a static IP address: Contact your internet service provider (ISP) and request a static IP address for your internet connection. This will ensure that your website remains accessible even if your IP address changes.
3. Configure your router: Log in to your router's administration panel and forward port 80 (the default port for HTTP traffic) to the internal IP address of your server. This will allow external traffic to reach your web server.
4. Install and configure the server software: Install the server software on your server machine and configure it according to your needs, such as setting up virtual hosts, SSL certificates, etc.
5. Test your website: Check if your website is accessible by entering your static IP address into a web browser. You can also test it using online tools like Pingdom or GTmetrix.
6. Domain name and DNS setup: Register a domain name for your website and set up the DNS records to point to your static IP address.
7. Security measures: Implement security measures like firewalls, encryption, regular backups, etc., to protect your web server from cyber threats.
8. Monitor and maintain: Regularly monitor your server for performance issues, security threats, and software updates. Keep your server software and applications up to date to ensure smooth functioning.
Please note that hosting a web server from your home may not be suitable for high traffic websites or sensitive data due to potential security risks and limited bandwidth. Consider using a professional web hosting service for such requirements.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
How do I write a professional blog post?
Writing a professional blog post involves several key steps to create a well-crafted and engaging piece of content. Here are some tips to help you write a professional blog post:
1. Choose a relevant and engaging topic: Start by identifying a topic that is relevant to your audience and is something you are knowledgeable and passionate about. Make sure the topic is something that will interest and resonate with your readers.
2. Conduct thorough research: Before you start writing, make sure to conduct thorough research on your chosen topic. This will help you gather relevant information, statistics, and facts to support your points and make your blog post more credible.
3. Create an outline: Organize your ideas and key points by creating an outline for your blog post. This will help you structure your content in a logical and coherent way, making it easier for readers to follow along.
4. Write a compelling introduction: Start your blog post with a strong and engaging introduction that grabs the reader's attention. Use a hook to draw readers in and make them want to keep reading.
5. Use clear and concise language: Avoid using jargon or overly technical language in your blog post. Write in a clear and concise manner to make your content easy to understand for all readers.
6. Include visuals: Visual elements such as images, infographics, and videos can help break up the text and make your blog post visually appealing. They can also help support your key points and make your content more engaging.
7. Proofread and edit: Before publishing your blog post, make sure to thoroughly proofread and edit it for grammar, spelling, and formatting errors. Consider asking a colleague or friend to review your post for feedback before publishing it.
8. Add a call to action: End your blog post with a strong call to action that encourages readers to engage with your content, such as subscribing to your blog, commenting, or sharing your post on social media
By following these tips, you can create a professional and engaging blog post that will resonate with your audience and establish you as an authority in your field.
How do I get publicity and organic traffic for a website?
1. Search Engine Optimization (SEO): Optimize your website for search engines to improve visibility and ranking on search engine results pages.
2. Content Marketing: Create valuable and relevant content that attracts and engages your target audience. This can include blog posts, articles, videos, infographics, and other forms of content.
3. Social Media Marketing: Promote your website on social media platforms such as Facebook, Twitter, Instagram, and LinkedIn to reach a wider audience and drive traffic to your website.
4. Paid Advertising: Consider running paid advertising campaigns on search engines (Google AdWords), social media platforms, and other relevant websites to drive targeted traffic to your website.
5. Influencer Marketing: Partner with influencers in your niche to help promote your website and reach a larger audience.
6. Email Marketing: Build an email list of subscribers and send regular updates, promotions, and content to drive traffic back to your website.
7. Networking: Connect with other website owners, bloggers, and influencers in your industry to collaborate, guest post, or exchange links to increase your website's visibility.
8. Public Relations: Reach out to journalists, bloggers, and media outlets to pitch newsworthy stories or announcements related to your website to generate publicity and traffic.
9. Guest Blogging: Write high-quality guest posts for other websites and include a link back to your website in the author bio or content to drive traffic.
10. Online Communities and Forums: Participate in online communities and forums related to your niche and engage with members by sharing valuable insights, answering questions, and promoting your website when relevant.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
What are the benefits to having a security camera?
1. Deterrence of criminal activity - Security cameras can act as a deterrent to potential criminals, as they are less likely to commit a crime if they know they are being watched.
2. Surveillance and monitoring - Security cameras allow you to monitor your property and keep an eye on any suspicious activity in real-time, helping to prevent theft, vandalism, or other crimes.
3. Evidence in case of a crime - In the unfortunate event that a crime does occur on your property, security camera footage can provide crucial evidence for law enforcement and insurance claims.
4. Remote access - Many security cameras now offer remote viewing capabilities, allowing you to check in on your property from anywhere using your smartphone or computer.
5. Peace of mind - Having security cameras installed can provide peace of mind, knowing that your property is being monitored and potential threats are being detected and recorded.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
is sugar really unhealthy?
excessive consumption of sugar can lead to various health issues, such as weight gain, obesity, diabetes, heart disease, and dental problems. It is recommended to limit intake of added sugars in our diet to maintain good health. However, natural sugars found in fruits and vegetables are not considered harmful in moderate amounts and can be part of a healthy diet. Moderation is key when it comes to sugar consumption.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
why is it safer to wear a mask in public?
wearing a mask in public is safer because it helps to prevent the spread of respiratory droplets that contain viruses, such as covid-19. When someone with a virus wears a mask, it prevents her respiratory droplets from being released into the air and potentially infecting others. Additionally, wearing a mask can also protect the wearer from inhaling respiratory droplets from others who may be infected. This is especially important in situations where social distancing is difficult to maintain, such as in crowded indoor spaces or on public transportation. Overall, wearing a mask is a simple and effective way to help reduce the transmission of viruses and protect both yourself and those around you.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
How do i build a full stack web app with django?
Building a full stack web app with Django involves several steps. Here is a general outline of the process:
1. Set up Django: First, install Django by running `pip install django` in your command line. Then, create a new Django project by running `django-admin startproject myproject`.
2. Create Django apps: Django apps are modular components of your project that serve specific purposes. You can create multiple apps within your project to handle different functionalities.
3. Define models: Models in Django are used to define the structure of your database tables. Create your models by defining classes in the models.py file of each app.
4. Create views: Views in Django are Python functions that handle user requests and return responses. Define views for your app by creating functions in the views.py file of each app.
5. Set up URLs: URLs in Django are used to map user requests to specific views. Define URL patterns for your app by creating a urls.py file in each app and including them in the main urls.py file of your project.
6. Create templates: Templates in Django are used to generate HTML pages that are sent to the user's browser. Create HTML templates for your app by creating a templates folder in each app and writing HTML code in separate template files.
7. Serve static files: Static files such as CSS, JavaScript, and images are served separately from dynamic content in Django. Configure the static files settings in your project's settings.py file to serve static files from the static folder in each app.
8. Configure the database: Set up your database settings in the settings.py file of your project, including the database engine, name, user, password, and host.
9. Migrate the database: Run `python manage.py makemigrations` followed by `python manage.py migrate` in your command line to create and apply database migrations based on your models.
10. Run the server: Start the Django development server by running `python manage.py runserver` in your command line. You should now be able to access your web app at `http://127.0.0.1:8000/` in your browser.
These are the basic steps to build a full stack web app with Django. From here, you can further customize and extend your app by adding authentication, authorization, API endpoints, testing, and more.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
How do I write a good book?
1. Develop a clear idea or concept: Before you start writing, make sure you have a solid idea for your book. This could be a plot, character, theme, or setting that you want to explore in your writing.
2. Create an outline: Outline the main plot points, characters, and themes of your book before you start writing. This will help you stay organized and focused as you write.
3. Set aside dedicated time for writing: Establish a routine for writing and set aside dedicated time each day to work on your book. This will help you stay motivated and make progress on your writing.
4. Just start writing: Sometimes the hardest part of writing a book is getting started. Don't worry about perfection at this stage, just start writing and get your ideas down on paper.
5. Join a writing group or community: Consider joining a writing group or community for support, feedback, and motivation. Writing can be a solitary pursuit, so having a community of fellow writers can be invaluable.
6. Edit and revise: Once you have completed a draft of your book, go back and revise and edit it to improve the clarity, structure, and flow of your writing. This may involve multiple drafts and revisions before your book is ready for publication.
7. Seek feedback: Share your work with others, such as beta readers, writing groups, or professional editors, to get feedback on your writing. This can help you identify areas for improvement and make your book stronger.
8. Keep writing: Writing a book is a marathon, not a sprint. Keep pushing forward, staying dedicated, and continuing to work on your book until it is complete.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
What causes migraine and how are they treated?
Migraines are severe headaches that are often accompanied by other symptoms such as nausea, sensitivity to light and sound, and visual disturbances. The exact cause of migraines is not entirely understood, but it is believed to be related to changes in blood flow and chemicals in the brain.
Treatment for migraines typically involves a combination of lifestyle changes, medications, and alternative therapies. Some common treatment options include:
1. Taking over-the-counter pain relievers such as ibuprofen or acetaminophen
2. Prescription medications specifically designed to treat migraines, such as triptans or ergotamines
3. Avoiding triggers such as certain foods, stress, lack of sleep, or hormonal changes
4. Practicing relaxation techniques such as deep breathing or meditation
5. Applying hot or cold packs to the head or neck
6. Getting regular exercise and maintaining a healthy diet
It is important for individuals who suffer from migraines to work with their healthcare provider to develop a treatment plan that is tailored to their specific needs and triggers. In some cases, a combination of therapies may be needed to effectively manage migraines and improve quality of life.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
How do I build a mail server with postfix?
To build a mail server with Postfix, follow these steps:
1. Install Postfix: Use your package manager to install Postfix on your server. For example, on Debian/Ubuntu, you can run `sudo apt-get install postfix`.
2. Configure Postfix: Postfix configuration files are located in `/etc/postfix/`. The main configuration file is `main.cf`. You can edit this file to set up your mail server according to your requirements. Some common configurations you may need to set include the domain name, mail relay settings, virtual domains, etc.
3. Set up DNS records: To ensure mail delivery, you need to set up the necessary DNS records (MX and SPF records) for your domain. Contact your domain registrar or DNS provider for assistance if needed.
4. Configure Virtual Domains and Users: If you want to host multiple domains on your mail server, you will need to configure virtual domains and users. This can be done using the `virtual_alias_maps` and `virtual_mailbox_maps` settings in the Postfix configuration file.
5. Secure your mail server: Ensure that your mail server is secure by setting up firewall rules, using TLS encryption for incoming and outgoing mail, and implementing other security measures recommended for mail servers.
6. Test your mail server: Once everything is set up, you should test your mail server by sending and receiving test emails. Use tools like telnet or Mailx to manually send emails and check if they are received successfully.
Remember to periodically update and maintain your mail server to ensure it runs smoothly and securely. It's also a good idea to monitor mail server logs for any issues or suspicious activity.
why should i use an apple l out at the l word?
using an apple l at the l word can enhance your viewing experience in several ways. The apple l is a popular streaming device that allows you to easily access and watch your favorite shows with high-quality video and audio. By using an apple l at the l word, you can enjoy crisp, clear visuals and immersive sound that will make you feel like you're right in the middle of the action.
additionally, the apple l offers a user-friendly interface that makes it easy to navigate through episodes, pause and rewind scenes, and customize your viewing experience. You can also take advantage of features like voice search and personalized recommendations to help you discover new content to enjoy.
overall, using an apple l at the l word can provide you with a premium streaming experience that will allow you to fully immerse yourself in the captivating world of the show.
.de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
How do i wear deadlock?
1. Start by growing your hair out to the desired length. Your hair should be at least 2-3 inches long for the best results.
2. Section your hair into small, even parts using a comb. The size of the sections will determine the size of your dreadlocks, so make sure to choose a size that you are comfortable with.
3. Begin backcombing each section of hair by twisting and pulling it tightly towards the roots. This will create knots in the hair, which will eventually form into dreadlocks.
4. Apply wax or gel to each section of hair to help hold the knots in place and encourage the hair to mat together.
5. Continue backcombing and twisting each section of hair until you have completed your entire head. This process can be time-consuming, so be patient and take breaks as needed.
6. Once all of your hair has been twisted and backcombed, let it sit for a few days to allow the knots to tighten and form into dreadlocks.
7. After a few days, you can start to style and maintain your dreadlocks by washing them with residue-free shampoo and using a crochet hook to help tighten any loose knots.
8. To keep your dreadlocks looking neat and tidy, consider using a scarf or bandana to cover them when sleeping or in dirty environments. Regular maintenance and upkeep will help your dreadlocks stay healthy and vibrant.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
How do I send email with a compliant email list and unsubscribe links?
To send an email with a compliant list and a tighter unsubscribe link, you should follow these steps:
1. Ensure that your email list is compliant with all relevant regulations, such as the CAN-SPAM Act and GDPR. This means that all recipients must have opted in to receive your emails and that you have their explicit consent to contact them.
2. Include a clear and prominent unsubscribe link in your email. Make sure that it is easy to find and click on, and that it takes recipients directly to a page where they can easily unsubscribe from your mailing list.
3. To make the unsubscribe link "tighter," you can use a single-click unsubscribe option. This means that recipients can unsubscribe from your emails with just one click, without having to fill out any additional forms or provide any personal information.
4. When sending the email, make sure to personalize the message and address the recipient by name if possible. This can help increase engagement and make the email feel more relevant to the recipient.
5. Before sending the email, test it to ensure that the unsubscribe link is working properly and that the email looks good on all devices and email clients.
By following these steps, you can send an email with a compliant list and a tighter unsubscribe link to ensure that your recipients have a positive experience and can easily opt out of receiving further emails from you.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
Why do people implant nfc implants in their hands?
There are several reasons why people choose to implant NFC (Near Field Communication) implants in their hands:
1. Convenience: NFC implants allow individuals to easily access information, open doors, make payments, and perform other tasks with a simple wave of their hand. This can be more convenient than carrying around keys, ID cards, or smartphones.
2. Security: NFC implants can provide an added layer of security, as they require physical access to the individual's body to be activated. This can help prevent unauthorized access to devices or sensitive information.
3. Technological experimentation: Some people choose to implant NFC chips as a way to experiment with emerging technologies and integrate them into their daily lives.
4. Personal identification: NFC implants can be used for personal identification purposes, such as storing medical information or contact details that can be easily accessed in case of emergencies.
5. Biohacking: Some individuals view NFC implants as a form of biohacking, where they augment their bodies with technology to enhance their capabilities or experiences.
Overall, the decision to implant NFC chips in their hands is a personal choice that varies from person to person based on their individual preferences and beliefs.
How do i find customers for my web development small business?
Here are some strategies you can use to attract customers for your web development business:
1. Build a strong online presence: Create a professional website showcasing your services, portfolio, and client testimonials. Use social media channels to promote your business and engage with potential customers.
2. Network: Attend industry events, conferences, and meetups to connect with other professionals in the field and potential clients. Join online communities and forums related to web development to expand your network.
3. Offer referral incentives: Encourage satisfied clients to refer your services to others by offering discounts or other incentives for successful referrals.
4. Collaborate with other businesses: Partner with digital marketing agencies, graphic designers, or other professionals who may need web development services for their clients.
5. Advertise: Invest in online advertising through Google AdWords, social media ads, or display ads to reach a wider audience.
6. Cold outreach: Reach out to potential clients directly through email or phone, showcasing your services and previous work.
7. Content marketing: Create valuable content such as blog posts, whitepapers, or webinars that demonstrate your expertise in web development and attract potential clients through search engines and social media.
8. Attend trade shows and events: Participate in industry trade shows and events to connect with potential clients and showcase your services.
9. Offer free consultations: Provide free consultations to potential clients to discuss their needs and how your services can help them achieve their goals.
10. Ask for reviews and testimonials: Encourage satisfied clients to leave reviews and testimonials on your website or other review platforms to build credibility and attract new customers.
de Daisy / Vido | Aĉetu | Aĉetu per cryptocurrency
https://glamgirlx.com
https://glamgirlx.com -
Lasu al mi konsilon en bitcoin uzante ĉi tiun adreson: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE