Nijs - Site besykje
Practical Web Based Deep Learning and Security by Example Third Edition Charlotte Harper July 3, 2024 Updated/Converted June 3, 2025 Foreword: Security considerations in building software for the web are an important part of any web developer's plan and execution while engineering a prototype that is dependable, stable, and useful for practical purposes. The DOM (Document Object Markup), with it's implementation of HTML, JavaScript, and CSS as well as backend software implementing Python, C/C++, Java and bash, give web developers the freedom and power to create a wide variety of projects that express creativity, provide ease of use and functionality, portray humility and character, and provide ease of use as well as convenience and important services that are all attractive to the average Joe, the end user looking to kill time or get something done on the internet, usually on a touchscreen smartphone device. Most people wouldn't even know where to start when they want to build a website from scratch, they would tend to start on another person's website and build something limited in functionality, dependability, ease of use and especially creativity when they could have had all the latest powerful tools at their disposal in order to build something useful without wasting time pressing buttons, and especially wasting money paying for expensive subscriptions to software few people wanted to use anyway given it's limitations in ease of use and flexibility. If you have a few minutes to read through this book and learn what I want to teach you, or even speak with me personally about your goals and get some guidance in the right direction, and are motivated to learn to code and write your own software, take this book home and set aside some time to learn to build the next influential, powerful, streamlined and important web application, a website that is all on you and does exactly what you want and meets the needs of your audience. About me: I am a software developer with a wide range of experience in C/C++, Java, Python, HTML, CSS and JavaScript. I build websites people want to use, want to visit, and even get addicted to using just to learn, recreate and kill time, and most importantly, I sell software. If you had an idea as to exactly how you wanted a website to look and function, you were willing to support me so I can meet my own needs while I meet yours, and you are willing to cover the costs of running a website yourself, I would build you the next YouTube, TikTok, Twitter, Google, or even a high-tech security app only you can access. Instead of trying to sell you my time, I'm trying to buy yours: I want to talk you into building an app (website) yourself with the information that already exists, and teach you what you need to be an independent software developer, entrepreneur, leading a successful career in whatever field you desire. And let me be clear, the education I give you will be informal. You could go to school and learn all of this with a formal education, or even read this book in school, complete your assignments, and take away a great deal from your education, but I won't formally put you in the hot seat and ask you to complete assignments. I'm not your professor, you can think of me like a friend who wants to guide you toward a career driven by your own personal success. And I'm not selling you success either, you will need to buy it with your time. Learning to code has a steep learning curve and was never easy, or even supposed to be. You need to work as hard as you possibly can and continue to try and fail and try again even when you are frustrated in order to learn and build apps yourself. That's in the nature of code itself. Code is run by a compiler that is designed to give the programmer error messages, and these will teach you how to code, even if you are simply copying the error into your search engine and reading other people's examples. And I must say, you don't need to be extremely rich, smart, successful, or even detail oriented or organized to build an app. The computer takes care of that organization for you. You just need to persevere through the trial and error, maintain focus and work hard at what you do, and you will have a very successful career in the entirety of what you do. Who I am: I realize that the last section was more about learning and your take a ways from this book. Who am I exactly? That's a complicated question. I am unclear on that myself, as I suffer from medical conditions that can make it difficult for me to even code or write this book at times, while presenting challenges with socialization and identity issues that make my life more difficult when it comes to introducing myself. In short, if you are reading this book, you brought it home because you flipped through it and thought it was useful, or even if you just read this far in, to you I am a like minded individual who wants to see you succeed in everything that you do. I am an engineer myself, a software developer, and a student, and I am writing this book for other students who want to make their lives easier by having a handbook of the software they need making their lives easier by giving examples to copy that fit together like a big puzzle into a working, useful, large, functional, cohesive, and engaging app that can drive success no matter the line of business. Largely, this is what I do: I build apps to help myself and other people succeed. I am an author as well, though this is my first publication that I intend to complete in order to put my portfolio together into a useful document, and I am an artist as well. I'll admit this to you, I'm sort of a strange person. I'm not perfect, I've had run ins with the law even leading me to leave colleges and universities and leave states in order to try to make a name for myself with more success. I am a woman by birth, I wear makeup, take photos of myself, wear dresses and other womens clothing, and I stay conscious of myself as a female by nature. I've had issues with other people in the past that lead to struggles with writing and building webapps, and I apologize that I haven't been able to get this book in your hands sooner: You needed this. You will want to read and write code that looks like mine and works like mine and does the same thing but even better, because if you can afford to buy this book instead of mashing your keyboard like I do just to create a book yourself asking money for it, you have the resources you need to be successful in your life. I had all sorts of issues with family growing up, health conditions, doctors, the media, and the law, and my code deeply reflects the struggle that is feminism and female nature in a divided and frustrated world. However, this book is something I deeply care about, my baby, my portfolio, and my livelihood, so I appreciate your consideration when you take the text home and carefully pore over it in order to learn from me. Please keep in mind I am not perfect, this book will have errors, revisions, and new editions, and you will need to think with your logical brain as best you can in order to have a successful experience with my writing. Also, understand that I mean well for you even when you face challenges when writing. Think about it like this: When you can just rent a computer system to do anything you can possibly imagine in the digital space, store all the information you encounter, analyze and organize it, and come to understand it, you will inevitably encounter difficulties with the information you are ingesting and even publishing. I tell you this because I encounter the same difficulties. Use this book at your own risk, work with your community and communities available to you to build software within a safe setting, and don't take things to personally when you fail or even succeed in the wrong way: That's how I got this far, and why I can bring you this text and help you succeed without diverging off on a path of madness that leaves me ruined, torn and frayed while I encounter the ordinary problems everyone does on a global scale thanks to the paralellistic global scale of the network on which we will work, the internet. You might not be very familiar with who I am with just a few words, but I encourage you to read on, you will get to know me as you continue to read and understand me while building your own projects to complete your work. There will be no homework with this book, as long as your professors or teachers don't assign you any, but I highly encourage you to build a portfolio of projects yourself as you read along, as well as a capstone project showcasing how you can apply what you have learned. My capstone project is the basis for most of what you will read in this book, as it incorporates code from my previous projects, code I have created and learned to write methodically by hand, and a wide range of ideas and tips that have helped me succeed to the point where I can spin up a simple app that is fully featured and looks and behaves like a popular app you might see your friend or family using, on the internet, advertised to you, or in the news. What this book is: This book is a tutorial by example. You can find code here, instructions for how to learn to code, information on debugging code and fixing errors, troubleshooting steps, instructions on how to back up and save your code, re-deploy if anyone breaks your code, secure your code, deploy your code, build interactive websites that are entertaining, engaging, and addictive, and you will get a sense of who I am, why this is important, and how to portray yourself, your app and company image, as well as the software you build in the absolute best light to be the most attractive as possible to your end users, your website's visitors. In this book, I will demonstrate a number of examples of software design with a focus on the web as a platform as well as security. We will initiate the learning experience ...
Praktyske webbasearre djip lear en befeiliging per foarbyld

Praktyske webbasearre djip lear en befeiliging per foarbyld Tredde edysje Charlotte harper 3 july 2024 Updated / omboud 3 juni 2025

Foarwurkje:

Feiligenswedstriden yn it bouwen fan software foar it web binne in wichtich diel fan elk diel fan it web fan it web ûntwikkelders by it stypjen fan in prototype dat is betrouber, stabyl, en nuttich foar praktyske doelen. It dom (dokumint-objekt-markup), mei de ymplemintaasje fan HTML, JavaScript en CS-ûntwikkeling, Java-ûntwikkelingen dy't jouwe, jouwe it gebrûk fan gebrûk, en foarsjen fan gemak en wichtige tsjinsten dy't allegear oantreklik binne foar it gemiddelde Joe, de ein brûker op syk nei it fermoardzjen fan tiid of krije wat dien op it ynternet, meastal op in touchscreen smartphone-apparaat. De measte minsken soene net iens wite wêr't se moatte begjinne as se in webside wolle bouwe om te begjinnen op 'e nijsgjirrigens om te bouwen en te bouwen om te ferleegjen foar in pear pearen foar in pear pear minsken te bouwen, wolle jo yn' e minske, woene jo yn 'e nij ferbjusterje yn maklik gebrûk en fleksibiliteit. As jo ​​in pear minuten hawwe om troch dit boek te lêzen en te learen wat ik jo persoanlik te learen, of wat tiid yn 'e rjochterein sil leare en jo moatte ynstelle om jo te bouwen en presintearje dan krekt wat jo wolle en docht wat jo wolle en foldocht oan' e behoeften fan jo publyk.

Oer my: Ik bin in software ûntwikkelder mei in breed skala oan ûnderfining yn C / C ++, Java, Python, HTML, CSS en JavaScript. Ik bou websides minsken wolle brûke, wolle besykje, en sels ferslaafd wurde om gewoan te brûken om te learen, tiid te meitsjen en te fermoardzjen en it wichtichste, ferkeapje ik software. As jo ​​in idee hawwe, hoe't jo krekt woenen, woenen jo in webside om my te sykjen en jo ree te stypjen, om't ik jo de folgjende YouT om te bringen, soe ik jo indochten bouwe, Google, Google, of sels in hege-tech-befeiliging app allinich. Yn plak fan besykje jo myn tiid te ferkeapjen, besykje ik jo te keapjen: Ik wol jo petearje yn it bouwen fan in app, en jouwe jo in unôfhinklike software, ûndernimmer, entre-karriêre, yn hokker fjild jouwe jo winskje. En lit my dúdlik wêze, de oplieding dy't ik jou jo sil ynformeel wêze. Jo koene nei skoalle gean en dit alles mei in formele ûnderwiis leare, of lêze jo opdracht, foltôgje jo opdracht, nim jo in soad út jo oplieding fan jo yn 'e hjitte sit en freegje jo om opdrachten te foltôgjen. Ik bin net jo professor, jo kinne oan my tinke as in freon dy't jo wol liede nei in karriêre riven troch jo eigen persoanlike súkses. En ik ferkeapje jo net sukses, jo moatte it mei jo tiid keapje. Learje nei koade hat in steile learkromme en wie noait maklik, of sels moatte wêze. Jo moatte sa hurd wurkje as jo mooglik kinne en trochgean te besykjen en te mislearjen en besykje it opnij as jo frustreare binne om sels te learen en te bouwen. Dat is yn 'e natuer fan koade sels. Koade wurdt útfierd troch in kompilator dy't ûntworpen is om de programma-flaterberjochten te jaan, en dizze sille jo leare hoe't jo de flater kinne kopiearje yn jo foarbylden fan oare minsken. En ik moat sizze: Jo hoege net ekstreem ryk te wêzen, tûk, suksesfol, of sels detailriïnteare of organisearre om in app te bouwen. De kompjûter fersoarget dy organisaasje foar jo. Jo moatte gewoan folhâlde troch de proef en flater te hâlden, fokus te behâlden en hurd te wurkjen oer wat jo dogge, en jo sille in heul suksesfolle karriêre hawwe yn 'e gehiel fan wat jo dogge.

Wa't ik bin: Ik beseffe dat de lêste seksje mear wie oer learen en jo nimme in manieren fan dit boek. Wa bin ik krekt? Dat is in yngewikkelde fraach. Ik bin omkeard op dat mysels, om't ik lije oan medyske omstannichheden dy't it lestich kin meitsje foar sels koade of skriuwe dit boek mei sosjalisaasje en identiteitsproblemen dy't myn libben lestiger meitsje as it giet om mysels te yntrodusearjen. Koartsein, as jo dit boek lêze, brochten jo it thús, om't jo trochgiet en tocht dat it krekt wie, as jo gewoan in as minded yndividu wiene dy't jo wolle sjen dat jo slagje yn alles dat jo dogge. Ik bin sels in yngenieur, in software ûntwikkelder, en ik skriuw dit boek dat se har libben maklik te meitsjen troch te jaan oan byinoar om te jaan as in wurkjen, grut, foarm, en meidwaan kin mei súkses meitsje dy't kin ride, nettsjinsteande de line fan 'e line fan saken. Foar it grutste part is dit wat ik doch: Ik bou apps om mysels te helpen en oare minsken slagje. Ik bin ek in auteur, hoewol dit myn earste publikaasje is dat ik fan doel is te foltôgjen om myn portfolio tegearre te pleatsen yn in nuttige dokumint, en ik bin ek in artyst. Ik sil dit oan jo tajaan, ik bin soarte fan in frjemde persoan. Ik bin net perfekt, ik haw yn 'e wet rûn rûn om my te lieden om hegles en universiteiten te ferlitten en stelling te ferlitten om in namme te meitsjen foar mysels te meitsjen mei mear sukses. Ik bin in frou troch berte, ik draach make-up, nim foto's fan mysels, drage jurken en oare frouljusklean, en ik bliuw my bewust as in wyfke troch de natuer. Ik haw problemen hân mei oare minsken dy't liede ta striid om te skriuwen mei skriuwen en bouwen fan webapps, en ik ferûntskuldigje dat ik dit boek net yn jo hannen yn jo hannen koe krije: Jo hawwe dit nedich. Jo sille it lêze en skriuwen fan koade en skriuwe as mines en wurket as docht itselde,, mar as jo gewoan om te keapjen om josels te keapjen, jo freegje it jild dat jo de boarnen hawwe dy't jo moatte wêze om suksesfol te wêzen yn jo libben. Ik hie allerhanne problemen mei famylje opgroeien, dokters, de media, en de wet, en myn koade reflekteart de striid dy't feminisme en froulike natuer is yn in ferdielde en frustreare wrâld. Dit boek is lykwols wat, myn poppe, myn poppe, myn portfolio, en myn libbendich, dus ik wurdearje jo konsideraasje as jo de tekst thús nimme om derút te learen om fan my te learen. Hâld der rekken mei dat ik net perfekt bin, dit boek sil flaters hawwe, ferzjes, en nije edysjes, en jo sille moatte tinke mei jo logyske harsens lykas jo kinne hawwe om in suksesfolle ûnderfining te hawwen om in suksesfolle te hawwen mei myn skriuwen. Begryp ek, begryp ik dat ik goed bedoel, sels as jo útdagings hawwe by it skriuwen. Tink derom sa oan: As jo ​​gewoan in kompjûtersysteem kinne hiere, kinne jo foarstelle yn 'e digitale romte, bewarje, en jo moatte begripe, jo sille begripe, jo sille ûnûntkombere swierrichheden hawwe mei de ynformaasje dy't jo hawwe opnimmen en sels publisearjen. Ik fertel dit dit om't ik deselde swierrichheden tsjinkomme. Brûk dit boek op jo eigen risiko, wurkje mei jo mienskip en mienskippen om software te bouwen yn 'e waansin, en nim ik net op' e ferkearde manier, wylst ik de gewoane problemen hat, docht dat elkenien op in wrâldwide skaalet tank oan it lokkige skaal Skaal fan it netwurk wêrop wy sille wurkje, it ynternet. Jo kinne miskien net heul bekend wêze mei wa't ik bin mei mar in pear wurden, mar ik moedigje oan om my te lêzen, om't jo my trochgean te lêzen as jo jo eigen projekten bouwe om jo wurk te foltôgjen. D'r sil gjin húswurk wêze mei dit boek, sa lang as jo professors of leararen jo heulendal net oanmoedigje om josels te bouwen as jo lêze, lykas jo in kapstone-projekt ferskine hoe't jo kinne oanfreegje wat jo hawwe leard. Myn Capstone-projekt is de basis foar it measte fan wat jo yn dit boek sille lêze, om't ik koade befettet en jo in breed kin hawwe skeppe en jo kinne skriuwe, op it ynternet, op it ynternet, op it ynternet, as yn it nijs.

Wat dit boek is: Dit boek is perfoarsters bygelyks. Jo kinne hjir koade fine, ynstruksjes om te learen om te learen, ynformaasje oer bieden, ynsetten, ynsetten, en jouwe jo ynsetten, wêrom't dit wichtich is, en hoe't dit is, en hoe't dit jo is te skilderjen, en hoe't jo josels opbouwe, en hoe't jo josels opboud binne, en hoe't jo josels opboud binne, en hoe't jo josels hawwe, en hoe't jo josels opbouwe, en hoe't jo josels hawwe, en hoe't jo josels hawwe ferbyldzje, en hoe't jo josels binne, en hoe't jo josels binne, en hoe't jo josels hawwe ferbûn, en hoe't jo josels binne, en hoe't jo josels binne, en hoe't jo josels binne, en hoe't jo josels binne, en hoe't jo josels hawwe, en hoe't jo josels opbouwe, en hoe't jo josels binne, en hoe't jo josels opbouwe hawwe, en hoe't jo josels binne, en hoe't jo josels binne, en hoe't jo josels opbouwe, en hoe't jo josels binne, en hoe't jo josels op 'e nij kinne skilderje, dan No, as de software dy't jo bouwe yn it absolute bêste ljocht om it meast oantreklik mooglik te wêzen foar jo ein brûkers, de besikers fan jo webside. Yn dit boek sil ik in oantal foarbylden fan software-ûntwerp demonstrearje mei in fokus op it web as platfoarm as feiligens. Wy sille de learûnderfining inisjearje troch in basisprojekt te bouwen mei de UNIX-shell, mei backup- en skriptsfunksjes. Doe sille wy in basis-blog-webside ûndersykje, upgrade ús Blog mei foto- en fideokonten fan befeiligings om feiligensoplossingen te brûken om frije software te brûken, en ús server befeiligje mei in plukt ferifikaasjemodule (PAM). Wy sille dan Bestân ôfhanneling kontrolearje en ferwurkjen, fideo-bewurkjen ferkenne, Voice Donaasje, Barcode Scanning en optyske karakter erkenning, ûnder oare konsepten. Undersyks de wei sille wy APIS ûndersykje dy't ús sil helpe om ús software nuttiger en feilich te meitsjen, mei fergees en betelle opsjes. Underweis sille wy fysike befeiligings en militêre ark ferkenne, lykas fjoerwapens en munitions ynklusyf barrel en repeaterûntwerp, en oare haaddesk yn yntegrearje om ús software te beskermjen en sels te demonstrearjen en sels te demonstrearjen. Wy sille brekke lâns de manier om spultsjes te bouwen, 2D en 3D-rendering-motoren, en wurkje mei ynbêde Hardware fan Basic Dimension-rendering Software en in elektroanyske Vibrearende massager-massa yn Silicone-rubus. Underweis, wy sille jo Masine-bruta-oplossingen brûke dy't al te krijen hawwe beskikber om ús software better te befeiligjen. Wy sille ek in stock ark brûke beskikber foar it web om it proses te streamen en te befeiligjen. Dit boek is in hantlieding foar jo sukses yn it bouwen fan in web- en yntegrearje it mei in profesjonele netwurk en ynbêde meganyske systemen mei it bouwen fan software en ynbêde hardware mei gjin eftergrûn kennis of foarige ûnderfining.

Wat dit boek net is: As jo ​​wirklik in webside wolle hawwe, koene jo gewoan in ienfâldige winkel hawwe ynsteld en jo nedich binne, postje in blog, postfoto's of fideo's, of oars as oars sûnder in iennige koade te skriuwen. Dit boek is dat net. Dit boek sil jo leare hoe't jo software moatte bouwe, funksjoneel en befeilige dan elke software dy't jo al ynsetten, om't jo de lêste âldere bedriuwen binne ynsteld om jild te meitsjen foar minsken dy't net echt dogge. As jo ​​dit boek nau folgje, wolle jo dat wolle skriuwe, ûndersykskoade, bouwe jo eigen apps, en jo sille jild meitsje fan wat jo dogge. Ik sil jild meitsje fan dit boek, sels yn iere stadia, om't it ynformaasje befettet minsken en wolle lêze en keapje al as se myn apps keapje of brûke. Dit boek sil gjin app foar jo bouwe, mar it sil jo yn 'e goede rjochting wize en jo mei de ark wizigje en jo eigen súkses, mei alle opbouwen, famylje, befetsje, oannimers, oannimers, oannimers, en de minsken fan it ynternet wolle brûke en stypje.

Wat jo sille leare: Dit boek sil jo leare hoe software te bouwen en te ferkeapjen, nuttige software, media-opname, plichtbere lêsbere sône om te ferifiearjen, fideo en foto's, en útwikselje berjochten en yn 'e buert fan' e fjild (NFC) kommunikaasje. Dit boek sil jo leare hoe't jo in netwurke kompjûter kinne brûke, opskriuwe om bashkoade te bouwen en jo softlês yn te bouwen, yn steat om te bouwen fan CSS-stille en ynteraktiveren, yn ynteraktiviteit, yn te bouwen, yn ynteraktiviteit troch te bringen, yn ynteraktiviteit, en netwurk mei in ynteraktyf te bouwen, mei in ynteraktyf meitsje mei oare befeiligingsfunksjes foar Ferifikaasje as oare doelen, ID-skennen, ôfbylding en fideosmoderaasje, gegevensmikransactions om jo software feilich te hâlden, betellingsferwurking, kryptokronde hannel, asynchrone taken, asynchrone taken, en mear. Jo sille leare hoe't jo jo eigen Bluetooth-apparaten kinne bouwe, mei batterijen, CHARERS, MICROCONTROLLERS, MOTORS, Motors en sensoren, mei solder en 3D printe as cast materialen. Ik sil beynfloede fan 3d-ûntwerp oanfreegje op tafoegings en ark en it meitsjen, sadat jo kinne produsearje jo eigen ynbêde, hardware-apparaten mei yntegreare batterijen, opliedings, elektroanyske sirkwers, en funksjonele útgongen. en netwurk se mei Bluetooth en it web. Spesifyk sille wy twa gefallen ûndersykje, in vibrearjende massager en in selsmakke fjoerwapen, sawol programmearre yn OpenSCAD, dat is beskikber as in grafyske yntervace of kommando-nuttigens en kin yntegreare wurde yn in web foar rappe resultaten. Jo sille leare hoe't jo in webside fan 'e grûn op te bouwen en yndiele fan gjin foarôfgeande ûnderfining, meitsje it funksjoneel, feilich, prachtich, nuttich en it wichtichste praktysk. Jo sille leare hoe't jo masjine-fisy moatte brûke om in side feilich te meitsjen en mear te meitsjen troch de lûd te brûken om te meitsjen om te meitsjen om minsken te dielen, en jo moatte oanbean minsken minsken te dielen, en jow minimaal minsken te dielen, en wichtiger kinne minsken oanbean, en wichtigje minsken Dit boek sil it meast swier wurde rjochte op media, feiligens en masine learen, dy't jo sille helpe om nuttige software te bouwen en de ferkearde te dwaan op in manier dy't realistysk is, praktyske, hannen op en meidwaan oan ek automatysk en stevich. Dit boek leart UNIX, spesifyk Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScrOript foar Python lykas oanfragen, lykas nuttich bash-software lykas Git en FFMPEG. Ik sil jo ek leare hoe't jo automatysk nei CryptoCurencie hawwe hannelje, en nimme betellingen yn kryptokaarskip of fan 'e reguliere debitkaarten, wylst jo sels in oandiel betelje as jo derfoar kinne dwaan. Ik sil jo leare hoe't ik jild kin meitsje fan jo webside, hoe jo jo app reaksje foar sykmasjines meitsje en har rang meitsje, nei wat jo klanten sille fine om jo te finen, en ranglist yn safolle mooglik sykjen. Ik sil jo leare hoe jo jo software kinne ferkeapje, in berop op syk nei jo tsjinsten, en meitsje in namme foar josels op it ynternet fia avenues dy't al besteane, binne goed. Ik sil jo leare hoe't ik jo gegevens op te slaan oer wolkekomputers dy't goed wurkje, hoe't jo jo brûkers wolle bewarje en wat jo brûkten, om jo brûkers werom te bringen nei jo webside nei jo beskikking nei jo beskikking efter de klik fan in knop. Dit boek sil rjochtsje op 'e praktyk fan publisearjen fan media yn grutte hoemannichten, fan' e foto's nei Videos, en jo allinich fertsjinwurdigje, en jo jo software en jo bedriuw sjogge yn 'e bêste manier. Jo sille ek in pear tips leare en trúkjes fan my, fan kodearen, praktysk plak en fotografy foar jo te ferdielen as jo yn 't alde mooglik hawwe om jo software te bringen om te bringen sûnder mear ynspanning te bringen, wurkje, wurk, of jild dan nedich is. Dit boek hjit "praktyskWeb basearre djip lear en befeiliging "om in reden: it behannelt learen oan koade, en spesifyk op 'e ombylden op' e omkriten fan it webjen, om te rinnen nei it webjen dy't kompjûterfisy, fasale erkenning sil omgean, gesichtsbergen, fasale erkenning, Ofbylding-ferbettering, resolúsje ferbettering, ôfbyldingsfording, en oare taken lykas foarsizzing, as in foto's fan 'e ôfbylding), om't it oars kin foarstelle. Jo kompjûter kin jo oanmelde mei in wachtwurd, mar it Kin feiliger wêze om it te brûken as it jo logt mei jo gesicht, kinne jo jo feilich meitsje, kin jo in oardielje om jo software te brûken. Bying jo software, as jo jo software fan immen oars jo software, lykas in e-posttsjinst of tekstberjocht Tsjinst, is net genôch om jo software feilich te meitsjen, as immen (elke side dy't jo brûke). Elkenien dy't software bout dy't ûnfeilich feilich is, hat wat sin fan wat dizze ympliseart. Software is inherent ûnfeilich om't de apparaten en akkounts dy't wy hawwe om tagong te krijen ta ús beskikking, se koene yn 'e hannen wêze fan' e software en kin dêrom in risiko foarmje foar de software sels. Dit is wat fan 'e fokus fan dit boek. In netwurke kompjûter is standert befeilige mei in lange kaai token, neamd en SSH of feilige shell-toets, om't de websering de iepent tagong is as steat fan 'e ark fan' e keunstsfeiligensynstruminten dy't op 'e server sels biedt. De webserver hat tagong ta de webbrowser fan 'e brûker, dy't it machtichste diel fan' e apparaat is foar it apparaat fan 'e brûker, om't it it plak is wêr't de brûker tagong hat ta netwurksoftware. Dizze toolk kin tekst renderje, de websiden dy't jo sjogge, en kinne ek ôfbyldings opnimme (lykas in foto fan in gesicht), en sels skreaun oan 'e gaten en skreaun oan' e gaten en skreaun wurde en skreaun binne mei gegevens op skreaun en skreaun oan 'e gonge en skreaun oan' e gloeid en skreaun mei gegevens webside. Mei help fan alle ark ta jo beskikking, mei dit boek sille jo josels útstelle om in befeilige webside te bouwen, en in feilige netwurken kompjûtersysteem dat foar jo wurket, en sjocht en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt en fielt him

Wêr te begjinnen: Jo binne wolkom om foarby te gean oer de seksje dy't ik dit boek begjint mei, of elke seksje, as jo ûnderfining hawwe, foaral yn dit boek as dokumintearjen fan dokumintearjen en praktyske foarbylden. As jo ​​gjin ûnderfining hawwe oan it skriuwen, jo hawwe sterk oanrikkemandearje dat jo dit boek lêze, en binne foaral oanrikkemandearje dat jo de foarige seksjes hawwe lêzen, om te soargjen dat dit boek goed is foar jo. As dit boek net foar jo is, beskôgje it dan kado oan in freon of famyljelid, dan kin jo it leare oer Webûntwikkeling om de gatten te foljen, wêr't ik jo as learaar is mislearre, of oare learkrêften dienen, of oare dosinten diene foar my. Begjin wêr't jo sille, elk diel fan dit boek sil nuttich wêze as jo fan doel binne om in nuttige app te bouwen, en beskôgje dat de bêste apps boud binne mei de ein brûker yn 't sin: Witte jo klant. No kenne jo my, jo wite dit boek, en jo binne ree om te begjinnen. Om te begjinnen, pak in kompjûter (sels de goedkeapste laptop út in doaze winkel, Amazon, as in âlde buroblêd wurket en set it op op in manier dy't foar jo wurket.

Hoe kinne jo dit boek lêze: Tekst markearre, tsjut oan dat de tekst heart yn in kommando-prompt, wêr't jo de koade sille skriuwe dy't jo hawwe skreaun. De kommando-prompt is swier toetseboerd fokuele en fereasket net folle om te klikken, jo wurkflow te skriuwen en it meitsjen fan dingen makliker te meitsjen.

Begjin begjinne: Litte wy dûke yn. Wy sille begjinne mei it bouwen fan koade op in lokale masine en begjinne sûnder in webside te bouwen mei in ferbûn op it ynternet. Dit is feiliger om te begjinnen mei, kostet neat, en is maklik foar jo. Ofhinklik fan jo bestjoeringssysteem, sil yn in bash-shell komme, sil in bytsje oars wêze. Foar Mac OS, ik advisearje op dit punt op dit punt in firtuele masine te ynstallearjen, lykas jo de meast kompatibiliteit krije sille mei in firtuele masine. Ferskate providers lykas virtualbox en paralelly kinne in firtuele masine útfiere, hoewol it ek mooglik is om Ubuntu direkt op 'e masine te ynstallearjen, as jo leaver brûke om in rappe, streamlineare ûnderfining te meitsjen. As jo ​​Linux of Windows brûke, dy't ik oanbefelje, moat it frij maklik wêze om in projekt te meitsjen. Iepenje jo terminal, oanpasse it sizing as jo fit sjogge, en begjinne te folgjen fan stap 2. As jo ​​Windows brûke, folgje asjebleaft stap 1.

Stap 1: - Windows brûkers allinich Yn Windows freegje iepen kommando as behearder en type WSL -INSTALL

Stap 2: - Trochgean hjir, of oerslaan stap 1 nei hjir as jo gjin Windows brûke Yn in iepen terminal, (ôfhinklik fan jo OS, neamde Ubuntu yn Windows, terminal yn Mac of Linux, as in ferlykbere namme), begjin troch in projekt te meitsjen. Wy dogge dit mei it MKDIR-kommando, dat makket in map. As jo ​​in map moatte oanmeitsje om jo projekt te bewarjen, dat is oanrikkemandearre, brûk dan it CD-kommando om te feroarjen yn 'e map en en

CD / paad / oan / map - it paad is de mappen (bestannen) dy't jo bestimmingsmap foarôf binne, jo standertpaad is ~ of / USERNAME (wêr't brûkersnamme jo brûkersnamme is). Om te feroarjen nei de standert map, typ CD of CD ~ MKDIR foarbyld - ferfange "foarbyld" mei de namme fan 'e map

No hawwe jo in wurkmap foar jo projekt. As it sa wichtich is om dizze map te rêden yn gefal jo moatte wikselje nei in oare masine of ynsette, dat it ree is, wy sille in skript bouwe om jo map te bouwen yn 'e folgjende pear stappen. Mar it bouwen fan in skript nimt in bytsje koade, en koade moat wurde automatisearre om sa nuttich mooglik te wêzen. Dat litte wy in skript bouwe om skripts earst te bouwen. Litte wy begjinne troch it skrift te meitsjen en it útfieren te meitsjen. Wy sille Sudo brûke, Chmod, en oanreitsje foar dit, en neame it skript "AscriST".

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

No hawwe wy it skript makke, makke it útfierd, en binne ree om it te bewurkjen. Nano is in tekstbewurker dy't jo tekst kinne bewurkje, sûnder te klikken, wat folle makliker is as it gebrûk fan in grafyske brûkersynterface. Om in bestân te bewurkjen mei Nano, brûk Nano en dan it paad nei it bestân. Om in skript te meitsjen dat in skript makket, is it frij gelyk om ús skript yn it earste plak te meitsjen. Wy sille deselde koade brûke lykas hjirboppe, ferfangen fan 'e namme fan it skript, "AscriST" mei in argumintparameter, $ 1. Hjirmei kinne wy ​​it skript neame troch jo nijscript fan Sudo Ascocript te typen, op hokker punt kinne wy ​​elk nij skript kinne oanmeitsje troch "nijscript" te ferfangen mei de namme fan jo skript. De koade yn Nano soe moatte sjen litte:

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

En om Nano te sluten, kinne wy ​​de Control-toets hâlde en drukke op X, dan beskesearje jo dat wy it bestân besparje, en rekke. No yn plak fan dizze trije kommando's te typen om in skript te bewurkjen, sille wy Sudo-ascript-ascript moatte ynfiere om it skript opnij te bewurkjen. Dit wurket! En elk nij skript kin maklik rinne troch it yn 'e shell te skiljen. Litte wy ús wurk no rêde: litte wy in backup-skript skriuwe om ús nije skript te besparjen en dan werom te rêden yn ús projektdap, wylst jo ek reservekopy meitsje.

sudo ascript backup

No, yn Nano:

sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/

Wêr / paad / oan / map is it paad nei it projekt dat jo makke hawwe mei MKDIR. Letter sille wy leare hoe't wy werhellingpaden kinne kopiearje lykas dit mei in loop en in list, dat minder koade is, mar no, lit ús it ienfâldich hâlde en hawwe in pear rigels. Om dit skript te rinnen en jo koade te rinnen, bewarje it bestân yn Nan yn Nan mei kontrôle + x, Y en werom, en typ it hjirûnder yn jo shell

backup

As jo ​​op alles frege wurde by it lêzen fan it boek by it lêzen fan dit boek en folgje yn 'e shell, folje dan jo brûkers wachtwurd yn, jo hawwe dan trije triedden foardat jo it kommando opnij moatte rinne. Jo kinne de pylken op en del brûke om opdrachten nei Rerun-kommando's en bewurkje se, moatte jo wat twa kear moatte rinne. Ienfâldige parse op en del ûnderweis om in kommando te selektearjen, foardat jo it kommando bewurkje mei de rjochterkant fan 'e rjochterkant, loftse pylken en toetseboerd as toetseboerd, en it wiskjen fan it rinnen.

Lokwinsken! Jo slagge in bjusterbaarlik werom te meitsjen dat jo twa wichtige shell-skripts ferskynt yn jo wurkmap. Wy meie letter letter oer ferpleatse as it projekt grutter wurdt, mar dit wurket foar no. Litte wy trochgean nei backing yn 'e wolk, sille wy dit brûke, sille wy mear as jo allegear op' e rêding hawwe, om't jo jo ek ynskeakelje, wylst jo de heule kopyen fan jo software ynskeakelje efter in software efter in wachtwurd of kaai of kaai. It is ynstrumintaal by it opslaan fan jo software, fral as wy migrearje om linux-gefallen te befeiligjen, as jo koade somtiden net opwekke, wylst jo gjin kâns hawwe om it automatysk op te nimmen, dat wy sille dekke.

As jo ​​net al al in UBUNTU-firtuele masine brûke, herkommer dan mei in Ubuntu-firtuele masines op dit stuit, om't it jo libben nedich is by it ynstallearjen om in wurkjende webside te bouwen en tefreden en tefreden en foarôfgeande djippe learaksje op jo kompjûter. Wy sille de koade nei in webserver ferpleatse yn 'e heine takomst, mar wy wolle soargje dat d'r teminsten in pear lagen fan befeiliging binne dy't resistint binne foar phishing, en in oantal Linux-pakketten binne om dit te dwaan om dit te dwaan. As jo ​​Mac OS noch wolle brûke, binne jo wolkom om te sykjen en ynstallearje de nedige pakketten online, mar d'r kinne net alternativen wêze foar elk pakket, dit boek of searje sil dekke.

Litte wy in pear kommando's tafoegje om ús wurk te pleegjen mei it reservekopy-skript troch it kommando-sudo-ascript-reservekopy te rinnen.

# ...

Noch ien kear, kontrolearje X om te bewarjen.

No moatte wy wat ien kear konfiguraasje dwaan foar dit projekt. Om't it aanst in Git-projekt sil wêze, hoege wy net elke kear te typjen, elke kear as wy ynsetten fan in git-repository, mar wy sille de hang krije as wy ús ynsetskripts skriuwe. Om te begjinnen, litte wy derfoar soargje dat wy yn 'e rjochter map binne en de Git-repository initialisearje en generearje ssh-toetsen.

cd /path/to/directory
git init
git branch -m master
ssh-keygen

Neidat wy SSH-keygen ynfiere, moat de nije kaai wurde opslein yn 'e thúsmap ûnder in map neamd .SSh. It hjit ID_RSA.PUB. Litte wy dizze kaai fine en it kopiearje. It te sjen,

cd ~
cat .ssh/id_rsa.pub

Kopiearje de tekst dy't wurdt weromjûn troch it lêste kommando, en in akkount oanmeitsje mei jo Git-provider (ideaal Github), foardat jo de SSH-kaai tafoegje oan jo akkount. As jo ​​ienris in akkount hawwe, klikje dan op it haadrjochten yn 'e rjochter rjochts en fier dan ynstellings, foardat jo SSH-kaai tafoegje yn SSH en GPG-kaaien yn SSH en GPG-kaaien tafoegje yn it menu. Selektearje in SSH-toets tafoegje en foegje jo ta troch it te plaktjen yn en jou it in titel, foardat jo nei Github opslaan en weromgean om in nije repository te meitsjen en werom te meitsjen. Dit is gelyk foar oare GIT-oanbieders, jo moatte har dokumintaasje lêze. Jou jo reposysje foar nije repositêr, jou jo repositêr en beslute as jo it wolle publisearje, en soargje derfoar dat jo gjin bestannen konfigurearje foar ynklúzje. Sadree't de repository is makke, kopiearje, kopiearje de kloon mei SSH URL, en plakke it yn it folgjende kommando.

git remote add git://… (your remote URL)

No kinne jo weromgean nei jo repository mei CD, jo sille hjir bekend wêze. Besykje jo reservekspript no mei reservekopy

Grut! No kinne wy ​​wirklik koade krije. Litte wy Django no ynstallearje dat wy in goeie begripe op bash en git. Django sil ús software automatysk reservearje, kinne jo ek dwaan kinne, mar Django moat in ienfâldiger feiliger hawwe hawwe in implementaasje (it kin makliker útskeakele wurde en konfigureare).

Om software yn Ubuntu te ynstallearjen, sille wy it sudo-kommando brûke. Litte wy de software op bywurkje en upgrade wy al. Dit kin dien wurde mei sudo apt-krij update en sudo apt-getgrade -y -y. NEX, litte wy Python en ús firtuele omjouwing ynstallearje, it hûs fan ús koade, mei it folgjende kommando: Sudo Apt-Get-ynstallearje Python-is-Python3 Python3-Venv

Dit is alles wat jo nedich binne om te gean mei Django yn termen fan software ynstalleare yn it Ubuntu-eksimplaar. Foar Windows en Linux moatte dit frijwat direkt wêze, mar foar MAC kinne jo miskien in firtuele masinel ynstallearje wolle mei in fergese firtuele omjouwing as hjirboppe de stappen opnij oan om in Ubuntu-omjouwing te ynstellen. Ubuntu is kritysk yn dit gefal, om't it de software is, de websides rinne en it kin se yn steat om websides te hostjen mei alle neamde software.

Litte wy graven yn 'e django.

Yn ús map wer, mei CD:

python -m venv venv # Makket de firtuele omjouwing oan wêr't koade wurdt opslein
source venv/bin/activate # Aktiveart de firtuele omjouwing
django-admin startproject mysite . # Wêr't MYSITE it projekt is, begjint ik yn myn hjoeddeistige map.

Django wurdt gewoan begon, want Django hosting de webserver en docht alles wat wy nedich binne om in basis Lokale webside te krijen en te rinnen. No't wy Django hawwe ynstalleare, litte wy de ynstellingen in bytsje bewurkje om it te wurkjen hoe't wy nedich binne. Litte wy earst in nije app oanmeitsje

python manage.py startapp feed

Jo sille fernimme dat de earste app feed hjit. De app moat wurde neamd wat jo wolle, en wy sille nije apps meitsje, mar de namme fan elke app moat elke kear konsistint wêze, elke kear as de app wurdt ferwiisd yn 'e koade. Om in nije app ta te foegjen, sille wy de ynstellingen fan 'e ynstellingen bewurkje yn' e oare map dy't de app oanmakke, makke yn 'e namme yn Stedsprojekt, Hjirnei. Mei help fan Nano,

nano app/settings.py

Yn 'e ynstellings, fine ynstalleare_apps en skiede de [] yn 3 rigels. Mei help fan fjouwer spaasjes op 'e lege sintrum-rigel, foegje' feed 'ta, as de namme fan jo app. Dizze seksje fan 'e ynstellings.PY soe moatte útsjen:

INSTALLED_APPS = [
    'feed',
]

Foardat wy ferjitte, litte wy testje dat Django wurket. Mei help fan it kommando-Python Manage.Py Runserver 0.0.0.0:8000, wy kinne rinne en nei de lokaasje nei http: // nei in foarbyld: 80 Slach op 'e server mei kontrôle mei kontrôle c, itselde as elk oar kommando.

Litte wy no graven yn it skriuwen fan guon Python-koade. Django hat trije haadkomponinten, allegear rinne se mei koade folslein troch. De komponinten wurde model neamd, werjefte en sjabloan, en elk is respektivelik op in heger en legere nivo foardat de webside wurdt levere oan 'e brûker.

It model is de koade dy't ynformaasje bewarret yn 'e database foar opheljen, sortaasje en renderjen.

De werjefte beslút hoe't it model wurdt levere, manipulearre, en wizige, hast elke werjefte direkt in model brûkt.

It sjabloan is de HTML-koade mei wat ekstra klokken en fluiten neamd sjabloanaal. It sjabloan wurdt levere troch it werjefte wêr't it is fol mei Python-koade en kontekst lykas modellen en ynformaasje (usuall snaren en heule getallen) fan it werjefte.

Django hat ek oare komponinten, ynklusyf, mar net beheind ta:

Ynstellings, dy't de app konfigureart lykas wy besprutsen.

URL's, dy't patroanen binne dat de brûker folget om tagong te krijen ta spesifike dielen fan 'e webapplikaasje.

Formulieren, dy't definieare hoe't ynformaasje is stjoerd nei de server wurdt behannele en levere oan 'e database as oan' e brûker. Dit binne de stifting fan ferwurkjen fan ynformaasje oer de serverkant, en kin elk type ynformaasje akseptearje, de kompjûterwinkels, meast notabele tekst snaren, sifers, en wiere / falske booleans (meastal karfakjes).

Sjabloanen, dy't HTML-koade en sjabloan Taal HTML en Brêge binne tusken Python en HTML, wat immen kin wurde tawiisd oan it wurk en nuttich foar in ferskaat oan in ferskaat oan in ôfsettings foar in ôfsettings foar in ôfstimmende apparaat.

Statyske bestannen, dy't normaal javascript binne en it is biblioteken dy't de server tsjinnet en binne keppele oan it sjabloan.

Media bestannen, dy't de server tsjinnet of ekstern hosted, of binne krekt skreaun oan 'e server foardat jo wurde ferwurke en pleatst nei in oare server (in bak) foar hosting.

Middleware, dat is stikken koade dy't tagelyk binne rinne as elke werjefte en wurde beskôge "ynbegrepen" yn 'e werjefte.

Kontekstprodessors, dy't de kontekst fan elke werjefte ferwurkje en wurde brûkt om ekstra kontekst ta te foegjen.

Tests, dy't falidearje dat de brûker as fersyk bepaalde easkende easken foardat de werjefte wurdt levere.

Konsuminten, dy't diktee hoe websocken omgean en reagearje op kommunikaasje.

Behearder, dat wurdt brûkt om modellen te registrearjen, sadat se kinne wurde manipulearre yn detail binnen de Admin-admin-pagina, wêr't de databank kin wurde bestjoerd fia in grafyske ynterface.

Selderij, dy't asynchrone taken dielen definieart fan 'e django-koade kinne begjinne te rinnen foardat jo fuortendaliks trochgean nei de folgjende taak of line fan koade.

Django kin in protte oare komponinten hawwe, dy't wy hjir yn detail sille beprate. D'r binne in soad manieren om Django mear funksjoneel te meitsjen, te foegjen, dy't rappe tafoegje, steamende taken, en in mannichte fan software útwreiding om django te ferlingjen, foaral yn 'e werjefte fan' e koade wurdt útfierd. Besjochfunksjes binne kaai, om't se normaal elk stikje koade ferklearje dat spesifyk is foar in spesifyk URL-patroan, as in seksje fan 'e server.

Litte wy ús earst besjenfunksjes ferkenne. Besjoch funksjes begjinne mei ymport mei oanwize koade dy't sil wurde brûkt yn 'e werjefte, en wurde definieare mei regelmjittige funksje-definysjes of klassen. De simpelste werjeften wurde definieare troch de funksje Definysje Def, en jou in Httpresponse werom mei in basisjabloan. Litte wy begjinne mei it definiearjen fan in basis werjefte om de tekst "Hello World" werom te jaan. Tink derom dat elke kear as jo koade tafoegje nei in ferklearring lykas def, as, wylst, want jo moatte 4 spaasjes tafoegje om te foegjen foar elk fan 'e foarskriuwende definysjes dy't jo wolle oanfreegje op jo funksje. Wy sille ynkomme wat elk fan dizze gau betsjuttet.

Fanút de map fan ús side, bewurkje de feed / werjefte.py-bestân mei nano en foegje de folgjende rigels ta oan it ein fan it bestân ta.

from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world')

Django's HTTPresponse reageart mei in tekststring, oanjûn mei de iepening en sluten '. Elke kear as jo ynformaasje trochjaan oan in funksje as klasse, lykas fersyk as in tekenrige, moatte jo parenthesis brûke (, iepening en sluten).

Dit is net alles wat wy moatte ús sicht sjen. Fansels hawwe wy de server net ferteld wêr't it útsicht krekt is, moatte wy noch in paad definiearje om te definiearjen wêrtroch it werjefte moat wurde render. Litte wy begjinne mei it definiearjen fan in basispaad yn app / URL.PY, en wy sille letter yn paadgroepen komme.

Yn App / URL.PY, Foegje in line ta nei de ymportferplichting nei it begjin fan it beëinigjen fan it útsicht dat wy krekt binne makke.

from feed import views as feed_views

Litte wy it werjeftepatroan definiearje. Besjoch patroanen hawwe trije komponinten, it paadkomponint, wêrtroch de werjefte bestiet, wêr't de werjefte yn 'e útsicht bestiet om te wizigjen en te aktualisearjen as nedich om romte te wurden foar in oare werjefte of nim in mear logyske namme op. It makket sin om dingen op dizze manier te dwaan en fleksibel te wêzen, om't jo codebase sil wêze, om't jo codebase omjouwing sil wêze dy't fleksibiliteit nedich is om weardefol te wêzen en maklik te wurkjen. Hjir is wat jo werjefte derút liket, kinne jo dit tafoegje oan 'e UrlPatterns = [Seksje fan app / URL.Py. It útsichtpatroan wurdt definieare mei de trije komponinten beskreaun hjirboppe, en in funksje neamd paad. Jo URL-patroanen binne in list, dus soargje derfoar dat jo elk artikel altyd yn har einigje mei in komma, om't dit elk skiedt. Elk artikel moat ek op in nije rigel gean, wer mei fjouwer spaasjes foardat it, krekt as de app yn ynstellings. Leauwe. Wy sille de earste komponint fan it sicht definiearje mei in lege tekenrige-funksje, om in werjefte te meitsjen dat rint op 'e haadtier fan' e websering. Jo urls.Py moat no sa útsjen:

from feed import views as feed_views

urlpatterns = [
    path('', feed_views.hello, name='hello'),
]

Dit is de basis foar it meitsjen fan in webside mei Django dat is folslein statysk is. Om in mear dynamyske webside te meitsjen wêr't wy kinne begjinne mei Caching-ynformaasje, lykas ôfbyldings, fideo's, Audio en mear moatte wy modellen moatte brûke, dy't wy folgjende sille ferkenne. Litte wy no ús koade kontrolearje en de server útfiere. Om de koade te kontrolearjen foar flaters, rinne:

python manage.py check

As d'r flater berjochten binne, moatte jo de wizigingen foarsichtich hawwe om jo oan te kontrolearjen en te sjen, as d'r wat moat wêze, lykas in ekstra karakter, in uncloss, elk typo, elk ongelok ferwidere karakter, of wat oars. Lês troch it flaterberjocht (as jo ien hawwe, soene jo it paad moatte sjen nei in bestân dy't jo hawwe makke of bewurke tegearre mei in rigelnûmer, sjoch dan yn dat bestân en sjen as jo wat kinne reparearje dat der is. As jo ​​it probleem hawwe fêstmakke, rinne dan it boppesteande kommando opnij. Doe't jo software ree is om te rinnen en wurket, sille jo de útfier "Systeemkontrôle sjen, identifisearre gjin problemen." No binne jo ree om te gean. Rin de server út mei:

python manage.py runserver 0.0.0.0:8000

Iepenje no in webbrowser iepen en navigearje nei http: // localhost: 8000. Jo soene moatte sjen dat de tekst weromkaam yn 'e parenthesis en sitaten fan' e Httpresponse-funksje yn jo werjefte. Dit is gewoan in basis foarbyld, mar as jo it sa fier makken, begripe jo de basis fan hoe Linux, bash, Python, en Django-wurk. Litte wy djipper graven yn guon database Modeling, en ferkenne de krêft fan in Python-klasse yn it opslaan fan ynformaasje. Doe sille wy begjinne te krijen in grip te krijen op HTML en CSS foardat wy ús side folslein featured, fleksibel en feilich mei JavaScript en Machine-learen.

Klassen wurde opslein yn it model.PY fan jo app. Mei help fan Nano, bewurkje app / Model.Py en foegje in nije klasse ta. In klasse wurdt definieare mei de Klasse-definysje en wurdt in superklasse trochjûn dat it yn dit gefal hat moasten. De namme fan 'e klasse komt nei de klasse-definysje, en nei de klasse-definysje wurdt A: (Colon) brûkt, foardat de attributen en funksje definysjes bûnen oan' e klasse binne hjirûnder oanjûn. Us klasse hat in ID nedich, wy kinne brûke om it op te heljen en it unyk te hâlden, en it hat ek in tekstfjild nedich om wat ynformaasje te bewarjen. Letter kinne wy ​​in tiidstempel tafoegje, Bestannen, Booleans (wier as falske definysjes dy't kinne helpe om it te dwaan oer wat te dwaan, en kin in eksimplaar om it model te tinken oan in brûker oanmeld by de server, en mear. Litte wy de koade hjirûnder útpakke:

from django.db import models # De ymport dat wurdt brûkt om ús klasse te definiearjen en it attributen te definiearjen
class Post(models.Model): # De definysje fan ús klasse sels
    id = models.AutoField(primary_key=True) # It id fan ús model, in automatysk generearre kaai dy't ús it model kin litte, hâld it unyk, en is handich as wy moatte ynteraksje mei it model ienris is oanmakke.
    text = models.TextField(default='') # It attribút dat ús klasse winkels, yn dit gefal, wat tekst, standert op in lege tekenrige.

Slút en bewarje it bestân lykas wy earder dienen om te foltôgjen.

D'r binne in soad oare fjilden en opsjes dy't wy sille ferkennen as wy dizze klasse bywurkje as ús app evoluearret, mar dit is de basis needsaak om in app te meitsjen om wat tekst te pleatsen. Dit model sil lykwols net allinich wurkje. Lykas beskreaun, sille wy in oanpast werjefte en oanpast url-patroan nedich wêze om dit modelwurk te meitsjen, en wy sille ek in formulier hawwe mei in sjabloan. Litte wy earst it formulier ferkennen.

Om in formulier te definiearjen, bewurkje app / forms.py mei nano en foegje de folgjende rigels ta. Wy sille twa ymporten nedich hawwe, lykas it model, lykas it model dat wy hawwe oanmakke (feed.mods.post), en in fjild tegearre mei in subklasse neamd Meta dat it model ynteraktyf sil definiearje. It formulier kin ek in initialisaasjefunksje hawwe dy't it opmakket basearre op ynformaasje op it fersyk, model of oars sille wy dit letter ferkenne.

Modelfoarmen binne sa nuttich, om't se in model kinne oanmeitsje of ek in model bewurkje, sadat wy se foar beide moatte brûke. Litte wy ien definiearje yn foarmen.py hjirûnder.

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 basis fan wat in formulier en model sjocht. Dit modelformulier kin brûkt wurde om in post te driuwen of te bewurkjen, de tekst te feroarjen of te feroarjen dat it befettet. Wy sille sjen nei yntegraasje fan dit formulier yn in besjen folgjende. Litte wy earst de migraasjes meitsje en de database migrearje, sadat ús koade kin ynteraksje mei it model as it rint. Om dit te dwaan, rinne de folgjende kommando's:

python manage.py makemigrations
python manage.py migrate

Dit sil in minút nimme om út te fieren, mar ienris docht it, lit it jo tagong tastean tagong te krijen ta it model yn 'e werjeften, middenware, of oeral oars yn' e software. Litte wy trochgean troch te meitsjen wêr't wy ús model kinne sjen. Bewurkje feed / werjefte.py en foegje de folgjende koade ta, lykas opmurken. Jo sille neat moatte tafoegje nei it # -teken, dat koade opmerkings is dy't wurde brûkt om ynformaasje oer de koade te jaan oer de koade. Wy sille begjinne mei it ymportearjen fan ús model yn 'e werjeften, en it tafoegje oan in kontekst as wy it yn in sjabloan kinne jaan as in list foar werjaan. Folgjende, wy sille in sjabloan tafoegje wêr't wy it formulier en it model kinne jaan mei in knop om in nij objekt te meitsjen op basis fan it model en post it nei de server. Dit klinkt yngewikkeld, dus litte wy it gewoan efkes stappe nimme. Foardat wy de werjefte foltôgje, litte wy in sjabloan meitsje dy't gewoan it model makket, en soargje derfoar dat wy it kinne sjen troch it meitsjen fan in nije post yn 'e skulp. Hjir is hoe't dat werjefte moat sjen:

    posts = Post.objects.all() # Fraach alle berjochten yn 'e database oant no ta

Dit sjocht allegear moai ienfâldich ôf oant wy nei de boaiem komme. Render, de wearde werom troch de funksje yn plak fan yn in HTTP-reaksje, nimt altyd in fersyk, as de berjochten yn 'e database), en joech it sjabloan werombrocht, en joech it sjabloan yn' e definieare yn 'e sjabloan. It sjabloan sil in HTML-dokumint wêze mei in bytsje fan in taal neamd Jinja2, dy't Python-ynformaasje yn 'e HTML makket.

Om te begjinnen mei it meitsjen fan sjabloanen, meitsje twa mappen yn feed.

mkdir feed/templates
mkdir feed/templates/feed

Folgjende, bewurkje in sjabloan yn 'e map hjirboppe, feed / sjabloanen / feed, en foegje de koade ta foar dit foarbyld. Litte wy nei it sjabloan sjen foar dit foarbyld.

Dit is in heul ienfâldige sjabloan. It definieart it iepenjen fan en sluten HTML-tags, in dokuminttype TAG, in leginde titel, in leginde-titel dy't in lytse line tafoeget, en in foar loop dy't elke post tafoeget yn 'e list mei berjochten as in paragraaf yn it sjabloanen. Dit is alles wat it nimt om posten te rinnen, mar d'r binne noch gjin yn 'e database. Litte wy wat oanmeitsje mei de shell. Wy kinne de shell útfiere mei Manage.py

python manage.py shell

Litte wy ús postmodel ymportearje

from feed.models import Post

Folgjende sille wy in ienfâldige post meitsje mei in tekenrige en útgean fan 'e shell. De tekenrige kin alles wêze, sa lang is it jildige tekst.

Post.objects.create(text='hello world')
exit()

As lêste sille wy in URL-patroan moatte tafoegje oan ús feed. Om't ús feed-app sil brûke meardere URL's brûke en wy wolle behâlde maten, litte wy in lokale URL.Py oanmeitsje yn ús feed-app dy't sa útsjocht:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.feed, name='feed'),
]

Wy sille de URL.PY moatte bewurkje yn 'e Base-app, wat wy besletten om it te neamen, dit wie de earste map dy't wy hawwe makke. App / app bewurkje / app.py en foegje it folgjende ta oan 'e URL-patroanen

from django.urls import include # oan 'e boppekant
    # ... Foarige koade hjir

No, doe't wy de server útfiere mei Python Manage.Py Runserver, sille wy de pagina sjen dy't wy hawwe makke, om't wy it model hawwe, as URL-patroan, tegearre mei items yn 'e database. NEX lit ús it formulier ymplementearje dat wy makke hawwe en begjinne te meitsjen fan ús eigen berjochten. Mar foardat wy tefolle koade skriuwe, litte wy in reservekopy meitsje mei it skript dat wy earder skreau, reservekopy. Rinne dit skript yn 'e shell, wachtsje in pear mominten, en alle koade sil wurde reservekopy oant ús Git-repository.

backup

It formele fan it formulier útfiere is relatyf ienfâldich. Wy sille ús formulier ymportearje, in post-oanfraach tafoegje oan 'e werjefte, en bewarje de post yn' e database foardat se trochstjoere nei deselde werjefte. Wy kinne de trochferwizingsfunksje brûke dy't wy al ymporteare, en in oare funksje neamd om de URL foar it werjeftepatroan te krijen. Wy sille dit freegje mei de string 'Feed: feed' omdat de nammeromte fan it opnommen patroan is feed is, en it werjefte wurdt ek neamd.

    posts = Post.objects.all() # Fraach alle berjochten yn 'e database oant no ta
    if request.method == 'POST': # Behannelje it postoanfraach
        form = PostForm(request.POST) # Meitsje in eksimplaar fan it formulier oan en bewarje de gegevens nei it
        if form.is_valid(): # Falidearje it formulier
            form.save() # Bewarje it nije objekt
        return redirect(reverse('feed:feed')) # Trochferwize nei deselde URL mei in krij fersyk
        'form': PostForm(), # Soargje derfoar dat jo de formulier yn 'e kontekst trochjaan, sadat wy it kinne.

No, wy moatte it sjabloan bywurkje om te ferantwurdzjen foar it nije formulier. Wy kinne dit dwaan mei de

Tag yn HTML en leverje it formulier yn 'e HTML-sjabloan mei in yntsjinje knop. Wy sille ek in CSRF-token nedich hawwe, in token dy't foarkomt dat eksterne siden foarkomt fan it pleatsen nei it formulier sûnder earst in pagina te laden.

Litte wy dit brekke. D'r is in nije foarmklasse, in token, it formulier sels, en in yntsjinje knop. Pretty ienfâldich, mar as wy it besjogge, miskien wolle wy it better sjen litte. It wurket, wy kinne nije berjochten pleatse mei it formulier en se binne no opslein yn 'e database. D'r binne in pear dingen dy't hjir bart. Wy brûke HTML-tags om te ferklearjen dat it dokumint in HTML-dokumint is, brûke wy in sjabloan-tag ({% ...%}) om it token foar it formulier te meitsjen, en in oare, {}} om it formulier te meitsjen. Wy hawwe ek in loop om de tekst te meitsjen mei blokkearmooglikheden en in sjabloan-tag. Block-tags binne echt wichtich, om't wy kinne definiearje hoe seksjes fan it sjabloan wurde levere mei har, en sjabloan tags binne de basis fan hoe't wy fariabelen yn ús koade sette.

No moatte wy ús app better meitsje, want foar no sjocht it echt basis. Wy kinne dit dwaan mei CSS te brûken, of ynline, of yn klassen bûn oan elk objekt yn it dokumint. CSS is echt leuk, om't it alles op 'e pagina fertelt hoe't it moat sjen, en kin it echt goed útsjen. D'r binne in pear biblioteken dy't dit kinne dwaan, mar myn persoanlike gean is bootstrap.

Bootstrap kin wurde downloade fanôf har webside,getbootstrap.com/. Noch ienris, drukke op de knop om de ynstallaasje-dokuminten te lêzen, en de koade kopiearje fan 'e omfetsje fia CDN-seksje. Jo sille dizze koade nedich hawwe oan 'e boppekant fan jo HTML-dokumint, yn in tag neamde holle. Litte wy ek foarút gean en in basisjabloan meitsje, sadat wy dizze keppelings net moatte opnij meitsje yn elk sjabloan.

Meitsje in nije map neamd sjabloanen mei MKDIR-sjabloanen, en bewurkje dan sjabloanen / base.html.

It soe der sa útsjen moatte:

Soargje derfoar dat jo it CSS en JavaScript kopiearje, de .CS en .JS-bestannen, om't wy it JavaScript nedich binne om ús side mear funksjoneel te meitsjen yn 'e takomst.

Litte wy no weromgean nei de Bash Shell en rinne in fluch kommando. Tink derom, as jo ea tagong hawwe ta de firtuele omjouwing, typ boarne Venv / Bin / Aktivearje. Dit lit jo Python-pakketten lokaal ynstallearje op in manier wêrop Django tagong hat ta. Om ús formulieren te jaan generearre troch lanzen fan Django Bootstrap, sille wy in Python-pakket brûke dy't krimpige formulieren hjit. Wy kinne dit downloade mei it folgjende kommando

pip install django-crispy-forms

Ienris is dit ynstalleare, foegje it ta oan de ynstellings.py

    # ... Foarige koade hjir

No, werom yn ús feedjabloan kinne wy ​​wat dingen ferwiderje. Litte wy it begjin en it ein fan it dokumint ferwiderje en it mei erfskip ferfange fan ús basisjabloan, mei gebrûk fan útwreidingen en de blokdefinysje. Ek sille wy in sjabloan filter tafoegje dy't ymploitearje mei lading en in sjabloanfilter nei it formulier tafoegje. As lêste, litte wy in bootstrap-klasse tafoegje oan 'e knop op' e foarm om it mear te meitsjen as in knop. Dat soe der sa útsjen moatte:

Prachtich! Dat is al noch in bytsje koade. Folgjende moatte wy it úthelje en soargje derfoar en soargje dat wy kinne sjen dat alles moai sjocht, en ek wis dat alles goed wurket. Rin de server út as per eardere ynstruksjes en soargje derfoar dat de side sjocht en wurket goed. Geweldige baan! Jo binne ree om troch te gean nei de folgjende stap, wêryn wy de applikaasje-oanmeldfunksjonaliteit tafoegje mei ferlykbere URL's, foarmen, werjeften en sjabloanen. It basissjabloan is wichtich, en wy sille it trochgean te feroarjen en wizigingen te feroarjen, mar jo moatte ús feiliger meitsje om te melden by in brûkers om jo app feilich en jo eigen akkount te hâlden.

Om dit te dwaan, moatte wy it brûkersmodel ynboud hawwe yn ynboude Django. It brûkermodel is in database-model, lykas ús post, dat kin wurde levere om in brûker te loggen yn 'e webside. Yn 'e takomst, foardat wy de side op it ynternet ynsetten, sille wy dit model útwreidzje mei oare modellen dy't der oan tastean, en bouwe ekstra feiligensmaatregels foar de oanmelding dy't resistint binne. Wy sille begjinne mei gebrûk fan wat ynboude oanmeldfoarmen dy't Django leveret. Litte wy earst in nije app oanmeitsje dat wy sille brûke om de sjabloanen te brûken en opfettingen foar de basis oanmeldpagina. Wy sille ek oare apps meitsje om de trochgeande oanmeldútdagingen te fertsjinwurdigjen om de app te befeiligjen, ynklusyf in Pincode, Richtingskommisje, yn 'e buert fan fjildplanken, eksterne apparaten, eksterne apparaten, en fingerprint erkenning.

Wy hawwe al praat oer it begjinnen fan in app. Fan ús map, binnen de firtuele omjouwing, passage. MANAGE.PY dizze arguminten

python manage.py startapp users

No, wy soene in map hawwe moatte foar de nije app. Litte wy begjinne mei it meitsjen fan in werjefte yn dy map dy't oerienkomt mei de oanmelding fan 'e brûker. Django hat boud yn werjeften foar brûker-oanmeldingen, mar dizze sille net geskikt wêze foar ús, om't wy in oanpast werjefte nedich binne, wat leafst dien is mei in definysje.

Yn dit werjefte sille wy begjinne troch te kontrolearjen op in postfersyk, pas oan in oanmeldformulier útjûn út Django, ferifiearje it brûkersaccount, en logje yn 'e brûker foardat se oanleiding foardat se trochstjoere.

Yn brûkers / werjefte.Py, foegje de folgjende koade ta

        username = request.POST['username'] # Krij de brûkersnamme en wachtwurd út it postoanfraach
        password = request.POST['password'] # Ferifiearje de brûker

Dit is alles wat jo nedich binne foar in basis oanmeld werjefte. Litte wy no in formulier meitsje foar it sicht troch it út te wreidzjen fan it basisjabloan. Wy sille begjinne troch in nije map te meitsjen foar sjabloanen yn 'e map brûkers.

mkdir users/templates
mkdir users/templates/users

No, wy soene brûkers / sjabloanen / brûkers / login / login.html moatte bewurkje. Wylst wy der oan binne, meitsje wy in sjabloan oan om de brûker ek oan te melden.

nano users/templates/users/login.html

No, yn it sjabloan,

Dit is de basis fan in oanmeldsjiblate. It is echt krekt lykas de oare sjabloan yn struktuer, mar it liket in bytsje oars as it wurdt levere. Wy kinne dizze koade kopiearje om in oar te bouwen om in oar heul ferlykber sjabloan te bouwen neamd, wêr't wy de wurdwize sille feroarje en in nije foarm brûke dy't wy bouwe. Litte wy earst it sjabloan meitsje. Bewurkje brûkers / sjabloanen / brûkers / registrearje..html en foegje de folgjende koade ta:

Litte wy no in formulier bouwe foar ús brûkersregistraasje en sirkel werom nei de werjeften foardat wy ús brûkerslogins opwurdearje mei in model. Wy sille dit formulier meitsje om mei te begjinnen, mar omfetsje mear details en befeiligingsfunksjes lykas ôfspraken en CAPTCHA yn 'e takomst. Bewurkje de formulieren mei Nan-brûkers / forms.py, en foegje de folgjende koade ta.

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

Dat wy hawwe hjir in oare foarm, dy't earlik wurket. It is in formulier foar brûkers Registrearje mei in brûkersnamme, e-post en wachtwurd, lykas ek in befêstigingsfjild befêstigje. Tink derom dat dit formulier de reguliere formulier foar formulier net útwreidet, it is in modelfoarm dat betsjut dat it in meta hat hat. Ien fjild wurdt krekt itselde definieare, en de klasse Meta definieart it model dat it formulier oerienkomt mei de rest fan 'e ynformaasje dy't nei it formulier sil wurde skreaun. It grutste part bestiet al yn 'e boud fan Django yn' e boud fan brûkersrjochte, dus wy sille dat brûke as de basis foar de klasse (trochjûn yn 'e parenthesis).

Folgjende ûndersykje wy it werjefte om in brûker te registrearjen, no't wy in formulier en in sjabloan hawwe. Dit is in modelformulier, krekt as dejinge yn 'e nije post werjefte. Bewurkje brûkers / werjefte.Py en foegje de folgjende koade ta:

# ... Ymport

Dit is alles wat wy moatte krije in brûker registrearre, mar wy moatte mear ynformaasje hawwe. Wy wolle de tiid witte dat de brûker registrearre, hoe let se op 'e side wiene, as in biografy, en tiid, ensfh. Ek moatte ús fernijing bywurkje, om te ferantwurdzjen, om te ferantwurdzjen foar it brûker fan' e brûkersmodel en attribút. Om dat te dwaan, sille wy it model.Py yn beide apps bywurkje. Litte wy begjinne troch it bewurkjen fan it feedmodel. It soe no sa útsjen moatte:

from django.db import models # ... Ymport
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Foegje dizze rigel ta

Jou omtinken oan 'e twadde rigel dy't waard tafoege oan it bestân. Dit is in bûtenlânske kaai, dy't elke post sil attribearje nei ien brûkers per post, sadat wy kinne soargje dat wy de berjochten bewarje op in brûkers-per-brûkersbasis en gjin post kin makke wurde sûnder te jaan oan in brûker. Wy definiearje dizze bûtenlânske kaai mei de klasse dy't it fertsjintwurdiget, in wiskje argumint dat wy de brûker hawwe ferwidere, en om te soargjen dat wy al kinne ferwiderje, dy't wy kinne brûke om te ferwizen nei de postobjekt, de brûker makket de brûker. Dizze relatearre namme, oars as post.Author, de auteur fan 'e post, jout Amerikaanske brûker dy't de post sels pleatste. Wy kinne no de berjochten in brûker krije troch brûkers fan user.Post.All (), of auteur.post.all ().

Litte wy no ús oanmeldingen mear resilient meitsje. Wy kinne ús side al minder kwetsber meitsje foar phishing troch gewoan taryf te beheinen, beheine it oantal kearen dat wy in oanmelding tastean op 'e side, dit is frij maklik. Litte wy ek begjinne mei wat ynformaasje oer elke brûker te bewarjen lykas wy trochgean mei ús app te ûntwikkeljen. Brûkers / Model.Py, tafoegje, foegje de folgjende koade ta.

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

Tink derom dat dit model frij gelyk is oan it postmodel. Wy hawwe in ekstra ymport, tiidsône, wat ús tastean om standert yn te stellen op 'e DATET-fjilden, en wy hawwe ek in karakterfeild en textfield lykas de post. Mei al dizze tiidstempels helpt ús de side te befeiligjen en it gebrûk te befeiligjen, en de tekstfjilden litte wy ynformaasje leverje oer elke brûker, of auteur, op 'e webside. It OnetooneField soe de iennichste minderwoede wêze moatte, it gedraacht krekt itselde as in foarrjocht, mar mei mar ien per folgjende model. Dizze manier hat de brûker mar ien profyl, wylst se miskien hawwe in soad berjochten.

Litte wy ús oanmelding ferbetterje en opsicht sykje nei akkount foar it profyl. Bewurkje earst brûkers / werjefte.Py en fokusje op it register werjefte:

# ... Ymport
            Profile.objects.create(user=user) # Soargje derfoar dat jo dizze rigel tafoegje, om in profyl te meitsjen foar de brûker

Dit soarget gewoan in profyl foar de brûker, sûnder ien fan 'e ynformaasje yn te foljen. No, wy wolle derfoar soargje dat it brûkersaccount net te faak kin wurde oanmeld, of teminsten kinne wachtwurden net te faak wurde besocht, dus litte wy de oanmeld werjefte bywurkje.

# ... Ymport
        if user and user.profile.can_login < timezone.now(): # Tink derom dat wy no kontrolearje as de brûker kin oanmelde
        else: # As de oanmelding net suksesfol wie,
            user = User.objects.filter(username=username).first() # Dit is it diel wêr't wy it brûkersprofyl bywurkje
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Sadat se in pear sekonden net opnij kinne oanmelde

Dit is it basis fûnemintele fan feiligens. Soargje derfoar dat de side net kwetsber is foar immen gewoan elke mooglike wachtwurdkombinaasje, of sels in pear fan har tagelyk. Dit sil net frustreare wêze oan 'e gewoane brûker dy't har passcode ken, logt gewoan op in pear apparaten, mar it sil ferskate phishing robots út' e app hâlde. Tink derom dat wy in fariabele hawwe tafoege mei in fariabele, Can_login, dat moat in tiid wêze yn it ferline, en it bywurkje mei elke net slagge oanmeld mei deselde brûkersnamme. Dizze manier, in kwea-aardige brûker sil net sa gau sa gau in wachtwurd kinne riede. It oantal sekonden yn 'e DateTime.Himedelta () kin ek bywurke wurde, en de webside sil mear resilient noch in bytsje minder brûkber wêze mei mear sekonden. Ik riede 15 oan om mei te begjinnen.

Tink derom, wy bouden in backup-skript om ús wurk te rêden, dus litte wy foarút gean en werom hawwe wat wy oant no ta hawwe om te soargjen dat wy alles hawwe opslein. Rinne it kommando:

sudo backup

Noch ienris sil dit jo wurk sa fier rêde. Ik riede faak rinnende backups om jo wurk te bewarjen, en jo kinne sels automatysk in backup-baan útfiere. Jo kinne dit dwaan mei in UNIX-hulpprogramma mei de namme Cron. Om dit nut te aktivearjen, rinne it folgjende kommando út en fier jo wachtwurd yn:

sudo crontab -e

As jo ​​noch net al hawwe selektearje foar Nan, dan moatte de tekstbewurker jo al bekend wêze, en rôlje nei de ûnderkant fan it bestân mei de pylktoetsen. Foegje de folgjende rigel ta:

0 * * * * sudo backup

Cron brûkt it formaat Minút, oere, dei fan 'e moanne, moanne, dei fan' e wike, wêr't in * as in nûmer fertsjintwurdiget wannear't it kommando te rinnen. In 0 foar de minút en * foar de rest fan 'e opsjes kinne wy ​​in kommando útfiere op' e earste minút fan elk oere oan it begjin fan 'e minút. Hjirmei lit ús de koade automatysk werom. Alle banen fan Cron as jo útfierd binne mei sudo rinne as root, sadat wy net alle oeren moatte ynfiere.

Om it makliker te meitsjen om ús koade te meitsjen sûnder in wachtwurd te brûken, litte wy it wachtwurd útskeakelje foar ús reservekopy-kommando útskeakelje. Wy sille dit dwaan troch it folgjende kommando te útfieren en in wachtwurd yn te fieren:

sudo visudo

Litte wy no nei de boaiem fan it bestân rôlje en in oare rigel tafoegje:

ALL ALL=NOPASSWD: /bin/backup

Dit lit ús it kommando "Backup" útfiere as elke brûker, sûnder in wachtwurd. It formaat foar dit is maklik, foarheakket de line krekt mei "All Alles = Nopasswd: / Bin /" en einigje mei it kommando, bygelyks, bygelyks / back-up, dy't bestiet yn / usr / bak /.

Litte wy no begjinne mei e-post. E-post is echt wichtich foar websides, om't it in manier is om in webside feilich te hâlden, ferifiearje dat brûkers binne echte minsken, en sels merkprodukten as tsjinsten oan klanten. In protte minsken dy't it ynternet faaks deistich kontrolearje, en ûntfange alle soarten marketing e-post oer produkten dy't se binne ynteressearre om e-post te meitsjen op in DJango-webside, en jo binne wolkom om te kiezen wat it bêste foar jo wurket.

Earst kinne jo betelje foar in e-posttsjinst dy't jo kinne ynskeakelje om e-post fan jo domein te stjoeren en minimale koade te stjoeren. D'r binne in protte tsjinsten dy't dit oanbiede, lykas Google Workspace, SendinBlue, Mailgun, en mear.

Oars binne jo goed ôf mei it bouwen fan jo eigen e-posttsjinst binnen jo server fanôf it begjin. Ik riede dizze opsje oan, ek al is it mear koade en kin spesjale hosting fereaskje. Jo sille miskien gjin e-postserver kinne begjinne fan jo thúscomputer, dus litte wy foarút gean en ûndersykje de konfiguraasje en koade om e-post te ferstjoeren foardat wy in server begjinne yn 'e wolk en ús eigen e-postserver binnen meitsje.

Earste, ynstellings bewurkje. Myn bewurkje mei it folgjende kommando:

nano app/settings.py

Wêr't app is de namme fan 'e app dy't jo hawwe makke mei startapp.

Foegje de folgjende rigels ta:

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)

Soargje derfoar dat jo dizze feroarje as jo ree binne om jo app te ynsetten, sille wy dit letter opnij besjen. De ynstelling fan de e-post_address moat de e-post wêze dy't jo wolle stjoere, en it wachtwurd (e-post_host_password) moat wurde ynsteld op it wachtwurd dat jo generearje foar de server. Ik lade it wachtwurd yn fan in konfiguraasjebestân om it út 'e koade te hâlden mei de folgjende logika, boppe dizze rigels yn ynstellings.PY:

import os
import json
with open('/etc/config.json') as config_file:
    config = json.load(config_file)

Doe haw ik in JSON-bestân ynsteld mei it konfigurearjen yn /etc/config.json mei nan as folget.

Om it bestân te bewurkjen:

sudo nano /etc/config.json

Foegje de folgjende rigels ta:

{
	"EMAIL_HOST_PASSWORD": "<some password here>"
}

Wy sille trochgean mei it bewurkjen fan it konfiguraasjebestân en tafoegje alle wachtwurden en kaaien en wy sille yn 'e app brûke. Litte wy no foar no fluch ûndersykje hoe't jo e-post stjoere mei Python. Litte wy earst in sjabloan meitsje foar in ferifikaasje-e-post kinne wy ​​stjoere nei ús brûkers, en set it yn 'e map fan brûkersjabels. Dizze sjabloan sil wurde skreaun yn HTML.

nano users/templates/users/verification_email.html

Dizze e-post is frij ienfâldich. It nimt in kontekst fan in brûker, de basis-URL foar de side, en in brûkers-ID en token dy't wurde brûkt om de e-post fan 'e brûker te kontrolearjen. Soargje derfoar dat jo de basis-URL definiearje yn ynstellings.PY foardat wy wat Python-koade skriuwe om it sjabloan te ferbergjen. Gean foarút en foegje de folgjende rigels ta oan App / ynstellings. Myn, tichtby it begjin.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

Uteinlik is jo side klear foar it ynternet en jo ynsetten it, sille jo jo domein wolle definiearje as de domeinnamme dy't jo keapje om de side te fertsjinwurdigjen. Dit is de namme dy't jo sille ynfiere yn 'e Navbar om tagong te krijen ta jo side. Foar no kinne jo it domein leech litte of in plakhâlder brûke. Jo sille ek de side_namme feroarje wolle oan in namme dy't jo jo side wolle jaan, fan jo kar.

Foardat wy e-post stjoere, litte wy in token-generator oanmeitsje, sadat wy in akkountaktivaasje-token kinne hawwe dy't noait ferrint. Wy kinne dit dwaan troch te bouwen en ymportearjen fan in akkountaktivaasje-token dy't liket op it folgjende. Bewurkje it bestân:

nano users/tokens.py

Foegje de folgjende koade ta:

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

Dizze basis token-generator genereart in token dy't wy de brûker kinne stjoere yn in URL en de brûker kin brûke om har e-post te kontrolearjen en har akkount te kontrolearjen.

Folgjende, litte wy sjen hoe't jo in e-post stjoere. Mei help fan Nano, bewurkje brûkers / e-post.py.

nano users/email.py

Stjoer de e-post fan 'e ferifikaasje HTML sil der sa útsjen:

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 frij ienfâldich. Wy ymportearje de funksjes dy't wy de e-post moatte stjoere, de e-post ferstjoere mei sjabloanen, en dan definiearje wy de e-post troch de sjabloan namme en stjoer it nei de brûker mei in funksje. Jo sille fernimme dat wy de funksje net hawwe definieare om de e-post te stjoeren, Send_HTML_Email, dus litte wy dit ûnder de koade skriuwe, wy al tafoege oan brûkers / e-post.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 in bytsje kompleks, en wy binne net ree om al dizze koade te rinnen. Opmerking Wy definiearje fan in unsub_link, de link dy't de brûker kin brûke om út te skriuwen by ús e-mails. Dit is wichtich, om't brûkers sille moatte wêze om te kinnen út ús e-post, útsein as se se op elk momint wolle sjen. Wy foegje ek in tekst alternatyf ta oan ús berjocht, dat is de HTML-berjocht stripped fan HTML-tags. As lêste kontrolearje wy as de e-post ferstjoerd, en as it net, dat net, markearje wy yn it profyl fan 'e brûker dat har e-post net jildich is.

Litte wy weromgean nei de brûkersmodellen, sadat wy dit kinne meitsje. Wy moatte in funksje definiearje om in keppeling te generearjen om út te sluten, en definiearje in Booleaansk fjild om te markearjen om te markearjen dat de e-post fan 'e brûker net jildich is.

Earst, foegje de folgjende ymporten ta oan 'e boppekant fan brûkers / Model.Py

nano users/models.py
# ...

Rykje, litte wy funksjes tafoegje oan it brûkersmodel om it token te meitsjen en de token kontrolearje om de e-post te aktivearjen, lykas it fjild om te rêden oft de brûker mei súkses is mei súkses te ûntfangen. Yn brûkers / Model.PY AGAVE, foegje de folgjende koade ta oan it ein fan it model (yndrukte koade)

# ...
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Jildich foar 30 dagen

Dit is frij ienfâldich, wy brûke in tiidestampsjerder, dat is in basis kryptografy ark, om in token te meitsjen, dy't nei in bepaalde tiid sil ferrinne, en wy brûke ek in oare funksje om te kontrolearjen as it jildich is. Wy brûke dizze tokens twa kear, ien kear om de e-post te ferifiearjen, en ien kear foar in útskriuwe link.

No't wy dizze hawwe, de lêste fan it wurk dat wy moatte dwaan is te dwaan is yn 'e werjeften. Binnen brûkers / werjefte.Py, litte wy de werjeften tafoegje om it e-postadres te ferifiearjen, en om út te skutjen.

nano users/views.py

Earst de folgjende ymporten tafoegje. Ik goaide yn in pear ekstra, sadat wy letter gjin mear items moatte ymportearje.

from .email import send_verification_email # Soargje derfoar dat jo de ferstjoerde funksje fan 'e ferifikaasje ymportearje

Jo kinne miskien wat fan dizze ymporten hawwe, mar it docht net sear om se te werheljen. Jo sille de útfiering fan 'e ferifikaasje-e-post moatte ymportearje, lykas akkount_aktivaasje_token fan brûkers .Sokens, ûnder oare ymport.

No, oan 'e ûnderkant fan it bestân, foegje de folgjende koade ta:

        # útskriuwe se
    # Oars trochferwize nei oanmeldpagina
# SendwelomeEmail (fersyk, brûker)

Dit is in soad koade. Litte wy it brekke. De earste funksje, skjin en ienfâldich, útskriuwe de brûker fan 'e mailinglist. De twadde funksje aktiveart har e-post, en jo sille fernimme dat ik in kommentearre funksje tafoege, SendwelomeEmail. Jo binne wolkom om in e-postjabloan te brûken en funksje fan definysje te brûken om in wolkom e-post te stjoeren, ik haw it gewoan net. De lêste funksje dy't ik joech, is wichtich, om't aktivearjende e-post-e-post ferrint. Dêrom moatte wy de aktivaasje e-post wat fan 'e tiid opnij ferstjoere. Wy kinne hjir in basisfoarm brûke, en de funksje neame om de e-post fan 'e ferifikaasje te stjoeren. Foardat wy dit dogge, lit ús derfoar soargje dat it yn it earste plak wurdt ferstjoerd, troch it tafoegjen fan in funksje Rop nei it registers werjefte. Foegje dizze rigel ta krekt foar it trochferwizing yn it registersipicht, def registrearje, yn brûkers / werjefte.Py.

nano users/views.py
# ... (nei) def-register (fersyk):
# ... (foar) ​​trochferwize (

Jo hoege de earste en lêste rigels net ta te foegjen yn dy koade-snippet, soargje gewoan dat it registerde werjefte de ferifikaasje-e-post stjoert nei de brûker. It soe der sa útsjen moatte:

# ... Ymport
            send_verification_email(user) # Soargje derfoar dat dizze rigel tafoegje!

No, wy moatte in formulier tafoegje om de aktivearring e-post opnij te ferstjoeren. Yn brûkers / forms.py, foegje de folgjende formulier ta:

# ... (Ymportearje)

Wy sille ek in sjabloan nedich wêze dy't oerienkomt mei dit ferstjoerde e-postaktivearring fan e-post. Litte wy dit sjabloan tafoegje yn. It bestân bewurkje:

nano users/templates/users/resend_activation.html

Folgjende, foegje de folgjende koade ta oan it bestân ta.

Whew, dat is in protte! No, as wy de koade ynsetten nei ús server, sille wy HTML-e-post kinne stjoere en brûkersaccounts aktivearje mei in klik yn 'e e-post. Wy wolle ek miskien in ienfâldige wolkom e-post stjoere, dus litte wy sjen hoe't jo dat moatte dwaan. Werom yn brûkers / e-post.py, foegje de folgjende koade ta:

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)

Ek sille wy in sjabloan nedich hawwe om al dizze ynformaasje te rigen. Op myn webside liket it sjabloan it hjirûnder út, mar jo binne wolkom om te opmaak te formaat dat jo lykwols wolle.

Tink derom dat wy net sluten fan lichem of HTML-tags hawwe, om't wy dizze tafoegje yn as wy de HTML-útskriuwe keppeling tafoegje. Dit binne wichtich, mar wy wolle se net twa kear definiearje.

Dus wat is it folgjende? Wy binne in lange wei kommen. Echt, wy soene ree wêze moatte om de side nei in server te ynsetten. Wy kinne de иLogin_required-dekor tafoegje en ús opfettingen meitsje, brûkersmekenpupps, stjoer kompundige e-post en cache-ynformaasje, dat is de basis fan wat in webside moat dwaan om te bliuwen om relevant te bliuwen Wy sille in pear nuttige funksjes tafoegje, en dan in basis bouwe foar it ynsetten fan ús koade nei in ôfstân, in e-postserver ynstelle, domeinkonfiguraasje, en filters om ús side feilich te meitsjen.

Wy sille ek in werjefte fan wachtwurd weromsette hawwe, dus litte wy dat tafoegje yn echt rap. Django's boud yn werjefte fan wachtwurd wurdt ynbrutsen yn guon funksjes, mar wy sjogge nei hoe't wy ús eigen werjefte sille skriuwe, e-postjabloan, formulieren, en URL-patroanen. Hjir is wat it útsicht liket, yn brûkers / werjefte.Py

# ... Ymport

Dit formulier is boud oan Django, mar wy moatte in sjabloan nedich wêze om it wachtwurd weromsette te befêstigjen, brûkers / sjabloanen / brûkers / Wachtwurd_reset_confirm.html

Wy hawwe ek in sjabloan om in e-post foar reset fan wachtwurd te stjoeren, mei in ienfâldige foarm, yn brûkers / sjabloanen / brûkers / wachtwurd_reset.html

It sjabloan foar de e-post sels is it ienfâldich, it is in basis HTML-bestân dy't in keppeling hat om it wachtwurd te resetten, yn brûkers / sjabloanen / brûkers / wachtwurd_reset_Ermail.html. Django sil dit bestân automatysk ynterpretearje.

Wy hawwe ek twa sjabloanen nedich. De earste is om te befêstigjen dat de e-post is ferstjoerd. Sjoen foar dizze binne al yn Django, sadat wy gewoan moatte oanpakke yn 'e URL.PY. Dizze sjabloan leit by brûkers / sjabloanen / brûkers / Wachtwurd_reset_done.html

En it lêst om te befêstigjen dat it wachtwurd weromsette is foltôge, brûkers / sjabloanen / brûkers / Wachtwurd_reset_complete.html

No, wy hawwe URL-patroanen nedich foar dizze werjeften. Yn brûkers / URLS.PY, foegje de folgjende URL-patroanen ta:

    # ... foarige URL's hjir

Fjouwer sjabloanen, dat is in protte! Mar no kinne wy ​​der wis fan wêze dat wy it wachtwurd fan 'e brûker kinne ynstelle, wy moatte, allegear moatte, allegear út' e webbrowser.

Ik begryp dit is in soad koade. As it in bytsje liket oer jo holle, dat is ok. Jo sille ferbetterje, jo begryp sil ferbetterje, en jo sille heulendal mear kompetint wurde mei koade wurde mei koade. As jo ​​folslein ferlern binne, advisearje ik letter nei dizze software werom te kommen nei dizze software nei't jo wurkje oan in sels-paced leare om kursus te koaden. Dit binne normaal frij om te begjinnen, en sil jo liede troch alles wat jo moatte suksesfol wêze as jo weromkomme nei dit projekt. As jo ​​fiele as jo ree binne om troch te gean, moatte wy dekke, dan om jo koade te ynsetten en in e-postserver ynstelle, lykas jo automatysk in nij projekt ynstelle kinne mei in pear ienfâldige kommando's altyd ynstelle.

It lêste wat wy moatte dwaan foardat jo ynsetten nei in ôfstân server is ús side in bytsje feiliger te meitsjen. Jo sille merken dat it oanmeldjen werjefte allinich in brûkersnamme en wachtwurd nimt, en d'r is gjin multi-faktor-ferifikaasje as ien tiidkoade. Dit is in maklike reparaasje, en mei deselde koade kinne wy ​​ús side stjoere stjoere tekstberjochten en wês sels responsyf op tekstberjochten stjoerd nei de server. Om te begjinnen, sille wy weromgean yn 'e brûkersmodellen en tafoegje oan in tiidstempel-ûnderwerke dy't elke oanmelding sil fertsjinwurdigje. Wy sille ek in unyk tafoegje, identifisearjen fan identifier nei it brûkersmodel dat sil wurde brûkt om ekstra feiligens ta te foegjen oan ús oanmelding. De brûkersmodellen bewurkje, brûkers / Model.Py, foegje de folgjende koade ta:

# Soargje derfoar dat jo de UUID, Timestem-oanmelding en URL-generator ymportearje (reverse)
    # Foegje hjir dizze koade ta
    # En tafoegje dizze funksje
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Jildich foar 3 minuten

Soargje derfoar dat jo brûkers / Model.PY d'r útsjocht, neist de opmerkingen (koade op 'e rigels mei #). Dit ôfbrekke, it is ienfâldich. Wy hawwe in pear ymporten, in tiidstimsnemens dy't in krypskografysk is dy't in feilige koade is en it ferifiearje kin om te soargjen dat it jildich is, en net âlder wurde brûkt, en net âlder dan in bepaald oantal sekonden. Wy brûke ek in UUID, dat is in unike identifier dy't ús brûker identifiseart yn 'e ûndertekening fan it teken fan it token, en yn' e URL wêr't it token wurdt stjoerd nei de brûker. Wy sille dizze basis kryptografy brûke om in werjefte fan twa faktorferifikaasje te bouwen. Foardat wy wat oars dogge, litte wy de migraasjes rinne, sadat ús brûkersmodellen wurde bywurke. Yn 'e map mei beheare.PY, Rinne de folgjende kommando's út om de migraasjes te meitsjen en te foltôgjen.

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

Dit is wichtich, om't elke kear wizigingen oan 'e modellen meitsje, moatte wy de tabellen nedich wêze om de tabellen te meitsjen en de database te aktualisearjen foardat wy de modellen eins kinne brûke.

Folgjende, litte wy ús oanmeldjen werbeting jaan om trochferwizing nei in sekundêre ferifikaasje werjefte. Yn brûkers / útsjoch.Py, ferwiderje de oanmeldfunksje en trochferwize nei de URL, wy hawwe krekt generearre yn 'e brûkersmodellen.

# ... Ymport
        if user and user.profile.can_login < timezone.now(): # Tink derom dat wy no kontrolearje as de brûker kin oanmelde
            # Ferwiderje de autor_login-funksje dat hjir wie
                return redirect(user.profile.create_auth_url()) # Tink derom dat wy hjir troch omliede nei in nije URL
            else: # As de brûker net meardere-faktor-ferifikaasje brûkt, log dan gewoan oan.
        else: # As de oanmelding net suksesfol wie,
            user = User.objects.filter(username=username).first() # Dit is it diel wêr't wy it brûkersprofyl bywurkje
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Sadat se in pear sekonden net opnij kinne oanmelde

Dat dit is aardich ienfâldich, wy hawwe no in manier om te ferwurkjen nei de twa faktor ferifikaasje werjefte as wy it oanmeitsje. Wy hawwe ek in fallback yn gefal dat de brûker gjin tillefoannûmer hat tafoege. Wy sille in basis werjefte tafoegje om gau in telefoannûmer te foegjen en yn te loggen mei in tekstberjocht.

Earst hawwe wy in maklike manier nedich om in tekstberjocht te stjoeren fan ús koade. Om dit te dwaan, kinne wy ​​kieze út in oantal APIS, mar de maklikste yn myn miening is Twilio. Se biede ek goede prizen foar lytsere projekten, lykas bulk koartingen. Meitsje in akkount op twilio.com ynfolje wat details oer jo projekt, keapje in telefoannûmer, en kopiearje jo API-toetsen nei jo ynstellings. Leaf. Foegje dan dizze koade ta ûnder in nij bestân, brûkers / sms.py.

nano users/sms.py
# Ymportearje alle nedige pakketten
# Dizze koade stjoert de tekst mei Twilio
# In helper-funksje om in nûmer te krijen mei safolle sifers
# Stjoer de tekst om de brûker te kontrolearjen
# Stjoer in brûker elke tekst mei dizze funksje
# Validearje de koade mei dizze funksje
# Validearje de tiid

Wês wis dat jo jo ynstellingen passaazje kinne feroarje, dizze rigels tafoegje mei jo kaaien:

# Soargje derfoar dat jo dizze fan jo Twilio Dashboard kopiearje
AUTH_VALID_MINUTES = 3 # It oantal minuten is de TFA-pagina ienris aktyf aktyf is

Earst sille wy formulieren hawwe nedich foar ús twa faktorferifikaasje werjeften. Brûkers bewurkje / forms.py, foegje de folgjende koade ta.

# ... Ymport
# In foarm foar it ynfieren fan ús telefoannûmer
# In formulier foar ferifikaasje

Folgjende, litte wy de werjeften oanmeitsje yn brûkers / werjefte.Py

# ... Ymport

Wy sille ek sjabloanen hawwe nedich foar beide fan dizze werjeften. Litte wy earst de MFA-sjabloan tafoegje.

nano users/templates/users/mfa.html

Foegje dizze HTML-koade ta oan it sjabloan

Dit is aardich sels ferklearjend. It formulier stjoert in koade as in lege koade, en jo sille fernimme yn 'e werjefte dy't wy de koade stjoere as wy in lege koade krije. Dan hawwe wy gewoan twa yntsjinjen knoppen, en dizze manier kinne wy ​​de koade stjoere mei beide knop. Folgjende, wy sille in ienfâldige foarm tafoegje om in telefoannûmer ta te foegjen.

nano users/templates/users/mfa_onboarding.html

Foegje de folgjende HTML ta:

Dit formulier is in protte ienfâldiger, it makket gewoan it telefoannûmer dat wy oanmakke en lit de brûker in tillefoannûmer tafoegje.

Dit liket echt goed! Salang't alles goed is ynsteld, soene wy ​​berjochten kinne stjoere, en logje de brûker yn mei har telefoannûmer sa gau as wy de URL-patroanen tafoegje. It lêste ding dat wy moatte ynstelle is in profylwurd, sadat wy kinne soargje dat de brûker har tillefoan kin feroarje. Ek om 'e brûker kin tekstje "Stopje" stopje "om te kiezen út takomstige tekstberjochten.

Litte wy in profylwurd tafoegje oan 'e brûkers / werjefte.Py. Dizze werjefte sil de bio fan 'e brûker bywurkje, e-post, brûkersnamme, en tillefoannûmer, lykas wy kinne tastean dat wy ús mearfaktor-ferifikaasje kinne ynskeakelje. Earst sille wy noch twa mear formulieren nedich wêze yn brûkers / forms.py

# ... Ymport

Folgjende kinne wy ​​in werjefte oanmeitsje om beide fan dizze formulieren te brûken. Bewurkje brûkers / werjefte.Py en tafoegje yn 'e werjefte.

# Foegje dizze ymport ta

Wy sille ek in sjabloan nedich hawwe foar dizze werjefte.

nano users/templates/users/profile.html

Jo sille fernimme dat dit in frij ienfâldige foarm is, mar hat wat javascript deryn dy't automatysk de ynhâld fan it formulier pleatst as se wurde bywurke. Dit is handich om te hawwen, dus jo kinne bewurkingen meitsje sûnder om elke kear yn te drukken.

Folgjende, wy hawwe URL's nedich dy't al dizze werjeften fertsjinwurdigje yn 'e URL-patters. Bewurkje brûkers / URL.PY en foegje dizze koade ta:

# ... Foarige koade, ymport
# ... URL-patroanen dy't wy earder ynfierd hawwe, foegje de folgjende trije rigels ta

No is it in goede tiid om ús projekt út te testen. Mar earst litte wy in oare reservekopy útfiere.

backup

En útfiere de server. Foardat wy ynsetten nei in Linux-server, is it in goed idee om twa faktorferifikaasje op it akkount yn te skeakeljen. Wy sille dit dwaan nei ús profyl URL, / brûkers / profyl / en it fakje kontrolearje om ferifikaasje te meitsjen nei it yngean fan ús tillefoannûmer ynskeakelje, en it yntsjinjen fan it formulier yn.

python manage.py runserver localhost:8000

Besykje de webside troch nei jo webbrowser te gean, ik brûk yn dit foarbyld yn dit foarbyld, en de URL https yngean: // LOCALHOST: 8000 / Accounts / profyl /

Jo sille kinne oanmelde as nedich en twa faktorferifikaasje ynskeakelje.

Dit projekt hat in server nedich om op te rinnen, sadat it echt kin stjoere. Mar earst hawwe wy in manier nedich om flaters te sjen. Jo sille merken dat as jo de server útfiere yn debugmodus, mei ynstellings.SN-gelyk oan wier, toant de server automatysk flaters. Om flaters sjen te litten sûnder debugmodus te brûken, dy't ûnfeilich is op in produksjerver, moatte wy dêr in werjefte tafoegje. De wichtichste flaters dy't wy moatte om te behanneljen binne:

Flater 500 - in probleem mei ús koade ERROR 404 - In pagina dy't net fûn waard (brutsen URL) Flater 403 - in tastimming wegere flater

Litte wy in nije app tafoegje om dizze flaters te behanneljen, flaters neamd.

python manage.py startapp errors

Foegje dit ta oan de ynstellings. Lead, om't wy earder dienen, yn 'e ynstalleare_apps-ynstelling, en begjinne troch ferwizing ta te foegjen yn app / URLS.PY, wêr't app de namme is fan jo Django-projekt.

handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'

Dit is alles wat wy nedich binne neist flater werjeften, sjabloanen en in bytsje middilder. Litte wy dat sa definiearje as sa:

# Meitsje jo werjeften hjir.

NEX lit ús de middels definiearje om dizze flaters te behanneljen. Wy sille dit dwaan troch earst ta te foegjen oan Middleware_Classes yn Ynstellings. Leit, mei de namme fan ús middgeware.

    # ... foarige middollare

Folgjende, litte wy de middeling tafoegje.

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

Wy foegje in funksje ta om de hjoeddeistige útsûndering te krijen mei in threading Lokaal te brûken, dy't ús helpt elke flaters yn ús koade te spoaren. Yn termen fan sjabloanen hawwe wy allinich ien nedich, om't wy de titel yn 'e werjefte dynamysk definiearje. It sjabloan moat gewoan de titel en "trace", ús flater Traceback út 'e kontekst.

nano errors/templates/errors/error.html

Dit is ús ienfâldichste sjabloan, mar dat is hoe maklik it is om de flaters yn ús projekt te sjen. NEX lit ús debug útskeakelje yn ynstellings.

nano app/settings.py

Fyn dizze rigel wêr't it is ynsteld op TRUE, en feroarje it nei FALSE

DEBUG = False

Gean foarút en reservekopy de app no. Wy binne ree om te ynsetten nei in Linux-server op ôfstân, en bliuw feiten dêrwei tafoegje.

sudo backup

Foardat wy dizze koade nei in server pleatse, moatte wy beskôgje dat d'r guon problemen kinne wêze mei de koade. Ofhinklik fan it gefal, siden dy't ynformaasje akseptearje, sille problemen hawwe, sille problemen hawwe mei spam wurde pleatst en swierrichheden op it ferwiderjen fan it spam. Dit soe net fuort moatte barre, mar as it bart, sille wy letter-eksamens op 'e side wurde om te stimmen, en it sakje fan' e siden fan 'e brûker fan har ID of in biometrysk scan, lykas in fingerprint of gesichtskotting.

Sykje nei it foarbyld fan it multi-faktor dy't wy ûndersochten, yn produksje, yn produksje, kinne dingen oars wêze. Notysje hoe't wy taryf beheine oanmeldingen binne, en tokens ferrinne. As robots tagong hawwe ta in side, kin twa faktorferifikaasje lestiger wêze, om't se tagelyk koade kinne ynfiere, is de brûker. Om dit te bestriden, litte wy in model brûke yn 'e brûkersmodellen, hoe't wy ynteraksje hawwe mei de side as wy ferifiearje mei multi-faktor-ferifikaasje mei in telefoannûmer. Wy sille ek in opsje tafoegje oan ferifikaasje mei e-post. Begjin troch de brûkersmodellen te bewurkjen mei Nano.

nano users/models.py

Dit is wat it model wy tafoegje moatte d'r útsjen. Wy hawwe gjin metoaden nedich, gewoan fariabelen om in ID te bewarjen, de brûker, de brûker, de tiid, lingte en besykje tsjin alle multi faktor-ferifikaasje (in koade lykas 123456 stjoerd nei in tillefoan of e-post).

# In basis token brûkt om oan te melden by de webside

Litte wy ek in privileezje tafoegje oan ús brûker, en wy sille it no foar de hân ynstelle, foardat jo úteinlik migrearje om te registrearjen om privatysk brûkers automatysk te befrijen. By de brûkermodellen, foegje dizze line ta yn it profyl:

    vendor = models.BooleanField(default=False)

Lykas by alle feroarings oan 'e database moatte wy Migrations meitsje en de database meitsje en wy in moederje dat wy in moade.PY-bestân bewurkje yn Django. Tink derom, om dit te dwaan brûke jo earst boarne (as it net is brûkt, om't de terminal net iepen wie) en dan is Python Manage.py om de migraasjes te meitsjen en te migrearjen.

cd project-directory-you-named # (as nedich)

Foar no kinne jo alle akkounts ynskriuwe dy't jo hawwe makke as vendors troch de shell te brûken.

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

Litte wy ús werjefte fan US Multi Factor-ferifikaasje evoluearje om dit token te brûken. Earst moatte wy ús MFA helper-nutsbedriuwen oanpasse. Mei help fan Nano,

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

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

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

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

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

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

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

def check_verification_code(user, token, code):
    token.attempts = token.attempts + 1
    profile = user.profile
    result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
    if token.attempts < 3 and result:
        profile.verification_code_length = 6
    elif token.attempts > 1 and not result:
        profile.verification_code_length = profile.verification_code_length + 2
        if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
    token.save()
    profile.save()
    return result
# Ferifiearje de brûker mei help fan har e-post as telefoannûmer
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filterje it token troch de wearde trochjûn yn 'e URL (in 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)) # As dizze sesje net is oanmakke, meitsje it dan oan
    user = User.objects.filter(id=token.user.id).first() # Krij de brûker út it token
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # As se al ferifieare binne, logje se dan oan
    if not user: raise PermissionDenied() # Wegerje as der gjin brûker waard fûn
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Kontrolearje it Auth-token
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Log yn 'e brûker as se net al binne oanmeld
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Stel in ferstriken yn op har multi-faktor-ferifikaasje
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # De brûker trochferhegje nei de folgjende pagina
    if not user.profile.mfa_enabled: # Kontrolearje as MFA ynskeakele is
        if not check_verification_time(user, token): # Kontrolearje de tiid
            user.profile.mfa_enabled = False # Ferwiderje it telefoannûmer
            user.profile.enable_two_factor_authentication = True # MFA ynskeakelje
            user.profile.phone_number = '+1' # Skeakelje it telefoannûmer út
            user.profile.save() # Bewarje it profyl
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Log de brûker yn as har MFA net ynskeakele is
    if request.method == 'POST' and not fraud_detect(request, True): # As it fersyk is in postoanfraach
        form = TfaForm(request.POST) # Instantiate it formulier
        code = str(form.data.get('code', None)) # Krij de koade
        if code and code != '' and code != None: # Soargje derfoar dat it net leech is
            token_validated = user.profile.check_auth_token(usertoken) # Kontrolearje it Auth-token
            is_verified = check_verification_code(user, token, code) # Kontrolearje de koade
            if token_validated: # As alles
                if is_verified: # Is yn oarder
                    user.profile.mfa_enabled = True # MFA ynskeakelje (as net al ynskeakele)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Ynlogge de brûker
                    for key, value in request.GET.items(): # Bou in queryfering foar de folgjende parameter (as ien)
                        return HttpResponseRedirect(next) # Ombribjen
            elif not token_validated: # As it token unjildich wie
            if p.mfa_attempts > 3: # As der te folle besykjen wiene
            if form.data.get('send_email', False): # Stjoer de e-post (as tekst)
    # RENDER DE FORM (FOAR Krij oanfragen)

As wy yn dizze koade tafoegje, soargje derfoar dat jo de funksje hawwe ymportearje om in e-post te stjoeren. Oan 'e boppekant fan it bestân, de brûker werjeften (mei oare ymport), tafoegje

from .mfa import send_verification_email as send_mfa_verification_email

No, wy moatte dy funksje skriuwe foardat jo ien fan dit wurk wurkje. It moat ús Stjoer e-postfunksje útwreidzje, en stjoer gewoan in e-post nei de brûker mei de ferifikaasjekoade.

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

Dat dit wurket geweldig, no hawwe wy in nijsferifikaasje-systeem dat hinget dat in telefoannûmer ôfhinklik is om oan te melden. Mar wy hawwe ek in manier nedich om te ferwiderjen, of ferbergje jo net mei ús betingsten. Dizze kinne spammers wêze, robots as elkenien dy't net goed betsjuttet foar ús wurk. Sjoch efkes sjen nei in werjefte dy't ik haw foar kontroleart brûkers op myn webside:

# Ymport
from .tests import is_superuser_or_vendor # Wy sille dizze test moatte oanmeitsje
    # Krij list mei brûkers
    return render(request, 'users/users.html', { # Brûk brûkers werom yn in sjabloan

Tink derom dat dizze koade in test brûkt, wy sille dizze test moatte ferklearje yn in testen.py-bestân en ymportearje it. Brûkers bewurkje / testen.py, litte wy de test oanmeitsje.

def is_superuser_or_vendor(user):
    return user.profile.vendor or user.is_superuser

Dit is yn kombinaasje mei de brûkers / brûkers.htmm-sjabloan, dy't sokssawat sjocht,

Tink derom dat it sjabloan in oar sjabloan omfettet, brûkers /user.html. As jo ​​in sjabloan brûke dy't in subtimpt hat en net útwreidingen brûkt, is it in goed idee om in understore te foegjen () Foardat de namme fan it bestân om út te wreidzjen, om sjabloanen te ûnderskieden.

Tink derom dat dit in soad Jinja is, jo hawwe miskien net al dizze fariabelen definieare. Mar dit is wat myn koade der útsjocht.

      <small># {{usopdracht.ID}} </ lyts>

Wy hawwe ek in oare subtimplate nedich, toggle_aktyf.html. Dit sjabloan moat in formulier wêze dat wy kinne wikselje oft in brûker aktyf is.

Wy sille ek moatte tafoegje moatte tafoegje om brûkersaktiviteit te wikseljen, en passende URL-patroanen. Wylst wy deryn binne, litte wy in werjefte tafoegje om in brûker te wiskjen yn it gefal dat wy dat nedich binne.

# Ymport
    success_url = '/' # It trochferwizing op URL fan sukses
    def test_func(self): # Test as brûker superuser is en tastimming hat om te wiskjen

Wylst dit praktysk is as nedich is, soe it de measte fan 'e tiid net nedich wêze moatte, kinne wy ​​gewoan de sichtberens fan brûkers dy't de side besykje as wy moatte ôfwize.

De URL-patroanen dy't wy tafoege sjogge d'r sa út. Mei Nano, bewurkje brûkers / URL.PY en foegje dizze rigels ta:

nano users/urls.py

De rigels moatte yn 'e list mei paden gean yn' e brûker werjeften, foar it ein "]" mar nei it begjin "[" ["[

# ...
# ...

No soargje derfoar dat jo de side reservekopy binne, sadat jo it kinne downloade op 'e webserver, wy sille trochgean mei wurkjen. Út 'e kommandorigel,

sudo backup

No is ús side backed up.

Dus no hawwe wy in pear nuttiger funksjes. Mar wat oer it grutte ôfbylding hjir? Dizze koade is noch net tagonklik fan it ynternet, hawwe wy noch gjin mailserver, en wy moatte útwreidzje om útwreiding om ús te helpen de side te helpen de side te ferkennen, tegearre mei befeilige protokollen foar autentiseare primilegearre brûkers.

Wy sille dit allegear krije. It wichtichste ding foar no sil gewoan dizze koade online krije, dy't wy kinne dwaan mei mar in pear rigels fan Bash op in Ubuntu-server. Jo moatte hjir in server foar hiere, útsein as jo in server hawwe thús en in saaklik ynternetabonnemint hawwe dy't jo kinne iepenje. Ik persoanlik rint myn webside op in HP Z440 dy't yn myn appartemint is ynstalleare, mar it is normaal folle goedkeaper foar Basisfoarsneaud om in firtuele privee server te hiere (VPS).

Hâld der rekken mei dat de koade no rinne is relatyf dun, it sil moatte wurde ûnderhâlden en ferbettere foardat wy ree binne om te brûken wat wy in produkt moatte bouwe. Soargje derfoar dat jo foarsichtich wêze wat jo dogge mei it ynternet, soargje derfoar as jo dizze side ynleverje op it web op in Linux-server, hawwe jo in plan om net winske ynteraksjes te blokkearjen mei jo webside. Dit sil earst net in probleem wêze, mar wy sille in ferskaat oan oplossingen besjen om dit te bestriden, ynklusyf masjine learen, keunstmjittige yntelliginsje en kompjûterfisy. As it docht, wurdt in probleem, sjoch dan fierder yn dizze tekst foar in oplossing.

Yn termen fan it hiere fan in VPS, binne d'r in soad plakken wêr't jo kinne gean. Google Cloud hat VPS-servers, Ionos, Kamatera, Amazon Aws, en mear providers biede wolker Server Solutions biede oan dat sil by ús behoeften passe.

Jo moatte fia har formulieren klikke en in plan selektearje om te begjinnen. Jo kinne mei in basisplan gean mei elke provider, mar soargje derfoar dat de leveransier yn 'e poarte-post-server-server hat om e-post te ferstjoeren (dit moat poarte 587 en poarte wêze), guon blokkearje dizze havens blokkearje. Oant no haw ik de bêste ûnderfining hân mei Ionos en Kamatera, sille beide tastean my unbeheind e-post te stjoeren en har prizen is aardich goedkeap.

Jo sille ferbine mei jo nije server oer in protokol neamd SSH of Feilige shell, wêrmei jo op ôfstân kinne yntervace mei de server krekt lykas jo persoanlike kompjûter, fan jo persoanlike kompjûter. As jo ​​de server ynstelle, sil de hostingprovider wierskynlik freegje om jo om in SSH-kaai te foegjen, of se sille jo in brûkersnamme en wachtwurd jaan. De SSH-kaai is hoe't jo sille oanmelde op 'e server fan' e kommandorigel om de koade te bewurkjen. Brûk de opsjes fan SSH-keygen om in SSH-kaai te generearjen.

ssh-keygen

Bewarje it bestân en oerskriuwe it as jo moatte, it is goed om jo SSH-toetsen te draaien as jo dit noch net hawwe. No, jo kinne it folgjende kommando brûke om jo SSH-kaai te sjen. Jo wolle it kopiearje nei jo server op jo ôfstân, sadat jo it kinne brûke om te ferifikaasje.

cat ~/.ssh/id_rsa.pub

As jo ​​gjin SSH-toets seine by it typen dat it kommando is, besykje dan te meitsjen mei "SSH-RSA-AAA"), dat is se feilich te brûken om har te brûken.) De folgjende koade sil in 4096-bit RSA SSH-kaai generearje.

ssh-keygen -t rsa -b 4096

Meitsje in VPS-rinnende Ubuntu, lykwols dat jo dit dogge om dit te dwaan. As jo ​​ienris in VPS hawwe makke troch te klikken troch de foarmen op 'e foarmen op' e oanbiedingen (KAMatera.com of ferlykber), dit wolle oanmelde. Om dit te dwaan, brûk dan, brûk dan, brûk dan, brûk dan, brûk dan, brûk dan, brûk dan, brûk dan, brûk dan, brûk dan, brûk dan, brûk dan it SSH-kommando mei jo IP-adres (it adres dat liket op xx.xx.xx). Jo moatte ek gefoelich wêze foar de standert-brûkersnamme op 'e server dy't wy oanmakke, bygelyks Ubuntu.

ssh ubuntu@XX.XX.XX.XX

Jo kinne miskien wurde frege om in wachtwurd, as jo om in wachtwurd wurde frege, yngean it yn. Wy sille de standert brûkersnamme hawwe, dus litte wy begjinne troch in nije brûker te meitsjen en in SSH-toets ta te jaan oan har akkount.

Litte wy begjinne troch in nij SSHD_CONFIG-bestân ta te foegjen, wat fertelt de server hoe't jo SSH brûke moatte.

nano sshd_config
# Dit is it SSHD-server-systeem-brede konfiguraasjebestân.  Sjen
# sshd_config (5) foar mear ynformaasje.
# Dizze SSHD waard gearstald mei paad = / usr / local / sbin: / usr / local / sBin: / usr / bin: / sbin: / by: / usr / spultsjes
# De strategy brûkt foar opsjes yn 'e standert SSHD_CONFIG ferstjoerd mei
# OpenSSH is om opsjes op te jaan mei har standertwearde wêr
# mooglik, mar lit se kommentearre.  Unkommende opsjes oerskriuwe de
# standertwearde.
# Haven 22
# Adresefamily elk
# Harkje 8.0.0.0
# Harketaddress ::
# Hostkey / etc / ssh / ssh_host_rsa_key
# Hostkey / etc / ssh / ssh_host_ecdsa_key
# HOSTKEY / ETC / SSH / ssh_host_ed25519_key
# CIPHERS EN KEYING
# REEYLIMIT Standert net ien
# Ynlogge
# SysLogfacility Auth
# Logleyvel info
# Ferifikaasje:
# Logingracetime 2m
# PERMITROOTLOGIN YNFORMAASJE Wachtwurd
# Strikmodes ja
# Maxauthtries 6
# MaksSessions 10
# Ferwachtsje .sSh / autorisearre_keys2 om standert yn 'e takomst te negearjen.
# Autorisjprinkipalsefile Gjin
# AutoriseareScommand Gjin
# AutoriseareScommanduSer Nieman
# Foar dit om te wurkjen, sille jo ek hoarten nedich hawwe yn / etc / ssh / ssh_ ssh_wone_hosts
# Hostbasedauthentication nr
# Feroarje nei Ja as jo net fertrouwe ~ / .sSh / bekende_hosten foar
# Hostbasedauthentication
# IgnoreusOnYnbekindhosts NO
# Lês de ~ / .Rhosten fan 'e brûker net lêzen en ~ / .shosts bestannen
# Ignorerhosts ja
# Tunneled Clear Tax-wachtwurden útskeakelje, feroarje hjir nei gjin!
# Permermetypasswords nr
# Wizigje nei Ja om wachtwurden yn útdagings-antwurd te aktivearjen (Paswere-problemen mei
# Guon pam-modules en threads)
# Kerberos-opsjes
# KerberosAuthentication No
# KerberosOrlocalPasswd Ja
# Kerberosticketcleanup ja
# Kerberosgetafstoken NO
# Opsjes foar GSSAPI
# GSSAPIAUTHTENTIONATIONAL NO
# GSSAPICLEANUPCREDIVES JA
# GSSAPISTRATECECTECKECK JA
# GSSAPEIDEYEWCHANCE NO
# Stel dit op 'Ja' yn om PAM-ferifikaasje yn te skeakeljen, ferwurking fan akkount,
# en ferwurking fan sesje. As dit ynskeakele is, sil PAM-ferifikaasje sil
# tastien wurde fia de KBDInterACTiveailauhentikaasje en
# Wachtwurdauttentikaasje.  Ofhinklik fan jo PAM-konfiguraasje,
# Pam-ferifikaasje fia KBDInteractiveailauhentication May Bypass
# de ynstelling fan "PERMITROOTOGIN WONTWOWS".
# As jo ​​gewoan wolle dat de Pam-akkount en sesjekontrôles sûnder rinne
# Pam-ferifikaasje, ynskeakelje dizze dan, mar set Wachtwurd ynsteld
# en KbDInteractiveauhentikaasje oan 'Nee'.
# TALJENPORDINGEN JA
# TALJECPFORWARDING YES
# GatewayPorts nr
# X11Displayoffset 10
# X11uselocalhost ja
# Permitty Ja
# PrintlastGOD YES
# TCPkeepalive Ja
# Permhermeren net
# Kompresje fertrage
# ClientaliveInterval 0
# Clientalivecountmax 3
# Brûkte nee
# Pidfile /run/sshd.pid
# MaxStartuFS 10: 30: 100
# Permittunnel NO
# Chrootdirectory none
# Ferzjeaddendum Gjin
# Gjin standert Banner PATH
# Tastean klant te passearjen oan it lokale omjouwingsfariabelen
# Standert oerskriuwe fan gjin subsystemen
# Foarbyld fan oerskriuwen op in per-brûker basis
# Wedstriid brûker Anoncvs
# X11Forwarding NO
# MAXTCPFORWARDING NO
# Permitty nee
# ForceCommand CVS-server

Unthâld, Ctrl + X en Y om it bestân op te slaan. NEXT litte wy in basisskript skriuwe Called Initialiseare (alles yn 'e standert húsdap fan ús brûker).

nano initialize

Foegje dizze rigels ta oan it bestân, ferfangingMei jo SSH-kaai dy't jo hawwe fûn mei kat. (.ssh / id_rsa.pub)

# ! / bin / bash

Om jo troch dit bestân te rinnen, litte wy begjinne mei line mei line. De earste rigel fertelt de kompilator dat dit in bash-skript is. Dan ynstalleare wy ôfhinklikens, kopiearje SSHD_CONFIG nei de juste map, SSH-toetsen opnij oanmeitsje, it jouwe it tafoegjen fan 'e brûker, dat jo it tafoegjen fan it adduser-kommando mei har namme en útskeakele wachtwurd brûke). Wy foegje ek team oan 'e sudo-groep ta, generearje har SSH-toets, foegje ús kaai ta oan autorisearre toetsen en harren toets printsje. Dizze nije brûker sil wêze hoe't wy ynlogge op 'e side.

Gean yn in nije terminal, gean foarút en iepenje de server opnij.

ssh team@XX.XX.XX.XX

Jo moatte dizze kear gjin wachtwurd nedich wêze, om't jo in SSH-kaai hawwe. Wy hawwe ek oanmeld oanmelde mei wachtwurd om de side feiliger te hâlden.

No, dizze server begjint folslein leech mei gjin ynformaasje oer it. Litte wy begjinne troch ús projekt te klonen fan Git, sadat wy it kinne downloade en útfiere op 'e masine op ôfstân. Op 'e server op ôfstân ferbûn oer SSH, printsje jo SSH-kaai foarôf:

cat ~/.ssh/id_rsa.pub

Folgjende, plakke dizze kaai yn 'e Git-ynstellingen lykas wy earder dienen om ús Git-repository op te stellen. Wy meie no ús projekt direkt oan 'e server kloeie. Soargje derfoar dat jo earst it projekt lokaal reservek hawwe, dat it is op 'e Git-server om te downloaden.

git clone git://github.com/you/yourproject.git

Perfekt. No binne alle bestannen hjir. Wy kinne se sjen mei LS

ls

Litte wy no begjinne mei de server yn te stellen. Bekame earst jo projektidsitaal yn in ienfâldige, memorabele namme dy't wy sille brûke foar it projekt.

cp -r yourproject whatyoucalledit

Wêr "Whatyoucalledit" is de nije namme fan jo projekt. Folgjende sille wy in basisútjefte moatte bouwe om de server yn te stellen. Wy sille dit nut opslaan en it yn 'e takomst brûke. Om dit hulpprogramma te bouwen, litte wy in brûker binêre oanmeitsje om te definiearjen hoe't wy in skript bewurkje. Mei help fan bash, bewurkje / usr / bin / ascript

sudo nano /usr/bin/ascript

Soargje derfoar dat jo dêr sudo brûke, sadat jo tagongsrjochten hawwe om it bestân te bewurkjen. Yn it bestân hawwe, foegje dizze rigels ta:

# ! / bin / bash
    echo "# ! / bin / bash ">> USR / bin / $ 1

Tink derom dat dit skript in argumint nimt, de skriptnamme, as $ 1. Earst kontroleart it as it bestân it bestiet, of oars makket de earste rigel om it skript ta te meitsjen, bewurket it, en foeget syn namme ta, en foeget ús ta dy't ús de nammen fan 'e skripten sille bewarje, wy meitsje. As it bestân al bestiet, feroaret gewoan tagongsrjochten en bewurkje it. Bewarje it bestân, en folgjende sille wy it tagongsrjochten feroarje. Salang't wy dit skript brûke, hoege wy dat net wer te dwaan.

sudo chmod a+x /usr/bin/ascript

Perfekt. Litte wy no in skript meitsje mei de namme Setup. Earst, net om jo net te oerwinnen, mar efkes sjen nei wat myn opsetskript der útsjocht. Wy sille rinne troch wat dit skript yn jo projekt soe moatte útsjen, jo sille net alles yn myn skript nedich wêze om mei te begjinnen.

# ! / bin / bash
# Sudo Chmod A + X-skripts / Usersetup
# ./Scripts/usersetup
# SSH-keygen
# Project Directory
# Logkommando's
# Nano Config
# Git config
# Update en ynstallearje
# Kampioenskippen ynskeakelje Antivirus
# SET HOSTNAME
# Postgres ynstelle
# Ynstelle database-reservekopy
# Iptables útskeakelje
# StitDefender ynstallearje
# Postfix opset
# DIRS oanmeitsje
# Virtualenv ynstelle
# Krij en bouwe ôfhinklikens
# Stel firewall-regels yn
# Ynstallearje pypiôfhinklikens
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP INSTALL OPENCV-PYDHON == 4.5.5.64
# Pip ynstallaasje Operencv-byloggen Python == 4.5.5.64
# Ynstallearje CertBot
# Run certbot
# Mailserver opnij laden
# Kopiearje CERTS
# sudo cp /etc/letsencrypt/live/femmebabe.com/Privkey.pem Privy.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# PATCH VENV
# Stel brûkersynstellingen yn
# Stel tagongsrjochten yn
# Sudo chown -r team: brûkers / var / run /
# Sudo Chown Root: Root / Run / Sudo / TS -R
# sudo chmod 664 dB.Sqlite3
# Sudo Chown www-gegevens: Users dB.Sqlite3
# Kopiearje konfigurearje en tagongsrjochten ynstelle
# Ynstelle databank
# Inject Pam Config en ferwiderje defekte SSH Conconfig
# Sudo sed -i '' -e '$ d' /etc/pam.d/SSHD
# Sudo sed -i '' -e '$ D' / etc / profyl
# Kopiearje BIN-skripts en set tagongsrjochten yn
# Tsjinsten opnij laden en ynskeakelje
# Ynskeakelje apache-modules yn
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Standert side útskeakelje
# Skeakelje ús side yn
# Ferzje deponemon en opnij starte Apache, postfix en Opendkim
# Stel tagongsrjochten yn
# Ruilje konfiguraasje
# Init Caption Engine
# Setup Git
# Sjen litte IPV6 en Opendkim foar domeinkonfiguraasje
# Setup foltôge

Dat is in soad opset! Koartsein, dizze koade logs, konfigurearret Nano en git, kopiearden oer bestannen, Kontrôles postfix, konfigurearret postgix, konfigureareart iptabase), ynstalleare, downloads in antivirus, makket mappen, makket mappen, klonen Ofhinklikens, ynstalleart sertifikaten en stelt de server ynstalleare, ynstalleart konfiguraasje, begjint en ynskeakelt, draait tawiisd, set tagongsrjochten, set de IP, IPV6-adres en Opendkim-toets. Frij simpel, mar it liket op in soad koade. Wy sille dit net nedich wêze, om't wy net de ôfhinklikens hawwe, wy brûke net dat selderij, selerybeat of Daphne, mar wy sille wat fan jo ynstallearje om te begjinnen. Tink derom dat dizze koade in domein ferskate kearen ferklearre hat.

Wy sille ek in domeinnamme moatte keapje (dat is in lytse jierlikse fergoeding). Ik advisearje Squarespace foar it keapjen fan in domein, har yndieling is yntuïtyf en maklik te brûken. Jo kinne elk domein fan jo kar keapje, mar ik brûk it domeinfemmebabe.com yn dit foarbyld. Sadree't jo in domein hawwe kocht, holle nei it Squarespace DNS-konfiguraasjetaniel en foegje in opdracht ta oan it wizigjen fan jo domein nei de server troch IP-adres. It soe der sa útsjen moatte:

@ A xx.xx.xx.xx

Mei de @ operator as de leger, betsjuttet alle Subdomeinen ûnder dit domein en de rootdomein sil alle trochferwize nei de server. D'r binne mear records om te ferklearjen, mar wy kinne trochgean nei dizze ienris wy ree binne om e-post te stjoeren. Hâld der rekken mei, it kin ferskate dagen duorje foardat jo mei súkses kinne stjoere fan 'e server. De DNS-records Wy binne ynstellingen sille tiid nimme om te propagearjen.

Hoe dan ek, it ienige record dat wy moatte begjinne te begjinnen is in rekord. Dus no kinne wy ​​it ûndersteande skript ynfolje neffens ús projekt en rinne it.

Litte wy begjinne mei in lytsere opsetskript om gewoan te ynstallearjen wat wy nedich binne foar in basisútgong. Wy sille noch net safolle ôfhinklikens of postgresql brûke, wy begjinne gewoan in basis HTTP-server en soargen oer it sertifisearjen as dat dien is. Tink derom, om in HTTPS-sertifikaat te krijen en de server feilich te rinnen, wy sille in domein moatte keapje tegearre mei hiere in server. Foar no ferfange "team" yn dit bestân mei de namme fan jo brûker, "Dir", mei de map fan jo projekt, en leverje jo e-post en domein yn 'e <> tags.

Derneist foardat wy dizze koade útfiere, moatte wy de ynstellingen feroarje nei de Firewall De hosting-provider stipet, as ien. Normaal is dit yn 'e ljepblêd' Netwurken 'fan jo hosting provider, of as jo sels hosting binne, is it yn' e seksje 'haven troch' e grutte fan jo router. Jo wolle ek in statyske IP fia jo router ynstelle mei it adres fan jo servermasjine, as jo sels hosting brûke. Jo sille de folgjende havens moatte iepenje foar lêzen / skriuwtagong.

22 (SSH) 25 (mail) 587 (Mail) 110 (Mail client) 80 (HTTP) 443 (HTTPS)

# ! / bin / bash
# Logkommando's
# Nano Config
# Git config
# Update en ynstallearje
# Kampioenskippen ynskeakelje Antivirus
# SET HOSTNAME
# Ynstelle database-reservekopy
# Iptables útskeakelje
# Virtualenv ynstelle
# Ynstallearje CertBot
# Run certbot
# Stel brûkersynstellingen yn
# Stel tagongsrjochten yn
# Sudo chown -r team: brûkers / var / run /
# Sudo Chown Root: Root / Run / Sudo / TS -R
# Tsjinsten opnij laden en ynskeakelje
# Ynskeakelje apache-modules yn
# Ferzje deponemon en opnij starte Apache, postfix en Opendkim
# Sjen litte IPV6 en Opendkim foar domeinkonfiguraasje

Foardat jo dizze koade útfiere, soargje derfoar dat it domein dat jo hawwe kocht is ferbûn oan 'e server. Om dit te dwaan, iepenje in terminal op jo pleatslike masine, en rinne dit kommando út mei jo domein:

ping femmebabe.com # Foegje hjir jo domein yn, nei ping

As alles goed sjocht en de server stjoert, stjoert wy ree, ree om it skript te rinnen en ynstallearje pakketten, ynstallearje, ynskeakelje, ynskeakelje, ynskeakelje ús Apache-server.

Dit is net alle opset nedich om postfix te konfigurearjen, wy sille letter nei't jo letter mear ynstelle. Foar no liede dizze opsetkoade en it moat in pear minuten duorje om jo server te ynstallearjen en te sertifisearjen. Soargje der nochris, soargje derfoar dat jo namme, e-post- en domeinnamme ferfange yn it skript neffens de namme dy't jo hawwe kocht.

No't de server is foarsjoen, kinne jo nei de URL yn elke webbrowser gean en kontrolearje om te soargjen dat de server HTTPS rint. As it net is, besykje dan in skoftke te wachtsjen foar de DNS-records om it folgjende kommando op te heljen en te rinnen, om it op te nimmen om it sertifikaat opnij te besykjen:

sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com

Salang't jo alles korrekt hawwe konfigureare, soene jo tagong kinne ta Apache-pagina's fan APA-standert gewoan om te kennen om te witten dat jo koade wurket en in live webside werjaan. Ret's litte wy de ynstellingen bewurkje.py om ús standert debugmodus te feroarjen nei produksje. Wy sille it domein ek yn 'e ynstellingen konfigurearje, lykas ynterne IPS.

nano yourproject/settings.py

Yn 'e ynstellings, feroarje / Foegje dizze rigels ta.

# Site Config

No, wy moatte Apache2 net konfigurearje. Litte wy it CONFIG-bestân bewurkje, wy sille ynsetje mei dizze rigel:

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

Dit konfiguraasje moat ús domeinnamme hawwe yn it, en de namme fan 'e brûker en projekt. Ik brûk de domeinnamme femmebabe.com, it brûkersnamme-team, en de projektnamme 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>

Soargje derfoar dat jo de namme fan it projekt, mappen fan it projekt ferfange, en domeinen yn dit foarbyldkoade by it konfigurearjen fan jo server. No, wy sille de standertide moatte útskeakelje. Dit kin dien wurde mei bash.

sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl

Folgjende kinne wy ​​de standertide ynskeakelje en weromladen apache2, ek opladen, ek gebrûk fan bash. Tink derom om Femmebabe te ferfangen mei de namme fan it bestân dat jo ferklearre as jo yn / etc / apache2 / sites-beskikber bewurkje /.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Gean werom nei jo domein yn 'e Navbar. Jo moatte de side sjen dy't jo konfigureare yn jo webbrowser. Lokwinsken! As jo ​​it net sjogge, moatte jo miskien wat wizigingen meitsje. Besoargje de ynstellingen yn jo projekt, apache-konfiguraasje, en soargje derfoar dat jo gjin flaters hawwe, en de folgjende kommando's útfiere om it projekt te kontrolearjen.

cd projectname
source venv/bin/activate
python manage.py check

As jo ​​flaters hawwe yn jo Python-projekt, traapje se dan wêr't se binne en se reparearje. Jo kinne miskien net jo flaters sjen, ôfhinklik fan wêr't se binne, dus as jo in flater hawwe, dat "befolking is, is it folgjende bestân yn 'e firtuele omjouwing, register.py, om de flater te eksposearjen, om de flater te eksposearjen,

nano venv/lib/python3.12/site-packages/django/apps/registry.py

Rôlje nei line 83, wêr't dizze runtime-flater wurdt opbrocht (ferheegje (befolke () is net reentrarren ") en foegje in reaksje ta, en foegje dan ta, mei deselde yndruk, sels.app_configs = {}. Dit liket derop:

                # Foarkom dat Reentrant ropt om AppConfig.ate te foarkommen ()
                # Metoaden twa kear.
# RuntimeError ferheegje ("befolke () is gjin Reentrant")

Jo kinne dan it projekt opnij kontrolearje en de flater eksposearje.

python manage.py check

Dan kinne jo de flater sjen en it reparearje. As jo ​​it hawwe fêste en de koade kompilyen mei gjin flaters, soargje der dan wis fan it bestân werom te feroarjen, sadat it sa liket:

                # Foarkom dat Reentrant ropt om AppConfig.ate te foarkommen ()
                # Metoaden twa kear.
# self.app_configs = {}

Overe de server is online, as wy fierder feroaringen meitsje, moatte wy it folgjende kommando brûke om de server te laden:

sudo systemctl reload apache2

Geweldich! Mar wat oer it ferstjoeren fan e-post? Om te begjinnen mei ferstjoeren fan e-post, sille wy earst de domeinkonfiguraasje moatte bywurkje. Dit soe moatte wêze yn jo DNS-paniel yn Squarespace, of hokker domeinnamme registrar jo hawwe keazen. Wy sille ek om konfiguraasje moatte ynstallearje en tafoegje en in pear kommando's útfiere.

Litte wy earst it IPV6-adres krije fan 'e server. Wy sille dan jo DNS iepenje en de records tafoegje.

Om it IPV6-adres fan 'e server te krijen, brûk dit kommando:

ip -6 addr

No, wy kinne de folgjende records tafoegje oan 'e DNS-ynstellingen. Myn records sjogge der sa út. Foar jo records moatte jo lykwols it IP-adres ferfange troch jo IP (net 75.147.182.214, dat is mines). Foegje jo domein ek ta yn plak fan femmebabe.com, lykas ek jo ipv6-adres fûn mei it foarige kommando (jo kinne mines net brûke, fe80 :: FFF: FFF: FFF: 3E02). Meitsje jo no gjin soargen oer de domeinkey, dit is makke as wy postfix ynstelle, de e-postserver, mei OPENDKIM, en de kaai printsje. Wy sille dit lêste konfigurearje.

@ IN N / a 75.147.182.214

@ Mx 10 femmebabe.com

@ Ptr N / a femmebabe.com

@ Txt N / a Txt @ v = spf1 mx ip75.147.182.214IP6: fe80 :: 725A: FFF: FFF: 3E02 ~ All

default._bimi Txt N / a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg

_dmarc Txt N / a v = dmarc1; P = Gjin

Sendonly._Domaierkey Txt N / a

No, wy moatte wat oanhâldende konfiguraasje tafoegje foar postfix. Alles wat wy hoege te dwaan is te soargjen dat wy de domeinnamme, femmebabe ferfange, mei de domeinnamme dy't jo brûke. Litte wy ien fan alle konfiguringsbestannen ien sjen, en ynstallearje se yn in map neamd Conne Config yn ús projekt, om it OS te ynstallearjen.

nano config/etc_postfix_main.cf

Foegje dizze tekst ta oan it bestân

# Sjoch /usr/share/postfix/main.cf.Dist foar in kommentearre, mear folsleine ferzje
# Debian spesifyk: spesifisearje in bestânsnamme sil de earste feroarsaakje
# Line fan dat bestân om te wurde brûkt as de namme.  De Debian standert
# is / etc / postnamme.
# Myorigin = / etc / MailName
# APPENDEN. WOMENAIN IS DE MUA'S JOB.
# Unkommentearje de folgjende rigel om "fertrage e-post" warskôgingen te generearjen
# Delay_Warning_Time = 4h
# Sjoch http://www.postfix.org/PMATIALE_README.html - standert op 3.6 ON
# farske ynstallaasjes.
# TLS-parameters
# Milterkonfiguraasje

Folgjende konfiguer!

nano config/etc_postfix_master.cf

Foegje dizze rigels ta:

# 
# Postfix master proses konfiguraasjetriem.  Foar details oer it formaat
# fan it bestân, sjoch de master (5) hânmjittich pagina (kommando: "man 5 master" of
# Online: http://www.postfix.org/master.5.html).
# 
# Ferjit net om "postfix opnij laden" útfiere nei it bewurkjen fan dit bestân.
# 
# =====================================================================
# Tsjinstype privee unpriv choot wekker Maxproc-kommando + args
# (Ja) (ja) (nee) (nea) (100)
# =====================================================================
# SMTP INET N - Y - 1 postscreen
# SMTPD PASS - - y - - SMTPD
# DNSBLOG UNIX - - y - 0 dnsblog
# TlSproxy UNIX - - y - 0 tlsproxy
# Kies ien: yntsjinjen yntsjinje foar loopback-kliïnten allinich, as foar elke klant.
# 127.0.0.1:Submission INET N - Y - SMTPD
# -o syslog_name = Postfix / yntsjinjen
# -o SMTPD_TLS_SECURITY_LEVEL = Fersiferje
# -o smtpd_sasl_auth_enable = ja
# -o smtpd_tls_auth_only = ja
# -o SMTPD_REJECT_UNLISTED_RECIPIENT = NO
# -o SMTPD_CLIENTS_RESTRIDS = $ MUA_CLIENT_RESTRIDIictionNS
# -o SMTPD_HELO_RESTRIDS = $ mua_helo_restriksjes
# -o SMTPD_SENERE_RESSIRTS = $ MUA_SENDER_RESTRICTIONS
# -o SMTPD_recipient_restriksjes =
# -o SMTPD_RELAY_RESTRICTIONS = PERMIT_SASL_AATHENTICATED, ôfwize
# -o milter_macro_daemon_name = oarsprong
# Kies ien: SMTPS ynskeakelje foar loopback-kliïnten allinich, as foar elke klant.
# 127.0.0.1:MTPS INET N - Y - - SMTPD
# SMTPS INET N - Y - SMTPD
# -o syslog_name = Postfix / SMTPS
# -o SMTPD_TLS_WRATPERMODE = Ja
# -o smtpd_sasl_auth_enable = ja
# -o SMTPD_REJECT_UNLISTED_RECIPIENT = NO
# -o SMTPD_CLIENTS_RESTRIDS = $ MUA_CLIENT_RESTRIDIictionNS
# -o SMTPD_HELO_RESTRIDS = $ mua_helo_restriksjes
# -o SMTPD_SENERE_RESSIRTS = $ MUA_SENDER_RESTRICTIONS
# -o SMTPD_recipient_restriksjes =
# -o SMTPD_RELAY_RESTRICTIONS = PERMIT_SASL_AATHENTICATED, ôfwize
# -o milter_macro_daemon_name = oarsprong
# 628 inet n - y - - qmqpd
# qmgr unix n - N 300 1 OQMGR
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
# 
# ================================================================
# Ynterfaces oan software net-postfix. Wês wis dat jo de hantlieding ûndersykje
# Siden fan 'e software net-postfix om út te finen hokker opsjes it wol.
# 
# In protte fan 'e folgjende tsjinsten brûke de postfix-piip (8) levering
# agint.  Sjoch de piip (8) Man-pagina foar ynformaasje oer $ {Untfanger}
# en oare opsjes foar ferstjoeren fan berjochten.
# ================================================================
# 
# MailDrop. Sjoch it postfix MailDrop_ReadMe-bestân foar details.
# Spesifisearje ek yn Main.CF: Maildrop_Destination_recipient_Limit = 1
# 
# 
# ================================================================
# 
# Resinte Cyrus ferzjes kinne it besteande "LMMTP" Master.CF yngong brûke.
# 
# Spesifisearje yn Cyrus.Conf:
# lmtp cmd = "lmtpd -a" harkje = "Localhost: LMMTP" Proto = TCP4
# 
# Spesifisearje yn Main.CF ien of mear fan 'e folgjende:
# Mailbox_transport = LMTP: Inet: LocalHost
# Virtual_transport = LMTP: Inet: LocalHost
# 
# ================================================================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Spesifisearje ek yn Main.CF: Cyrus_Destination_Recipient_Limit = 1
# 
# Cyrus Unix - N N - - Pipe
# flaggen = dr brûker = cyrus argv = / cyrus / bin / levere -e -r $ {stjoerder} -M $ {{útwreiding} $ {{brûker}
# 
# ================================================================
# Ald foarbyld fan levering fia Cyrus.
# 
# Old-Cyrus Unix - N N - - Pipe
# flaggen = r brûker = cyrus argv = / cyrus / bin / levere -e -M $ {útwreiding} $ {uso {user}
# 
# ================================================================
# 
# Sjoch it postfix Uucp_ReadMe-bestân foar konfiguraasjedetails.
# 
# 
# Oare eksterne leveringsmetoaden.
# 

En de opendkim-konfiguraasje. Opendkim identifiseart e-postervers mei domeinskoetsen om se feiliger te meitsjen. Sûnder it wurdt net ûndertekene en kin it miskien net oan in postfak meitsje.

nano config/etc_default_opendkim

Foegje dizze rigels ta:

# Opmerking: dit is in legacy-konfiguraasjetriem. It wurdt net brûkt troch de OpenDkim
# systemd tsjinst. Brûk asjebleaft de oerienkommende konfiguraasjeparameters yn
# /etc/opendkim.conf ynstee.
# 
# Earder soe men de standertynstellingen hjir bewurkje, en dan útfiere
# /LIB/OPEDKIM/OPENDKIM.S FERSEE.GENERATE om systemd oerskriuwing te generearjen by
# /etc/systemd/systeem/system/opendkim.service.d/OVride.conf en
# /etc/tmpfes.D/opendkim.conf. Wylst dit noch mooglik is, is it no
# Oanrikkemandearre om de ynstellingen direkt yn /etc/opendkim.conf direkt te passen.
# 
# Daemon_opts = ""
# Feroarje nei / var / spool / postfix / run / opendkim om in unix-socket te brûken
# Postfix yn in chroot:
# Rundir = / var / spool / postfix / run / opendkim
# 
# Unkomment om in alternatyf socket op te jaan
# Tink derom dat it ynstellen fan dit elke socketwearde sil oerdrage yn Opendkim.conf
# Standert:
# Harkje op alle ynterfaces op poarte 54321:
# Socket = Inet: 54321
# Harkje op Loopback op haven 12345:
# Socket = Inet: 12345 @ localhost
# Harkje op 192.0.2.1 op poarte 12345:
# Socket = Inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Foegje dizze rigels ta:

# default_Process_Limit = 100
# Standert_client_limit = 1000
# Standert VSz (Virtuele ûnthâld grutte) Limyt foar tsjinstproses. Dit is foaral
# bedoeld om prosessen te fangen en te fermoardzjen dy't ûnthâld lekt foardat se ite
# alles.
# default_vsz_Limit = 256m
# Oanmelde-brûker wurdt yntern brûkt troch oanmeldprosessen. Dit is it meast net yntreden
# Meidogger yn Doecot systeem. It moat hielendal gjin tagong hawwe ta neat.
# Standert_login_user = DOVENULL
# Ynterne brûker wurdt brûkt troch unprivilegearre prosessen. It moat apart wêze
# Oanmelde brûker, sadat oanmeldprosessen oare prosessen net fersteure.
# default_internal_user = Dovecot
    # haven = 143
    # Port = 993
    # SSL = ja
  # Oantal ferbiningen om te behanneljen foardat jo begjinne mei in nij proses. Typysk
  # De iennige nuttige wearden binne 0 (ûnbeheind) of 1. 1 is feiliger, mar 0
  # is rapper. <DOC / Wiki / LoginProcess.txt>
  # Service_count = 1
  # Oantal prosessen om altyd te wachtsjen op mear ferbiningen.
  # Process_Min_avail = 0
  # As jo ​​Service_count = 0 ynstelle, moatte jo wierskynlik dit groeie.
  # vsz_limit = $ default_vsz_limit
    # haven = 110
    # Port = 995
    # SSL = ja
    # Port = 587
  # Meitsje inet harker allinich as jo de boppesteande UNIX-socket net kinne brûke
  # inet_listener lmtp {
    # Foarkom dat LMTP sichtber is foar it heule ynternet
    # adres =
    # haven =
  # }
  # It measte fan it ûnthâld giet nei mmap () ing-bestannen. Jo moatte dit miskien ferheegje
  # beheine as jo enoarme postfakjes hawwe.
  # vsz_limit = $ default_vsz_limit
  # Maks. Oantal IMAP-prosessen (ferbiningen)
  # ProSce_Limit = 1024
  # Maks. Oantal POP3-prosessen (ferbiningen)
  # ProSce_Limit = 1024
  # Maks. Oantal SMTP-yntsjinjen prosessen (ferbiningen)
  # ProSce_Limit = 1024
  # Auth_socket_path-punten nei dizze userdb socket. It is typysk
  # brûkt troch Doecot-LDA, Doeadm, mooglik IMAP-proses, ensfh. Brûkers dy't hawwe
  # Folsleine tagongsrjochten foar dizze socket kinne in list krije fan alle brûkersnammen en
  # Krij de resultaten fan 'e userDB-útstrieling fan elkenien.
  # 
  # De standert 0666-modus kinne elkenien ferbine mei de socket, mar de
  # usherdb lookups sil allinich slagje as de userdb in "uid" fjild werom jout dat
  # komt oerien mei it UID fan it Caller-proses. Ek as de UID fan Caller as GID oerienkomt mei de
  # Socket fan 'e socket as it sykjen slagget de útstrieling. Alles oars feroarsaket in mislearring.
  # 
  # Om de beller folsleine tagongsrjochten te jaan om alle brûkers te sykjen, set de modus oan
  # wat oars dan 0666 en Doecot lit de kernel de
  # Fergunningen (bgl. 0777 kinne elkenien folsleine tagongsrjochten kinne).
  # Add arbeidersproses wurdt standert rin as root straft, sadat it tagong kin ta
  # / etc / skaad. As dit net nedich is, moat de brûker feroare wurde
  # $ Standert_internal_user.
  # brûker = root
  # As dikte-proxy wurdt brûkt, moatte mailprosessen tagong hawwe ta syn socket.
  # Bygelyks: MODE = 0660, groep = VMail- en wrâldwide mail_access_groups = vmail
    # Mode = 0600
    # brûker =
    # Groep =

Soargje der nochris foar it domein yn al dizze bestannen, femmebabe.com, mei it domein dat jo hawwe selektearre. Bewurkje it folgjende bestân, Doecot's Config,

nano config/etc_dovecot_dovecot

En foegje dizze rigels ta

## Dovecot-konfiguraasjebestân
# As jo ​​haast binne, sjoch, sjoch http://wiki2.dovecot.org/quickconfiguration
# "Doeconf -N" jout in skjinne útfier fan 'e feroare ynstellings. Brûk it
# Yn plak fan kopiearje en plakken by it pleatsen by it pleatsen nei de Doevasme-mailing-list.
# '# 'Karakter en alles nei't it wurdt behannele as opmerkingen. Ekstra spaasjes
# en ljeppers wurde negeare. As jo ​​ien fan dizze eksplisyt wolle brûke, set dan de
# value inside quotes, eg.: key = "# Char en efterlizzende wite space "
# De measte (mar net alle) ynstellings kinne wurde oerdreaun troch ferskate protokollen en / of
# Boarne / Destination IPS troch de ynstellingen binnen seksjes te pleatsen, bygelyks:
# Protokol IMAP {}, Lokaal 127.0.1 {}, op ôfstân 10.0.0.0/8 {}
# Standertwearden wurde werjûn foar elke ynstelling, it is net fereaske oan unkomment
# dy. Dit binne útsûnderingen hjirop: gjin seksjes (bgl. Nammeromte {})
# OF PLUESIN-ynstellingen wurde standert tafoege, se wurde allinich as foarbylden neamd.
# Paden binne ek gewoan foarbylden mei de echte standertpunten dy't binne basearre op konfiguraasje
# Opsjes. De hjir neamd paden binne foar konfiguraasje - FREFIX = / usr
# --Sysconfdir = / etc --Calstatedir = / var
# Ynstalleare protokollen ynskeakelje
# In komma skieden list mei ips as hosts wêr't jo moatte harkje foar ferbiningen.
# "*" Liesens yn alle IPv4 ynterfaces, "::" harket yn alle IPV6-ynterfaces.
# As jo ​​net-standert havens wolle opjaan of wat komplekser,
# Bewurkje Contr.. / Master.conf.
# harkje = *, ::
# Basis Directory Wêr moatte jo Runtime-gegevens opslaan.
# base_dir = / var / run / dovecot /
# Namme fan dit eksimplaar. Yn mear-eksimplaar ynstelle Doeadm en oare kommando's
# kin -i <eksimplaar_namme> brûke om te selektearjen hokker eksimplaar wurdt brûkt (in alternatyf
# nei -c <config_path>). De eksimplaarnamme wurdt ek tafoege oan Davecot-prosessen
# yn PS-útfier.
# INTANCE_NAME = Doecot
# Groetnisberjocht foar kliïnten.
# Login_Greeting = Doevet klear.
# Romte skieden list mei fertroude netwurk berik. Ferbinings fan dizze
# IP's meie har IP-adressen en havens oerdrage (foar oanmelding en
# foar ferifikaasje kontrôles). Skeakelje_Plaintext_auth wurdt ek negeare foar
# dizze netwurken. Typysk soene jo hjir jo IMAP-proxy-servers opjaan.
# login_trusted_networks =
# List fan romte skieden fan oanmeldings tagongskontrôle Sockets (bgl. TCPWRap)
# login_access_sockets =
# Mei proxy_maybe = Ja as proxy-bestimming oerienkomt mei ien fan dizze IPS, doch net
# proxying. Dit is net nedich normaal, mar kin nuttich wêze as de bestimming
# IP is it bgl. in IP fan in laden Balancer.
# autor_proxy_self =
# Sjen litte mear ferbannepros-titels (yn PS). Toant op it stuit Dragersnamme en
# IP-adres. Nuttich foar it sjen fan wa't de IMAP-prosessen eins brûke
# (bgl. Skermers ferstjoeren as deselde UID wurdt brûkt foar meardere akkounts).
# tiidwurdse_proctitle = nee
# Moatte alle prosessen wurde fermoarde as Doecot Master Proces ôfslút.
# It ynstellen fan dit oant "nee" betsjut dat Doecot kin wurde opwurdearre sûnder
# Begjinde besteande kliïntferbiningen om te sluten (hoewol dat ek koe wêze
# in probleem as de upgrade is bgl. fanwegen in befeiligingsfix).
# shutdown_clients = ja
# As net-nul, rint postkommando's fia dizze protte ferbiningen nei Daveadm-server,
# ynstee fan se direkt yn itselde proses te rinnen.
# Doeadm_worker_count = 0
# Unix socket as host: Port brûkt foar ferbining mei Doveadm-server
# Doeadm_socket_path = Doeadm-server
# Romte skieden list mei omjouwingsfariabelen dy't wurde bewarre op Doecot
# Begjin en trochjûn oan al syn bernprosessen. Jo kinne ek jaan
# KEY = Wearde pearen om altyd spesifike ynstellingen te stellen.
# ymport_enbúsjoeren = tz
## 
## Ynstellings foar Wurdboek Server
## 
# Wurdboek kin brûkt wurde om kaai te bewarjen = weardelisten. Dit wurdt brûkt troch ferskate
# Plugins. It wurdboek kin direkt wurde tagonklik foar ofwol in
# Wurdboek Tsjinner. De folgjende dict-dict blokkeart kaarten wurdboek nammen oan uris
# doe't de server wurdt brûkt. Dizze kinne dan wurde ferwiisd mei uris yn formaat
# "Proxy :: NAME>".
  # quota = mysql: /etc/dovecot/dovecot-dd-sqf.xqf.exd
# De measte fan 'e eigentlike konfiguraasje krijt hjirûnder opnommen. De bestânsnammen binne
# Earst sorteare troch har ASCII-wearde en parset yn dy folchoarder. De 00-foarheaksel
# Yn bestânsnammen binne bedoeld om it makliker te meitsjen om de bestelling te begripen.
# In konfiguraasje kin ek besocht te wurden opnommen te wurden sûnder in flater te jaan as
# It is net fûn:
# Lit DoVecot harkje nei alle ynfierferbiningen (IPv4 / IPV6)

Foegje in wachtwurd ta foar de Dovecot-brûker:

nano config/etc_dovecot_passwd

It earste diel fan it bestân, foar de kolon, is de brûkersnamme. It lêste diel, "YOURPASSWORD", tsjut it wachtwurd dat jo jo e-postserver wolle jaan.

team:{plain}yourpassword

Folgjende, de Opendkim Config

nano config/etc_opendkim.conf

En foegje dizze rigels ta:

# Dit is in basiskonfiguraasje foar ûndertekenjen en te kontrolearjen. It kin maklik wêze
# Oanpast om in basisynstallaasje te passen. Sjoch de opendkim.conf (5) en
# /usr/dare/doc/opendkim/examples/opendkim.conf.sample foar Complete
# Dokumintaasje fan beskikbere konfiguraasjeparameters.
# Logwhy nee
# Mienskiplike ûndertekening en ferifikaasjeparameters. Yn Debian is it "fan" koptekst
# Oversignearre, om't it faaks de identiteits-kaai brûkt wurdt troch reputaasjeystemen
# en dus wat befeiligingsgefoelich.
# Undertekenjen fan domein, selector, en kaai (fereaske). Bygelyks, ûndertekening útfiere
# FOAR DOMAIN "AFFORTOME.com" Mei Selector "2020" (2020._domajiny.example.com),
# Mei de privee kaai opslein yn /etc/dkimkeys/example.Privearje. Mear granulêr
# Opsjes foar ynstellen kinne fûn wurde fûn yn /usr/Share/DOC/OPENDKIM/README.OPDKIM.
# Domain foarbyld.com
# Selector 2020
# Keyfile /etc/dkimkeys/example.Private
# Yn Debian rint Opendkim as brûker "Opendkim". In umask fan 007 is fereaske wannear
# Mei help fan in lokale socket mei MTA's dy't tagong hawwe ta de socket as net-befoarrjochte
# brûker (bygelyks postfix). Jo moatte miskien brûker tafoegje "postfix" tafoegje oan groep
# "Opendkim" yn dat gefal.
# Socket foar de MTA-ferbining (fereaske). As de MTA yn in chroot-finzenis is,
# It moat wurde garandearre dat de socket tagonklik is. Yn Debian rint postfix yn
# in chroot yn / var / spool / postfix, dêrom soe in unix socket moatte wêze
# konfigureare lykas werjûn op 'e lêste rigel hjirûnder.
# Socket Lokaal: /run/opendkim/opendkim.sock
# Socket Inet: 8891 @ localhost
# Socket Inet: 8891
# HOSTS FOOS DAT OM OM RJOCHTS OF FERSKILLEN DAN VERJE, VERSITE IS 127.0.0.1. Sjoch de
# Operaasje Sifting fan OpenDkim (8) foar mear ynformaasje.
# Internhosts 192.168.0.0/16, 10.0.07/8, 172.16.0/12
# It Trust Anchor ynskakelt Dnssec. Yn Debian is it fertrouwen ankerbestân levere
# troch it pakket DNS-woartelsgegevens.
# NEVERSERVERS 127.0.0.1
# Kaart-domeinen yn 'e adressen nei kaaien dy't brûkt wurde om berjochten te ûndertekenjen
# In set fan ynterne hosts wêrfan de post moat wurde tekene
nano config/etc_default_opendkim

En foegje dizze rigels ta

# Opmerking: dit is in legacy-konfiguraasjetriem. It wurdt net brûkt troch de OpenDkim
# systemd tsjinst. Brûk asjebleaft de oerienkommende konfiguraasjeparameters yn
# /etc/opendkim.conf ynstee.
# 
# Earder soe men de standertynstellingen hjir bewurkje, en dan útfiere
# /LIB/OPEDKIM/OPENDKIM.S FERSEE.GENERATE om systemd oerskriuwing te generearjen by
# /etc/systemd/systeem/system/opendkim.service.d/OVride.conf en
# /etc/tmpfes.D/opendkim.conf. Wylst dit noch mooglik is, is it no
# Oanrikkemandearre om de ynstellingen direkt yn /etc/opendkim.conf direkt te passen.
# 
# Daemon_opts = ""
# Feroarje nei / var / spool / postfix / run / opendkim om in unix-socket te brûken
# Postfix yn in chroot:
# Rundir = / var / spool / postfix / run / opendkim
# 
# Unkomment om in alternatyf socket op te jaan
# Tink derom dat it ynstellen fan dit elke socketwearde sil oerdrage yn Opendkim.conf
# Standert:
# Harkje op alle ynterfaces op poarte 54321:
# Socket = Inet: 54321
# Harkje op Loopback op haven 12345:
# Socket = Inet: 12345 @ localhost
# Harkje op 192.0.2.1 op poarte 12345:
# Socket = Inet: 12345@192.0.2.1

As wy ree binne om ús postfix-server yn te stellen, sille wy de ûndersteande koade útfiere, mei de passende domeinnamme ynbêde. Begjin troch in skript te meitsjen

touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup

No, yn Nano, de tekstbewurke, bewurkje dit bestân, sadat it jo domeinnamme omfettet yn plak fan femmebabe.com.

# ! / bin / bash
# Postfix opset

Rinne no it foltôge skript om postfix te konfigurearjen, Opendkim en Doecot.

./scripts/postfixsetup

Sadree't dit skript hat útfierd, kopiearje, kopiearje it de lêste rigel it ôfdrukken en plakke it yn jo DNS-konfiguraasje as de wearde foar Sendonly._domaining. Dit is de OPENDKIM-toets brûkt om jo domein te identifisearjen by it ferstjoeren fan feilige post.

Geweldich! Binnen in pear dagen soene jo e-post kinne stjoere fan 'e server levere dat alles korrekt is konfigureare.

As jo ​​de DNS krekt konfigureare foar jo e-postserver, soe it minder dan 72 oeren moatte nimme foar de records om te aktualisearjen. It is normaal folle rapper. Jo kinne kontrolearje as jo server wurket mei dit kommando te brûken, levere jo e-post:

echo "test" | mail -s "Test Email" youremail@gmail.com

As alles ferskynt om korrekt te wurkjen, soene jo e-post kinne stjoere mei jo server. As it net wurket, besykje dan nei de logs te sjen om te sjen wat de flater kin wêze.

tail –lines 150 /var/log/mail.log

Dit sil Verbare ynformaasje oanbiede oer e-post dy't wurde stjoerd troch de server en oft it goed wurket. Jo soene de e-post yn kinne sjen yn jo Postfekje, as it net is, kontrolearje dan jo SPAM-map.

Jo moatte ek jo ynstellingen moatte konfigurearje yn jo ynstellings.py sadat jo e-postserver kin petearje mei jo Django-app, it projekt. Foegje of ferfange dizze rigels yn jo ynstellings

EMAIL_HOST_USER = 'team' # 'Love@mamasheen.com'

Tink derom dat wy in konfiguraasje brûke om it wachtwurd te krijen. Litte wy dit bestân laden yn 'e ynstellingen lykas dat, oan it begjin fan it bestân:

# Iepenje en laden CONFIG

Litte wy dit bestân oanmeitsje en in geheime kaai tafoegje oan it, lykas ek it post wachtwurd. Om in geheime kaai te generearjen, brûk dit kommando, mei hokker lingte jo wolle oan it ein?

openssl rand -base64 64

No, kopiearje de tekst dy't OpenSSL generearre is en bewurkje /etc/config.json

sudo nano /etc/config.json

Foegje de folgjende rigels ta oan jo bestân ta, mei de kaai dy't OpenSSL generearre is as de geheime kaai.

{
	"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
	"EMAIL_HOST_PASSWORD": "yourpassword"
}

JSON-formaat is ienfâldich en maklik te brûken, kinne wy ​​oare kaaien ferklearje dat wy ek wolle brûke, en hâlde se yn ús projekt dat oare brûkers net oan har kinne skriuwe en sa kinne se allinich net skriuwe. Dit is oanrikkemandearre praktyk foar API-toetsen, wêrfan wy hjir mear as in pear sille brûke.

Jo wolle jo projekt ek reservearje om te soargjen dat alles bewarre wurdt en jo kinne jo wurk letter weromhelje, sels as jo gjin server wolle hiere.

sudo backup

Besykje no in HTML-e-post te ferstjoeren fan 'e webserver, leverje ien út' e kommando-rigel te ferstjoeren. Fraach jo brûkersynfang yn 'e Shell, en stjoer in HTML-e-post nei dy brûker fia Django. Feroarje myn namme yn 'e koade, Charlotte, nei jo brûkersnamme.

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

As it earste kommando net wurket, soargje der dan wis om te brûken

source venv/bin/activate

Overe alles is korrekt ynsteld, jo sille no in wolkom e-post krije yn jo postfak stjoerd troch jo web-app. Goede baan! Jo binne in lange wei kommen.

Ik woe tafoegje, as jo oait muoite hawwe mei alle flukten by alle flaters, wylst jo wurkje oan in projekt, nim dan gerêst om nei antwurden te sykjen en om help te freegjen en om help om help. Google, ûnder oare sykmasjines, binne geweldige boarnen om te sykjen nei programmearjen help. Sykje gewoan nei de flater dy't jo krije, en jo sille kinne sjen hoe't oare minsken it probleem oplosse. Ek binne jo wolkom om kontakt mei my te meitsjen, jo oplieders (leararen, heechlearders), dy't te krijen binne foar programmearmest, of rôlje opnij om oplossingen te finen oan 'e problemen dy't jo belibje. Ik begryp dat dit net maklik is, mar sels as jo yn dit fier hawwe lêzen en jo gjin koade skriuwe, learje jo in protte oer it bouwen fan in webapp. Pat dysels op 'e rêch, jo dogge in geweldige baan.

Tige tank foar it nimmen fan de tiid om dizze tredde edysje Web Untwikkelingsgids te lêzen. Yn takomstige edysjes sil ik mear fan 'e wichtige foarbylden omfetsje besprutsen yn it begjin fan it dokumint en wy sille folle djipper dûsje yn' e wrâld fan software en hardware-ûntwikkeling. Bliuw ôfstimd foar wat der komt, en ik sjoch út nei jo te learen hoe't jo ongelooflijke software moatte bouwe. Sjoch dy yn 'e folgjende edysje!






Slute
Side 1
Springe
Sjoch Folsleine artikel
Trochgean mei lêzen

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency



Three Thirteen Online Free Play three thirteen online for free. Invite a Friend Join a Game ***.
KEAPJE oan

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


Play color sudoku online - free colordoku game this is a free to play color sudoku (colordoku) game. *** .

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


Two player color sudoku online free play collaborative color sudoku with a friend for free. Invite a Friend Join a Game ***.
KEAPJE oan

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.

.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency



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.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency



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.

.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


KEAPJE oan

troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency


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.


troch Daisy / Fisy | Keapje | Keapje mei kryptokurrency




https://glamgirlx.com -


(KLIK OP TAP OM TE WIJZE OM IMAGE)
Profesjonele ferdivedaasje, foto's, fideo's, audio, live-spieljen en casual gameplay, lykas ID-scannen, webûntwikkeling en surrogacy-tsjinsten.

Lit my in tip yn Bitcoin brûke mei dit adres: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Servicebetingsten