Uudised - Külastussait
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 ...
Praktiline veebipõhine sügav õppimine ja turvalisus eeskujuks

Praktiline veebipõhine sügav õppimine ja turvalisus eeskujuks Kolmas väljaanne Charlotte Harper 3. juuli 2024 Uuendatud/teisendatud 3. juuni 2025

Eessõna:

Turvalisuse kaalutlused veebi tarkvara ehitamisel on oluline osa iga veebiarendaja plaanist ja täitmisest, samal ajal kui prototüübi kavandades, mis on usaldusväärne, stabiilne ja kasulik praktilistel eesmärkidel. DOM (dokumendiobjektide märgistus) koos HTML, JavaScripti ja CSS -i rakendamisega ning tausta tarkvara abil, mis rakendab Pythonit, C/C ++, Java ja Bash, annavad veebiarendajatele vabadust ja jõudu luua mitmesuguseid projekte, mis väljendavad loomingut, mis pakuvad kasutamist ja funktsionaalsust, ja pakuvad, et see on vajalik, ning pakuvad kõike, mis on vajalikud, ning pakuvad kõiki kasutusele. Tapa aeg või tehke midagi Internetis tehtud, tavaliselt puutetundliku nutitelefoniseadmega. Enamik inimesi ei teaks isegi, kust alustada, kui nad soovivad veebisaiti nullist ehitada, kipuksid alustama teise inimese veebisaidilt ja ehitama midagi piiratud funktsionaalsuse, usaldusväärsuse, kasutusmugavuse ja eriti loovuse poole, kui neil oleks võinud olla kõik nende käsutuses olevad uusimad võimsad tööriistad, et ehitada midagi kasulikku, et ehitada aega, ilma et oleks vaja ajada nuppude ja paindlike inimeste jaoks, et see oleks vajalik, et see saaks, et see oleks, et see saaks, et see oleks vaja, et see oleks kulutatud. Kui teil on mõni minut seda raamatut läbi lugeda ja teada saada, mida ma teile õpetada tahan, või isegi minuga isiklikult oma eesmärkidest rääkida ja saada mingeid juhiseid õiges suunas ning olete motiveeritud õppima oma tarkvara kodeerima ja kirjutama, võtke see raamat koju ja pange mõni aeg välja, et õppida, et ehitada järgmine mõjukas, võimas ja oluline veebirakendus, mis on teie jaoks.

Minust: Olen tarkvaraarendaja, kellel on lai valik kogemusi C/C ++, Java, Pythoni, HTML, CSS ja JavaScripti alal. Ehitan veebisaite, mida inimesed soovivad kasutada, soovivad külastada ja isegi sõltuvusse saada, et kasutada lihtsalt õppimiseks, taasloomiseks ja tapmiseks ning mis kõige tähtsam - ma müün tarkvara. Kui teil oleks idee täpselt sellest, kuidas soovite veebisaiti välja näha ja toimida, oleksite nõus mind toetama, et saaksin oma vajadusi täita, kui kohtun oma, ja olete nõus katma veebisaidi ise käitamise kulud, ehitaksin teile järgmise YouTube'i, Tiktoki, Twitteri, Google'i või isegi kõrge tehnoloogiaga turvarakenduse, millele pääsete ainult juurde. Selle asemel, et proovida teile oma aega müüa, üritan teie oma osta: ma tahan teid rääkida juba olemasoleva teabega rakenduse (veebisaidi) ehitamiseks ja õpetada teile, mida peate olema sõltumatu tarkvaraarendaja, ettevõtja, mis juhib edukat karjääri mis tahes valdkonnas, mida soovite. Ja las ma saan selgeks, see haridus, mille ma teile annan, on mitteametlik. Võiksite koolis käia ja seda kõike õppida formaalse haridusega või isegi seda raamatut koolis lugeda, ülesandeid täita ja haridusest palju ära võtta, kuid ma ei pane teid ametlikult kuumale kohale ja palun teil ülesandeid täita. Ma pole teie professor, võite mõelda minust nagu sõber, kes soovib teid suunata karjääri poole, mida ajendab teie enda isiklik edu. Ja ma ei müü ka teile edu, peate selle oma ajaga ostma. Koodi õppimisel on järsk õppimiskõver ja see ei olnud kunagi lihtne või isegi pidi olema. Peate töötama nii kõvasti kui võimalik ja jätkata proovimist ja uuesti ebaõnnestumist ning proovimist isegi siis, kui olete pettunud, et ise rakendusi õppida ja ehitada. See on koodi enda olemuses. Koodi juhib kompilaator, mis on mõeldud programmeerija tõrketeadetele ja need õpetavad teile kodeerimist, isegi kui kopeerite lihtsalt vea oma otsingumootorisse ja loete teiste inimeste näiteid. Ja ma pean ütlema, et te ei pea rakenduse ehitamiseks olema äärmiselt rikas, nutikas, edukas või isegi detailide orienteeritud või korraldatud. Arvuti hoolitseb selle organisatsiooni eest teie eest. Peate lihtsalt katse -eksituse kaudu püsima, hoidma keskendumist ja tegema kõvasti tööd, mida teete, ning teil on väga edukas karjäär kogu teie tegevuse osas.

Kes ma olen: Ma mõistan, et viimane osa oli seotud rohkem õppimisega ja teie selle raamatu kaudu. Kes ma täpselt olen? See on keeruline küsimus. Mul on see iseenesest ebaselge, kuna kannatan meditsiiniliste seisundite all, mis võivad minu jaoks keeruliseks muuta seda raamatut isegi kodeerida või kirjutada, esitades samas väljakutseid sotsialiseerumise ja identiteediprobleemidega, mis muudavad minu elu keerukamaks, kui tegemist on enda tutvustamisega. Lühidalt, kui loete seda raamatut, tõid selle koju, kuna libistasite selle läbi ja arvasite, et see on kasulik või isegi kui loete seda lihtsalt kaugele, olen teile sarnane inimene, kes soovib näha, et teil õnnestub kõiges, mida teete. Olen ise insener, tarkvaraarendaja ja õpilane ning kirjutan seda raamatut teistele tudengitele, kes soovivad oma elu lihtsamaks muuta, kui neil on vajalik käsiraamat, mida nad vajavad oma elu lihtsamaks, tuua näiteid, mis sobivad kokku nagu suureks mõistatuseks töötavaks, kasulikuks, suureks, funktsionaalseks ja kaasahaaravaks rakenduseks, mis võib edu saavutada, olenemata tegevusest. Suuresti teen seda ma: ehitan rakendusi, mis aitaksid endale ja teistele inimestele õnnestuda. Olen ka autor, ehkki see on minu esimene väljaanne, mille kavatsen oma portfelli kasuliku dokumendi kokku panna, ja olen ka kunstnik. Ma tunnistan seda teile, ma olen omamoodi kummaline inimene. Ma pole täiuslik, olen olnud seadusega, mis viis mind isegi kolledžitest ja ülikoolidest lahkuma ning osariikidest lahkuma, et proovida rohkem edu saavutada. Olen sünnituse järgi naine, kannan meiki, teen endast fotosid, kannan kleite ja muid naiste rõivaid ning olen teadlik endast kui naisest oma olemuselt. Mul on varem olnud probleeme teiste inimestega, mis viivad võitlusteni WebAppide kirjutamise ja ehitamisega, ning vabandan, et ma pole seda raamatut varem teie kätte saanud: vajasite seda. Tahate lugeda ja kirjutada koodi, mis näeb välja nagu minu oma ja töötab nagu minu oma, kuid teeb sama asja, kuid veelgi paremini, sest kui saate selle raamatu ostmise asemel endale lubada, selle asemel, et oma klaviatuuri masseerida, nagu mina lihtsalt selleks, et luua raamat endale selle eest raha küsides, on teil ressursid, mida peate oma elus edu saavutama. Mul oli igasuguseid probleeme kasvavate perede, tervislike seisundite, arstide, meedia ja seaduse osas ning minu kood peegeldab sügavalt võitlust, mis on feminism ja naissoost loomus jagunenud ja pettunud maailmas. Kuid see raamat on asi, millest ma sügavalt hoolin, mu laps, oma portfell ja elatist, nii et hindan teie kaalutlust, kui võtate teksti koju ja hoolikalt selle üle, et minult õppida. Pidage meeles, et ma pole täiuslik, sellel raamatul on vigu, parandusi ja uusi väljaandeid ning peate oma loogilise ajuga mõtlema nii hästi kui võimalik, et saada minu kirjutamisega edukas kogemus. Samuti mõistke, et ma mõtlen teile hästi isegi siis, kui kirjutamisel seisate silmitsi väljakutsetega. Mõelge sellele nii: Kui saate lihtsalt rentida arvutisüsteemi, et teha kõike, mida saate digitaalses ruumis ette kujutada, salvestada kogu tekkinud teave, analüüsida ja korraldada seda ning saada sellest aru, leiate paratamatult raskusi selle teabega, mida te neelate ja isegi avaldate. Ma ütlen teile seda, sest mul on samu raskusi. Kasutage seda raamatut omal vastutusel, tehke oma kogukonna ja kogukondadega teile kättesaadavad kogukonnad tarkvara ehitamiseks turvalises keskkonnas ja ärge võtke asju isiklikult, kui ebaõnnestub või isegi õnnestub valesti: nii ma jõudsin nii kaugele ja miks saan teile selle teksti tuua ja aidata teil õnnestuda, ilma et see halvustab, mis jätab mulle globaalseteks, kui maniks on, et kõik, mis on, et MAGE MAGITIIMINE MADUSTEGE, MAGIMEEKS MADUSTE TEADMISEKS, MIS MAGIMISEKS ESITAKSE, KUIDAS MÄRKSEMISEKS KOHTUMISEKS, MIS MÄRKSETAMISEKS MAGIMISEKS KOHTUMISEKS KOHTA. Töö, Internet. Te ei pruugi olla eriti tuttav, kes ma olen vaid mõne sõnaga, kuid julgustan teid lugema, saate minuga tuttavaks, kui jätkate mind lugemist ja mõistmist, samal ajal oma projektide ehitamisel oma töö lõpuleviimiseks. Selle raamatuga ei toimu kodutöid, kui teie professorid või õpetajad teile seda ei määra, kuid julgustan teid tungivalt üles ehitama ise projektide portfelli, samuti Capstone'i projekti, mis tutvustab, kuidas saate õpitu rakendada. Minu Capstone'i projekt on enamiku sellest, mida selles raamatus loete, kuna see sisaldab minu eelmiste projektide koodi, koodi, mille ma olen loonud ja õppinud metoodiliselt käsitsi kirjutama, ning laias valikus ideid ja näpunäiteid, mis on aidanud mul õnnestuda nii kaugele, et saan keerutada lihtsat rakendust, mis on täielikult esile tõstetud, mis on täielikult esile tõstetud ja mis välimus ja käitub, nagu populaarset rakendust, mida võiksite oma sõpra või peret kasutada, kui Internetis on teie Internetis.

Mis see raamat on: See raamat on näite järgi õpetus. Siit leiate koodi, juhised koodi õppida, teavet koodi silumise ja vigade parandamise kohta, tõrkeotsingu etappe, juhiseid koodi varundamiseks ja salvestamiseks, uuesti, kui keegi teie koodi murrab, teie koodi kinnitab, teie koodi juurutamine, interaktiivsete veebisaitide loomine, mis on meelelahutuslik, ja saate oma pilti, mis on ja saate oma rakendusest, mis on ja saate oma rakendusest. Olete loodud absoluutselt parima valgusega, et olla lõppkasutajatele, teie veebisaidi külastajatele võimalikult atraktiivsem. Selles raamatus demonstreerin mitmeid näiteid tarkvara kujundamisest, keskendudes nii veebile kui platvormile kui ka turvalisusele. Alustame õppimiskogemuse, ehitades põhiprojekti Unix Shelli abil koos varundamise ja skriptimisfunktsioonidega. Seejärel uurime põhiliste ajaveebide veebisaiti, täiendame oma ajaveebi foto- ja videofunktsioonidega ning kasutame neid funktsioone turvalahenduste kasutamiseks tasuta tarkvara abil ja kinnitame meie serverit, kasutades Pluggble autentimismooduli (PAM). Seejärel vaatame teiste mõistete hulgas üle failide käitlemine ja töötlemine, videotöötluse uurimine, hääle annetamine, vöötkoodi skaneerimine ja optiline tähemärkide äratundmine. Tee ääres uurime API -sid, mis aitavad meil muuta oma tarkvara kasulikumaks ja turvalisemaks, tasuta ja tasuliste võimalustega. Tee ääres uurime füüsilisi turvalisuse ja sõjakaid tööriistu, nagu tulirelvad ja laskemoona kujundamine ja tootmine, sealhulgas tünni- ja kordusprojekteerimine, torn ja droonide kujundamine ning muud direktorid, mille me integreerume oma tarkvaraga olemasolevas võrgus, et kaitsta oma tarkvara ning demonstreerida enesekaitset ja vastupidavust. Mängude ehitamiseks, 2D- ja 3D -renderdavate mootorite ehitamiseks ning manustatud riistvaraga juhtumiuuringute näidetes põhiliste mõõtmete renderdamistarkvara ja vastavalt silikoonkummist valatud elektroonilise vibreeriva massaaži näidetes. Tee ääres kasutame tarkvara paremaks kindlustamiseks juba saadaval olevaid masinõppelahendusi. Samuti kasutame protsessi sujuvamaks muutmiseks ja kindlustamiseks veebi jaoks saadaval olevaid aktsiariistu. See raamat on juhend veebirakenduse loomisel ja selle integreerimisel professionaalse arvuti ja manustatud mehaaniliste süsteemide võrgustikuga ning üldiselt juhend tarkvara ehitamiseks ja manustatud riistvaraks, millel pole taustteadmisi ega varasemaid kogemusi.

Mida see raamat pole: Kui soovite tõesti veebisaiti, võiksite lihtsalt seadistada lihtsa poe ja müüa vajaliku, postitada blogi, postitada fotosid või videoid või muul viisil, kirjutamata kunagi ühte koodirida. See raamat pole nii. See raamat õpetab teile, kuidas ehitada tarkvara, mis on kasulikum, täielikult esiletõstetud, funktsionaalne ja turvalisem kui mis tahes tarkvara, mida juba leiate, kuna see juurutab uusimat tarkvara, mis on endiselt prototüübid, võib olla kallis, kui vanemad ettevõtted tegutsevad skaalal, ja ei meeldi tagurpidi, keerukatele ettevõtetele, kes ei tee raha, kes tegelikult midagi ei tee. Kui jälgite seda raamatut tähelepanelikult, soovite kirjutada koodi, uurimiskoodi, ehitada oma rakendused ja teenite raha sellest, mida teete. Ma teen sellest raamatust raha, isegi varajases staadiumis, kuna see sisaldab teavet, mida inimesed vajavad ja tahavad lugeda, ja ostavad juba siis, kui nad minu rakendusi ostavad või kasutavad. See raamat ei ehita teile rakendust, kuid see osutab teile õiges suunas ja relvastab teid vajalike tööriistadega, ning oskusi ja näpunäiteid, mis hõlbustavad teie enda edu veebi loomisel, iga koodiridaga peate kirjutama näitena, mis on valmis kokku panema tarkvara, mida teie ja teie toetajad, külalised, kliendid, pered, külastajad, töövõtjad, ja inimesed soovivad.

Mida sa õpid: See raamat õpetab teile, kuidas ehitada ja müüa tarkvara, tõeliselt funktsionaalset, kasulikku tarkvara, meediumiettevõtteid, turvafunktsioone nagu näotuvastus, masina loetav vöötkoodi skaneerimine, veebi API -d, et autentida, salvestada ja renderdada, videoid ja fotosid ning vahetada sõnumeid nagu Bluetooth ja lähivälja (NFC) suhtlus. See raamat õpetab teile, kuidas kasutada võrku ühendatud arvutit, keskendudes Debian Linuxile, kuidas ehitada bash -koodi, et muuta oma tarkvara installimine ja varundamine sujuvaks, automatiseeritud tuulekehaks, kuidas ehitada python -koodi taustina dünaamiliste sõnumite teenindamiseks, stiilide asjade jaoks kenasti kasutades CSS -i abil, nagu näiteks WAYTRAP -id, mis pakuvad veebipõhiseid, et saada veebisõnumeid, mis pakuvad veebipõhiseid sõnumeid, mis pakuvad veebipõhiseid sõnumeid, mis pakuvad interaktiivsust, ja interaktiivsust. või muud eesmärgid, ID -skaneerimine, pildi- ja videomodereerimine, andmete mikrotransaktsioonid, et hoida teie tarkvara turvalist, maksete töötlemist, krüptovaluutaga kauplemist, asünkroonseid ülesandeid ja palju muud. Saate teada, kuidas ehitada oma Bluetooth -seadmeid koos akude, laadijate, mikrokontrollerite, vooluahelate, mootorite ja anduritega, kasutades joote, traati ja 3D -trükitud ning valatud materjale. Ma demonstreerin aditiivse tootmise ja tööriistade ja die valmistamise jaoks rakendatavaid 3D -disainidirektoreid, nii et saate toota oma manustatud riistvaraseadmeid, millel on integreeritud akud, laadijad, elektroonilised vooluringid ja funktsionaalsed väljundid. ja ühendage need Bluetoothi ja veebiga. Täpsemalt uurime kahte juhtumiuuringut, vibreerivat massaaži ja omatehtud tulirelva, mõlemad programmeeritud OpenScadis, mis on saadaval graafilise liidese või käsuridade utiliidina ja mida saab kiiremate tulemuste saamiseks integreerida veebi. Saate teada, kuidas ehitada ja juurutada veebisaiti algusest peale ilma eelneva kogemuseta, muuta see funktsionaalseks, turvaliseks, ilusaks, kasulikuks ja mis kõige tähtsam - praktiline. Saate teada, kuidas kasutada masinõppe ja arvutinägemist, et muuta sait turvaliseks ja praktilisemaks, salvestada oma veebisaidilt video ja heli, annetada oma häält, muusikat teha ja heli moduleerida, et luua kasulikke proove ning kuidas müra läbi murda, kasutades teisi veebisaite, et luua oma veebisaitide parimat võimalikku võrgustikku, mida saate otse teie jaoks pakkuda, et saaksite oma tarkvara ja veelgi olulisemat pakkuda. See raamat keskendub kõige tugevamalt meediumi-, turva- ja masinõppele, mis on kolm peamist komponenti, mis aitavad teil luua veebi jaoks kasulikku tarkvara, kaasates õigeid kasutajaid ja eraldades valesid viisil, mis on realistlik, praktiline, käed külge sisse lülitatud ja kaasahaaravad, samas ka automaatne ja vastupidav. See raamat õpetab Unixi, eriti Debiani (Ubuntu), Bash Shelli, Pythonit, HTML -i, CSS -i, JavaScripti ja mitmeid kasulikke tarkvarapakette Pythoni jaoks nagu päringud, aga ka kasulikud bash -tarkvara nagu GIT ja FFMPEG. Õpetan teile ka, kuidas krüptovaluutat automaatselt kaubelda, ja võtta makseid krüptovaluuta või tavaliste deebetkaartidelt, makstes samal ajal isegi külastajatele osa oma tuludest, kui otsustate seda teha. Õpetan teile, kuidas oma veebisaidilt raha teenida ka reklaami kaudu, kuidas oma rakendust otsingumootorite jaoks valmistada ja kiireks teha, järjestatud esimeses paremusjärjestuses, mida teie kliendid teie leidmiseks otsivad, ja paremusjärjestus võimalikult paljudes tavalistes otsingutes. Õpetan teile, kuidas oma tarkvara müüa, seda reklaamida, pöörduda teie teenuste osutavate klientide poole ja teha juba olemasolevate võimaluste kaudu Internetis endale nimi, on odavad ja töötavad hästi. Õpetan teile, kuidas salvestada teie andmeid teie jaoks töötavate pilvarvutitega ja salvestada teie andmeid odavalt, kuidas planeerida ja ehitada veebisaiti, mis teeb seda, mida teie kasutajad soovite ja mida soovite, ning kuidas hoida oma kasutajaid kaasahaaramiseks, pannes oma saidi oma telefonide, e -posti, tekstsõnumite, telefonikõnede ja muude võimalustele teie jaoks mõeldud kliki tagaküljel asuva nupuga tagatud nupuga. See raamat keskendub meediumide avaldamise ja levitamise praktilisusele suurtes kogustes, alates fotodest kuni videoteni kuni heli ja helideni, mis jätab lõppkasutajatele (teie klientuurile) hea mulje ja müüb ennast mis tahes viisil, mida teete veebisaidi loomiseks, rakenduses, mis esindab ainult teid ja teie, ja teie ettevõte ja teie ettevõte näevad head välja parima. Õppite minult ka mõned näpunäited, kodeerimisnõuanded, praktiline edevus nagu meik ja fotograafia, modelleerimine ja näitlemine ning palju muud, mis on oluline enda ja ettevõtte kujutamiseks parima võimaliku valguse kujundamiseks, kasutades kõiki teile pakutavaid tööriistu, kui levitate nii palju sisu, kui vajate tervislikku tasakaalu, et saada tarkvara, mis pole rohkem vaeva näinud, või raha, kui see pole vaja. Seda raamatut kannab nime "praktilineVeebipõhine sügav õppimine ja turvalisus näite järgi: "Põhjus: see tegeleb koodi õppimisega, eriti veebi jaoks, eriti turvalisusele keskendudes, praktilisest vaatenurgast, näiteid töökoodist, mis pakub tekstis esitatud praktilisi eesmärke. Selle teksti õppimiskomponent hõlmab ka masina õppimist, mis näitab teile numbrit, mis on suunatud, kuidas VIICE, VIICE, VIIVITUD VIICE, VIIVITUD VIICE, VIIVITUD, EAGE VIIT -i, mis on suunatud. Pilti pealdised ja muud ülesanded, nagu piltidelt pärit ennustusmõõdikud, näiteks autentse, arvutiülekande pilt, või optiline koopia (pildi foto või trükitud foto) on väga oluline, kui see võib teie arvutit kasutada, kui see võib teie arvutit kasutada, kuid see võib teie arvutit kasutada. Face. Saate serveri arvuti muuta, arvutit, mis küsib teile kasutajanime ja sisse logida, võib -olla iga uue sisselogimise või uue IP -aadressi kinnitusmärgi abil, kuid kui ehitate laiaulatuslikku, hõlpsasti kasutatavat, põhimõtteliselt turvalist ja võimas turvaliselt, võib see teie tarkvarale turvaliselt kasutada. Kõigil, kes ehitavad tarkvara, mis on laitmatult turvaline, on teatav tunne, mida see vihjab. Tarkvara on oma olemuselt ebakindel, kuna seadmed ja kontod, mida me sellele juurde pääsevad, ei ole alati meie käsutuses, vaid need võivad olla igaüks, kellel on tarkvara halvasti, ja seetõttu võivad nad ka tarkvarale endale ohtu kujutada. See on selle raamatu keskmes. Võrgustiku arvuti on vaikimisi turvatud pika võtmega, mille nimi on SSH ja SSH või Secure Shell Key, ning on muul viisil kõige paremini turvatud veebiserveriga, kuna veebiserver pakub nii avatud juurdepääsu kui ka serveris töötavate asjade turvariistade olekut. Veebiserveril on juurdepääs kasutaja veebibrauserile, mis on vaieldamatult kasutaja seadme kõige võimsam osa, kuna see on koht, kus kasutaja pääseb võrku ühendatud tarkvarale. See tööriistakomplekt saab renderdada teksti, nähtavaid veebilehti ning saab salvestada ka pilte, heli ja videot (näiteks foto näo või oleku ID -ga), saab lugeda ja kirjutada Bluetooth -raadioseadmetele ning kirjutada ja kirjutada lähivälja Transponderi siltidele, odavate võtmekaartide, FOB -de, kleebiste, rõngaste ja isegi veebisaidiga, mis on veebisaidid, mis on veebis, mis on saadaval. Kõigi teie käsutuses olevate tööriistade kasutamine koos selle raamatuga varustate end turvalise veebisaidi loomiseks ning teie jaoks töötav turvaline võrku ühendatud arvutisüsteem teeb teie pakkumise ning näeb välja ja tundub ja tunneb

Kust alustada: Olete teretulnud, et jaotisest mööda minna, alustan seda raamatut või mis tahes jaotisega täpse koodiga, mida vajate, eriti kui teil on kogemusi enne kodeerimise kogemusi või mõnda eelnimetatud tööriista, mida ma selles raamatus üksikasjalikult kirjeldan, ning dokumenteerite selle kasutusjuhtumeid ja nende praktilisi näiteid. Kui teil pole koodi kirjutamisel kogemusi, soovitan teil tungivalt lugeda kogu see raamat ja soovitan teil eelnevaid jaotisi lugeda, veendumaks, et see raamat sobib teile. Kui see raamat pole teie jaoks sobiv, kaaluge selle kinkimist sõbrale või sugulasele, kes võiks olla huvitatud veebiarenduse tundmaõppimisest, ja isegi kaaluge selle tagasi laenamist ja nendelt õppimist, et täita lüngad, kus ma teid kui õpetajat ebaõnnestus, või teised õpetajad tegid seda enne mind. Alustage seal, kus saate, selle raamatu iga osa on kasulik, kui kavatsete luua kasuliku rakenduse, ja mõelge, et parimad rakendused on lõppkasutaja meeles ehitatud: tundke oma klienti. Nüüd tunnete mind, teate seda raamatut ja olete valmis alustama. Alustuseks haarake arvuti (isegi kõige odavam sülearvuti kastipoest, Amazonist või vanast töölauast, ja seadistage see teie jaoks sobival viisil.

Kuidas seda raamatut lugeda: Tekst on esile tõstetud, tähistab, et tekst kuulub käsuviibadesse, kus kirjutate käivitatud koodi. Käsuviip on keskendunud tugevalt klaviatuurile ja nõuab klõpsamist vähe või üldse mitte, töövoo kiirendamist ja asjade lihtsamaks muutmist.

Alustamine: Sukeldume sisse. Alustame kohalikus masinas ehitamisest ja alustame ilma Interneti -ühendatud veebisaidi loomiseta. Alustuseks on see turvalisem, ei maksa midagi ja see on teile lihtne. Sõltuvalt teie opsüsteemist on bash -kesta sattumine pisut erinev. Mac OS -i jaoks soovitan sellel hetkel installida virtuaalne masin, kuna saate virtuaalse masinaga kõige rohkem ühilduvust. Erinevad pakkujad, näiteks VirtualBox ja Paralells, saavad teie jaoks virtuaalse masina käivitada, ehkki ka Ubuntu on võimalik installida otse masinasse, kui eelistate kasutada looduslikku keskkonda, mida soovitatakse kiire ja sujuva kogemuse loomiseks. Kui kasutate Linuxi või Windowsi, mida soovitan, peaks projekti loomine olema üsna lihtne. Avage oma terminal, reguleerige suurust nii, nagu näete, ja alustage 2. sammu. Kui kasutate Windowsi, järgige 1. sammu.

1. samm: - ainult Windowsi kasutajad Windowsis avatud käsuviip administraatorina ja tüüp WSL -INSTALL

2. samm: - Jätkake siin või jätke 1. samm vahele, kui te ei kasuta Windowsi Avatud terminalis (sõltuvalt teie OS -ist, mida nimetatakse Ubuntu Windowsis, Terminal Macis või Linuxis või sarnases nimes), alustage projekti loomisega. Me teeme seda käsu Mkdir, mis loob kataloogi. Kui peate oma projekti salvestamiseks looma kataloogi, mis on soovitatav, kasutage CD -käsku kataloogi ja ja ning ning ning

CD/PATH/TO/kataloog - tee on kaustad (failid), mis eelnevad teie sihtkataloogile, teie vaiketee on ~ või kodu/kasutajanimi (kus kasutajanimi on teie kasutajanimi). Vaikekataloogi muutmiseks tippige CD või CD ~ mkdir näide - asendage "Näide" kataloogi nimega

Nüüd on teil oma projekti jaoks töötav kataloog. Kuna see on nii oluline, et see kataloog on salvestatud juhuks, kui peate vahetama teise masina või kirjutatud koodi, nii et see oleks veebi jaoks valmis, ehitame skripti, et oma kataloogi järgmistes sammudes varundada. Kuid skripti ehitamine võtab natuke koodi ja kood tuleb automatiseerida, et see oleks võimalikult kasulik. Ehitame siis kõigepealt skriptide ehitamiseks skripti. Alustame skripti loomisest ja selle käivitatavaks muutmiseks. Kasutame selleks sudo, chmod ja puudutus ning nimetame skripti "Ascript".

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

Nüüd oleme skripti loonud, teinud selle käivitatavaks ja oleme valmis seda redigeerima. Nano on tekstiredaktor, mis võimaldab teil teksti redigeerida ilma klõpsamiseta, mis on palju lihtsam kui graafilise kasutajaliidese kasutamine. Nanoga faili redigeerimiseks kasutage nano ja seejärel tee faili. Skripti tegemiseks skripti tegemiseks on see üsna sarnane meie skripti valmistamisega. Kasutame sama koodi nagu ülalpool, asendades skripti nime "Ascript" argumendiparameetriga, 1 dollar. See võimaldab meil skripti helistada, kirjutades lihtsalt Sudo Ascripti ajalehte, sel hetkel saame luua mis tahes uue skripti, asendades "ajalehte" teie skripti nimega. Nano kood peaks välja nägema:

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

Ja Nano sulgemiseks saame juhtimisnumbi all hoida ja vajutada X -i, siis y, et tähistada faili, ja vajutada tagasitulekut. Nüüd, et kirjutada need kolm käsku skripti redigeerimiseks, saame skripti uuesti redigeerimiseks kirjutada Sudo Ascripti. See töötab! Ja iga uut skripti saab hõlpsalt käivitada, kui helistate selle kesta. Salvestame nüüd oma töö: kirjutame oma uue skripti salvestamiseks varukoopia ja seejärel varundage see oma projekti kataloogis, varundades samal ajal ka varundusskripti.

sudo ascript backup

Nüüd, nanos:

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

Kus/tee/kataloog on tee projekti juurde, mille loodi koos mkdiriga. Hiljem õpime, kuidas selliseid korduvaid teid silmuse ja loendiga kopeerida, mis on vähem kood, kuid praegu hoidkem seda lihtsana ja teil on paar rida. Selle skripti käivitamiseks ja koodi varundamiseks salvestage fail nanoga kontroll+x, y ja tagastage ning sisestage allpool oma kesta

backup

Kui teil palutakse selle raamatu lugemisel ja kestaga jälgides üldse parooli, sisestage oma kasutaja parool õigesti, enne kui peate käsu uuesti käivitama, on teil kolm katset. Kui peaksite midagi kaks korda käivitama, saate kasutada üles ja alla nooled käskude korrigeerimiseks ja redigeerimiseks. Lihtne vajutage vahelduvalt üles ja alla käsu valimiseks, enne kui käsu redigeerimine parempoolse, vasaku noolte ja kustutamise klahviga ning klaviatuuriga ning selle tagasitulekuga käitamist.

Palju õnne! Teil õnnestus luua vinge varundusskript, mis varundab teie töökataloogi kahte olulist kestaskripti. Võime asju hiljem ringi liikuda, kui projekt suureneb, kuid see töötab praegu. Liigume edasi pilves varundamist, kasutame selleks GitHubi (kuigi varundamiseks on palju muid GIT -i lahendusi, need on kõik samad.) Git on Verision Control tarkvara, mis võimaldab teil tarkvara redigeerida, kui teete neid serverisse, võimaldades samal ajal alla laadida parooli või võtme taga olevad tarkvara terved koopiad. See on oluline teie tarkvara salvestamisel, eriti kui me rändame turvatud Linuxi eksemplaridele, mis mõnikord purunevad, kui koodise rida ebaõnnestub, jättes teid lukustama, kui teie koodi ei pruugi varundada, kui te ei saa võimalust seda automaatselt varundada, mida me katame.

Kui te ei kasuta praegu Ubuntu virtuaalmasinat, soovitan praegu Ubuntu virtuaalse masina kasutamist, kuna see muudab teie elu lihtsamaks, kui paigaldatakse kõik vajalikud paketid, et luua töötav veebisait ja kujundada oma arvutisse sügavat õppimistoimingut. Liigume lähitulevikus koodi veebiserverisse, kuid tahame veenduda, et meie veebiserveri taga on vähemalt paar turvalisust, mis on andmepüügi suhtes vastupidavad, ja selleks kasutatakse mitmeid Linuxi pakette. Kui soovite ikkagi Mac OS -i kasutada, olete oodatud veebis vajalike pakettide otsimiseks ja installimiseks, kuid iga paketi või sarja iga paketi jaoks ei pruugi olla alternatiive.

Lisame mõned käsud, et oma tööd varundusskriptiga toime panna, käivitades käsu Sudo Ascripti varukoopia.

# …

Veelkord kontrollige päästmiseks X -i.

Nüüd peame selle projekti jaoks tegema ühekordse konfiguratsiooni. Kuna see on varsti Giti projekt, ei pea me iga käsku iga kord Giti hoidlast kasutusele võtma, kuid kui me oma juurutusskriptide kirjutamisel saame selle riputada. Alustuseks veenduge, et oleme õiges kataloogis ja lähtestame Giti hoidla ja genereerime SSH -klahve.

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

Pärast SSH-KeyGeni kirjutamist tuleks uus võti salvestada kodukausta kausta nimega .sssh. Seda nimetatakse id_rsa.pub. Leiame selle võtme ja kopeerime selle. Seda näha,

cd ~
cat .ssh/id_rsa.pub

Kopeerige enne SSH -klahvi oma kontole SSH -klahvi lisamist koostage tekst, mille on tagastatud viimane käsk, ja looge konto oma GIT -i pakkujaga (ideaalis GitHub). Kui teil on konto, klõpsake enne SSH -klahvi SSH ja GPG -klahvide lisamist menüüs juurdepääsu all oleva SSH -klahvi lisamist paremal ülanurgas ja sisestage sätted. Valige lisage SSH -klahv ja lisage oma, kleepides selle sisse ja andes sellele pealkirja, enne kui salvestate ja naaseb GitHubisse uue hoidla loomiseks. See on sarnane teiste GIT -i pakkujate jaoks, peate lugema nende dokumentatsiooni. Andke uues hoidla konfiguratsioonis oma hoidlale kirjeldav nimi ja otsustage, kas soovite selle avaldada, ja veenduge, et konfigureerige veel ühegi faili kaasamiseks. Kui hoidla on loodud, kopeerige kloon SSH URL -iga ja kleepige see järgmisse käsku.

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

Nüüd saate CD -ga oma hoidlasse tagasi liikuda, olete sellega tuttav. Proovige oma varukoopia skripti nüüd varukoopiaga

Tore! Nüüd saame tõesti kodeerimise. Paigaldame Django nüüd, kui meil on hea haare bashis ja gitist. Django laseb meil oma tarkvara automaatselt varundada, ka Bash saab seda teha, kuid Django peaks olema lihtsam ohutum rakendus (seda saab keelata ja hõlpsamini konfigureerida).

Ubuntu tarkvara installimiseks kasutame käsku SUDO APT-GET. Esiteks värskendame ja uuendame juba tarkvara, mis meil juba oli. Seda saab teha koos SUDO APT-GET UPDATE ja SUDO APT-GET-UP -Y -Y-ga. Järgmisena installime Python ja meie virtuaalne keskkond, meie koodi kodu koos järgmise käsuga: Sudo Apt-Get install Python-is-Python3 Python3-venv

See on kõik, mida vajate Djangoga koos tarkvara installimise osas Ubuntu eksemplaris. Windowsi ja Linuxi jaoks peaks see olema üsna sirgjooneline, kuid Maci jaoks võiksite installida sellele virtuaalse masina ja Linuxi, kasutades tasuta või tasulist virtuaalset keskkonda nagu virtuaalkast või Paralells töölauale ja taastada ülaltoodud sammud Ubuntu keskkonna seadistamiseks. Ubuntu on sel juhul kriitilise tähtsusega, kuna see on tarkvara, mida veebisaidid käivitavad, ja see võimaldab neil korraldada veebisaite kogu eelnimetatud tarkvaraga.

Kaevame Django sisse.

Jälle meie kataloogis CD -ga:

python -m venv venv # Loob virtuaalse keskkonna, kus koodi salvestatakse
source venv/bin/activate # Aktiveerib virtuaalse keskkonna
django-admin startproject mysite . # Kus MySite on projekt, mida alustan oma praeguses kataloogis.

Django just alustab meid, sest Django majutab veebiserverit ja teeb kõike, mida vajame, et saada kohalik veebisait üles ja käivitaks. Nüüd, kui meil on Django installitud, redigeerime sätteid natuke, et see toimiks nii, nagu vajame. Esiteks loome uue rakenduse

python manage.py startapp feed

Võite märgata, et esimest rakendust nimetatakse söödaks. Rakendust tuleks nimetada kõik, mis teile meeldib, ja me loome uusi rakendusi, kuid iga rakenduse nimi peab olema järjekindel iga kord, kui rakendusele koodis viidatakse. Uue rakenduse lisamiseks redigeerime alati sätteid.Py teises kataloogis, mille rakendus lõi, nimega StartProject, edaspidi rakendus. Nano kasutamine,

nano app/settings.py

Seadetes leidke installitud_Apps ja eraldage [] 3 read. Kasutades tühja keskjoonel nelja ruumi, lisage oma rakenduse nimi. See seadete osa.py peaks välja nägema:

INSTALLED_APPS = [
    'feed',
]

Enne kui unustame, proovime, et Django töötab. Kasutades käsku python manage.py RunServer 0.0.0.0:8000, saame serveri käivitada ja seejärel navigeerida arvutis veebibrauseris, mis käivitab koodi http: // localhost: 8000 ja vaadake näidet veebilehte (see töötab!) Lõpeta server kontroll C -ga, mis on sama, mis mis tahes muu käsuga.

Kavatseme nüüd mõnda Pythoni koodi kirjutada. Djangol on kolm peamist komponenti, kõik juhivad koodi täielikult. Komponente nimetatakse mudeliks, vaade ja mall ning enne veebilehe edastamist on igaüks vastavalt kõrgemal ja madalamal.

Mudel on kood, mis salvestab andmebaasi otsimiseks, sorteerimiseks ja renderdamiseks.

Vaade otsustab, kuidas mudelit renderdatakse, manipuleeritakse ja muudetakse, peaaegu iga vaade kasutab mudelit otse.

Mall on HTML -kood, millel on mõned lisakellad ja vile, mida nimetatakse mallkeeleks. Mall on ette nähtud vaatega, kus see on täidetud Pythoni koodi ja kontekstiga, näiteks mudelid ja teave (kasutatavad strings ja täisarvud) vaatest.

Djangol on ka muid komponente, sealhulgas, kuid mitte ainult:

Seaded, mis konfigureerib rakenduse nii, nagu me arutasime.

URL -id, mis on mustrid, mida kasutaja jälgib, et pääseda juurde veebirakenduse konkreetsetele osadele.

Vormid, mis määratlevad, kuidas serverisse saadetud teavet käsitletakse ja renderdatakse nii andmebaasi kui ka kasutajale. Need on serveri poolel oleva teabe töötlemise alus ja võivad aktsepteerida mis tahes tüüpi teavet, mida arvuti salvestab, eriti tekstistringid, numbrid ja tõesed/valed booleansid (tavaliselt märkeruutu).

Mallid, mis on HTML -kood ja mallkeel ning ühendavad lõhet Pythoni ja HTML -i vahel, mis tähendab, et Pythoni teavet saab teenindada HTML -koodina, millele igaüks pääseb juurde ja saab veebisaiti piiratud juurdepääsuga kaitsta, muutes Pythoni koodi veebis kättesaadavaks ja kasulikuks mitmesugustel eesmärkidel, mis ei vaja serveri lähedal.

Staatilised failid, mis on tavaliselt JavaScript ja selle teegid, mida server serveerib ja on malliga seotud.

Meediumifailid, mida server serveerib või on väliselt hostitud või kirjutatakse lihtsalt serverisse enne töötlemist ja teise serverisse postitamist (ämber) hostimiseks.

Vahetarkvara, mis on kooditükid, mida käitatakse samal ajal iga vaatega ja mida peetakse vaates "kaasatud".

Kontekstiprotsessorid, mis töötlevad iga vaate konteksti ja mida kasutatakse täiendava konteksti lisamiseks.

Testid, mis kinnitavad, et kasutaja või päring läbivad teatud nõuded enne vaate edastamist.

Tarbijad, kes dikteerivad, kuidas WebSocketid suhtlemisel reageerivad ja reageerivad.

Administraator, mida kasutatakse mudelite registreerimiseks, et neid saab üksikasjalikult manipuleerida Django administraatori lehel, kus andmebaasi saab graafilise liidese kaudu manustada.

Seller, mis määratleb asünkroonsed ülesanded Django koodi osad, võivad alustada enne järgmise ülesande või koodirida juurde minekut.

Djangol võib olla palju muid komponente, mida siin üksikasjalikult arutame. Django funktsionaalsemaks muutmiseks on palju võimalusi, lisades kiireid, sujuvamad suhtluskanalid, seller, mis täidab asünkroonseid ülesandeid, ja hulgaliselt muid tarkvaratükke Django laiendamiseks, eriti vaatefunktsioonides, kus suurem osa koodist täidetakse. Vaatefunktsioonid on võtmeks, kuna need deklareerivad tavaliselt iga konkreetse URL -i mustri või serveri jaotise spetsiifilise koodiosa.

Esiteks uurime vaatame funktsioone. Vaatefunktsioonid algavad impordiga, mis tähistab vaates kasutatavat koodi, mis on määratletud tavaliste funktsioonide määratluste või klasside abil. Lihtsaimad vaated on määratletud funktsiooni määratluse DEF -ga ja tagastage põhimalliga HTTPRESS. Alustame põhimõtte määratlemisega teksti "Tere maailm" tagastamiseks. Pidage meeles, et iga kord, kui lisate koodi nagu Def, kui, kui, kui jne, peate lisama 4 ruumi iga eelneva määratluse jaoks, mida soovite oma funktsioonile rakendada. Me satume sellesse, mida igaüks neist varsti tähendab.

Redigeerige meie saidi kataloogist Feed/Views.py faili, kasutades nano ja lisage faili lõppu järgmised read.

from django.http import HttpResponse

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

Django httpresponse vastab tekstistringiga, mida tähistatakse ava ja sulgemisega ". Iga kord, kui edastate teavet funktsioonile või klassile, näiteks päringule või stringile, peate kasutama sulgudes (, avamist ja sulgemist).

See pole veel kõik, mida peame oma vaateid nägema. Muidugi, me pole serverile öelnud, kus vaade on täpselt, peame ikkagi määratlema tee, mille järgi vaade peaks muutuma. Alustame rakenduses/URLS -is põhitee määratlemisega ja satume hiljem teede rühmadesse.

Rakenduses/urls.py lisage pärast impordi avaldusi pärast selle loodud vaate importimist rida.

from feed import views as feed_views

Määratleme nüüd vaatemustri. Vaademustritel on kolm komponenti, teekomponent, mis ütleb serverile, kus vaade on serveris olemas (URL -i tee, mida kasutaja sisestatakse veebilehe sisenemiseks navigeerimisribale), vaatekomponent, kus vaade on täpsustatud, ja vaadete jaoks sõbralik nimi, nii et see on lihtne oma mustrit hankida, eriti kui see on vajalik, et seda teha. On mõistlik teha asju niimoodi ja olla paindlik, sest teie koodibaas on pidevalt muutuv keskkond, mis vajab paindlikkust ja improvisatsiooni, et olla väärtuslik ja hõlpsasti töötav. See, milline teie vaade välja näeb, saate selle lisada urlpatterns = [APP/URLS.PY jaotisse. Vaatemuster on määratletud kolme ülalkirjeldatud komponendiga ja funktsiooniga, mida nimetatakse teeks. Teie URL -i mustrid on nimekiri, nii et lõpetage alati iga üksus neis komaga, sest see eraldab igaüks. Iga üksus peaks minema ka uuele reale, taas enne seda nelja ruumiga, täpselt nagu rakendus seadetes.py. Me määratleme vaate esimese komponendi tühja stringifunktsiooniga, et luua vaade, mis töötab veebiserveri juurkataloogis. Teie urls.py peaks nüüd välja nägema:

from feed import views as feed_views

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

See on Djangoga veebisaidi loomise alus, mis on täiesti staatiline. Dünaamilisema veebisaidi loomiseks, kus saame hakata vahemällu salvestamist, näiteks pilte, videoid, heli ja palju muud, peame kasutama mudeleid, mida uurime järgmisena. Nüüd kontrollime oma koodi ja käivitame serveri. Vigade koodi kontrollimiseks käivitage:

python manage.py check

Veateadete olemasolul peaksite hoolikalt üle oma rakenduses tehtud muudatused üle vaatama ja uurima, kas on midagi, mis on vaja fikseerida, näiteks kõrvaline või puuduv ruum, lisaterakter, lisateraline nöör, mis tahes kirjaviga, mis tahes juhuslikult kustutatud tegelane või midagi muud. Lugedes veateadet (kui teil seda on) peaksite nägema loodud või redigeeritud faili teed koos reanumbriga, nii et uurige seda faili ja rida ning vaadake, kas saate parandada midagi, mis seal on. Kui olete probleemi lahendanud, käivitage ülaltoodud käsk uuesti. Kui teie tarkvara on käitamiseks valmis ja töötab, näete väljundit "Süsteemi kontrollimine pole tuvastatud probleeme". Nüüd olete valmis minema. Käivitage server:

python manage.py runserver 0.0.0.0:8000

Nüüd avage veebibrauser ja liikuge aadressile http: // localhost: 8000. Peaksite nägema sulgudes tagastatud teksti ja oma vaates funktsiooni HTTPResponse tsitaate. See on lihtsalt põhinäide, kuid kui te selle kaugele jõudis, mõistate põhitõdesid, kuidas Linux, bash, Python ja Django töötavad. Kaevame sügavamale andmebaasi modelleerimisele ja uurime Pythoni klassi jõudu teabe salvestamisel. Seejärel hakkame HTML -i ja CSS -ist kinni saama, enne kui me oma saidi täielikult esile tooda, paindlikuks ja turvaliseks JavaScripti ja masinõppe abil.

Klassid salvestatakse mudelites.Py teie rakenduse. Kasutades nano, redigeeri rakendust/mudeleid.py ja lisage uus klass. Klass on määratletud klassi määratlusega ja antud superklassist, mille see pärineb, antud juhul mudelite.Model. Klassi nimi tuleb pärast klassi määratlust ja pärast klassi määratlust A: (käärsoole) kasutatakse enne klassiga seotud atribuutide ja funktsioonide määratlusi. Meie klass vajab ID -d, mida saame kasutada selle hankimiseks ja ainulaadse hoidmiseks, ning ka teabe salvestamiseks vajab see tekstivälja. Hiljem saame lisada ajatempli, faile, tõelisi või valesid määratlusi, mis aitavad meie koodil teha otsuseid, mida mudeliga teha, ja mida saab selle sorteerimiseks kasutada), eksemplari sidumiseks mudeli serverisse sisselogitud kasutajaga ja palju muud. Pakkime lahti alloleva koodi:

from django.db import models # Import, mida kasutatakse meie klassi ja selle atribuutide määratlemiseks
class Post(models.Model): # Meie klassi enda määratlus
    id = models.AutoField(primary_key=True) # Meie mudeli ID, automaatselt genereeritud võti, mis võimaldab meil mudeli päringuid küsida, hoida seda ainulaadseks ja on kasulik, kui peame mudeliga suhelda, kui see on loodud.
    text = models.TextField(default='') # Meie klassi atribuut salvestab sel juhul tühja stringi vaikeseade.

Sulgege ja salvestage fail, nagu me enne seda lõpetasime.

Seal on palju muid valdkondi ja võimalusi, mida uurime, kui värskendame seda klassi meie rakenduse arenedes, kuid see on põhi vajadus rakenduse loomiseks mõne teksti postitamiseks. See mudel aga üksi ei tööta. Nagu varem kirjeldatud, vajame selle mudeli toimimiseks kohandatud vaadet ja kohandatud URL -i mustrit ning ka vormi koos malliga. Uurime kõigepealt vormi.

Vormi määratlemiseks redigeerige rakendust/vorme.Py Nanoga ja lisage järgmised read. Vajame kahte impordi, meie vormide klassi, samuti meie loodud mudelit (Feed.Models.post), mudeliga sarnast klassi määratlus ja väli koos alaklassiga Meta, mis määratleb mudeli, millega vorm interakteerub. Vormil võib olla ka initsialiseerimisfunktsioon, mis seab selle päringu, mudeli või muu teabe põhjal, uurime seda hiljem.

Mudeli vormid on nii kasulikud, kuna need saavad mudeli luua või mudelit redigeerida, nii et kasutame neid mõlema jaoks. Määratleme ühe vormidena.py allpool.

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

See on põhitõed, kuidas vorm ja mudel välja näevad. Seda mudeli vormi saab kasutada postituse kiirendamiseks või redigeerimiseks, selle sisalduse teksti muutmiseks. Vaatame selle vormi integreerimist järgmise vaatesse. Esiteks teeme ränne ja migreerime andmebaasi, et meie kood saaks mudeliga suhelda. Selleks käivitage järgmised käsud:

python manage.py makemigrations
python manage.py migrate

Selle käivitamine võtab minut, kuid kui see juhtub, võimaldab see teil juurde pääseda mudelile vaadetes, vahetarkvaras või mujal tarkvaras. Jätkame, tehes vaade, kus näeme oma mudelit. Redigeerige voogu/vaateid.Py ja lisage järgmine kood, nagu märgitud. Pärast # -märki ei pea te midagi lisama, see kood on kommentaarid, mida kasutatakse koodi kohta teabe tähistamiseks. Alustuseks impordime oma mudeli vaadetes ja lisame selle konteksti, kus saame selle mallis kuvamise loendina renderdada. Järgmisena lisame malli, kus saame vormi ja mudeli nupuga renderdada, et luua uus objekt, mis põhineb mudelil, ja postitada see serverisse. See kõlab keerukana, nii et astugem see lihtsalt samm -sammult. Enne kui vaade lõpetame, loome malli, mis lihtsalt mudeli muudab ja veenduge, et näeme seda, luues kesta uue postituse. Nii peaks see vaade välja nägema:

    posts = Post.objects.all() # Küsige kõik andmebaasis olevad postitused seni

See kõik näeb üsna lihtne välja, kuni jõuame põhja. Render, mis tagastab funktsiooni, mitte HTTP vastuse, nagu eelmine näide, võtab alati selle esimese sisendina päringu, aktsepteerib konteksti (antud juhul andmebaasi postitusi), mida saab nüüd mallis renderdada, ja tagastab funktsiooni määratletud malli. Mall saab olema HTML -dokument, millel on natuke keelt nimega Jinja2, mis muudab Pythoni teabe HTML -i.

Mallide loomiseks tehke sööt kaks kataloogi.

mkdir feed/templates
mkdir feed/templates/feed

Järgmisena redigeerige ülaltoodud kataloogis malli, sööda/mallid/sööda ja lisage selle näite kood. Vaatame selle näite malli.

See on väga lihtne mall. See määratleb HTML -siltide avamise ja sulgemise, dokumendi tüüpi sildi, legendi pealkirjaga kehasildi, murdesildi, mis lisab ekraanile väikese rea, ja ahela jaoks, mis muudab iga postituse postituste loendis malli lõiguna. See on kõik, mis kulub postituste renderdamiseks, kuid andmebaasis pole veel ühtegi. Loome mõned kestaga. Saame kesta hallata.pyga joosta

python manage.py shell

Impordime nüüd oma postitusmudel

from feed.models import Post

Järgmisena loome stringiga lihtsa postituse ja väljume kestast. String võib olla ükskõik, kui see on kehtiv tekst.

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

Lõpuks peame oma söödale lisama URL -i mustri. Kuna meie söödarakendus kasutab mitut URL -i ja me tahame hoida failide suurusi väikesed, loome oma söödarakenduses kohalikud URL -id, mis näeb välja selline:

from django.urls import path
from . import views

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

Samuti peame redigeerima URLS.Py baasrakenduses, ükskõik, mida otsustasime seda nimetada, see oli esimene meie loodud kataloog. Redigeeri rakendust/app.py ja lisage URL -i mustritele järgmine

from django.urls import include # tipus
    # ... eelmine kood siin

Nüüd, kui käivitame serverit koos python haldamise.py RunServeriga, näeme meie loodud lehte, kuna meil on mudel, vaade ja mall ning ka URL -i mustr koos andmebaasis olevate üksustega. Järgmisena rakendame loodud vormi ja alustame oma postituste loomist. Kuid enne kui kirjutame liiga palju koodi, teeme varukoopia, kasutades varem kirjutatud skripti. Käivitage see skript kesta, oodake mõni hetk ja kogu kood toetatakse meie Giti hoidlasse.

backup

Vormi rakendamine on suhteliselt lihtne. Impordime oma vormi, lisame vaatele postitaotluse käitleja ja salvestame postituse andmebaasi enne samale vaatele suunamist. Saame kasutada juba imporditud ümbersuunamisfunktsiooni ja veel ühte funktsiooni, mida kutsutakse tagurpidi, et saada URL vaatemustri jaoks. Küsime selle stringiga „Sööda: voog", kuna lisatud mustri nimeruum on sööda ja vaadet nimetatakse ka söötmiseks.

    posts = Post.objects.all() # Küsige kõik andmebaasis olevad postitused seni
    if request.method == 'POST': # Käsitlege postitaotlust
        form = PostForm(request.POST) # Looge vormi eksemplar ja salvestage andmed sellele
        if form.is_valid(): # Vorm kinnitama
            form.save() # Salvestage uus objekt
        return redirect(reverse('feed:feed')) # Suunake sama URL -i koos get -päringuga
        'form': PostForm(), # Pange vorm kindlasti konteksti, et saaksime selle renderdada.

Nüüd peame uue vormi arvestamiseks malli värskendama. Saame seda teha, kasutades

Sildistage HTML -is ja renderdades vormi HTML -i malli nupuga. Vajame ka CSRF -i märki, märgi, mis takistab väliste saitide postitamist vormile ilma lehe laadimata.

Jagame selle maha. Seal on uus vormiklass, sümbool, vorm ise ja nupp Esita. Päris lihtne, kuid kui me seda vaatame, võiksime selle paremaks muuta. See töötab, saame vormiga uusi postitusi postitada ja need on nüüd andmebaasi salvestatud. Siin toimub mõned asjad. Me kasutame HTML -silte, et deklareerida, et dokument on HTML -dokument, kasutame vormi renderdamiseks malli silti ({ %… %}) ja vormi renderdamiseks veel ühe, {{…}}}. Meil on ka silmus teksti renderdamiseks, kasutades ploki silte ja mallisilti. Block -sildid on tõesti olulised, kuna saame määratleda, kuidas malli lõigud nendega muudetakse, ja mallisildid on aluseks sellele, kuidas me oma koodi muutujaid paneme.

Nüüd peame oma rakenduse paremaks muutma, sest praegu näeb see välja tõesti põhiline. Saame seda teha, kasutades CSS -i, kas sisemist või klassides, mis on seotud dokumendi iga objektiga. CSS on tõesti tore, sest see ütleb lehel kõik, kuidas see peaks välja nägema, ja võib muuta selle tõeliselt heaks. Seal on mõned raamatukogud, mis saavad seda teha, kuid minu isiklik käik on Bootstrap.

Bootstrapi saab alla laadida nende veebisaidilt,getbootstrap.com/. Kui olete seal, vajutage nuppu, et lugeda installidokumendid, ja kopeerige kood CDN -i jaotise kaudu. Teil on vaja seda koodi oma HTML -dokumendi ülaosas sildil nimega Head. Samuti läheme edasi ja loome baasmalli, nii et me ei pea neid linke igas mallis uuesti looma.

Tehke uus kataloog, mille nimi on MKDIR -i mallidega, ja seejärel redigeerige malle/base.html.

See peaks välja nägema selline:

Kopeerige kindlasti CSS ja JavaScript, .CSS ja .js -failid, sest meil on vaja JavaScripti, et meie sait tulevikus funktsionaalsemaks muuta.

Nüüd pöördugem tagasi bash -kesta juurde ja käivitame kiire käsu. Pidage meeles, et kui teil on kunagi vaja juurdepääsu virtuaalsele keskkonnale, tippige allikas Venv/bin/aktiveerimine. See võimaldab teil Pythoni pakette kohapeal installida viisil, mis võimaldab Djangol neile juurde pääseda. Django Bootstrapi klasside loodud vormide saamiseks kasutame Pythoni paketti nimega Crispy vormid. Saame selle alla laadida järgmise käsuga

pip install django-crispy-forms

Kui see on installitud, lisage see sätetesse.py

    # … Eelmine kood siin

Nüüd saame tagasi oma sööda mallis mõned asjad eemaldada. Eemaldame dokumendi algus ja lõpp ning asendame see pärandiga meie baasmallist, kasutades laiendamist ja ploki määratlust. Samuti lisame vormile mallifiltri impordi koos koormusega ja mallifiltriga. Lõpuks lisame vormi nupule bootstrap -klassi, et see näeks rohkem nuppu. See peaks välja nägema selline:

Ilus! See on juba üsna palju koodi. Järgmisena peaksime seda proovima ja veenduma, et näeme, et kõik näeb kena välja, ja veenduge, et kõik töötab korralikult. Käivitage server varasemate juhiste kohaselt ja veenduge, et sait näeks välja ja töötab hästi. Suurepärane töö! Olete valmis liikuma järgmise sammu juurde, kus lisame kasutaja sisselogimisfunktsioonid, kasutades sarnaseid URL -e, vorme, vaateid ja malle. Põhi mall on oluline ja jätkame selle muutmist ja muudatusi vastavalt vajadusele, kuid keskendume praegu meie saidi turvalisemaks muutmisele, võimaldades kasutajatel sisselogida kasutajanime ja pääsukoodiga ning lõpuks veelgi olulisema teabe, mis aitab hoida teie rakendust turvaliselt ja teie enda kontot ainult teie poolt.

Selleks peame kasutama Djangosse sisseehitatud kasutajamudelit. Kasutajamudel on andmebaasimudel, nagu meie postitus, ja mida saab kasutaja veebisaidile logida. Tulevikus laiendame enne saidi Internetti juurutamist seda mudelit teiste sellele omistatud mudelitega ja koostame andmepüügile vastupidava sisselogimise jaoks täiendavaid turvameetmeid. Alustuseks kasutame mõnda sisseehitatud sisselogimisvormi, mida Django pakub. Kõigepealt loome uue rakenduse, mida kasutame põhilise sisselogimislehe mallide ja vaadete renderdamiseks. Samuti loome muud rakendused, mis esindavad jätkuvaid sisselogimisprobleeme, et kindlustada rakendus, sealhulgas pincode, näotuvastus, lähedane põllusuhtlus, välised seadmed, mitmefaktoriline autentimine ja sõrmejälgede äratundmine.

Rääkisime juba rakenduse loomisest. Meie kataloogist, virtuaalkeskkonnas, pange halla.Py need argumendid

python manage.py startapp users

Nüüd peaks meil olema uue rakenduse kataloog. Alustame sellest kataloogis vaade, mis vastab kasutaja sisselogimisele. Django on kasutajate sisselogimiste jaoks vaated sisse ehitanud, kuid need ei sobi meile, kuna vajame kohandatud vaadet, mida eelistatavalt tehakse määratlusega.

Selles vaates kontrollime postituse päringut, edastage päring.post Djangost imporditud sisselogimisvormile, autentige kasutajakonto ja logime kasutaja sisse, enne kui need meie söödarakendusele ümber suunatakse.

Kasutajad/Views.py lisage järgmine kood

        username = request.POST['username'] # Hankige postituse päringust kasutajanimi ja parool
        password = request.POST['password'] # Autentige kasutaja

See on kõik, mida vajate põhilise sisselogimisvaate jaoks. Loome nüüd vaate vorm, laiendades baasmalli. Alustuseks loome USE -i kausta mallide jaoks uue kataloogi.

mkdir users/templates
mkdir users/templates/users

Nüüd peaksime suutma muuta kasutajaid/malle/kasutajaid/sisselogimist.html. Selle ajal, kui oleme, loome malli, mis võimaldab kasutajal registreeruda.

nano users/templates/users/login.html

Nüüd mallis,

See on sisselogimismalli põhitõed. See on tõesti täpselt nagu teine struktuuriline mall, kuid selle renderdamisel näeb see natuke teistsugune välja. Saame selle koodi kopeerida, et ehitada veel üks väga sarnane mall nimega Register.html, kus muudame sõnastust ja kasutame uut meie ehitatavat vormi. Teeme kõigepealt malli. Redigeerige kasutajaid/malle/kasutajaid/register.html ja lisage järgmine kood:

Ehitame nüüd oma kasutaja registreerimiseks vorm ja ringi liikuge vaadete juurde, enne kui uuendame oma kasutaja sisselogimisi mudeli abil. Teeme selle vormi alustamiseks põhiliseks, kuid lisame tulevikus rohkem üksikasju ja turvafunktsioone, näiteks lepinguid ja captcha. Redigeerige vorme nanokasutajate/vormide abil.py ja lisage järgmine kood.

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

Nii et meil on siin teine vorm, mis töötab üsna lihtsalt. See on kasutajanime, e -posti ja parooliga kasutajaregistri vorm, samuti kinnitusparool. Pange tähele, et see vorm ei laienda tavalisi vorme. Vormi klassi, see on mudeli vorm, mis tähendab, et sellel on meta. Üks väli on määratletud täpselt sama ja klassimeta määratleb mudeli. Vorm vastab ülejäänud vormile kirjutatud teabele. Suurem osa sellest eksisteerib juba Django sisseehitatud UserCreasingaForm, nii et kasutame seda klassi alusena (antud sulgudes).

Järgmisena uurime kasutaja registreerimist, nüüd, kui meil on vorm ja mall. See on modifikatsioon, nagu ka uue postituse vaates. Redigeerige kasutajaid/vaateid.Py ja lisage järgmine kood:

# … Import

See on kõik, mida vajame kasutaja registreerimiseks, kuid meil peaks olema rohkem teavet. Tahame teada, kui kasutaja registreeris, mis kell nad saidil viimati olid, nende kohta, näiteks biograafia, ajavöönd jne, peame värskendama oma voomudeli, postitamist, et arvestada kasutajamudeli ja atribuutide postitusi igale kasutajale. Selleks värskendame mudeleid.py mõlemas rakenduses. Alustame söödamudeli redigeerimisega. See peaks nüüd välja nägema:

from django.db import models # … Import
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Lisage sellele reale

Pöörake tähelepanu teisele reale, mis faili lisati. See on võõras võti, mis omistab iga postituse ühele postituse kohta, nii et saame veenduda, et salvestame postitused kasutaja kasutajapõhiselt ja postitusi ei saa teha ilma kasutajale omistamata. Me määratleme selle võõra võtme klassiga, mida see esindab, kustuta argument, et tagada postituste kustutamine kasutajatega, null- ja tühjade argumentidega, et veenduda, kas saame kasutaja vajadusel eemaldada, ja majutada kasutaja puudumise tõttu juba loodud postituste ja sellega seotud nimega, mida võime kasutada kasutaja loodud postitusobjektidele. See seotud nimi, erinevalt Post.Autor, postituse autor, annab meile kasutaja, kes postituse ise postitas. Nüüd saame postitused, mille kasutaja on teinud kasutaja.post.all () või autor.post.all ().

Teeme nüüd oma sisselogimised vastupidavamaks. Saame oma saidi juba andmepüügi suhtes palju vähem haavatavaks muuta, kui lihtsalt piirata saidi sisselogimise kordi, on see üsna lihtne. Hakkame ka enne iga kasutaja kohta teavet salvestama, kuna jätkame oma rakenduse väljatöötamist. Kasutajate/mudelite redigeerimine.PY, lisage järgmine kood.

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

Pange tähele, et see mudel on üsna sarnane postmudeliga. Meil on täiendav import, Timesone, mis võimaldab meil seada vaikeväljadel vaikeseadeid, ja meil on ka tegelaskuju ja tekstiväli nagu postitus. Kõigi nende ajatemplite kasutamine aitab meil saiti kindlustada ja mõista selle kasutamist ning tekstiväljad annavad meile veebisaidil teavet iga kasutaja või autori kohta. Onetoonefield peaks olema ainus väike kaalutlus, see käitub täpselt samamoodi nagu eelkingi, kuid ainult ühe järgneva mudeli kohta. Nii on kasutajal ainult üks profiil, samas kui neil võib olla palju postitusi.

Parandame nüüd oma sisselogimise ja registreerime vaated profiili arvestamiseks. Esiteks muutke kasutajaid/vaateid.Py ja keskenduge registrivaatele:

# … Import
            Profile.objects.create(user=user) # Lisage see rida kindlasti, et luua kasutajale profiil

See loob kasutajale lihtsalt profiili, ilma et oleksite midagi teavet täitmata. Nüüd tahame veenduda, et kasutajakontot ei saa liiga sageli sisse logida, või vähemalt paroole ei saa liiga sageli proovida, nii et värskendame sisselogimisvaadet.

# … Import
        if user and user.profile.can_login < timezone.now(): # Pange tähele, et nüüd kontrollime, kas kasutaja saab sisse logida
        else: # Kui sisselogimine ei õnnestunud,
            user = User.objects.filter(username=username).first() # See on osa, kus värskendame kasutajate profiili
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Nii et nad ei saa mõneks sekundiks uuesti sisse logida

See on turvalisuse põhiline põhialus. Veenduge, et sait pole haavatav selle suhtes, kes lihtsalt proovib kõiki võimalikke paroolide kombinatsioone, või isegi mõnda neist korraga. See ei ole pettumust valmistav tavakasutajale, kes teab nende pääsukoodi ja logib sisse mõnesse seadmesse, kuid see hoiab arvukalt andmepüügiroboteid rakendusest välja. Pange tähele, et lisasime IF -lause muutujaga CAN_LOGIN, see peaks olema minevikus aeg, ja värskendada seda iga ebaõnnestunud sisselogimisega, kasutades sama kasutajanime. Nii ei saa pahatahtlik kasutaja parooli nii kiiresti lähedale arvata. Ka DateTime.timedelta () sekundite arvu saab värskendada ja veebisait on vastupidavam, kuid pisut vähem kasutatav sekunditega. Alustuseks soovitan 15.

Pidage meeles, et oma töö salvestamiseks ehitasime varundusskripti, nii et lähme edasi ja varundame seda, mis meil seni on, et veenduda, et meil on kõik salvestatud. Käivitage käsk:

sudo backup

Veelkord päästab see teie töö seni. Soovitan oma töö säästmiseks käitada sagedasi varukoopiaid ja võiksite isegi varukoopiat automaatselt käivitada. Seda saate teha, kasutades UNIX -i utiliiti nimega Cron. Selle utiliidi aktiveerimiseks käivitage järgmine käsk ja sisestage oma parool:

sudo crontab -e

Kui te pole veel Nano jaoks valikut valinud, siis tekstiredaktor, kellega peaksite juba tuttav olema, ja kerige nooleklahvide abil faili põhja. Lisage järgmine rida:

0 * * * * sudo backup

Cron kasutab formaadis minutit, tundi, kuu, kuu, nädalapäeva, kus * või arv tähistab, millal käsku käivitada. Kasutades 0 minutiks ja * ülejäänud võimaluste jaoks, saame käsu käivitada minuti alguses iga tunni esimesel minutil. See võimaldab meil koodi automaatselt varundada. Kõik Croni töökohad, kui neid käivitatakse koos juurtena, nii et me ei pea iga tunni parooli sisestama.

Meie koodi varundamiseta lihtsamaks ilma parooli kasutamata, keelame meie varukoopia parooli. Teeme seda järgmise käsu täitmisega ja parooli sisestamisega:

sudo visudo

Kerige nüüd faili põhja ja lisame veel ühe rea:

ALL ALL=NOPASSWD: /bin/backup

See võimaldab meil käivitada käsu "varundamine" kui iga kasutaja, ilma paroolita. Selle vorming on lihtne, lihtsalt eesli rida "kõik kõik = nopasswd:/bin/" ja lõpetage käsuga, näiteks/bin/varundamine, mis eksisteerib/usr/bin/.

Alustame nüüd e -postiga töötama. E -post on veebisaitide jaoks tõesti oluline, kuna see on viis, kuidas veebisaiti turvalisemaks hoida, kontrollida, kas kasutajad on tõelised inimesed, ja isegi turustatavad tooted või teenused klientidele. Paljud inimesed, kes Interneti -ühed käivad, kontrollivad oma e -posti iga päev ja saavad igasuguseid turundusmeilisid, mis on huvitatud toodete ja teenuste kohta. Django veebisaidil e -kirjade lubamisel on mõned võimalused ja olete teretulnud valima, kumb teie jaoks kõige paremini töötab.

Esiteks saate maksta e -posti teenuse eest, mis võimaldab teil oma domeenist e -posti saata ja nõuab minimaalset koodi. Seda pakuvad palju teenuseid, näiteks Google Workspace, Sendinblue, Mailgun ja palju muud.

Vastasel juhul ehitate oma serverisse nullist oma e -posti teenuse hästi. Soovitan seda valikut, isegi kui see on rohkem kood ja võib vajada spetsiaalset hostimist. Tõenäoliselt ei saa te oma koduarvutist meiliserverit käivitada, nii et lähme edasi ja uurime konfiguratsiooni ja koodi e -posti saatmiseks, enne kui me pilves serveri käivitame ja omaenda meiliserveri loome.

Esiteks muutke sätteid.Py järgmise käsuga:

nano app/settings.py

Kus rakendus on rakenduse nimi, mille loodi StartAppiga.

Lisage järgmised read:

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)

Muutke neid kindlasti, kui olete oma rakenduse juurutamiseks valmis, vaatame selle hiljem uuesti läbi. E -post_addressi säte peaks olema meilisõnum, millelt soovite saata, ja parool (Emale_host_password) tuleks seada serveri jaoks genereeritud paroolile. Laadin parooli konfiguratsioonifailist, et see koodist eemal hoida, kasutades järgmist loogikat, nende ridade kohal sätetes.py:

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

Seejärel olen seadistanud JSON -faili koos konfiguratsiooniga /etc/config.json, kasutades nano järgmiselt.

Faili redigeerimiseks:

sudo nano /etc/config.json

Lisage järgmised read:

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

Jätkame konfiguratsioonifaili redigeerimist ja lisame kõik paroolid ja võtmed, mida rakenduses kasutame. Nüüd uurime kiiresti, kuidas saata e -kirju Pythoni abil. Esiteks loome malli kinnitusmeili jaoks, mida saame oma kasutajatele saata, ja lisada see kasutaja mallide kataloogi. See mall kirjutatakse HTML -is.

nano users/templates/users/verification_email.html

See e -kiri on üsna lihtne. See võtab kasutaja konteksti, saidi baas -URL -i ning kasutaja e -posti kontrollimiseks kasutatava kasutajatunnuse ja märgi. Määratlege kindlasti seadete alus URL.Py, enne kui kirjutame malli renderdamiseks mõne Pythoni koodi. Minge edasi ja lisage järgmised read rakendustele/seadetele.PY, alguse lähedal.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

Lõpuks, kui teie sait on Interneti jaoks valmis ja kasutate seda, soovite määratleda oma domeeni saidi esindamiseks ostetava domeeninimena. See on nimi, mille sisestate navbari, et oma saidile pääseda. Praegu võite jätta domeeni tühjaks või kasutada kohahoidjat. Samuti soovite muuta saidi_nimi nimeks, mille soovite oma saidile oma valitud.

Enne e -posti saatmist loome sümboolse generaatori, et meil oleks konto aktiveerimise sümbol, mis kunagi aegub. Saame seda teha, ehitades ja importides konto aktiveerimismärgi, mis näeb välja nagu järgmine. Redigeerige faili:

nano users/tokens.py

Lisage järgmine kood:

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

See põhitoode generaator genereerib märgi, mida saame kasutaja URL -i saata ja kasutaja saab kasutada oma e -posti kontrollimiseks ja konto aktiveerimiseks.

Järgmisena vaatame, kuidas meili saata. Nano kasutades redigeerige kasutajaid/e -posti aadressil.py.

nano users/email.py

HTML -i e -posti kinnituse saatmine näeb välja järgmine:

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)

See on üsna lihtne. Me impordime funktsioonid, mida vajame e -kirja saatmiseks, mallide ja seadetega e -kirja renderdamiseks, ning siis määratleme e -kirja malli nime järgi ja saadame selle kasutajale funktsiooni abil. Võite märgata, et me pole veel määratlenud, et e -posti saatmine, send_html_email, nii et kirjutagem see koodi alla, mille me juba kasutajatele lisasime/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()

See on natuke keerulisem ja me pole veel valmis kogu seda koodi käivitama. Pange tähele, et määratleme UNUB_LINKi, linki, mida kasutaja saab kasutada meie e -kirjade tellimuseks. See on oluline, kuna kasutajad peavad saama meie e -kirjadest loobuda, kui nad ei taha neid igal ajal näha. Lisame ka oma sõnumile teksti alternatiivi, mis on HTML -i siltidest eemaldatud HTML -teade. Lõpuks kontrollime, kas meilisõnum saadeti, ja kui seda ei teinud, tähistame kasutaja profiili, et nende e -post ei kehti.

Liigume tagasi kasutajamudelite juurde, et saaksime selle kõik tööd teha. Peame määratlema funktsiooni, et genereerida link tellimusest loobumiseks, ja määratlema Boole'i välja, et märkida, et kasutaja e -post ei kehti.

Esiteks lisage järgmine import kasutajate/mudelite tippu.PY

nano users/models.py
# …

Järgmisena lisame kasutajamudelile funktsioonid, et teha märk ja kontrollige e -kirja aktiveerimiseks kasutatavat sümbolit, samuti valdkonda, et salvestada, kas kasutaja saab edukalt oma meili. Kasutajad/mudelid.py lisage jälle järgmine kood mudeli lõppu (kandekood)

# …
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Kehtib 30 päeva

See on üsna lihtne, kasutame ajatempsigner, mis on põhilise krüptograafia tööriist, et luua märk, mis aegub teatud aja pärast, ja kasutame ka mõnda muud funktsiooni, et kontrollida, kas see kehtib. Me kasutame neid žetoone kaks korda, üks kord e -kirja kontrollimiseks ja üks kord tellimuse tühistamise lingi saamiseks.

Nüüd, kui need olemas on, on viimane töö, mida peame tegema, vaadetes. Kasutaja/Views.py lisame e -posti aadressi kontrollimiseks ja tellimuse tühistamiseks vaated.

nano users/views.py

Esiteks lisage järgmine import. Viskasin paar lisa, nii et me ei pea hiljem rohkem üksusi importima.

from .email import send_verification_email # Importige kindlasti kinnitusmeili saatmisfunktsioon

Võib -olla on teil juba mõni neist impordist, kuid nende korramine ei tee haiget. Peate muu hulgas impordi hulgas importima kinnitusmeili saatmise funktsiooni, samuti konto_aktivatsiooni_token.

Nüüd lisage faili allosas järgmine kood:

        # tühista need
    # Muidu suunake sisselogimislehele
# sendwelcomeEmail (päring, kasutaja)

See on palju koodi. Jagame selle maha. Esimene funktsioon, puhas ja lihtne, tühistab kasutaja meililistist. Teine funktsioon aktiveerib nende e -posti aadressi ja märkate, et lisasin kommenteeritud funktsiooni, SendwelcomeEmail. Olete teretulnud kasutama e -posti malli ja funktsiooni määratlust, et saata tervitusmeili, ma lihtsalt pole seda veel teinud. Viimane funktsioon, mille sisse viskasin, on oluline, kuna aktiveerimise e -kirjad aeguvad. Seetõttu peame aktiveerimise e -kirja osa mõne aja kohta uuesti üles võtma. Selle jaoks saame kasutada põhivormi ja helistada funktsioonile kinnitusmeili saatmiseks. Enne kui me seda teeme, veenduge, et see saadetakse kõigepealt, lisades funktsioonikõne registrivaatele. Lisage see rida vahetult enne ümbersuunamist registrivaates, def register, kasutajad/vaated.py.

nano users/views.py
# … (Pärast) def register (taotlus):
# … (Enne) ümbersuunamist (

Te ei pea sellesse koodilõigu esimest ja viimast rida lisama, veenduge, et registrivaade saadaks kasutajale kinnitusmeili. See peaks välja nägema selline:

# … Import
            send_verification_email(user) # Lisage see rida kindlasti!

Nüüd peame aktiveerimise e -kirja uuesti leidmiseks lisama vormi. Kasutajad/vormid.py lisage järgmine vorm:

# … (Import)

Vajame ka malli, mis vastab sellele Resendi e -posti aktiveerimisvormile. Lisame selle malli sisse. Redigeerige faili:

nano users/templates/users/resend_activation.html

Järgmisena lisage faili järgmine kood.

Whew, seda on palju! Nüüd, kui me koodi oma serverisse juurutame, saame saata HTML -i e -posti aadressi ja aktiveerida kasutajakontod e -posti aadressil. Samuti võiksime saata lihtsa tervitusmeili, nii et vaatame, kuidas seda teha. Tagasi kasutajate/e -posti aadressil lisage järgmine kood:

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)

Samuti vajame kogu selle teabe muutmiseks malli. Minu veebisaidil näeb mall välja nagu allpool, kuid olete teretulnud vormindada, kui soovite.

Pange tähele, et meil pole keha ega HTML -silte, kuna lisame need sisse, kui lisame hTML -i tellimusest loobumise lingi. Need on olulised, kuid me ei taha neid kaks korda määratleda.

Mis siis edasi saab? Oleme jõudnud kaugele. Tõesti, me peaksime olema valmis saidi serverisse minema. Saame lisada @login_required dekoraatori ja muuta meie vaated turvaliseks, võtta kasutaja registreerumisi, saata nõuetele vastavaid e -kirju ja vahemälu teavet, mis on alus, mida veebisait peab tegema, et jääda asjakohaseks. Lisame veel mõned kasulikud funktsioonid ja seejärel loome aluse oma koodi juurutamiseks kaugserverisse, meiliserveri, domeeni konfiguratsiooni ja filtrite seadistamiseks, et muuta meie sait turvaliseks ja sobivaks.

Vajame ka parooli lähtestamise vaadet, nii et lisame selle väga kiiresti. Django sisseehitatud parooli lähtestamise vaade on mõnes funktsioonis katki, kuid vaatame, kuidas kirjutada oma vaade, e -posti malli, vorme ja URL -i mustreid. Siit saate teada, kuidas vaade välja näeb, kasutajate/vaade.py

# ... import

See vorm on sisse ehitatud Djangosse, kuid parooli lähtestamise kinnitamiseks on vaja malli, kasutajad/mallid/kasutajad/parool_reset_confirm.html

Meil on ka mall, et saata parooli lähtestamise e -posti aadressiga, kasutajate/mallide/kasutajate/parool_reset.html

E -kirja enda mall on lihtne, see on põhiline HTML -fail, mis muudab parooli lähtestamise lingi, kasutajate/mallide/kasutajate/parooli_reset_email.html. Django tõlgendab seda faili automaatselt.

Vajame ka veel kahte malli. Esimene on kinnitada, et e -kiri on saadetud. Vaated nende jaoks on juba Djangos, nii et peame lihtsalt pöörduma nendega URLS.PY. See mall asub kasutajate/mallide/kasutajate juures/parool_reset_done.html

Ja lõpuks, et kinnitada, et parooli lähtestamine on täielik, kasutajad/mallid/kasutajad/parool_reset_complete.html

Nüüd vajame nende vaadete jaoks URL -i mustreid. Lisage kasutajad/URLS.PY järgmised URL -i mustrid:

    # ... eelmised URL -id siin

Neli malli, see on palju! Kuid nüüd saame kindlasti kasutada kasutaja parooli igal ajal, kui vajame, kõik veebibrauserist.

Ma saan aru, et see on palju koodi. Kui see tundub natuke üle pea, on see ok. Parandate, teie arusaam paraneb ja muutute koodiga palju paremini kompetentsemaks. Kui olete täielikult kadunud, soovitan pärast isetehingu kallal töötamist selle tarkvara juurde tagasi tulla. Need on tavaliselt alustamiseks tasuta ja juhendavad teid kõike, mida vajate selle projekti juurde tagasi tulles edukaks. Kui tunnete, et olete valmis jätkama, loeme edasi, kajastame teie koodi juurutamist kaugserverisse ja seadistamisserveri seadistamisega, samuti automatiseerime oma juurutamise automatiseerimisega, et saaksite alati seadistada uue projekti mõne lihtsa käsuga.

Viimane asi, mida peame enne kaugserverisse juurutamist tegema, on meie saidi natuke turvalisem. Võite märgata, et sisselogimisvaade võtab ainult kasutajanime ja parooli ning seal pole mitmefaktorilist autentimist ega ühe ajakoodi. See on lihtne parandus ja sama koodiga saame panna meie saidi tekstisõnumid ja isegi reageerima serverisse saadetud tekstsõnumitele. Alustuseks läheme tagasi kasutajamudelitesse ja lisame ajatempli allkirjastaja, mis tähistab iga sisselogimist. Lisame kasutajamudelile ka ainulaadse, pöörleva identifikaatori, mida kasutatakse meie sisselogimise lisa turvalisuse lisamiseks. Kasutajamudelite, kasutajate/mudelite redigeerimine.PY, lisage järgmine kood:

# Importige kindlasti UUID, Timesmp Ac et Signer ja URL -i generaator (vastupidine)
    # Lisage see kood siia
    # Ja lisage see funktsioon
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Kehtib 3 minutit

Veenduge, et teie kasutajad/mudelid.py näeb välja lisaks kommentaaridele (kood ridadel #). Selle lagundamine on lihtne. Meil on mõned import, ajatempligner, mis on krüptograafiline utiliit, mis suudab genereerida turvalise koodi ja kontrollida seda, et veenduda, et see on kehtiv, mida kasutatakse ainult üks kord, ja mitte vanem kui teatud arv sekundeid. Kasutame ka UUID, mis on ainulaadne identifikaator, mis identifitseerib meie kasutaja märgi allkirjastamisel ja URL -is, kus märgi kasutajale saadetakse. Me kasutame seda põhilist krüptograafiat kahefaktorilise autentimisvaate loomiseks. Enne kui teeme midagi muud, käivitame ränne, et meie kasutajamudeleid värskendataks. Käivitage rännakute tegemiseks ja läbiviimiseks kataloogis koos hallata.pyga järgmised käsud.

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

See on oluline, kuna iga kord, kui mudelites muudatusi teeme, peame enne mudeleid tegelikult kasutama tabeleid ja värskendama andmebaasi vaikeseadega.

Järgmisena improviseerime oma sisselogimisvaade, et suunata sekundaarne autentimisvaade. Kasutajad/Views.py eemaldage sisselogimisfunktsioon ja suunake ümber URL -i, mille me lihtsalt genereerisime kasutajamudelites.

# … Import
        if user and user.profile.can_login < timezone.now(): # Pange tähele, et nüüd kontrollime, kas kasutaja saab sisse logida
            # Eemaldage funktsioon Auth_login, mis oli siin
                return redirect(user.profile.create_auth_url()) # Pange tähele, et suuname siia uue URL -i
            else: # Kui kasutaja ei kasuta mitmefaktorilist autentimist, logige need lihtsalt sisse.
        else: # Kui sisselogimine ei õnnestunud,
            user = User.objects.filter(username=username).first() # See on osa, kus värskendame kasutajate profiili
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Nii et nad ei saa mõneks sekundiks uuesti sisse logida

Nii et see on üsna lihtne, nüüd on meil võimalus selle loomisel suunata kahe teguri autentimisvaade. Meil on ka varu, kui kasutaja pole telefoninumbrit lisanud. Lisame põhivaade, et varsti telefoninumber lisada ja peagi tekstsõnumiga sisse logida.

Esiteks vajame oma koodist tekstisõnumi saatmiseks lihtsat viisi. Selleks võime valida paljude API -de hulgast, kuid minu arvates on kõige lihtsam Twilio. Samuti pakuvad nad head hinnakujundust väiksematele projektidele, aga ka hulgioodustusi. Looge konto saidil Twilio.com, täitke mõned üksikasjad oma projekti kohta, ostke telefoninumber ja kopeerige oma seadetele API -võtmed.PY. Seejärel lisage see kood uue faili alla, kasutajad/sms.py.

nano users/sms.py
# Importige kõik vajalikud paketid
# See kood saadab teksti Twilioga
# Abistaja funktsioon, et saada number nii paljude numbritega
# Saada tekst kasutaja kontrollimiseks
# Saada kasutajale selle funktsiooniga teksti
# Kood kinnitage selle funktsiooniga
# Aega kinnitama

Muutke kindlasti oma sätteid asjakohaselt, lisades need read oma klahvidega:

# Kopeerige need kindlasti oma Twilio armatuurlaualt
AUTH_VALID_MINUTES = 3 # TFA leht on minutite arv aktiivne, kui see on kiirendatud

Esiteks vajame oma kahe faktori autentimisvaate jaoks vorme. Kasutajate/vormide redigeerimine.PY, lisage järgmine kood.

# … Import
# Vorm meie telefoninumbri sisestamiseks
# Vorm autentimiseks

Järgmisena loome vaated kasutajatest/vaadetes.py

# … Import

Vajame mõlema vaate jaoks ka malle. Lisame kõigepealt MFA malli.

nano users/templates/users/mfa.html

Lisage see HTML -kood mallile

See on üsna iseenesestmõistetav. Vorm saadab kas koodi või tühja koodi ja märkate vaates, et saadame koodi, kui saame tühja koodi. Siis on meil lihtsalt kaks esitamisnuppu ja sel viisil saame koodi saata nupuga. Järgmisena lisame telefoninumbri lisamiseks lihtsa vormi.

nano users/templates/users/mfa_onboarding.html

Lisage järgmine HTML:

See vorm on palju lihtsam, see lihtsalt muudab meie loodud telefoninumbri vormi ja laseb kasutajal lisada telefoninumbri.

See näeb väga hea välja! Kuni kõik on korralikult üles seatud, peaksime saama sõnumeid saata ja kasutaja sisse logida niipea, kui lisame URL -i mustrid. Viimane asi, mida peame seadistama, on profiilivaade, et saaksime veenduda, et kasutaja saab oma telefoninumbrit muuta ilma sisse logitamata. Samuti tahame lõpuks lisada valiku "Stop to Tut Tuth", et kasutaja saaks tulevaste tekstisõnumite valimiseks teksti "STOP" teksti saada.

Lisame kasutajatele/vaadetele profiilivaade.PY. See vaade värskendab kasutaja biograafiat, e -posti, kasutajanime ja telefoninumbrit, samuti võimaldab meil lubada mitmefaktorilist autentimist. Esiteks vajame kasutajatel/vormis veel kahte vormi.py

# ... import

Järgmisena saame luua vaate mõlema vormi kasutamiseks. Redigeerige kasutajaid/vaateid.Py ja lisage vaade.

# Lisage need import

Vajame selle vaate jaoks ka malli.

nano users/templates/users/profile.html

Võite märgata, et see on üsna lihtne vorm, kuid sellel on natuke JavaScripti, mis postitab vormi sisu automaatselt nende värskendamisel. See on kasulik, nii et saate redigeerida, ilma et peaksite iga kord vajutama.

Järgmisena vajame URL -e, mis esindavad kõiki neid vaateid kasutajate URL -i mustrites. Redigeerige kasutajaid/URLS.py ja lisage see kood:

# … Eelmine kood, import
# … URL -i mustrid, mille me varem sisenesime, lisage järgmised kolm rida

Nüüd on hea aeg meie projekti proovimiseks. Kuid kõigepealt joostame veel ühe varukoopia.

backup

Ja käivitage server. Enne Linuxi serverisse kasutuselevõtmist on hea mõte lubada kontol kahe faktori autentimine. Teeme seda oma profiili URL -ile,/kasutajatele/profiilile/, ja kontrollime kasti autentimise lubamiseks pärast meie telefoninumbri sisestamist ja vormi saamist.

python manage.py runserver localhost:8000

Külastage veebilehte, minnes oma veebibrauserisse, kasutan selles näites Google Chrome'i ja sisestades URL https: // localhost: 8000/konto/profiil/profiil/

Vajadusel saate sisse logida ja lubada kahefaktorilise autentimise.

See projekt vajab serverit, et töötada, et see saaks tõesti posti saata. Kuid kõigepealt vajame vigu nägemiseks viisi. Võite märgata, et kui käivitate serveri silumisrežiimis, seadete.debug on võrdne true, näitab server autosid automaatselt. Vigade kuvamiseks ilma silumisrežiimi kasutamata, mis on tootmisserveris ohtlikud, peaksime selle lisama vaate. Kõige olulisemad vead, mida me peame hakkama saama, on järgmised:

Viga 500 - probleem meie koodiga Viga 404 - leht, mida ei leitud (purustatud URL) Viga 403 - luba keelatud viga

Lisame nende vigade käsitlemiseks uue rakenduse, mida nimetatakse vigadeks.

python manage.py startapp errors

Lisage see seadetele.Py nagu me varem, installitud_APPS -i seade, ja lisage viited mõnele rakendusele/URLS.PY vaatele, kus rakendus on teie Django projekti nimi.

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

See on kõik, mida vajame lisaks veavaadete, mallide ja natuke vahetarkvarale. Määratleme need nii:

# Looge siin oma vaated.

Järgmisena määratleme nende vigade käsitlemiseks vahetarkvara. Me teeme seda kõigepealt seadete vahetarkvara_klassidele.

    # ... eelmine vahevara

Järgmisena lisame vahetarkvara.

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

Lisame funktsiooni, et saada praegune erand, kasutades keermestavat kohalikku, mis aitab meil oma koodis sisalduvaid vigu jälgida. Mallide osas vajame ainult ühte, kuna määratleme dünaamiliselt vaates pealkirja. Mall peab lihtsalt pealkirja ja "jälgi", meie veakontekstist tagasivõtmise.

nano errors/templates/errors/error.html

See on meie kõige lihtsam mall, kuid nii lihtne on meie projekti vigu näha. Järgmisena keelame silumise seadetes.

nano app/settings.py

Leidke see rida, kus see on seatud tõele, ja muutke see valeks

DEBUG = False

Minge edasi ja varundage rakendus nüüd. Oleme valmis Linuxi serverisse kasutusele võtma ja lisage sealt funktsioone.

sudo backup

Enne selle koodi serverisse postitamist peaksime arvestama, et koodiga võib olla probleeme. Sõltuvalt juhtumist on saididel, kes neile postitatud teavet aktsepteerivad, rämpsposti postitamisega ja rämpsposti eemaldamisega. See ei tohiks kohe juhtuda, kuid kui see toimub, uurime hiljem, kuidas saidil automaatselt mõõdutada ja robotitele saidile juurdepääsu karmimaks muuta, lisaks kasutajakontode desaktiveerida ning kontrollida kasutaja identiteeti nende ID -i või biomeetrilise skannimisega, näiteks sõrmejälje või näotuvastuse abil.

Vaadates mitmefaktorilist autentimise näidet, mida me uurisime, võivad tootmises asjad olla erinevad. Pange tähele, kuidas me hindame sisselogimisi, ja aeguvad märgid. Kui robotid pääsevad saidile, võib kahefaktorilise autentimine olla keerulisem, kuna need võivad sisestada koode samal ajal, kui kasutaja on. Selle vastu võitlemiseks kasutame kasutajamudelites mudelit, kuulutades, kuidas me saidiga suhtleme, kui autentime, kasutades mitmefaktorilist autentimist telefoninumbriga. Lisame ka valiku e -postiga autentimiseks. Alustage kasutajamudelite redigeerimisega nanoga.

nano users/models.py

See on see, kuidas meie lisatud mudel peaks välja nägema. Me ei vaja mingeid meetodeid, lihtsalt muutujaid ID, kasutaja, ajatempli, aegumist, pikkust ja katseid mis tahes mitmefaktorilise autentimise vastu (kood nagu 123456 saadetud telefonile või e -posti aadressile).

# Põhimärgi, mida kasutati veebisaidile sisselogimiseks

Lisame oma kasutajale ka privileegi ja seame selle praeguseks käsitsi, enne kui lõpuks privilegeeritud kasutajate automaatseks värbamiseks. Lisage kasutajamudelites see rida profiilile:

    vendor = models.BooleanField(default=False)

Nagu kõigi andmebaasi muudatuste puhul, peame ka rände tegema ja andmebaasi ületama igal ajal, kui redigeerime mudelid.py -faili Djangos. Pidage meeles, et selleks kasutame kõigepealt allikat (kui seda pole juba kasutatud pärast terminali avatud) ja siis Python Manage.PY rännete valmistamiseks ja rännakuks.

cd project-directory-you-named # (vajadusel)

Praegu saate koore abil värvata kõik kontod, mille olete müüjatena loonud.

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

Nüüd arendame selle märgi kasutamiseks meie mitmefaktorilise autentimisvaate. Esiteks peame muutma oma MFA abistaja utiliite. Nano kasutamine,

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
# Autentige kasutajat nende e -posti või telefoninumbri abil
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filtreerige märk URL -is edastatud väärtuse järgi (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)) # Kui seda seanssi pole loodud, looge see
    user = User.objects.filter(id=token.user.id).first() # Hankige kasutaja märgist
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Kui nad on juba autentitud, logige need sisse
    if not user: raise PermissionDenied() # Eitada, kui kasutajat ei leitud
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Kontrollige autelimärki
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Logige kasutaja sisse, kui neid pole veel sisse logitud
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Määrake nende mitmefaktorilise autentimise aegumine
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Suunake kasutaja järgmisele lehele
    if not user.profile.mfa_enabled: # Kontrollige, kas MFA on lubatud
        if not check_verification_time(user, token): # Kontrollige aega
            user.profile.mfa_enabled = False # Tühjendage telefoninumber
            user.profile.enable_two_factor_authentication = True # Luba MFA
            user.profile.phone_number = '+1' # Keela telefoninumber
            user.profile.save() # Salvestage profiil
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Logige kasutaja sisse, kui nende MFA pole lubatud
    if request.method == 'POST' and not fraud_detect(request, True): # Kui taotlus on postitaotlus
        form = TfaForm(request.POST) # Vormi kiirendada
        code = str(form.data.get('code', None)) # Hankige kood
        if code and code != '' and code != None: # Veenduge, et see pole tühi
            token_validated = user.profile.check_auth_token(usertoken) # Kontrollige autelimärki
            is_verified = check_verification_code(user, token, code) # Kontrollige koodi
            if token_validated: # Kui kõik
                if is_verified: # On korras
                    user.profile.mfa_enabled = True # Luba MFA (kui pole veel lubatud)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Logi sisse kasutaja
                    for key, value in request.GET.items(): # Ehitage järgmise parameetri querüstring (kui see on olemas)
                        return HttpResponseRedirect(next) # Suunama
            elif not token_validated: # Kui märk oli kehtetu
            if p.mfa_attempts > 3: # Kui katseid oleks liiga palju
            if form.data.get('send_email', False): # Saada e -kiri (või tekst)
    # Renderdage vorm (get päringute jaoks)

Kui lisame selle koodi, importige kindlasti meilisõnumi saatmiseks funktsioon. Faili ülaosas vaatab kasutaja (koos muude impordiga), lisage

from .mfa import send_verification_email as send_mfa_verification_email

Nüüd peame selle funktsiooni kirjutama enne, kui see kõik töötab. See peaks laiendama meie saatmise e -posti funktsiooni ja saatma kasutajale lihtsalt kinnituskoodiga meilisõnumi.

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

Nii et see kõik töötab suurepäraselt, nüüd on meil mitmefaktoriline autentimissüsteem, mis sõltub sisselogimiseks telefoninumbrist või e -posti aadressist. Kuid vajame ka viisi eemaldamiseks või vähemalt peita kasutajaid, kes ei tee meie tingimustega koostööd. Need võivad olla rämpspostitajad, robotid või keegi, kes ei tähenda meie töö jaoks hästi. Heitke pilk vaade, mis mul on minu veebisaidil kasutajate jälgimiseks:

# import
from .tests import is_superuser_or_vendor # Peame selle testi looma
    # Hankige kasutajate nimekiri
    return render(request, 'users/users.html', { # Tagastage kasutajad mallil

Pange tähele, et see kood kasutab testi, peame selle testi testides deklareerima. Kasutajate redigeerimine/testid.py, loome testi.

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

See on koos kasutajate/kasutajatega.html mall, mis näeb välja umbes selline:

Pange tähele, et mall sisaldab teist malli, kasutajaid/kasutaja.html. Kui kasutate malli, millel on alam- ja ei kasuta laiendusi, on see hea mõte lisada alakoor () enne faili nime pikendamiseks, mallide eristamiseks.

Pange tähele, et see on palju Jinjat, te ei pruugi kõiki neid muutujaid määratleda. Kuid see näeb välja minu kood.

      <small># {{user.id}} </small>

Vajame ka teist subtiplaati, Toggle_Active.html. See mall peaks olema vorm, mis võimaldab meil lülitada, kas kasutaja on aktiivne.

Samuti peame lisama vaate kasutaja tegevuse ja sobivate URL -i mustrite ümberlülitamiseks. Kui me oleme selle juures, lisame kasutaja kustutamiseks vaade, kui seda vajame.

# Import
    success_url = '/' # Edu URL -i ümbersuunamine
    def test_func(self): # Test, kui kasutaja on superkasutaja ja tal on luba kustutada

Kuigi see on vajadusel praktiline, ei tohiks kasutaja kustutamine olla vajalik enamasti, saaksime lihtsalt ümber lükata seda saiti külastavate kasutajate nähtavust, kui peame need vallandama.

Meie lisatud URL -i mustrid näevad välja sellised. Nano abil redigeerige kasutajaid/urls.py ja lisage need read:

nano users/urls.py

Liinid peaksid minema kasutajate vaadete teede loendisse enne lõppu "]", kuid pärast algust "[".

# …
# …

Nüüd varundage sait kindlasti, et saaksite selle veebiserverisse alla laadida, mille kallal jätkame. Käsurealt,

sudo backup

Nüüd on meie sait varundatud.

Nii et nüüd on meil veel paar kasulikku funktsiooni. Aga kuidas on siin suure pildiga? Sellele koodile pole endiselt Internetist juurdepääsetav, meil pole veel meiliserverit ja peame laiendama oma rakendust, et lisada nii põhjalik kontrollimisprotsess kui ka sujuvad paigutused, mis aitavad meil seda saiti uurida, koos turvaliste protokollidega privilegeeritud kasutajate autentimiseks.

Selle kõige juurde jõuame. Praegu on kõige olulisem see kood lihtsalt veebist hankida, mida saame teha vaid mõne Bash -i rida Ubuntu serveris. Selle jaoks peate serveri rentima, välja arvatud juhul, kui teil pole kodus serverit ja ettevõtte Interneti -tellimust, mis võimaldab teil sadamaid avada. Käitan isiklikult oma veebisaiti minu korterisse installitud HP Z440 -l, kuid virtuaalse privaatserveri (VPS) rentimiseks on tavaliselt palju odavam vajadus.

Pidage meeles, et praegu töötav kood on suhteliselt õhuke, seda tuleb enne, kui oleme valmis kasutama toote ehitamist. Olge kindlasti ettevaatlik, mida teete Internetiga, veenduge, et kui kasutate seda saiti Linuxi serverisse avalikult veebisse, on teil plaan blokeerida soovimatu suhtlus oma veebisaidiga. Tõenäoliselt pole see alguses probleem, kuid uurime mitmesuguseid lahendusi selle vastu võitlemiseks, sealhulgas masinõpe, tehisintellekt ja arvutinägemine. Kui see muutub probleemiks, otsige lahendust selle teksti juurde.

VPS -i rentimise osas on palju kohti, kuhu saate minna. Google Cloud on VPS -serverid, Ionos, Kamatera, Amazon AWS ja rohkem pakkujaid pakuvad pilveserveri lahendusi, mis sobivad meie vajadustele.

Peate klõpsama nende vormid ja valima alustamiseks plaan. Võite minna iga pakkujaga põhiplaaniga, kuid veenduge, et pakkuja lubab teil avada e -kirjade saatmiseks pordi e -posti serveri pordid (see peaks olema port 587 ja port 25), mõned pakkujad blokeerivad need pordid. Siiani on mul olnud Ionose ja Kamateraga parimad kogemused, mõlemad võimaldavad mul saata piiramatuid e -kirju ja nende hinnakujundus on üsna odav.

Ühendate oma uue serveriga protokolli nimega SSH või Secure Shell, mis võimaldab teil serveriga kaugliidest täpselt nagu personaalarvuti, personaalarvutist. Serveri seadistamisel palub hostiteenuse pakkuja tõenäoliselt lisada SSH -klahvi või nad annavad teile kasutajanime ja parooli. SSH -klahv on see, kuidas koodi redigeerimiseks serverisse sisse logite. SSH-võtme genereerimiseks kasutage allpool toodud SSH-KeyGen.

ssh-keygen

Salvestage fail ja kirjutage see vajadusel üle, kui te seda pole veel teinud, on hea SSH -klahve pöörata. Nüüd saate oma SSH -klahvi nägemiseks kasutada järgmist käsku. Soovite selle kopeerida oma kaugserverisse, et saaksite seda autentimiseks kasutada.

cat ~/.ssh/id_rsa.pub

Kui te ei näinud selle käsu kirjutamisel SSH-võtit (pikk numbrite ja tähtede string, mis algab "SSH-RSA AAA"), proovige genereerida RSA-klahvi (need on turvalisemad, nii et soovitan neid kasutada.) Järgmine kood genereerib 4096-bitist RSA SSH-võti.

ssh-keygen -t rsa -b 4096

Looge Ubuntu töötav VPS, kuid kavatsete seda teha. Kui olete VPS -i loonud, klõpsates pakkujate veebisaidil (Kamatera.com, Ionos.com või muu sarnane), soovite sisse logida. Selleks kasutage käsku SSH -käsku koos oma IP -aadressiga (aadress, mis näeb välja nagu xx.xx.xx.xx). Samuti peate olema tundlik meie loodud serveri vaikekasutajanime suhtes, näiteks Ubuntu.

ssh ubuntu@XX.XX.XX.XX

Teil võidakse küsida paroolilt, kui teilt küsitakse parool, sisestage see sisse. Me ei kasuta vaikimisi kasutajanime, nii et alustame uue kasutaja loomisega ja lisades nende kontole SSH -võtme.

Alustame uue SSHD_CONFIG -faili lisamisega, mis ütleb serverile, kuidas SSH -d kasutada.

nano sshd_config
# See on SSHD-serveri hõlmav konfiguratsioonifail.  Nägema
# SSHD_CONFIG (5) Lisateabe saamiseks.
# See SSHD koostati teega =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/mängud
# STRATEEGIA KASUTATAKSE VAJALIK VAHE
# OpenSSH peab täpsustama valikud koos vaikeväärtusega, kus
# Võimalik, kuid jätke nad kommenteerima.  Mitteotsustamata võimalused alistavad
# vaikeväärtus.
# 22. port
# Aadress
# Kuulake 0.0.0.0
# Kuulake ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Šifrid ja klahv
# RekeyLiMIT vaikeseade pole
# Logimine
# SyslogFacility Auth
# Logleveli teave
# Autentimine:
# Logingracetime 2m
# Loll Rootlogin keelab-passi
# RangedModes Jah
# Maxauthtries 6
# Maksimaalselt 10
# Eeldatakse, et tulevikus ei arvestata .sssh/volitatud_keys2.
# Volitatudprincpalsfile puudub
# VolitatudKeyscommand pole ühtegi
# VolitatudKeyscommander keegi
# Selle tööks vajate ka host võtmeid/etc/ssh/ssh_known_hosts
# HostbaasAuthentication nr
# Muutke jah, kui te ei usalda ~/.sssh/tuntu_hosts
# Võõrustaja
# Ignoreerynokhosts ei
# Ärge lugege kasutaja ~/.RHOSTS ja ~/.SOSTS -faile
# Ignorerhostid jah
# Tunnelitud selgete tekstiparoolide keelamiseks muutke siin NO!
# Lollymptypasswords nr
# Muutke JAH-le, et lubada väljakutse-reageerimise paroolid (ole ettevaatlikud probleemid
# mõned PAM -moodulid ja niidid)
# Kerberose valikud
# Kerberosauthenticication nr
# KerberosorlocalPasswd jah
# KerberosticketCleanup jah
# KerberosgetAfstoken Ei
# GSSAPI valikud
# GSSAPIAATHENTICATION NO
# GSsapicLeanupcredentials Jah
# GSsapistricticcepceptorcheck jah
# Gssapikeyexchange nr
# Pange see PAM -i autentimise, konto töötlemise lubamiseks „jah"
# ja seansi töötlemine. Kui see on lubatud, siis PAM autentimine
# olla lubatud KBDinteractiveauthiction kaudu ja
# ParoolAuthentication.  Sõltuvalt teie PAM -i konfiguratsioonist,
# PAM autentimine KBDinteractiveauthentiction kaudu võib mööda minna
# seadistus "PERMITROOTLOGIN ilma -ta sõnadeta".
# Kui soovite lihtsalt PAM -i kontot ja seansi tšekke ilma käivitada
# PAM autentimine, siis lubage see, kuid määrake parooliAuthentication
# ja kbdinteractiveauthentiction to 'ei'.
# AndogentForwarding Jah
# AndytcpForwarding Jah
# Gatewayports Ei
# X11Displayoffset 10
# X11uselocalhost jah
# Lubatud jah
# PrintLastlog Jah
# TCPEKUNALIVE JAH
# Permituuse keskkond nr
# Kokkusurumine hilines
# CLANSTENIVINTERVAL 0
# KliendilivecountMax 3
# Kasutatud nr
# Pidfile /run/ssshd.pid
# Maxstartups 10: 30: 100
# Lubatud nr
# ChrootDirectory Puudub
# VersioonidDendum pole
# vaike ribatee pole
# Laske kliendil läbida lokaalse keskkonnamuutujad
# NO alamsüsteemide vaikeseade
# Näide seadete ülekasutaja alusel
# Sobitada kasutaja anoncvs
# X11Forwarding Ei
# Lubage nr lubada
# Lubatud nr
# Forcecommand CVS -server

Pidage meeles, et faili salvestamiseks Ctrl+X ja Y. Järgmisena kirjutame põhiskripti nimega Initialize (kõik meie kasutaja vaikekataloogis).

nano initialize

Lisage need read faili, asendadesOma SSH -klahviga leidsite kassi abil. (.sssh/id_rsa.pub)

# !/bin/bash

Sellest failist läbi jalutamiseks alustame ridade kaupa. Esimene rida ütleb kompilaatorile, et see on bash -skript. Seejärel installime sõltuvusi, kopeerime SSHD_CONFIG õigesse kataloogi, taaskäivitades SSH -i, genereerides Root SSH -klahve, lisades kasutaja 'meeskonna' (saate valida nime, mis teile meeldib, kasutage käsku Adduseri nimega ja praegu puudega parooliga). Lisame ka meeskonda Sudo grupile, genereerime nende SSH -võtme, lisame oma võtme volitatud võtmete ja ka nende omadele ning printime nende võtme. See uus kasutaja on see, kuidas saidile sisse logida.

Uues terminalis minge edasi ja avage server uuesti.

ssh team@XX.XX.XX.XX

Teil ei tohiks seekord parooli vajada, kuna teil on SSH -võti. Samuti oleme saidi turvalisemaks hoidmiseks keelanud parooliga sisselogimise.

Nüüd algab see server täiesti tühjaks, ilma et oleks teavet selle kohta. Alustame oma projekti kloonimisega Gitist, et saaksime selle kaugmasinas alla laadida ja käivitada. Printige kõigepealt SSH -klahvi SSH -ga ühendatud kaugserveris:

cat ~/.ssh/id_rsa.pub

Järgmisena kleepige see võti Giti sätetesse, nagu me varem tegime oma Giti hoidla seadistamiseks. Nüüd võime oma projekti otse serverisse kloonida. Veenduge, et olete projekti kõigepealt kohapeal varundanud, nii et GIT -serveris allalaadimine on.

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

Täiuslik. Nüüd on kõik failid siin. Näeme neid LS -iga

ls

Nüüd hakkame serveri seadistama. Esiteks kopeerige oma projekti kataloog lihtsasse, meeldejäävaks nimeks, mida projekti jaoks kasutame.

cp -r yourproject whatyoucalledit

Kus on teie projekti uus nimi. Järgmisena peame serveri seadistamiseks üles ehitama põhiliiti. Salvestame selle utiliidi ja kasutame seda tulevikus. Selle utiliidi loomiseks loome kasutaja binaarse, et määratleda, kuidas skripti redigeerime. Kasutades bashit, redigeeri/usr/bin/ascript

sudo nano /usr/bin/ascript

Kasutage seal kindlasti Sudo, et teil oleks faili redigeerimiseks luba. Lisage failis need read:

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

Pidage meeles, et see skript võtab argumendi, skripti nime 1 dollarina. Kõigepealt kontrollib ta, kas fail on olemas või loob selle muul viisil, lisab skripti deklareerimiseks esimese rea, muudab oma õigusi, redigeerib seda ja lisab oma nime /etc /astcripts, mis võimaldab meil salvestada meie loodud skriptide nimed. Kui fail on juba olemas, muutke lihtsalt õigusi ja muutke seda. Salvestage fail ja järgmisena muudame selle õigusi. Kuni me seda skripti kasutame, ei pea me seda enam tegema.

sudo chmod a+x /usr/bin/ascript

Täiuslik. Loome nüüd skripti nimega Setup. Esiteks, mitte teid ületama, vaid vaadake, milline näeb välja minu seadistusskript. Käime läbi, milline see skript teie projektis välja näeb, te ei vaja minu skripti alustamiseks kõike.

# !/bin/bash
# sudo chmod a+x skriptid/kasutajatup
# ./scripts/usersetup
# SSH-Keygen
# Projekti kataloog
# Logi käsud
# Nano konfiguratsioon
# Git konfiguratsioon
# Uuendage ja installige
# Luba Clamavi viirus
# Määra hostinimi
# Seadistamine postgres
# Seadistamise andmebaasi varundamine
# Keela iptables
# Installige Bitdefender
# Seadistamine Postfix
# Loo dirs
# Seadistamine virtualenv
# Hankige ja ehitage sõltuvusi
# Määra tulemüürireeglid
# Installige pypi sõltuvused
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP-install OpenCV-Python == 4.5.5.64
# PIP-installige OpenCV-Contrib-Python == 4.5.5.64
# Installige CertBot
# Käivitage sertbot
# Laadige uuesti meiliserver
# Koopiatooted
# sudo cp /etc/letlessencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letlesencrypt/live/femmebabe.com/cert.pem cert.pem
# Plaastri venv
# Seadke kasutaja seaded
# Seadistama õigused
# sudo chown -r meeskond: kasutajad/var/run/joon/
# sudo chown juur: juur/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: kasutajad db.sqlite3
# Kopeerige konfiguratsioon ja määrake õigused
# Seadistamise andmebaas
# Süstige pam konfiguratsioon ja eemaldage vigane SSH Config
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profiil
# Kopeeri prügikastide skriptid ja määrake õigused
# Laadige uuesti teenused
# Luba Apache moodulid
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Keela vaikesait
# Luba meie sait
# Laadige uuesti deemon ja taaskäivitage Apache, Postfix ja Opendkim
# Seadistama õigused
# Vahetuse konfiguratsioon
# Init -pealdismootor
# Seadistus Git
# Kuva domeeni konfiguratsiooni jaoks IPv6 ja Opendkim
# Seadistamine valmis

See on palju seadistusi! Lühidalt öeldes logib see kood logib, konfigureerib nano ja giti, koopiaid failide kaudu, allalaadimisi ja installib Ubuntu APT pakette, pythoni sõltuvusi, konfigureerib PostFixi, konfigureerib PostgreSQL (The Database Server) ja laadib andmebaasi, konfigureerib UFW -i, installib, installib antientsid (Deabs Deabs), Deabs Makebs, Deabs Masebs, Discoubs Iptable, allalaadimine, allalaadimine, allalaadimine, IPPABles, IPPABLE, IPPABLE, IPPABLE, DEPABS, DAIGLID, IPPABLE ja seadistab serveri, installib konfiguratsiooni, käivitab ja lubab seviendi, eraldab vahetuse, seadistab õigused ja prindib IP, IPv6 aadressi ja Opendkimi klahvi. Üsna lihtne, kuid see näeb välja nagu palju koodi. Me ei vaja seda palju, kuna meil pole sõltuvusi, me ei kasuta sellerit, selleriburki ega daphne, vaid installime neist nagunii alustamiseks. Pange tähele, et sellel koodil on mitu korda deklareeritud domeen.

Samuti peame ostma domeeninime (mis on väike aastatasu). Soovitan domeeni ostmiseks Squarespace'i, nende paigutus on intuitiivne ja hõlpsasti kasutatav. Saate osta mis tahes valitud domeeni, kuid ma kasutan selles näites domeeni femmebabe.com. Kui olete domeeni ostnud, minge Squarespace DNS -i konfiguratsioonipaneelile ja lisage oma domeen serverile IP -aadressi abil. See peaks välja nägema selline:

@ A xx.xx.xx.xx

Kui hostina operaatoriga on @, mis tähendab, et kõik selle domeeni all olevad alamdomeenid ja juur domeen suunavad kõik serverisse. Deklareerimiseks on veel dokumente, kuid saame nende juurde liikuda, kui oleme valmis posti saatma. Pidage meeles, et see võib võtta mitu päeva, enne kui saate serverist posti edukalt saata. Meie seadistatud DNS -i kirjed võtavad levitamiseks aega.

Igatahes on ainus rekord, mida peame alustama, plaat. Nii et nüüd saame alloleva skripti oma projekti järgi täita ja seda käivitada.

Alustame väiksema seadistamisskriptiga, et lihtsalt installida põhiagredu jaoks vajalik. Me ei kasuta veel nii palju sõltuvusi ega PostgreSQL -i, alustame lihtsalt põhilise HTTP -serveri ja muretseme selle sertifitseerimise pärast, kui see on tehtud. Pidage meeles, et HTTPS -sertifikaadi saamiseks ja serveri turvalise käivitamiseks peame ostma domeeni koos serveri rentimisega. Praegu asendage selles failis "Team" oma kasutaja nimega, "dir" oma projekti kataloogiga ja tarnige oma e -posti ja domeen siltidesse <>.

Lisaks peame enne selle koodi käivitamist muutma sätted tulemüürile, mida hostimise pakkuja toetab, kui neid on. Tavaliselt on see teie hostiteenuse pakkuja vahekaardil „Võrkud" või kui te ise majutate, on see teie ruuteri jaotises „Pordi edastamine". Kui kasutate ise hostimist, soovite oma ruuteri kaudu staatilise IP -d seadistada. Lugemis-/kirjutamisjuurdepääsu jaoks peate avama järgmised pordid.

22 (SSH) 25 (post) 587 (post) 110 (posti klient) 80 (HTTP) 443 (HTTPS)

# !/bin/bash
# Logi käsud
# Nano konfiguratsioon
# Git konfiguratsioon
# Uuendage ja installige
# Luba Clamavi viirus
# Määra hostinimi
# Seadistamise andmebaasi varundamine
# Keela iptables
# Seadistamine virtualenv
# Installige CertBot
# Käivitage sertbot
# Seadke kasutaja seaded
# Seadistama õigused
# sudo chown -r meeskond: kasutajad/var/run/joon/
# sudo chown juur: juur/run/sudo/ts -r
# Laadige uuesti teenused
# Luba Apache moodulid
# Laadige uuesti deemon ja taaskäivitage Apache, Postfix ja Opendkim
# Kuva domeeni konfiguratsiooni jaoks IPv6 ja Opendkim

Enne selle koodi käivitamist veenduge, et teie ostetud domeen oleks serveriga ühendatud. Selleks avage oma kohalikul masinal terminal ja käivitage see käsk koos oma domeeniga:

ping femmebabe.com # Sisestage oma domeen siia pärast pingi

Kui kõik näeb hea välja ja server saadab vastuseid, oleme valmis skripti käitama ja pakette installima ning alustama, lubama ja sertifitseerima oma Apache'i serverit.

See pole ainult Postfixi konfigureerimiseks vajalik seadistus, vaatame seda seadistust hiljem rohkem. Praegu käivitage see seadistuskood ja serveri installimiseks ja sertifitseerimiseks peaks kuluma mõni minut. Veelkord asendage skriptis nime, e -posti ja domeeninimi järgi teie ostetud nime järgi.

Nüüd, kui server on ette nähtud, võite minna igas veebibrauseris URL -i ja kontrollida, kas server töötab HTTPS -i. Kui see pole nii, proovige natuke aega oodata, et DNS -i kirjed järele jõuaksid ja seejärel käivitage järgmine käsk, et proovida Certboti sertifikaati:

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

Kuni olete kõik õigesti konfigureerinud, peaksite pääsema Apache vaikelehele lihtsalt selleks, et teada saada, et teie kood töötab ja kuvab reaalajas veebilehte. Järgmisena redigeerime sätteid.py, et muuta meie vaikesilumisrežiim tootmiseks. Konfigureerime ka domeeni seadetes, aga ka sisemises IP -s.

nano yourproject/settings.py

Seadetes muutke/lisage need read.

# Saidi konfiguratsioon

Nüüd peame konfigureerima Apache2. Redigeerime konfiguratsioonifaili, mille me selle reaga kasutusele võtame:

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

Sellel konfiguratsioonifailil peaks olema meie domeeninimi ning kasutaja ja projekti nimi. Ma kasutan domeeninime femmebabe.com, kasutajanime meeskonda ja projekti nimi 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>

Selle näite koodis oma serveri konfigureerimisel asendage kindlasti projekti, kataloogide ja domeeni nimi. Nüüd peame vaikesaidi keelama. Seda saab teha bashi abil.

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

Järgmisena saame vaikesaidi lubada ja Apache2 uuesti laadida, kasutades ka BASH -i. Ärge unustage asendada femmebabe faili nimega, mille deklareerisite redigeerimisel/etc/apache2/saidid-saidil/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Minge navbaris tagasi oma domeeni juurde. Peaksite nägema saiti, mille olete oma veebibrauseris konfigureeritud. Palju õnne! Kui te seda ei näe, peate võib -olla tegema mõned muudatused. Vaadake hoolikalt üle oma projekti seaded, Apache konfiguratsioon ja veenduge, et teil pole vigu, ja käivitage järgmised käsud, et projekti tõrgete kontrollimiseks kontrollida.

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

Kui teil on Pythoni projektis vigu, jälgige neid sinna, kus nad asuvad, ja parandage need. Võimalik, et te ei näe kõiki oma vigu sõltuvalt sellest, kus nad asuvad, nii et kui teil on tõrge, mis ütleb lihtsalt, et "asustatud pole uuesti kinnine", muutke vea paljastamiseks virtuaalses keskkonnas register.py järgmist faili.

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

Kerige rida 83, kus see käitusaja tõrge tõstetakse (RAGE RuntimeError ("Asukoha () ei ole uuesti kinnine") ja lisage selle rea ette kommentaar, seejärel lisage sama taandumisega iseenda.App_Configs = {}. See näeb välja nagu see:

                # Vältige uuestintrantkõnesid, et vältida AppConfig.Ready () käitamist
                # meetodid kaks korda.
# RAGE RuntimeError ("Asukoha () ei ole uuesti")

Seejärel saate projekti uuesti kontrollida ja vea paljastada.

python manage.py check

Siis näete viga ja parandama selle. Kui see on fikseeritud ja kood kompileerib vigadeta, muutke fail kindlasti tagasi, nii et see näeb välja selline:

                # Vältige uuestintrantkõnesid, et vältida AppConfig.Ready () käitamist
                # meetodid kaks korda.
# Self.App_configs = {}

Eeldusel, et server on võrgus, kui teeme sellega täiendavaid muudatusi, peame serveri uuesti laadimiseks kasutama järgmist käsku:

sudo systemctl reload apache2

Vinge! Aga kuidas on posti saatmisega? E -posti saatmise alustamiseks peame kõigepealt värskendama domeeni konfiguratsiooni. See peaks olema teie DNS -paneelis Squarespace'is või mis tahes domeeni nime registripidaja. Samuti peame installima ja lisama konfiguratsiooni ning käivitama paar käsku.

Kõigepealt saame serveri IPv6 -aadressi. Seejärel avame teie DNS ja lisame kirjed.

Serveri IPv6 aadressi saamiseks kasutage seda käsku:

ip -6 addr

Nüüd saame DNS -i sätetesse lisada järgmised kirjed. Minu plaadid näevad välja sellised. Siiski peaksite oma kirjete jaoks IP -aadressi asendama oma IP -ga (mitte 75.147.182.214, see on minu oma). Lisage ka oma domeen femmebabe.com asemel, samuti oma eelmise käsuga leitud IPv6 aadress (te ei saa oma kasutada, Fe80 :: 725A: FFF: FE49: 3E02). Ärge muretsege praegu domeeni pärast, see luuakse siis, kui seadistame Postfixi, meiliserveri Opendkimiga ja printime klahvi. Konfigureerime selle viimase.

@ A N/a 75.147.182.214

@ Mx 10 femmebabe.com

@ Ptr N/a femmebabe.com

@ Txt N/a Txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: FFF: FE49: 3E02 ~ kõik

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

_DMARC Txt N/a v = dMarc1; p = puudub

Sendonly._Domainkey Txt N/a

Nüüd peame Postfixi jaoks lisama püsiva konfiguratsiooni. Kõik, mida peame tegema, on veenduda, et asendaksime domeeninime femmebabe.com koos teie kasutatava domeeninimega. Vaatame kõiki konfiguratsioonifaile ükshaaval ja installime need meie projekti kataloogi nimega Config, et installida OS -i.

nano config/etc_postfix_main.cf

Lisage see tekst faili

# Kommenteeritud, terviklikuma versiooni kohta vaata /usr/share/postfix/main.cf.dist
# Debian spetsiifiline: failinime määramine põhjustab esimese
# Selle faili rida, mida kasutatakse nimena.  Debiani vaikimisi
# IS /etc /MailName.
# mürigin = /etc /mailnimi
# Lisamine .Domain on MUA töö.
# Lahendus järgmine rida genereerida hoiatusi "hilinenud posti"
# viivitus_warning_time = 4h
# Vt http://www.postfix.org/Compatibility_readme.html - vaikimisi kuni 3.6
# Värsked paigaldused.
# TLS parameetrid
# Häiringu konfiguratsioon

Järgmine konfiguratsioon!

nano config/etc_postfix_master.cf

Lisage need read:

# 
# PostFixi põhiprotsessi konfiguratsioonifail.  Vormingu üksikasju leiate
# Faili kohta vaata Master (5) käsiraamatu leht (käsk: "Man 5 Master" või
# On-line: http://www.postfix.org/master.5.html).
# 
# Ärge unustage pärast selle faili redigeerimist käivitada "PostFix Reaud".
# 
# ================================================================================================================================================================================================================================================================================================ =
# Teenuse tüüp Privaat Unpiv Chroot WakeUp MaxProc Command + Args
# (jah) (jah) (ei) (mitte kunagi) (100)
# ================================================================================================================================================================================================================================================================================================ =
# smtp inet n - y - 1 postikraani
# smtpd pass - - y - - smtpd
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Valige üks: lubage esitada ainult Loopback klientidele või mis tahes kliendile.
# 127.0.0.1:Submission INET N - Y - - SMTPD
# -o syslog_name = postfix/alistumine
# -o smtpd_tls_security_level = krüpt
# -o smtpd_sasl_auth_enable = jah
# -o smtpd_tls_auth_only = jah
# -o smtpd_reject_unListed_recipient = nr
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restrictions = loit_sasl_authenticated, tagasilükkamine
# -o milter_macro_daemon_name = päritolu
# Valige üks: lubage SMTP -d ainult Loopback klientide jaoks või mis tahes kliendi jaoks.
# 127.0.0.1:SMTPS INET N - Y - - SMTPD
# smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -o smtpd_tls_wrappermode = jah
# -o smtpd_sasl_auth_enable = jah
# -o smtpd_reject_unListed_recipient = nr
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restrictions = loit_sasl_authenticated, tagasilükkamine
# -o milter_macro_daemon_name = päritolu
# 628 INET N - Y - - QMQPD
# QMGR UNIX N - N 300 1 OQMGR
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
# 
# ==============================================================================================================================
# Liidesed mitte-postfaksi tarkvarasse. Uurige kindlasti käsiraamatut
# POSTFIX-i tarkvara lehed, et teada saada, milliseid võimalusi see soovib.
# 
# Paljud järgmistest teenustest kasutavad PostFixi toru (8) kohaletoimetamist
# agent.  Lisateavet $ {adressaadi} kohta leiate toru (8) mehe lehelt
# ja muud sõnumite ümbriku valikud.
# ==============================================================================================================================
# 
# Maildrop. Üksikasjade leiate faili PostFix Maildrop_readme.
# Määrake ka saidil main.cf: maildrop_destination_recipient_limit = 1
# 
# 
# ==============================================================================================================================
# 
# Viimased CYRUS -i versioonid saavad kasutada olemasolevat "LMTP" master.cf kirjet.
# 
# Täpsustage jaotises Cyrus.conf:
# lmtp cmd = "lmtpd -a" kuula = "localhost: lmtp" proto = tcp4
# 
# Määrake main.cf üks või mitu järgmist:
# postbox_transport = lmtp: inet: localhost
# Virtual_transport = LMTP: INET: LocalHost
# 
# ==============================================================================================================================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Määrake ka saidil main.cf: cyrus_destination_recipient_limit = 1
# 
# Cyrus unix - n n - - toru
# lipud = drx user = cyrus argv =/cyrus/bin/tarn -e -r $ {saatja} -m $ {laiend} $ {user}
# 
# ==============================================================================================================================
# Vana näide kohaletoimetamisest Cyruse kaudu.
# 
# Vana -tsürus unix - n n - - toru
# lipud = r user = cyrus argv =/cyrus/bin/tarn -e -m $ {laiend} $ {user}
# 
# ==============================================================================================================================
# 
# Konfiguratsiooni üksikasju leiate faili PostFix UUCP_README.
# 
# 
# Muud välised kohaletoimetamise meetodid.
# 

Ja Opendkimi konfiguratsioon. Opendkim identifitseerib e -posti serverid domeenivõtmetega, et muuta need turvalisemaks. Ilma selleta pole Mail allkirjastatud ega pruugi postkasti pääseda.

nano config/etc_default_opendkim

Lisage need read:

# MÄRKUS. See on pärandi konfiguratsioonifail. Seda ei kasuta Opendkim
# SystemD teenus. Palun kasutage vastavaid konfiguratsiooniparameetreid
# /etc/opendkim.conf.
# 
# Varem redigeeriks siin vaikeseadeid ja seejärel käivitage
# /lib/opendkim/opendkim.service.generate SystemD genereerimiseks failide alistamine aadressil
# /etc/systemd/system/opendkim.service.d/override.conf ja
# /etc/tmpfiles.d/opendkim.conf. Kuigi see on endiselt võimalik, on see nüüd
# Soovitatav reguleerida seadeid otse /etc/opendkim.conf.
# 
# Daemon_opts = "" "
# Muutke/var/pooli/postfix/run/opendkim, et kasutada UNIX -i pistikupesa
# Postfix Chrootis:
# Rundir =/var/pool/postfix/run/opendkim
# 
# Lahtiklus alternatiivse pistikupesa määramiseks
# Pange tähele, et selle seadistamine alistab opendkim.confis igasuguse pistikupesa väärtuse
# vaikimisi:
# Kuulake kõigil liidestel pordi 54321:
# Pistikupesa = INET: 54321
# Kuulake Pordi 12345 loopbackil:
# Pistikupesa = INET: 12345@localhost
# Kuulake 192.0.2.1 saidil 12345:
# Pistikupesa = INET: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Lisage need read:

# default_process_limit = 100
# default_client_limit = 1000
# Vaikeväärtus VSZ (virtuaalne mälu suurus) teenuse protsesside piirmäärad. See on peamiselt
# eesmärk on püüda ja tappa protsesse, mis lekivad mälu enne söömist
# Kõik.
# default_vsz_limit = 256m
# Sisselogimiskasutajat kasutavad sisselogimisprotsessid sisemiselt. See on kõige ebausaldusväärsem
# Kasutaja DoveCoti süsteemis. Sellel ei tohiks olla üldse juurdepääsu millelegi.
# default_login_user = dovenull
# Sisekasutajat kasutavad ebasoovitamata protsessid. See peaks olema eraldi
# Sisselogimise kasutaja, nii et sisselogimisprotsessid ei saaks teisi protsesse häirida.
# default_internal_user = dovecot
    # port = 143
    # port = 993
    # SSL = jah
  # Enne uue protsessi alustamist käitlevate ühenduste arv. Tavaliselt
  # Ainsad kasulikud väärtused on 0 (piiramatu) või 1. 1 on turvalisem, kuid 0
  # on kiirem. <doc/wiki/loginProcess.txt>
  # teenuse_count = 1
  # Protsesside arv, et alati oodata rohkem ühendusi.
  # protsess_min_avail = 0
  # Kui seate teenuse_count = 0, peate seda tõenäoliselt kasvatama.
  # vsz_limit = $ default_vsz_limit
    # port = 110
    # port = 995
    # SSL = jah
    # port = 587
  # Looge inet -kuulaja ainult siis, kui te ei saa ülaltoodud UNIX -i pistikupesa kasutada
  # INET_LISTENER LMTP {
    # Vältige LMTP nähtavaks kogu Interneti jaoks nähtavaks
    # aadress =
    # port =
  # }
  # Suurem osa mälust läheb MMAP () ING -failidele. Võimalik, et peate seda suurendama
  # Piirake, kui teil on tohutud postkastid.
  # vsz_limit = $ default_vsz_limit
  # Max. IMAP -protsesside arv (ühendused)
  # protsess_limit = 1024
  # Max. POP3 protsesside arv (ühendused)
  # protsess_limit = 1024
  # Max. SMTP esitamisprotsesside arv (ühendused)
  # protsess_limit = 1024
  # Auth_Socket_Path osutab vaikimisi selle kasutajadb -pistikupesale. Tavaliselt on see
  # kasutab Dovecot-LDA, Doveadm, võib-olla IMAP protsess jne. Kasutajad, kellel on
  # Selle pistikupesa täielikud õigused saavad saada kõigi kasutajanimede ja
  # Hankige kõigi UserDB otsingute tulemused.
  # 
  # Vaikimisi 0666 režiim võimaldab kõigil pistikupesaga ühenduse luua, kuid
  # UserDB otsingud õnnestub ainult siis, kui kasutajadB tagastab välja "UID"
  # Sobib helistaja protsessi UID -ga. Ka siis, kui helistaja UID või GID sobib
  # Socket on UID või GID Otsingud õnnestuvad. Kõik muu põhjustab läbikukkumist.
  # 
  # Kõigi kasutajate otsimiseks helistajatele täielike õiguste andmiseks määrake režiim väärtuseks
  # midagi muud kui 0666 ja Dovecot laseb tuumal jõustada
  # Lubad (nt 0777 võimaldab kõigile täielikke õigusi).
  # Autotöötaja protsessi käivitatakse vaikimisi juurtena, nii et sellele pääseb juurde
  # /jne/vari. Kui see pole vajalik, tuleks kasutajat muuta
  # $ default_internal_user.
  # kasutaja = juur
  # Dikti puhverserveri kasutamisel peaksid postiprotsessidel olema juurdepääs pistikupesale.
  # Näiteks: režiim = 0660, grupp = vmail ja globaalne mail_access_groups = vmail
    # režiim = 0600
    # kasutaja =
    # rühm =

Veelkord asendage domeen kõigis neis failides, femmebabe.com, teie valitud domeeniga. Redigeeri järgmist faili, DoveCot's Config,

nano config/etc_dovecot_dovecot

Ja lisage need read

## Dovecoti konfiguratsioonifail
# Kui teil on kiire, vaadake http://wiki2.dovecot.org/quickconfiguration
# "Doveconf -n" käsk annab muudetud sätete puhta väljundi. Kasutage seda
# Failide kopeerimise ja kleepimise asemel Dovecoti meililisti postitamisel.
# '# 'I iseloomu ja kõike pärast seda käsitletakse kommentaaridena. Lisaruumid
# ja vahekaarte eiratakse. Kui soovite mõnda neist selgesõnaliselt kasutada, pange
# value inside quotes, eg.: key = "# Char ja jälitav vingumine "
# Enamiku (kuid mitte kõiki) sätteid saab erinevate protokollide ja/või
# lähte-/sihtkoha IPS, paigutades seaded sektsioonidesse, näiteks:
# Protokoll IMAP {}, kohalik 127.0.0.1 {}, kaugmaht 10.0.0.0/8 {}
# Kuvatakse vaikeväärtused iga seade jaoks
# need. Need on siiski erandid: puuduvad lõigud (nt nimeruum {})
# või pistikprogrammi sätted lisatakse vaikimisi, need on loetletud ainult näidetena.
# Teed on ka lihtsalt näited, mille tegelikud vaikeseaded põhinevad konfigureerimisel
# Valikud. Siin loetletud teed on konfigureerimiseks -prefix =/usr
# --sysconfdir =/etc--localstantedir =/var
# Luba installitud protokollid
# Koma eraldatud IP -de või võõrustajate loetelu, kuhu ühendusi kuulata.
# "*" Kuulab kõigis IPv4 liidestes, "::" Kuulab kõigis IPv6 liidestes.
# Kui soovite täpsustada vaikeseadeid või midagi keerukamat,
# Redigeeri Conf.D/Master.conf.
# Kuula = *, ::
# Baaskataloog, kus käitamisandmeid salvestada.
# base_dir =/var/run/dovecot/
# Selle juhtumi nimi. Mitme instantsi seadistuses Doveadm ja muud käsud
# saab kasutada -i <eksemplar_name>, et valida, millist eksemplari kasutatakse (alternatiiv
# to -c <config_path>). Eksemplari nimi lisatakse ka protsessidele
# PS väljundis.
# eksemplar_name = DoveCot
# Tervitussõnum klientidele.
# login_greeting = dovecot valmis.
# Kosmose eraldatud loetelu usaldusväärsetest võrguvahemikest. Nende ühendused
# IP -del lubatakse nende IP -aadressid ja pordid alistada (logimiseks ja logimiseks
# autentimiste kontrollimiseks). Samuti eiratakse ka keelata_plaintext_auth
# Need võrgud. Tavaliselt täpsustate siin oma IMAP -puhverserveri serverid.
# login_trusted_networks =
# Ruumi eraldatud sisselogimise juurdepääsu kontrollimise pistikupesade (nt TCPWRAP) loend
# login_access_sockets =
# Proxy_maybe = jah, kui puhverserveri sihtkoht vastab mõnele neist IP -dest, ärge tehke seda
# puhverserver. See pole tavaliselt vajalik, kuid võib olla kasulik, kui sihtkoht
# IP on nt. Koormuse tasakaalustaja IP.
# authe_proxy_self =
# Näidake rohkem verbose protsessi pealkirju (PS -s). Näitab praegu kasutajanime ja
# IP -aadress. Kasulik nägemiseks, kes tegelikult kasutavad IMAP -protsesse
# (nt jagatud postkastid või kui sama UID -d kasutatakse mitme konto jaoks).
# verbose_proctitle = ei
# Kas tuleks kõik protsessid tappa, kui DoveCot Masteri protsess välja lülitub.
# Selle seadistamine "ei" tähendab seda, et DoveCot saab ilma uuendada ilma
# sundida olemasolevaid kliendiühendusi sulgema (kuigi see võib olla ka
# Probleem, kui uuendus on nt. Turvalisuse paranduse tõttu).
# Shutdown_clients = jah
# Kui see pole null
# selle asemel, et neid otse samas protsessis käitada.
# doveadm_worker_count = 0
# UNIX -i pistikupesa või host: port, mida kasutatakse Doveadmi serveriga ühendamiseks
# doveadm_socket_path = doveadm-server
# Ruumi eraldatud keskkonnamuutujate loetelu, mis on säilinud DoveCotis
# Startup ja edastati kõigile oma lasteprotsessidele. Võite anda ka
# võti = väärtuspaarid, et alati seada konkreetsed sätted.
# Import_environment = tz
## 
## Dictionary Serveri sätted
## 
# Sõnastikku saab kasutada võtme = väärtuse loendite salvestamiseks. Seda kasutab mitu
# pistikprogrammid. Sõnaraamatule pääseb juurde kas otse või ehkki a
# Sõnastiku server. Järgmine dikt plokiga kaardistab sõnaraamatu nimed URIS -iga
# Kui serverit kasutatakse. Seejärel saab neile viidata URI -dele vormingus
# "Puhverserver :: <name>".
  # Kvoodi = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Suurem osa tegelikust konfiguratsioonist lisatakse allpool. Failinimed on
# Esmakordselt sorteeritakse nende ASCII väärtuse järgi ja parsib selles järjekorras. 00-eelsed
# FileName'is on mõeldud tellimuse mõistmise lihtsamaks.
# Konfiguratsioonifaili saab proovida ka kaasata ilma tõrke andmata
# Seda ei leitud:
# Võimaldab DoveCot kuulata kõiki sisendühendusi (IPv4 / IPv6)

Lisage Dovecoti kasutaja parool:

nano config/etc_dovecot_passwd

Faili esimene osa enne käärsoole on kasutajanimi. Viimane osa "YourPassword" tähistab parooli, mida soovite oma e -posti serverile anda.

team:{plain}yourpassword

Järgmisena Opendkimi konfiguratsioon

nano config/etc_opendkim.conf

Ja lisage need read:

# See on põhikonfiguratsioon allkirjastamiseks ja kontrollimiseks. See võib kergesti olla
# Kohandatud põhilise installatsiooni jaoks. Vt Opendkim.conf (5) ja
# /usr/share/doc/opendkim/examples/opendkim.conf.sample COMPLEKT
# Saadaolevate konfiguratsiooniparameetrite dokumentatsioon.
# Logwhy ei
# Ühised allkirjastamise ja kontrollimise parameetrid. Debianis on päisest "From"
# Ülendatud, kuna see on sageli identiteedi võti, mida kasutavad mainesüsteemid
# ja seega mõnevõrra turvatundlik.
# Domeeni, valija ja võtme allkirjastamine (vajalik). Näiteks tehke allkirjastamine
# domeeni "näide.com" jaoks koos valijaga "2020" (2020._Domainkey.example.com),
# kasutades privaatvõtme kasutamist /etc/dkimkeys/example.private. Granulaarsem
# Seadistusvalikud leiate saidilt /usr/share/doc/opendkim/readme.opendkim.
# Domeen näide.com
# Valija 2020
# KeyFile /etc/dkimkeys/example.private
# Debianis töötab Opendkim kasutajana "Opendkim". 007 umask on vajalik, kui
# Kasutades kohaliku pistikupesa koos MTA-dega, mis pääseb pistikupesale mitte-privileegina
# Kasutaja (näiteks PostFix). Võimalik, et peate gruppi lisama kasutaja "PostFix"
# "Opendkim" sel juhul.
# MTA ühenduse pistikupesa (vajalik). Kui MTA asub Chroot vanglas,
# Tuleb tagada, et pistikupesa on juurdepääsetav. Debianis jookseb Postfix sisse
# Chroot in/var/pooli/postfix, seetõttu peaks olema Unixi pistikupesa
# konfigureeritud, nagu näidatud alloleval viimasel real.
# Kohalik pistikupesa: /run/opendkim/opendkim.sock
# Pistikupesa: 8891@localhost
# Pistikupesa: 8891
# Hostid, millele pigem allkirjastada, mitte kontrollida, on vaikimisi 127.0.0.1. Vaata
# Opendkimi (8) operatsiooni jaotis lisateabe saamiseks.
# Internathosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Usaldusankur võimaldab DNSSEC -i. Debianis on esitatud usaldusankuri toimik
# Pakendi poolt DNS-Root-Data.
# Nimeserverid 127.0.0.1
# MAP -domeenid aadressilt aadresside ja sõnumite allkirjastamiseks kasutatavate võtmeteni
# Sisemiste võõrustajate komplekt, mille post tuleks allkirjastada
nano config/etc_default_opendkim

Ja lisage need read

# MÄRKUS. See on pärandi konfiguratsioonifail. Seda ei kasuta Opendkim
# SystemD teenus. Palun kasutage vastavaid konfiguratsiooniparameetreid
# /etc/opendkim.conf.
# 
# Varem redigeeriks siin vaikeseadeid ja seejärel käivitage
# /lib/opendkim/opendkim.service.generate SystemD genereerimiseks failide alistamine aadressil
# /etc/systemd/system/opendkim.service.d/override.conf ja
# /etc/tmpfiles.d/opendkim.conf. Kuigi see on endiselt võimalik, on see nüüd
# Soovitatav reguleerida seadeid otse /etc/opendkim.conf.
# 
# Daemon_opts = "" "
# Muutke/var/pooli/postfix/run/opendkim, et kasutada UNIX -i pistikupesa
# Postfix Chrootis:
# Rundir =/var/pool/postfix/run/opendkim
# 
# Lahtiklus alternatiivse pistikupesa määramiseks
# Pange tähele, et selle seadistamine alistab opendkim.confis igasuguse pistikupesa väärtuse
# vaikimisi:
# Kuulake kõigil liidestel pordi 54321:
# Pistikupesa = INET: 54321
# Kuulake Pordi 12345 loopbackil:
# Pistikupesa = INET: 12345@localhost
# Kuulake 192.0.2.1 saidil 12345:
# Pistikupesa = INET: 12345@192.0.2.1

Kui oleme valmis oma PostFixi serveri seadistama, käivitame alloleva koodi, manustatakse sobiva domeeninimega. Alustage skripti loomisega

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

Nüüd redigeerige seda faili Nanos tekstiredaktor, nii et see sisaldab femmebabe.com asemel teie domeeninime.

# !/bin/bash
# Seadistamine Postfix

Nüüd käivitage lõpetatud skript, et konfigureerida PostFix, Opendkim ja DoveCot.

./scripts/postfixsetup

Kui see skript on käivitatud, kopeerige viimane rida, mille see prindib, ja kleepige selle oma DNS -i konfiguratsiooni väärtuseks Sendonly._Domainkey väärtuseks. See on Opendkimi võti, mida kasutatakse teie domeeni tuvastamiseks turvalise posti saatmisel.

Vinge! Mõne päeva jooksul peaksite saama serverist posti saata, kui kõik on õigesti konfigureeritud.

Kui konfigureerisite lihtsalt oma meiliserveri DNS -i, peaks kirjete värskendamiseks kuluma vähem kui 72 tundi. See on tavaliselt palju kiirem. Saate kontrollida, kas teie server töötab selle käsu abil, edastasite oma e -posti aadressi:

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

Kui näib, et kõik töötab õigesti, peaksite saama oma serveriga e -kirju saata. Kui see ei tööta, proovige vaadata logisid, et näha, milline võib olla viga.

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

See pakub verbose teavet serveri saatmise posti kohta ja kas see töötab korralikult. Te peaksite nägema ka postkastis e -kirja, kui seda pole, kontrollige oma rämpsposti kausta.

Samuti peate seaded oma sätetes konfigureerima. Lisage või asendage need read oma seadetes

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

Pange tähele, et parooli saamiseks kasutame konfiguratsioonifaili. Laadime selle faili sätetesse nagu nii, faili alguses.:

# Avatud ja laadige konfiguratsioon

Loome selle faili ja lisame sellele salajase võtme, samuti posti parooli. Salajase võtme genereerimiseks kasutage seda käsku, mis iga pikkusega, mis teile lõpus meeldib:

openssl rand -base64 64

Kopeerige nüüd genereeritud ja redigeerige /etc/config.json redigeerige tekst

sudo nano /etc/config.json

Lisage oma faili järgmised read koos klahviga, mis avati salajaseks võtmeks.

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

JSON -vorming on lihtne ja hõlpsasti kasutatav, võime kuulutada ka muid võtmeid, mida me oma projektis kasutada tahame, ja hoida neid meie projekti kataloogist eraldi, et teised kasutajad ei saaks neile kirjutada ja nii ei saa neid lugeda meie projekti kataloogist. See on API võtmete jaoks soovitatav praktika, millest siin kasutame rohkem kui mõnda.

Samuti soovite oma projekti varundada, et veenduda, et kõik on salvestatud, ja saate oma töö hiljem taastada, isegi kui te ei soovi enam serverit rentida.

sudo backup

Nüüd proovige saata veebiserverist HTML -i e -kiri, kui käsurealt ühe saatmine töötab. Küsige oma kasutajajuhtumi kesta ja saatke Django kaudu sellele kasutajale HTML -i e -kiri. Muutke minu nimi koodis, Charlotte, oma kasutajanimeks.

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

Kui esimene käsk ei tööta, veenduge kindlasti

source venv/bin/activate

Kui kõik on õigesti seadistatud, saate nüüd oma veebirakenduse saadetud postkasti tervitusmeili. Hea töö! Sa oled jõudnud kaugele.

Tahtsin lisada, et kui olete kunagi sellise projekti kallal töötades hädas vigadega, siis ärge kartke otsida vastuseid ja küsida abi. Google on muude otsingumootorite hulgas suurepärased ressursid programmeerimisabi otsimiseks. Otsige lihtsalt saadavat viga ja näete, kuidas teised inimesed probleemi lahendavad. Samuti võtke teretulnud ühendust minuga, teie koolitajate (õpetajad, professorid, juhendajad), kõik Interneti -eakaaslased, kes on saadaval programmeerimisabi saamiseks, või konsulteerige selle raamatu uuesti või muude ressurssidega, et leida lahendusi kogetud probleemidele. Ma saan aru, et see pole lihtne, kuid isegi kui olete nii kaugelt lugenud ega kirjuta ühtegi koodi, õpite palju veebirakenduse nullist ehitamist. Patta ennast selga, sa teed suurepärast tööd.

Täname, et leidsite aega selle kolmanda väljaande veebiarendusjuhendi lugemiseks. Tulevastes väljaannetes lisan rohkem dokumendi alguses käsitletud olulisi näiteid ja me sukeldume palju sügavamale tarkvara ja riistvara arendamise maailma. Olge kursis tulevase ja ootan teile õpetamist, kuidas luua uskumatut tarkvara. Kohtumiseni järgmises väljaandes!






Sulgur
Leht 1
Hüppama
Vaata täielikku artiklit
Jätka lugemist

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga



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

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.

.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga



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.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga



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.

.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


Ostma

poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga


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.


poolt Daisy / Vaade | Ostma | Osta krüptovaluutaga




https://glamgirlx.com -


(Pildi allalaadimiseks klõpsake või koputage)
Professionaalne meelelahutus, fotod, videod, heli, otseülekanded ja juhuslikud mängud, samuti ID -skannimine, veebiarendus ja asendusliikmed.

Jätke mulle selle aadressi abil Bitcoini näpunäide: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Teenuse tingimused