Praktinis gilus mokymasis ir saugumas pavyzdžiu Trečiasis leidimas Charlotte Harper 2024 m. Liepos 3 d Atnaujinta/konvertuota 2025 m. Birželio 3 d
Pratarmė:
Saugumo svarstymai kuriant žiniatinklio programinę įrangą yra svarbi bet kurio žiniatinklio kūrėjo plano ir vykdymo dalis, tuo metu, kai inžinerija prototipu, kuris yra patikimas, stabilus ir naudingas praktiniams tikslams. DOM (dokumento objekto žymėjimas), įgyvendinant HTML, „JavaScript" ir CSS, taip pat „Backend" programinę įrangą, įgyvendinančią „Python", C/C ++, „Java" ir „Bash", suteikia žiniatinklio kūrėjams laisvę ir galią, kad būtų galima sukurti įvairius projektus, kurie išreiškia kūrybiškumą, paprastą naudojimą ir funkcionalumą, vaizduojant „Humance" ir „Varžybas", ir suteikia galimybę naudoti įvairius projektus. Laikykite ar ką nors padaryti internete, paprastai jutiklinio ekrano išmaniųjų telefonų įrenginyje. Daugelis žmonių net nežinotų, nuo ko pradėti, kai nori kurti svetainę nuo nulio, jie linkę pradėti kito asmens svetainėje ir sukurti ką nors ribotos funkcionalumo, patikimumo, naudojimo lengvumo ir ypač kūrybiškumo, kai jie galėjo turėti visus naujausius galingus įrankius, kad būtų galima naudoti ką nors naudingo, bet kokiu atveju, kai reikia naudoti laiką, nesugaišdami laiko ir ypač švaistymo už brangias prenumeracijas, kad būtų galima naudotis. Jei turite keletą minučių perskaityti šią knygą ir išmokti to, ko noriu jus išmokyti ar net asmeniškai kalbėtis su manimi apie savo tikslus ir gauti keletą patarimų teisinga linkme ir esate motyvuoti išmokti koduoti ir rašyti savo programinę įrangą, pasiimti šią knygą namo ir skirti šiek tiek laiko, kad išmoktumėte savo auditorijos kūrimą ir tenkintumėte jūsų poreikius.
Apie mane: Aš esu programinės įrangos kūrėjas, turintis daugybę patirties C/C ++, „Java", „Python", HTML, CSS ir „JavaScript". Aš kuriu svetaines, kurias žmonės nori naudotis, nori apsilankyti ir netgi priklausomi nuo to, kad tik mokytis, atkurti ir nužudyti laiką, o svarbiausia - parduodu programinę įrangą. Jei turėtumėte idėją, kaip tiksliai norėjote, kad svetainė atrodytų ir veiktų, jūs norėjote mane palaikyti, kad galėčiau patenkinti savo poreikius, kol patenkinu jūsų, ir jūs norite padengti savęs valdymo išlaidas patys, aš sukurčiau jums kitą „YouTube", „Tiktok", „Twitter", „Google" ar net aukštųjų technologijų saugos programą, kurią galite pasiekti, tik galite pasiekti. Užuot bandęs parduoti jums savo laiką, bandau nusipirkti savo: noriu pakalbėti apie tai, kaip kurti programą (svetainę) su jau egzistuojančia informacija, ir išmokyti jus, ko jums reikia, kad būtumėte nepriklausomas programinės įrangos kūrėjas, verslininkas, vadovaudamas sėkmingai karjerai bet kurioje jūsų norima srityje. Ir leisk man aiškiai pasakyti, kad išsilavinimas, kurį jums suteikiu, bus neoficialus. Galite eiti į mokyklą ir išmokti viso to naudodamiesi oficialiu išsilavinimu ar net skaityti šią knygą mokykloje, atlikti savo užduotis ir labai daug atimti iš savo išsilavinimo, tačiau aš oficialiai nepadėsiu jūsų į karštą vietą ir paprašysiu atlikti užduotis. Aš nesu jūsų profesorius, jūs galite galvoti apie mane kaip į draugą, kuris nori nukreipti jus link karjeros, kurią lemia jūsų asmeninė sėkmė. Ir aš taip pat neparduodu jums sėkmės, turėsite ją nusipirkti su savo laiku. Mokymasis koduoti turi staigią mokymosi kreivę ir niekada nebuvo lengva ar net neturėjo būti. Turite dirbti kiek įmanoma sunkiau, ir toliau bandyti žlugti ir bandyti dar kartą, net jei esate nusivylę, kad patys išmoktumėte ir sukurtumėte programas. Tai yra paties kodo pobūdis. Kodas vykdo kompiliatorių, skirtą suteikti programuotojo klaidų pranešimams, ir tai išmokys jus koduoti, net jei tiesiog nukopijuojate klaidą į savo paieškos variklį ir skaitydami kitų žmonių pavyzdžius. Ir turiu pasakyti, kad jums nereikia būti ypač turtingi, protingi, sėkmingi ar net detaliai orientuoti ar organizuoti programai kurti. Kompiuteris rūpinasi ta organizacija. Jums tereikia atkakliai atlikti bandymus ir klaidas, išlaikyti dėmesį ir sunkiai dirbti prie to, ką darote, ir jums bus labai sėkminga karjera per visą tai, ką darote.
Kas aš esu: Aš suprantu, kad paskutinis skyrius buvo labiau susijęs su mokymuisi, o jūsų knygos pasirinkimas. Kas aš tiksliai? Tai sudėtingas klausimas. Aš pats tai neaišku, nes kenčiu nuo sveikatos sutrikimų, dėl kurių man gali būti sunku net koduoti ar rašyti šią knygą, kartu pateikdamas iššūkius socializacijos ir tapatybės problemoms, dėl kurių mano gyvenimas apsunkina, kai reikia pristatyti save. Trumpai tariant, jei jūs skaitote šią knygą, jūs ją parsivežėte namo, nes peržengėte ją ir manėte, kad tai buvo naudinga, ar net jei jūs ką tik perskaitėte, aš jums esu panašus į mąstymą, kuris nori, kad tau pasisektų viskuo, ką darai. Aš pats esu inžinierius, programinės įrangos kūrėjas ir studentas. Rašau šią knygą kitiems studentams, norintiems palengvinti savo gyvenimą, turėdamas programinės įrangos, kuriai reikalingas, vadovas, palengvinantis jų gyvenimą, pateikdami pavyzdžių, kad galėtumėte suderinti kartu su dideliu galvosūkiu į veikiančią, naudingą, didelę, funkcionuojančią, darnią ir įtraukiančią programą, kuri gali paskatinti sėkmę, nesvarbu, ar tai verslo linija. Iš esmės, tai aš darau: kuriu programas, kad padėčiau sau ir kitiems žmonėms pasisekti. Aš taip pat esu autorius, nors tai yra mano pirmasis leidinys, kurį ketinu baigti, norėdamas sudėti savo portfelį į naudingą dokumentą, taip pat esu menininkas. Aš jums tai pripažinsiu, aš tarsi keistas žmogus. Aš nesu tobula, aš buvau vykdęs įstatymus, netgi vedančius mane į kolegijas ir universitetus bei palikdamas valstijas, kad bandyčiau pavadinti save, turėdamas daugiau sėkmės. Aš esu moteris pagal gimimą, dėviu makiažą, fotografuoju save, dėviu sukneles ir kitus moteriškus drabužius ir aš suprantu save kaip moterį iš prigimties. Anksčiau turėjau problemų su kitais žmonėmis, dėl kurių kovojama su rašymo ir statybomis internetinėmis, ir atsiprašau, kad aš greičiau nesugebėjau gauti šios knygos į jūsų rankas: jums to reikėjo. Norėsite perskaityti ir parašyti kodą, kuris atrodo kaip mano ir veikia kaip mano, ir darykite tą patį, bet dar geriau, nes jei galite sau leisti nusipirkti šią knygą, užuot sukramtydami savo klaviatūrą, kaip aš darau tik tam, kad patys sukurčiau knygą, prašydami pinigų, turite išteklių, kurių jums reikia, kad jūsų gyvenime būtų sėkminga. Aš turėjau visokių klausimų, susijusių su šeimos augimu, sveikatos būklėmis, gydytojais, žiniasklaida ir įstatymais, o mano kodas giliai atspindi kovą, kuri yra feminizmas ir moters prigimtis padalintame ir nusivylusiame pasaulyje. Tačiau ši knyga man labai rūpi, mano kūdikis, mano portfelis ir pragyvenimo šaltinis, todėl vertinu jūsų svarstymą, kai paimate tekstą namo ir atsargiai perbraukiate jį, kad galėčiau iš manęs pasimokyti. Atminkite, kad nesu tobula, ši knyga turės klaidų, peržiūrų ir naujų leidimų, ir turėsite kuo geriau pagalvoti su savo loginėmis smegenimis, kad galėtumėte sėkmingai patirti mano rašymą. Be to, supraskite, kad turiu omenyje jums gerai, net kai rašant susiduriate su iššūkiais. Pagalvokite apie tai taip: kai galite tiesiog išsinuomoti kompiuterinę sistemą, kad padarytumėte viską, ką galite įsivaizduoti skaitmeninėje erdvėje, išsaugoti visą informaciją, su kuria susiduriate, analizuojate ir organizuojate, ir suprasite ją, neišvengiamai susidursite su sunkumais dėl jūsų vartojamos informacijos ir netgi publikavimo. Aš jums tai sakau, nes susiduriu su tais pačiais sunkumais. Naudokite šią knygą savo rizika, dirbkite su savo bendruomene ir bendruomenėmis, kuriomis galite sukurti programinę įrangą saugioje aplinkoje, ir nesiimkite dalykų asmeniškai, kai jums nepavyksta ar net nesiseka: štai kaip aš taip toli gavau, ir kodėl aš galiu jums atnešti šį tekstą ir padėti jums pasisekti, nesikreipdami į „Global", kuriam padėka, kad visuotinai padėkos, padėkos visuotinai, padėkos mastui, padėkos visuotinai, padėkos dėka, padėkos visuotinai padėkos dėka, kad padėkos pasaulinei mastui padėkos dėka, padėkos visuotinai padėkos dėka, kad padėkos dėka visiems padėka, kad padėka, kad padėka, kad padėka, kad padėka, kad padėka, kad padėka, kad padėka visuotinai, kad padėka, kad padėka visuotinai, kad padėkos pasaulinei mastui, padėkos visuotiniam maste. veiks, internetas. Galbūt nelabai susipažinote su tuo, kas esu tik keliais žodžiais, tačiau aš raginu jus skaityti, jūs susipažinsite su manimi, kai toliau skaitote ir suprasite mane kurdami savo projektus, kad atliktumėte savo darbą. Šioje knygoje nebus namų darbų, jei jūsų profesoriai ar mokytojai jums nieko nepriskirs, tačiau labai raginu patys kurti projektų portfelį, kai jūs skaitote kartu, taip pat „Capstone" projektą, kuriame parodyta, kaip galite pritaikyti tai, ką išmokote. Mano „Capstone" projektas yra daugumos to, ką perskaitysite šioje knygoje, pagrindas, nes jame yra mano ankstesnių projektų kodas, mano sukurtas ir išmoko rašyti metodiškai rankomis, ir daugybę idėjų ir patarimų, kurie padėjo man pasisekti iki to, kur galiu susieti paprastą programą, kuri yra visiškai pasižyminčia ir atrodo kaip populiari programa, kurią galite pamatyti jūsų draugui ar šeimos nariui, internete, reklamuojamą ar naujieną.
Kas yra ši knyga: Ši knyga yra pavyzdys. Čia galite rasti kodą, instrukcijas, kaip išmokti koduoti, informaciją apie kodo derinimą ir klaidų fiksavimą, trikčių šalinimo veiksmus, instrukcijas, kaip sukurti atsarginę kopiją ir išsaugoti kodą, iš naujo išsidėstyti, jei kas nors sulaužys jūsų kodą, užsitikrinkite jūsų kodą, Dalyvaukite jūsų kode, kurkite interaktyvias svetaines, kurios yra linksmos, įtraukiančios ir priklausomai nuo jūsų, o jūs galite įsigyti jūsų kodą, kodėl tai yra svarbu, kaip tai yra svarbūs ir kaip reikia paeiliui, o jūs, įtraukiate ir priklausomai nuo jūsų. Jūs kuriate absoliučiai geriausią šviesą, kad būtų patrauklesni jūsų galutiniams vartotojams, jūsų svetainės lankytojams. Šioje knygoje aš pademonstruosiu daugybę programinės įrangos dizaino pavyzdžių, daugiausia dėmesio skirdami internete kaip platformai ir saugumui. Mes inicijuosime mokymosi patirtį sukurdami pagrindinį projektą, naudodami „UNIX" apvalkalą su atsarginės kopijos ir scenarijaus funkcijomis. Tada mes išnagrinėsime pagrindinę tinklaraščio svetainę, atnaujinsime savo tinklaraštį su nuotraukų ir vaizdo įrašų funkcijomis, taip pat panaudosime šias funkcijas saugos sprendimams naudoti naudojant nemokamą programinę įrangą ir užsitikrinkite mūsų serverį naudodamiesi prijungiamu autentifikavimo moduliu (PAM). Tada, be kitų koncepcijų, peržiūrėsime failų tvarkymą ir apdorojimą, tyrinėdami vaizdo įrašų redagavimą, balso donorystę, brūkšninių kodų nuskaitymą ir optinio simbolių atpažinimą. Pakeliui išnagrinėsime API, kurie padės mums padaryti mūsų programinę įrangą naudingesnę ir saugesnę, naudodami nemokamas ir mokamas parinktis. Pakeliui mes ištirsime fizinio saugumo ir karingų įrankių, tokių kaip šaunamieji ginklai ir amunicijos dizainas ir gamyba, įskaitant statinės ir kartotuvų dizainą, bokštų ir dronų dizainą bei kitus direktorius, kuriuos integruotume su savo programine įranga esamame tinkle, kad apsaugotume savo programinę įrangą ir pademonstruotume savigyną bei nuojautą. Mes padarysime pertraukas, kad sukurtume žaidimus, 2D ir 3D perteikimo variklius ir dirbsime su įterpta aparatine įranga pagrindinių matmenų pateikimo programinės įrangos pavyzdžiuose ir elektroniniu vibruojančiu masažuokliu, išmetamu atitinkamai į silikono gumą. Pakeliui mes taip pat panaudosime jau prieinamus mašinų mokymosi sprendimus, kad galėtume geriau apsaugoti savo programinę įrangą. Mes taip pat panaudosime žiniatinklio atsargų įrankius, kad būtų galima supaprastinti ir apsaugoti procesą. Ši knyga yra jūsų sėkmės kuriant žiniatinklio programą ir integruojant ją į profesionalų kompiuterio ir įterptųjų mechaninių sistemų tinklą, vadovas ir bendras programinės įrangos kūrimo ir įterptosios aparatinės įrangos vadovas be jokių foninių žinių ar ankstesnės patirties.
Kas nėra ši knyga: Jei tikrai norite turėti svetainę, galėtumėte tiesiog nustatyti paprastą parduotuvę ir parduoti tai, ko jums reikia, paskelbti tinklaraštį, paskelbti nuotraukas ar vaizdo įrašus ar kitaip nerašydami nė vienos kodo eilutės. Ši knyga nėra tokia. Ši knyga išmokys jus sukurti naudingesnę, visiškai pasižyminčią, funkcionuojančią ir saugią programinę įrangą nei bet kokia programinė įranga, kurią jau galite rasti, nes ji dislokuoja naujausią programinę įrangą, kuri vis dar yra prototipai, gali būti brangu, kad vyresnės įmonės veiktų mastelio srityje, ir ji nekreipia dėmesio į atgalines įmones. Jei atidžiai stebėsite šią knygą, norėsite parašyti kodą, tyrimo kodą, sukurti savo programas ir uždirbsite pinigų iš to, ką darote. Aš uždirbsiu pinigų iš šios knygos, net ir ankstyvosiose etapuose, nes joje yra informacijos, kurią reikia žmonėms, ir nori skaityti, ir jau perkate, kai jie perka ar naudojasi mano programomis. Ši knyga jums nesukurs programos, tačiau ji nurodys jus teisinga linkme ir padės jums reikiamiems įrankiams ir įgūdžiams bei patarimams, kurie palengvins jūsų sėkmę kuriant interneto programinę įrangą, su kiekviena kodo eilute, kurią turėsite rašyti kaip pavyzdį, paruoštą į programinę įrangą ir jūsų rėmėjus, svečius, draugus, šeimą, lankytojus, rangovus ir interneto žmones, kuriuos norite naudoti ir palaikykite.
Ko išmoksite: Ši knyga išmokys jus kurti ir parduoti programinę įrangą, tikrai funkcionuojančią, naudingą programinę įrangą, žiniasklaidos įrašą, saugos funkcijas, tokias kaip veido atpažinimas, mašininis skaitomas zonos brūkšninių kodų nuskaitymas, žiniatinklio API, kad būtų galima autentifikuoti, įrašyti ir pateikti vaizdo ir nuotraukas bei mainų pranešimus, tokius kaip „Bluetooth" ir „Art Field" (NFC) ryšys. Ši knyga išmokys jus naudoti tinklo kompiuterį, daugiausia Tikslai, ID nuskaitymas, vaizdo ir vaizdo įrašų mažinimas, duomenų mikrotraumai, kad jūsų programinė įranga būtų saugi, mokėjimų apdorojimas, kriptovaliutų prekyba, asinchroninės užduotys ir dar daugiau. Sužinosite, kaip sukurti savo „Bluetooth" įrenginius su baterijomis, įkrovikliais, mikrovaldikliais, grandinėmis, varikliais ir jutikliais, naudodamiesi litavimo, vielos ir 3D spausdinimo, taip pat liejamomis medžiagomis. Aš pademonstruosiu 3D dizaino principus, pritaikytus priedų gamybai ir įrankiams bei mirti, todėl galite gaminti savo įterptus, aparatūros įrenginius su integruotomis baterijomis, įkrovikliais, elektroninėmis grandinėmis ir funkcinėmis išvestimis. ir sujungti juos su „Bluetooth" ir žiniatinkliu. Tiksliau, mes išnagrinėsime du atvejų tyrimus: vibruojantį masažuoklį ir naminį šaunamąjį ginklą, abu užprogramuoti „OpenScad", kuris yra prieinamas kaip grafinė sąsaja arba komandinės eilutės programa ir gali būti integruota į žiniatinklį, kad būtų greitesni rezultatai. Išmoksite kurti ir diegti svetainę nuo pat pradžių be išankstinės patirties, padarykite ją funkcionalią, saugią, gražią, naudingą ir, svarbiausia, praktišką. Sužinosite, kaip naudoti mašinų mokymąsi ir kompiuterinį matymą, kad svetainė būtų saugi ir praktiškesnė, įrašytų vaizdo įrašas ir garso įrašas iš savo svetainės, paaukotų savo balsą, sukurtų muziką ir moduliuotų garso įrašą, kad sukurtumėte naudingus pavyzdžius ir kaip nutraukti triukšmą, naudodamiesi kitomis svetainėmis, kad sukurtumėte geriausią įmanomą svetainių tinklą, kurį galite tiesiogiai susieti su savo programine įranga ir verslu. Ši knyga labiausiai bus sutelkta į žiniasklaidos, saugumo ir mašinų mokymąsi. Ši knyga dėsto „Unix", ypač Debianą (Ubuntu), „Bash Shell", „Python", „HTML", „CSS", „JavaScript" ir daugybę naudingų programinės įrangos paketų, skirtų „Python", pavyzdžiui, užklausoms, taip pat naudingą „Bash" programinę įrangą, tokią kaip „Git" ir „FFMPEG". Aš taip pat išmokysiu jus automatiškai prekiauti kriptovaliuta ir imtis mokėjimų kriptovaliuta arba iš įprastų debeto kortelių, net mokėdamas lankytojams, jei pasirinksite tai padaryti. Aš išmokysiu jus, kaip užsidirbti pinigų iš savo svetainės, taip pat reklamuodamas, kaip paruošti jūsų programą paieškos sistemoms ir padaryti ją greitą, įvertintą pirmąjį reitingą, ko jūsų klientai ieškos, kad jus rastų, ir reitinguotų kuo daugiau įprastų paieškų. Aš išmokysiu jus parduoti savo programinę įrangą, reklamuoti ją, kreiptis į klientus, ieškančius jūsų paslaugų, ir pasidaryti sau vardą internete per jau egzistuojančias galimybes, yra nebrangūs ir gerai veikia. Aš išmokysiu jus išsaugoti duomenis apie debesų kompiuterius, kurie jums tinka ir pigiai išsaugoti jūsų duomenis, kaip suplanuoti ir sukurti svetainę, kuri daro tai, ko nori jūsų vartotojai ir ko norite, ir kaip išlaikyti vartotojus, kad jūsų svetainė būtų naudojama savo telefonams, naudodamiesi savo telefonais, pranešimais, el. Paštu, tekstiniais pranešimais, telefono skambučiais ir dar daugiau, kad jūsų vartotojai galėtų grąžinti savo svetainę į savo svetainę, kai paspaudžiate mygtuką, el. Paštu, tekstinius pranešimus, telefono skambučius. Šioje knygoje pagrindinis dėmesys bus skiriamas daugybei didelių kiekių leidybos ir platinimo praktiškumui nuo teksto iki nuotraukų iki vaizdo įrašų iki garso, padarant gerą įspūdį galutiniams vartotojams (jūsų klientams) ir parduodant save bet kokiu būdu, kurį darai, kad sukurtumėte svetainę, programą, kuri yra jūsų ir jūsų ir jūsų, jūsų programinės įrangos ir jūsų įmonės, gerai. Taip pat iš manęs sužinosite keletą patarimų ir gudrybių, pradedant kodavimo patarimais, praktiniu tuštybe, tokiomis kaip makiažas ir fotografija, modeliavimas ir vaidinimas, ir dar daugiau, kurie bus svarbūs vaizduojant save ir savo įmonę geriausioje įmanomoje šviesoje, naudodamiesi visomis jums prieinamomis priemonėmis, tuo pačiu paskirstant tiek turinį, kiek reikia, kiek jums reikia sveikoje platformų balanse, kad jūsų programinė įranga galėtų įprasti, be jokių pastangų, darbo, nei reikia, nei reikia. Ši knyga vadinama „praktiškaŽiniatinklio gilus mokymasis ir saugumas pavyzdžiu „Dėl priežasties: jame kalbama apie mokymąsi koduoti, ypač žiniatinkliui, ypač daug dėmesio Vaizdų antraštė ir kitos užduotys, tokios kaip prognozavimo metrika, gaunama iš vaizdų, pavyzdžiui, vaizdo, kaip autentiško, kompiuterio perduoto vaizdo, ar optinės kopijos (vaizdo nuotrauka ar atspausdinta nuotrauka) pobūdis, ar atspausdinta nuotrauka). Galite padaryti serverio kompiuterį, kuris yra saugus, kompiuteris, kuris paprastai paprašytų jūsų vartotojo vardą ir kodą ir prisijungtų, galbūt su kiekvieno naujo prisijungimo ar naujojo IP adreso patvirtinimo prieigos raktu, tačiau jei kuriate didelę, lengvą naudojimą, iš esmės saugią ir galingą programinę įrangą, tai gali pakakti, kad jūsų programinė įranga būtų per daug. Kiekvienas, kuris kuria nepriekaištingai saugią programinę įrangą, šiek tiek supranta, ką tai reiškia. Programinė įranga iš prigimties yra nesaugi, nes įrenginiai ir sąskaitos, kurias mes naudojame jai pasiekti, ne visada yra mūsų žinioje, jie gali būti visų, turinčių netinkamą ketinimą dėl programinės įrangos, rankose, todėl gali rizikuoti pačiai programinei įrangai. Tai yra kažkas šios knygos dėmesio. Tinklo kompiuteris pagal numatytuosius nustatymus yra užtikrintas ilgo rakto prieigos raktu, vadinamu ir SSH arba saugiu „Shell" raktu, ir kitaip yra geriausiai užtikrintas žiniatinklio serveriu, nes žiniatinklio serveris suteikia atvirą prieigą ir moderniausius saugos įrankius, veikiančius pačiame serveryje. Žiniatinklio serveris turi prieigą prie vartotojo žiniatinklio naršyklės, kuri, be abejo, yra galingiausia vartotojo įrenginio dalis, nes tai yra vieta, kur vartotojas gali pasiekti tinklo programinę įrangą. Šis įrankių rinkinys gali pateikti tekstą, matomus tinklalapius, taip pat įrašyti vaizdus, garso ir vaizdo įrašus (pvz., Veido ar būsenos ID nuotrauką), gali skaityti ir rašyti į „Bluetooth" radijo įrenginius, ir gali skaityti bei rašyti į beveik lauko perskaičiavimo žymes, nebrangias klavišus, fobs, lipdukus, žiedus ir net mikroschemų implantus su unikaliais serijiniais numeriais, kuriuos galima perskaityti ir parašyti su duomenimis, sugeneruotais ir patvirtintais duomenimis, patvirtintais ir patvirtintais duomenimis, patvirtintais ir patvirtintais duomenimis, patvirtintais ir patvirtintais duomenimis, patvirtintais ir patvirtintais duomenimis, patvirtintais ir patvirtintais duomenimis, patvirtintais ir patvirtintais duomenimis. Naudodamiesi visais turimais įrankiais, naudodamiesi šia knyga, jūs aprūpinsite save žiniomis, kad sukurtumėte saugią svetainę, ir apskritai saugią tinklo kompiuterinę sistemą, kuri jums tinka, ar jūsų siūlymas ir išvaizda bei mano, kad atrodo ir jaučiasi.
Kur pradėti: Kviečiame praleisti skyrių, kuriam pradedu šią knygą, ar bet kurį skyrių, iki tikslaus jums reikalingo kodo, ypač jei turite patirties su kodavimu anksčiau ar bet kurią iš aukščiau paminėtų įrankių, kuriuos išsamiai aprašysiu šioje knygoje, taip pat dokumentuojant naudojimo atvejus ir praktinius jų pavyzdžius. Jei neturite rašymo kodo patirties, labai rekomenduoju perskaityti visą šią knygą ir ypač rekomenduoti perskaityti ankstesnius skyrius, kad įsitikintumėte, jog ši knyga jums tinka. Jei ši knyga jums netinka, apsvarstykite galimybę ją dovanoti draugui ar giminaičiui, kuris gali būti suinteresuotas patys sužinoti apie interneto plėtrą ir netgi apsvarstykite galimybę jį skolintis ir mokytis iš jų, kad užpildytumėte spragas, kur aš nepavyko tavęs, kaip mokytojo, ar kiti mokytojai. Pradėkite ten, kur norėsite, kiekviena šios knygos dalis bus naudinga, jei ketinate sukurti naudingą programą, ir apsvarstykite, kad geriausios programos yra sukurtos atsižvelgiant į galutinį vartotoją: Pažinkite savo klientą. Dabar jūs mane pažįstate, žinote šią knygą ir esate pasirengęs pradėti. Norėdami pradėti, paimkite kompiuterį (net pigiausią nešiojamąjį kompiuterį iš dėžutės parduotuvės, „Amazon" ar senų darbalaukio darbų ir nustatykite jį taip, kaip jums tinka.
Kaip perskaityti šią knygą: Paryškintas tekstas pažymi, kad tekstas priklauso komandų eilutei, kur parašysite jūsų naudojamą kodą. Komandų eilutė yra labai orientuota į klaviatūrą ir reikalauja mažai spustelėjimų, nes greitėja jūsų darbo eiga ir palengvina viską.
Pradėjimas: Pasinerkime. Pradėsime nuo statybos kodekso vietiniame kompiuteryje ir pradėsime nesukurdami svetainės, prijungtos prie interneto. Pradėti tai saugiau, nieko nekainuoja ir jums lengva. Priklausomai nuo jūsų operacinės sistemos, patekimas į „Bash" apvalkalą bus šiek tiek kitoks. „Mac OS" šiuo metu rekomenduoju įdiegti virtualią mašiną, nes gausite daugiausiai suderinamumo su virtualia mašina. Įvairūs tiekėjai, tokie kaip „VirtualBox" ir „Paralells", gali paleisti jums virtualią mašiną, nors taip pat įmanoma įdiegti „Ubuntu" tiesiai į mašiną, jei norite naudoti vietinę aplinką, kuri rekomenduojama sukurti greitą, supaprastintą patirtį. Jei naudojate „Linux" ar „Windows", kuriuos rekomenduoju, turėtų būti gana lengva sukurti projektą. Atidarykite savo terminalą, sureguliuokite dydį, kaip jums atrodo tinkama, ir pradėkite atlikti 2 veiksmą. Jei naudojate „Windows", atlikite 1 veiksmą.
1 žingsnis: - Tik „Windows" vartotojai „Windows" atidarykite komandų eilutę kaip administratorių ir tipas WSL - įdiegta
2 veiksmas: - Tęskite čia arba praleiskite 1 veiksmą čia, jei nenaudojate „Windows" Atvirame terminale (priklausomai nuo jūsų OS, vadinama „Ubuntu" „Windows", „Terminal" „Mac" ar „Linux" ar panašiu pavadinimu), pradėkite nuo projekto sukūrimo. Mes tai darome naudodamiesi „MkDir" komanda, kuri sukuria katalogą. Jei jums reikia sukurti katalogą savo projektui saugoti, o tai yra rekomenduojama, naudokite komandą CD, kad pakeistumėte į katalogą ir ir ir
CD/kelias/į/katalogą - kelias yra aplankai (failai), kurie yra prieš jūsų paskirties katalogą, jūsų numatytasis kelias yra ~ arba/namų/vartotojo vardas (kur vartotojo vardas yra jūsų vartotojo vardas). Norėdami pakeisti numatytąjį katalogą, įveskite CD arba CD ~ „MkDir" pavyzdys - pakeiskite „pavyzdį" į katalogo pavadinimą
Dabar turite savo projekto darbo katalogą. Būti taip svarbu, kad šis katalogas būtų išsaugotas tuo atveju, jei jums reikės pereiti prie kitokio kompiuterio arba įdiegti jūsų parašytą kodą, kad jis būtų paruoštas žiniatinkliui, mes sukursime scenarijų, kad galėtumėte sukurti jūsų katalogo atsarginę kopiją keliais keliais veiksmais. Tačiau scenarijaus kūrimas užtrunka šiek tiek kodo, o kodas turi būti automatizuotas, kad būtų kuo naudingiau. Taigi sukurkime scenarijų, kad pirmiausia sukurtume scenarijus. Pradėkime kurdami scenarijų ir padarykite jį vykdomą. Tam naudosime sudo, CHMOD ir paliesime, ir pavadinsime scenarijų „Ascript".
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Dabar mes sukūrėme scenarijų, padarėme jį vykdomą ir esame pasirengę jį redaguoti. „Nano" yra teksto redaktorius, kuris leis jums redaguoti tekstą nespaudus, o tai yra daug lengviau nei naudojant grafinę vartotojo sąsają. Norėdami redaguoti failą su „Nano", naudokite „Nano" ir tada kelią į failą. Norėdami sukurti scenarijų, kuriame yra scenarijus, jis yra gana panašus į mūsų scenarijaus sukūrimą. Mes naudosime tą patį kodą, kaip ir aukščiau, pakeisime scenarijaus pavadinimą, „Ascript" su argumento parametru, 1 USD. Tai leidžia mums paskambinti scenarijumi įvesdami tiesiog sudo ascript Newscript, tada mes galime sukurti bet kokį naują scenarijų pakeisdami „Newscript" jūsų scenarijaus pavadinimu. „Nano" kodas turėtų atrodyti taip:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
Norėdami uždaryti „Nano", mes galime laikyti valdymo klavišą ir paspausti X, tada y norėdami pažymėti, kad išsaugome failą, ir paspausti grąžinimą. Dabar, užuot įvedę šias tris komandas, norėdami redaguoti scenarijų, galėsime įvesti sudo ascript Ascript, kad dar kartą redaguotume scenarijų. Tai veikia! Ir bet kurį naują scenarijų galima lengvai paleisti paskambinus į apvalkalą. Išsaugokime mūsų darbą dabar: parašykime atsarginį scenarijų, kad išsaugotume mūsų naują scenarijų ir sukurtume atsarginę jo projekto kataloge, taip pat atsarginę atsarginę scenarijų.
sudo ascript backup
Dabar, nano:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Kur/kelias/į/katalogą yra kelias į projektą, kurį sukūrėte naudojant „Mkdir". Vėliau mes išmoksime nukopijuoti tokius pakartotinius kelius su kilpa ir sąrašu, kuris yra mažiau kodo, tačiau kol kas leiskime tai paprastai ir turėkime keletą eilučių. Norėdami paleisti šį scenarijų ir sukurti savo kodą, išsaugokite failą „Nano" su „Control+X" ir „Grįžkite" ir įveskite žemiau pateiktą apvalkalą
backup
Jei jums bus paragintas slaptažodžio skaitydami šią knygą ir sekdami apvalkale, tinkamai įveskite savo vartotojo slaptažodį, prieš jums reikės iš naujo paleisti komandą, turėsite tris bandymus. Norėdami pakartoti komandas ir jas redaguoti, galite naudoti rodykles aukštyn ir žemyn, jei jums reikia bet ko paleisti du kartus. Prieš redaguodami komandą su dešine, kairiuoju rodyklėmis ir ištrinkite klavišą, taip pat klaviatūrą, ir paleisdami ją su grąžinimu, paspauskite aukštyn ir žemyn.
Sveikiname! Jums pavyko sukurti nuostabų atsarginį scenarijų, kuris jūsų darbo kataloge palaiko du svarbius „Shell" scenarijus. Mes galime viską perkelti vėliau, nes projektas tampa vis didesnis, tačiau kol kas tai veikia. Pereikime prie atsarginės kopijos debesyje, tam naudosime „GitHub" (nors yra daugybė kitų atsarginių kopijų „GIT" sprendimų, jie yra maždaug vienodi.) „Git" yra „Verision Control" programinė įranga, leidžianti kurti savo programinės įrangos redagavimą, nes jūs pateksite į serverį, taip pat suteikiant galimybę atsisiųsti ištisą programinės įrangos kopijas už slaptažodžio ar rakto. Išsaugoti jūsų programinę įrangą, ypač kai mes migruojame į saugius „Linux" egzempliorius, kurie kartais nutrūksta, kai nepavyksta vienai kodo eilutei, palikdami jus užrakinti, o jūsų kodas gali būti neatsiejamas nuo atsarginių kopijų, jei negausite galimybės ją automatiškai sukurti, kurią mes apimsime.
Jei šiuo metu dar nenaudojate „Ubuntu" virtualios mašinos, šiuo metu rekomenduoju naudodamas „Ubuntu" virtualią mašiną, nes tai palengvins jūsų gyvenimą, kai įdiegsite visus paketus, reikalingus norint sukurti veikiančią svetainę ir atlikti giliųjų mokymosi operacijas jūsų kompiuteryje. Artimiausiu metu kodą perkelsime į žiniatinklio serverį, tačiau norime įsitikinti, kad už mūsų žiniatinklio serverio yra bent keli saugumo sluoksniai, kurie yra atsparūs sukčiavimui, ir naudoti keletą „Linux" paketų. Jei vis dar norite naudoti „Mac OS", kviečiame ieškoti ir įdiegti reikiamus paketus internete, tačiau kiekvienam pakuotei gali būti ne alternatyvos šioje knygoje ar serijoje.
Pridėkime keletą komandų, kad padarytume savo darbą su atsarginiu scenarijumi, paleisdami komandą sudo ascript atsarginę kopiją.
# …
Dar kartą valdykite X, kad išsaugotumėte.
Dabar turime atlikti šiek tiek laiko šio projekto konfigūracijai. Kadangi tai netrukus bus „Git" projektas, mums nereikia rašyti kiekvienos komandos kiekvieną kartą, kai dislokuosime iš „Git" saugyklos, tačiau mes tai pakabinsime, kai rašysime savo diegimo scenarijus. Norėdami pradėti, įsitikinkime, kad esame tinkamame kataloge, inicijuojame „Git" saugyklą ir sugeneruokite SSH raktus.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Po to, kai įvesime „Ssh-Keygen", naujasis raktas turėtų būti išsaugotas namų aplanke, esančiame aplanke, vadinamame .ssh. Jis vadinamas id_rsa.pub. Raskime šį raktą ir nukopijuokime. Tai pamatyti,
cd ~
cat .ssh/id_rsa.pub
Nukopijuokite tekstą, kurį grąžina paskutinė komanda, ir prieš pridėdami SSH klavišą prie savo paskyros, sukurkite paskyrą su savo „Git" teikėju (idealiu atveju). Kai turėsite paskyrą, spustelėkite viršutinį dešinįjį meniu ir įveskite nustatymus, prieš pridėdami SSH klavišą SSH ir GPG klavišus, esančius meniu. Pasirinkite Pridėti SSH klavišą ir pridėkite savo, įklijuodami jį ir suteikdami pavadinimą, prieš taupydami ir grįžtant į „GitHub", kad sukurtumėte naują saugyklą. Tai panašu į kitus GIT teikėjus, jums reikės perskaityti jų dokumentaciją. Naujoje saugyklos konfigūracijoje suteikite savo saugyklą aprašomąjį pavadinimą ir nuspręskite, ar norite ją paskelbti, ir būtinai sukonfigūruosite dar nėra failų įtraukimo. Sukūrę saugyklą, nukopijuokite kloną naudodami SSH URL ir įklijuokite jį į šią komandą.
git remote add git://… (your remote URL)
Dabar galite pereiti prie savo saugyklos naudodami kompaktinį diską, su tuo susipažinsite. Išbandykite atsarginį scenarijų dabar naudodami atsarginę kopiją
Puiku! Dabar mes tikrai galime gauti kodavimą. Įdiekime „Django" dabar, kai gerai suprasime „Bash" ir „Git". „Django" leis mums automatiškai sukurti savo programinę įrangą, „Bash" taip pat gali tai padaryti, tačiau „Django" turėtų būti paprastesnis saugesnis įgyvendinimas (ją galima išjungti ir lengviau sukonfigūruoti).
Norėdami įdiegti programinę įrangą „Ubuntu", naudosime komandą sudo apt-get. Pirmiausia atnaujinkime ir atnaujinkime ir atnaujinkime mūsų jau turimą programinę įrangą. Tai galima padaryti naudojant sudo apt-get atnaujinimą ir sudo apt-get atnaujinimą -y. Toliau įdiekime „Python" ir mūsų virtualią aplinką, mūsų kodo namus su šia komanda: sudo apt-get diegti „Python-IS-Python3 Python3-Venv"
Tai yra viskas, ko jums reikia norint pasiekti „Django", kalbant apie programinės įrangos diegimus „Ubuntu" egzemplioriuje. „Windows" ir „Linux" tai turėtų būti gana paprasta, tačiau „Mac" galbūt norėsite joje įdiegti virtualią mašiną ir „Linux" naudodami nemokamą ar mokamą virtualią aplinką, tokią kaip „VirtualBox" ar „Paralells" darbalaukis, ir atkurti aukščiau pateiktus veiksmus, kad būtų galima nustatyti „Ubuntu" aplinką. Šiuo atveju „Ubuntu" yra labai svarbus, nes tai yra programinė įranga, kurią naudoja svetainės, ir ji leidžia jiems priglobti svetaines su visa aukščiau minėta programine įranga.
Pasinerkime į djangą.
Mūsų kataloge vėl su kompaktiniu disku:
python -m venv venv # Sukuria virtualią aplinką, kurioje kodas saugomas
source venv/bin/activate # Suaktyvina virtualią aplinką
django-admin startproject mysite . # Kur „MySite" yra projektas, kurį pradedu savo dabartiniame kataloge.
„Django" tik pradeda mus pradėti, nes „Django" priglobia žiniatinklio serverį ir daro viską, ko mums reikia, kad gautume pagrindinę vietinę svetainę. Dabar, kai mes įdiegėme „Django", šiek tiek redaguokime nustatymus, kad jis veiktų taip, kaip mums reikia. Pirmiausia sukurkime naują programą
python manage.py startapp feed
Pastebėsite, kad pirmoji programa vadinama „Feed". Programa turėtų būti vadinama viskuo, kas jums patinka, ir mes sukursime naujas programas, tačiau kiekvienos programos pavadinimas turi būti nuoseklus kiekvieną kartą, kai programa nurodoma kode. Norėdami pridėti naują programą, mes visada redaguosime „Settings.py" kitame kataloge, kurią sukurta programa, pavadinta „StartProject", toliau. Naudojant nano,
nano app/settings.py
Nustatymuose raskite „Installed_apps" ir atskirkite [] į 3 eilutes. Naudodami keturias erdves tuščioje centrinėje linijoje, pridėkite „TEOKIA" arba savo programos pavadinimą. Šis nustatymų skyrius.py turėtų atrodyti taip:
INSTALLED_APPS = [
'feed',
]
Prieš pamiršdami, išbandykime, kad Django veikia. Naudodami komandą „Python Manage.py Runserver 0.0.0.0:8000", mes galime paleisti serverį ir tada naršyti žiniatinklio naršyklėje kompiuteryje, kuriame kodas veikia į http: // localhost: 8000 ir pamatyti pavyzdį tinklalapyje (jis veikia!), Nutraukite serverį su valdymu C, kaip ir bet kuri kita komanda.
Dabar įsigilinsime į „Python" kodą. „Django" turi tris pagrindinius komponentus, kuriuos jie visiškai valdo pagal kodą. Komponentai vadinami modeliu, rodiniais ir šablonu, o kiekvienas yra atitinkamai aukštesnio ir žemesnio lygio, prieš pateikiant tinklalapį vartotojui.
Modelis yra kodas, kuriame saugoma informacija duomenų bazėje, skirtoje gavimo, rūšiavimo ir perteikimui.
Vaizdas nusprendžia, kaip modelis pateikiamas, manipuliuojamas ir modifikuotas, beveik kiekvienas vaizdas tiesiogiai naudos modelį.
Šablonas yra HTML kodas su keletu papildomų varpų ir švilpukų, vadinamų šablono kalba. Šabloną pateikia vaizdas, kuriame jis užpildytas „Python" kodu ir kontekstu, tokiu kaip modeliai ir informacija (USUALL eilutės ir sveikieji skaičiai).
„Django" turi ir kitų komponentų, įskaitant, bet neapsiribojant::
Nustatymai, kurie sukonfigūruoja programą, kaip aptarėme.
URL, tai yra modeliai, kuriuos vartotojas seka norėdamas patekti į konkrečias žiniatinklio programos dalis.
Formos, apibrėžiančios, kaip informacija, siunčiama į serverį, yra tvarkoma ir pateikiama duomenų bazei, taip pat vartotojui. Tai yra informacijos apdorojimo serverio pusėje pagrindas ir gali priimti bet kokio tipo informaciją, kurią kompiuteriai saugo, ypač teksto eilutės, numeriai ir tikri/klaidingi loginiai (paprastai žymimieji langeliai).
Šablonai, kurie yra HTML kodas ir šablonų kalba, ir užpildo atotrūkį tarp „Python" ir HTML, tai reiškia, kad „Python" informacija gali būti naudojama kaip HTML kodas, kurį kiekvienas gali pasiekti, ir gali apsaugoti svetainę su ribota prieiga, tuo pačiu padarant „Python" kodą prieinamą žiniatinkliui ir naudingas įvairiems nuotoliniam įrenginiui, kuriai nereikia prie serverio.
Statiniai failai, kurie paprastai yra „JavaScript", ir tai bibliotekos, kurias serveris aptarnauja ir yra susietos su šablonu.
„Media Fails", kuriems serveris aptarnauja arba yra išorėje, arba tiesiog parašyti serveriui prieš apdorojant ir paskelbus kitam serveriui (kibirui) priegloba.
Tarpinė programinė įranga, kuri yra kodo dalis, vykdoma tuo pačiu metu kaip ir kiekvienas vaizdas ir laikomas „įtrauktu" į vaizdą.
Konteksto procesoriai, kurie apdoroja kiekvieno rodinio kontekstą ir yra naudojami pridedant papildomą kontekstą.
Testai, patvirtinantys, kad vartotojas ar užklausa atitinka tam tikrus reikalavimus prieš pateikiant rodinį.
Vartotojai, kurie diktuoja, kaip „WebSockets" elgiasi ir reaguoja į komunikaciją.
„Admin", kuris naudojamas registruoti modelius, kad juos būtų galima išsamiai manipuliuoti „Django" administratoriaus puslapyje, kur duomenų bazę galima administruoti per grafinę sąsają.
Salierai, apibrėžiantys asinchronines užduotis „Django" kodo dalis, gali būti pradėtos veikti prieš iškart pereinant prie kitos užduoties ar kodo eilutės.
„Django" gali turėti daugybę kitų komponentų, kuriuos čia išsamiai aptarsime. Yra daugybė būdų, kaip „Django" padaryti funkcionaliau, pridedant „WebSockets", kurie yra greiti, supaprastinti komunikacijos kanalai, salierai, vykdantys asinchronines užduotis, ir daugybę kitų programinės įrangos elementų, skirtų išplėsti „Django", ypač peržiūros funkcijas, kur vykdoma didžioji dalis kodo. Peržiūros funkcijos yra pagrindinės, nes paprastai jos deklaruoja kiekvieną kodą, būdingą konkrečiam URL modeliui, arba serverio skyrių.
Pirmiausia tyrinėkime peržiūros funkcijas. Peržiūros funkcijos prasideda nuo importo, nurodančio kodą, kuris bus naudojamas rodinyje, ir yra apibrėžtos naudojant įprastas funkcijų apibrėžimus arba klases. Paprasčiausius vaizdus apibūdinami funkcijos apibrėžimas def ir grąžina httpresponsą su pagrindiniu šablonu. Pradėkime apibrėždami pagrindinį vaizdą, kad grąžintume tekstą „Sveikas pasaulis". Atminkite, kad kiekvieną kartą pridedant kodą po tokio teiginio kaip DEF, jei, o ne, ir tt, turėsite pridėti 4 tarpus kiekvienam iš pirmųjų apibrėžimų, kuriuos norėtumėte pritaikyti savo funkcijai. Greitai įsitrauksime į tai, ką kiekvienas iš šių reiškia.
Iš mūsų svetainės katalogo redaguokite „Feed/Views.py" failą naudodami „Nano" ir pridėkite šias eilutes prie failo pabaigos.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
„Django" httpresponse reaguoja teksto eilute, pažymėta atidarymu ir uždarymu ". Kiekvieną kartą perduodant informaciją funkcijai ar klasei, pavyzdžiui, užklausai ar eilutei, turėsite naudoti skliausteliuose (, atidarymo ir uždarymo).
Tai dar ne viskas, ko mums dar reikia pamatyti savo požiūrį. Žinoma, mes nesakėme serveriui, kur vaizdas yra tiksliai, vis tiek turime apibrėžti kelią, kuriuo turėtų pateikti vaizdas. Pradėkime apibrėždami pagrindinį kelią programoje/urls.py, ir mes vėliau pateksime į kelių grupes.
„App/urls.py" pridėkite eilutę po importavimo teiginių po pradžios importuojant ką tik sukurtą vaizdą.
from feed import views as feed_views
Dabar apibrėžkime rodinio modelį. Vaizdo modeliai turi tris komponentus - kelio komponentą, kuris nurodo serveriui, kuriame vaizdas egzistuoja serverio metu (URL kelias, kurį vartotojas įveda į naršymo juostą, kad patektų į tinklalapį), rodinio komponentas, kuriame vaizdas nurodomas, ir draugiškas vaizdas, jei reikia, kad būtų galima gauti erdvę kitam vaizdui, kad būtų galima pamatyti kitą, kad būtų galima pamatyti kitą. Prasminga daryti dalykus tokiu būdu ir būti lankstus, nes jūsų kodinė bazė bus nuolat kintanti aplinka, kuriai reikia lankstumo ir improvizacijos, kad ji būtų vertinga ir lengvai dirbama. Štai kaip atrodys jūsų vaizdas, galite tai pridėti prie urlpatterns = [App/urls.py skyrius. Vaizdo modelis apibrėžtas trimis aukščiau aprašytais komponentais ir funkcija, vadinama keliu. Jūsų URL modeliai yra sąrašas, todėl būtinai visada baigkite kiekvieną elementą juose su kableliu, nes tai skiria kiekvieną. Kiekvienas elementas taip pat turėtų eiti nauja eilute, dar kartą su keturiomis vietomis prieš ją, kaip ir programa „Nustatymuose.py". Mes apibrėžsime pirmąjį rodinio komponentą su tuščios eilutės funkcija, kad sukurtume vaizdą, kuris veikia žiniatinklio serverio šakniniame kataloge. Jūsų URLS.Py dabar turėtų atrodyti taip:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
Tai yra pagrindas sukurti svetainę su „Django", kuri yra visiškai statiška. Norėdami sukurti dinamiškesnę svetainę, kurioje galime pradėti talpinti talpyklos informaciją, pavyzdžiui, vaizdus, vaizdo įrašus, garso įrašą ir dar daugiau, turėsime naudoti modelius, kuriuos tyrinėsime toliau. Kol kas patikrinkite mūsų kodą ir paleiskite serverį. Norėdami patikrinti kodą, ar nėra klaidų, paleiskite:
python manage.py check
Jei yra kokių nors klaidų pranešimų, turėtumėte atidžiai peržiūrėti jūsų atliktus pakeitimus ir sužinoti, ar yra kažkas, ką reikia ištaisyti, pavyzdžiui, pašalinės ar trūksta vietos, papildomo personažo, neuždengtos eilutės, bet kokio tipo, bet kokio netyčia ištrinto simbolio ar ko nors kito. Perskaičius klaidos pranešimą (jei jį turite), turėtumėte pamatyti kelią į sukurtą ar redaguotą failą kartu su eilutės numeriu, todėl pažvelkite į tą failą ir eilutę ir pažiūrėkite, ar galite ištaisyti ką nors, kas yra. Jei išsprendėte problemą, paleiskite aukščiau pateiktą komandą. Kai jūsų programinė įranga yra pasirengusi paleisti ir veikia, pamatysite išvestį „Sistemos patikrinimas nustatė jokių problemų". Dabar esate pasirengęs eiti. Paleiskite serverį:
python manage.py runserver 0.0.0.0:8000
Dabar atidarykite žiniatinklio naršyklę ir eikite į http: // localhost: 8000. Jūsų vaizde turėtumėte pamatyti tekstą, grąžintą skliausteliuose ir HttPresponse funkcijos citatose. Tai tik pagrindinis pavyzdys, tačiau jei jūs tai padarėte iki šiol, suprantate, kaip „Linux", „Bash", „Python" ir „Django" veikia pagrindai. Pasinaudokime gilintis į kai kuriuos duomenų bazių modeliavimą ir ištirkime „Python" klasės galią saugant informaciją. Tada mes pradėsime sugriebti HTML ir CSS, prieš pradėdami savo svetainę visiškai pasižymi, lanksčia ir saugi, naudodami „JavaScript" ir „Machine Learning".
Klasės saugomos jūsų programos modeliuose.py. Naudodamiesi „Nano", redaguokite programą/modelius.py ir pridėkite naują klasę. Klasė yra apibrėžta pagal klasės apibrėžimą ir perduodama super klasei, iš kurios ji paveldi, šiuo atveju modeliais.Model. Klasės pavadinimas atsiranda po klasės apibrėžimo, o po klasės apibrėžimo a: (storosios žarnos), prieš tai, kai su klase susieti atributai ir funkcijos apibrėžimai žymimi žemiau. Mūsų klasei reikalingas ID, kurį galime naudoti norėdami jį nuskaityti ir išlaikyti unikalų, taip pat reikia teksto lauko, kad būtų galima išsaugoti tam tikrą informaciją. Vėliau galime pridėti laiko žymos, failų, loginių gyventojų (teisingų ar klaidingų apibrėžimų, kurie gali padėti mūsų kodui priimti sprendimus, ką daryti su modeliu, ir gali būti naudojami jį rūšiuoti), egzempliorių, kad modelis susietų su vartotojo, prisijungusio prie serverio, ir dar daugiau. Išpakuokime žemiau pateiktą kodą:
from django.db import models # Importas, naudojamas apibrėžti mūsų klasę, ir jo atributai
class Post(models.Model): # Pačios mūsų klasės apibrėžimas
id = models.AutoField(primary_key=True) # Mūsų modelio ID, automatiškai sugeneruotas raktas, kuris leis mums užklausti modelį, išlaikyti jį unikalų ir yra naudingas, kai mums reikia bendrauti su modeliu, kai jis bus sukurtas.
text = models.TextField(default='') # Mūsų klasės parduotuvių atributas šiuo atveju šiek tiek teksto, numatytas iki tuščios eilutės.
Uždarykite ir išsaugokite failą, kaip mes darėme anksčiau, kad baigtume.
Yra daugybė kitų sričių ir parinkčių, kurias tyrinėsime, kai atnaujinsime šią klasę, kai vystosi mūsų programa, tačiau tai yra pagrindiniai poreikiai sukurti programą, kad būtų galima paskelbti tekstą. Tačiau šis modelis neveiks vienas. Kaip aprašyta anksčiau, mums reikės pasirinktinio rodinio ir pasirinktinio URL modelio, kad šis modelis veiktų, taip pat reikės formos kartu su šablonu. Pirmiausia ištirkime formą.
Norėdami apibrėžti formą, redaguokite programą/forms.py su nano ir pridėkite šias eilutes. Mums reikės dviejų importo, mūsų formų klasė, taip pat mūsų sukurtas modelis („Feed.models.post"), klasės apibrėžimas, panašus į modelį, ir laukas kartu su poklasiu, vadinamu meta, kuris apibrėžs modelį, su kuriuo formuojama formą. Forma taip pat gali turėti inicijavimo funkciją, kuri ją nustato remiantis informacija užklausoje, modelyje ar kitaip, mes tai ištirsime vėliau.
Modelio formos yra tokios naudingos, nes jos gali sukurti modelį arba taip pat redaguoti modelį, todėl mes jas naudosime abiem. Apibrėžkime vieną forma.py žemiau.
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',)
Tai yra pagrindai, kaip atrodo forma ir modelis. Ši modelio forma gali būti naudojama norint nustatyti ar redaguoti įrašą, pakeičiant jį esantį tekstą. Pažvelgsime į šios formos integravimą į kitą vaizdą. Pirmiausia padarykime perkėlimą ir perkelkime duomenų bazę, kad mūsų kodas galėtų sąveikauti su modeliu, kai jis veikia. Norėdami tai padaryti, vykdykite šias komandas:
python manage.py makemigrations
python manage.py migrate
Tai užtruks minutę, tačiau tai padarys, tai leis jums pasiekti modelį rodiniuose, tarpinės programinės įrangos ar bet kur kitur programinėje įrangoje. Tęskime vaizdą, kuriame galime pamatyti savo modelį. Redaguoti kanalą/vaizdą.py ir pridėkite šį kodą, kaip pažymėta. Jums nieko nereikės pridėti po # ženklo, tas kodas yra komentarai, kurie naudojami žymėti informaciją apie kodą. Pradėsime importuodami savo modelį rodiniuose ir pridėsime jį prie konteksto, kuriame galime jį pateikti šablone kaip ekrano sąrašą. Toliau pridėsime šabloną, kuriame galėtume pateikti formą ir modelį mygtuku, kad sukurtume naują objektą, pagrįstą modeliu, ir paskelbti jį serveriui. Tai skamba sudėtingai, todėl tiesiog ženkime tai žingsnis po žingsnio. Prieš baigdami vaizdą, sukurkime šabloną, kuris tiesiog pateikia modelį ir įsitikinkite, kad galime jį pamatyti sukūrę naują įrašą apvalkale. Štai kaip turėtų atrodyti tas vaizdas:
posts = Post.objects.all() # Klauskite visų duomenų bazės įrašų iki šiol
Visa tai atrodo gana paprasta, kol pateksime į dugną. Pateikite, vertė, kurią funkcija grąžina, o ne atsakyme HTTP, kaip ir ankstesniame pavyzdyje, visada priima užklausą kaip pirmąją įvestį, priima kontekstą (šiuo atveju įrašai duomenų bazėje), kuriuos dabar galima pateikti šablone, ir grąžina šabloną, apibrėžtą funkcijoje. Šablonas bus HTML dokumentas su trupučiu kalbos, vadinamos jinja2, kuri paverčia „Python" informaciją į HTML.
Norėdami pradėti kurti šablonus, padėkite du katalogus.
mkdir feed/templates
mkdir feed/templates/feed
Tada redaguokite aukščiau esančiame kataloge, tiekimo/šablonus/tiekimą ir pridėkite šio pavyzdžio kodą. Pažvelkime į šio pavyzdžio šabloną.
Tai labai paprastas šablonas. Tai apibrėžia HTML žymų atidarymo ir uždarymo ir uždarymo, dokumento tipo žymą, kūno žymę su legendos pavadinimu, pertraukos žyma, pridedanti mažą eilutę per ekraną, ir a ciklui, kuris kiekvienam įrašui pateikia įrašų sąrašą kaip šablono pastraipą. Tai viskas, ko reikia pranešimams pateikti, tačiau dar nėra duomenų bazėje. Sukurkime keletą su apvalkalu. Mes galime paleisti apvalkalą su „Manage.py"
python manage.py shell
Dabar importuokime mūsų pašto modelį
from feed.models import Post
Toliau sukursime paprastą įrašą su eilute ir išvažiuosime iš apvalkalo. Eilutė gali būti bet kas, kol tai galiojantis tekstas.
Post.objects.create(text='hello world')
exit()
Galiausiai mums reikės pridėti URL modelį prie savo kanalo. Kadangi mūsų kanalo programoje bus naudojami keli URL ir mes norime, kad failų dydžiai būtų maži, sukurkime vietinį URLS.Py mūsų kanalo programoje, kuri atrodo taip:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
Taip pat turėsime redaguoti urls.py bazinėje programoje, kad ir ką nusprendėme ją pavadinti, tai buvo pirmasis mūsų sukurtas katalogas. Redaguoti programą/app.py ir pridėkite šiuos URL modelius
from django.urls import include # viršuje
# ... Ankstesnis kodas čia
Dabar, kai paleisime serverį su „Python Manage.py Runserver", pamatysime mūsų sukurtą puslapį, nes turime modelį, vaizdą ir šabloną bei URL modelį, taip pat elementus duomenų bazėje. Toliau įgyvendinkime savo sukurtą formą ir pradėkime kurti savo įrašus. Bet prieš rašydami per daug kodo, padarykime atsarginę kopiją naudodami scenarijų, kurį parašėme anksčiau, atsarginę kopiją. Paleiskite šį scenarijų apvalkale, palaukite keletą akimirkų, ir visas kodas bus paremtas mūsų „Git" saugykla.
backup
Formos įgyvendinimas yra gana paprastas. Mes importuosime savo formą, pridėsime „Post" užklausos tvarkyklę į rodinį ir išsaugosime įrašą duomenų bazėje prieš nukreipdami į tą patį rodinį. Mes galime naudoti peradresavimo funkciją, kurią jau importuojame, ir dar vieną funkciją, vadinamą atvirkštine, kad gautume rodinio modelio URL. Mes užklaussime tai su eilute „Feed: Feed", nes įtraukto modelio vardų sritis yra tiekimas, o vaizdas taip pat vadinamas tiekimu.
posts = Post.objects.all() # Klauskite visų duomenų bazės įrašų iki šiol
if request.method == 'POST': # Tvarkykite įrašo užklausą
form = PostForm(request.POST) # Sukurkite formos egzempliorių ir išsaugokite jį
if form.is_valid(): # Patvirtinkite formą
form.save() # Išsaugokite naują objektą
return redirect(reverse('feed:feed')) # Peradresuokite į tą patį URL su GET užklausa
'form': PostForm(), # Įsitikinkite, kad perduokite formą į kontekstą, kad galėtume ją pateikti.
Dabar turėsime atnaujinti šabloną, kad būtų atsižvelgta į naują formą. Tai galime padaryti naudodamiesi
Suskirstykime tai. Yra nauja formos klasė, žetonas, pati forma ir mygtukas „Pateikti". Gana paprasta, bet kai pažvelgsime į tai, galbūt norėsime, kad jis atrodytų geriau. Tai veikia, mes galime paskelbti naujus įrašus su forma ir jie dabar išsaugomi duomenų bazėje. Čia vyksta keli dalykai. Mes naudojame HTML žymes, kad pareikštume, kad dokumentas yra HTML dokumentas, mes naudojame šablono žymą ({ %… %}), kad pateiktume formą, o kitą - {{…}}, kad forma būtų. Mes taip pat turime kilpą, kad tekstas būtų pateiktas naudojant blokų žymes ir šablono žymą. Blokų žymos yra tikrai svarbios, nes galime apibrėžti, kaip su jais pateikiamos šablono skyriai, o šablono žymos yra pagrindas, kaip mes įdedame kintamuosius į savo kodą.
Dabar turime padaryti mūsų programą geriau, nes kol kas ji atrodo tikrai paprasta. Tai galime padaryti naudodami CSS, įterptą arba klasėse, susietose su kiekvienu dokumento objektu. CSS yra tikrai gražus, nes jis sako viską puslapyje, kaip ji turėtų atrodyti, ir gali priversti jį atrodyti tikrai gerai. Yra keletas bibliotekų, kurios gali tai padaryti, tačiau mano asmeninis dalykas yra „Bootstrap".
„Bootstrap" galima atsisiųsti iš jų svetainės,getBootstrap.com/. Patekę į ten, paspauskite mygtuką, kad perskaitytumėte diegimo dokumentus, ir nukopijuokite kodą iš „Inclual" per CDN skyrių. Šį kodą jums reikės HTML dokumento viršuje, žymoje, vadinamoje galvute. Be to, eikime į priekį ir sukurkime pagrindinį šabloną, kad mums nereikėtų atkurti šių nuorodų kiekviename šablone.
Sukurkite naują katalogą, vadinamą šablonais su MKDIR šablonais, tada redaguokite šablonus/bazę.html.
Tai turėtų atrodyti taip:
Įsitikinkite, kad nukopijuokite CSS ir „JavaScript", .CSS ir .JS failus, nes mums reikės „JavaScript", kad mūsų svetainė ateityje taptų funkcionaliau.
Dabar grįžkime prie „Bash" apvalkalo ir paleisime greitą komandą. Atminkite, kad jei jums kada nors reikia pasiekti virtualią aplinką, įveskite šaltinį VENV/BIN/ACTION. Tai leis jums įdiegti „Python" paketus vietoje taip, kad „Django" galėtų juos pasiekti. Norėdami suteikti mūsų formas, kurias sukuria „Django Bootstrap" klasės, mes naudosime „Python" paketą, pavadintą „Crispy Forms". Mes galime tai atsisiųsti naudodami šią komandą
pip install django-crispy-forms
Įdiegę tai, pridėkite jį prie nustatymų.py
# … Ankstesnis kodas čia
Dabar, grįžę į mūsų pašarų šabloną, galime pašalinti kai kuriuos dalykus. Pašalinkime dokumento pradžią ir pabaigą ir pakeisime jį paveldėjimo iš mūsų bazinio šablono, naudodamiesi pratęsimu ir bloko apibrėžimu. Be to, prie formos pridėsime šablono filtro importą su apkrovos ir šablono filtru. Galiausiai pridėkime į „Bootstrap" klasę prie formos mygtuko, kad jis atrodytų labiau kaip mygtukas. Tai turėtų atrodyti taip:
Gražu! Tai jau gana daug kodo. Toliau turėtume tai išbandyti ir įsitikinti, kad matome, kad viskas atrodo gražiai, taip pat įsitikinkite, kad viskas veikia tinkamai. Paleiskite serverį pagal ankstesnes instrukcijas ir įsitikinkite, kad svetainė atrodo ir veikia gerai. Puikus darbas! Jūs esate pasirengęs pereiti prie kito veiksmo, kuriame pridėsime vartotojo prisijungimo funkcijas naudodami panašius URL, formas, rodinius ir šablonus. Bazinis šablonas yra svarbus, ir mes toliau jį modifikuosime ir atliksime pakeitimus, jei reikia, tačiau kol kas susitelkime į tai, kad mūsų svetainė būtų saugesnė, leisdami vartotojams prisijungti naudodami vartotojo vardą ir kodą, ir galiausiai dar svarbesnę informaciją, kuri padės užtikrinti jūsų programą saugią ir jūsų sąskaitą prieinamą tik jūsų.
Norėdami tai padaryti, turėsime naudoti vartotojo modelį, įmontuotą „Django". Vartotojo modelis yra duomenų bazės modelis, kaip ir mūsų įrašas, kurį galima pateikti norint prisijungti prie vartotojo į svetainę. Ateityje, prieš įdiegdami svetainę internete, išplėsime šį modelį su kitais su ja priskirtais modeliais ir sukursime papildomas prisijungimo saugos priemones, atsparias sukčiavimo apsimetant. Pradėsime naudodamiesi kai kuriomis įmontuotomis prisijungimo formomis, kurias teikia „Django". Pirmiausia sukurkime naują programą, kurią naudosime pagrindinio prisijungimo puslapio šablonams ir rodiniams pateikti. Mes taip pat sukursime kitas programas, kad atspindėtume nuolatinius prisijungimo iššūkius, kad apsaugotume programą, įskaitant „Pincode", veido atpažinimą, beveik lauko komunikaciją, išorinius įrenginius, daugialypės faktoriaus autentifikavimą ir pirštų atspaudų atpažinimą.
Mes jau kalbėjome apie programos pradžią. Iš mūsų katalogo, virtualios aplinkos viduje
python manage.py startapp users
Dabar turėtume turėti naujos programos katalogą. Pradėkime kurdami rodinį tame kataloge, kuris atitinka vartotojo prisijungimą. „Django" sukūrė vartotojų prisijungimo rodinius, tačiau jie mums nebus tinkami, nes mums reikia pasirinktinio rodinio, kuris, pageidautina, atliekamas su apibrėžimu.
Šiuo požiūriu pradėsime tikrindami įrašo užklausą, perduoti užklausą.post į prisijungimo formą, importuotą iš „Django", patvirtinkite vartotojo abonementą ir prisijungkite vartotojui prieš nukreipdami juos į mūsų kanalo programą.
Vartotojuose/vaizdas.py pridėkite šį kodą
username = request.POST['username'] # Gaukite vartotojo vardą ir slaptažodį iš įrašo užklausos
password = request.POST['password'] # Autentifikuokite vartotoją
Tai viskas, ko jums reikia pagrindiniam prisijungimo rodiniui. Dabar sukurkime vaizdą formą išplėsdami bazinį šabloną. Pradėsime kurdami naują šablonų katalogą vartotojų aplanke.
mkdir users/templates
mkdir users/templates/users
Dabar turėtume sugebėti redaguoti vartotojus/šablonus/vartotojus/prisijungti.html. Kol mes prie jo, sukursime šabloną, kad vartotojas taip pat galėtų prisiregistruoti.
nano users/templates/users/login.html
Dabar, šablone,
Tai yra prisijungimo šablono pagrindai. Tai tikrai kaip ir kitas struktūros šablonas, tačiau jis atrodo šiek tiek kitaip. Mes galime nukopijuoti šį kodą, kad sukurtume kitą labai panašų šabloną, pavadintą „Register.html", kur mes pakeisime formuluotę ir panaudosime naują mūsų sukurtą formą. Pirmiausia padarykime šabloną. Redaguokite vartotojus/šablonus/vartotojus/registre.html ir pridėkite šį kodą:
Dabar sukurkime mūsų vartotojo registracijos formą ir atsigręžkime į rodinius, prieš atnaujindami savo vartotojo prisijungimus su modeliu. Mes padarysime šią formą „Basic", kuriai pradėsime, tačiau ateityje įtrauksime daugiau informacijos ir saugos funkcijų, tokių kaip susitarimai ir „Captcha". Redaguokite formas naudodami „Nano" vartotojus/forma.py ir pridėkite šį kodą.
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']
Taigi mes čia turime dar vieną formą, kuri veikia gana paprastai. Tai vartotojo registro forma su vartotojo vardu, el. Paštu ir slaptažodžiu, taip pat patvirtinti slaptažodžio lauką. Atminkite, kad ši forma neišplečia įprastų formų. Formos klasė, tai yra modelio forma, tai reiškia, kad ji turi meta. Vienas laukas yra apibrėžtas lygiai taip pat, o klasė meta apibrėžia modelį, kurį forma atitinka likusią informaciją, kuri bus parašyta į formą. Didžioji dalis to jau egzistuoja „Django" įmontuotoje „UserCreationForm", todėl mes tai naudosime kaip klasės pagrindą (perduotą skliausteliuose).
Toliau mes išnagrinėsime vaizdą, kaip užregistruoti vartotoją dabar, kai turime formą ir šabloną. Tai yra „Modelform", kaip ir naujame pranešimo rodinyje. Redaguokite vartotojus/Views.py ir pridėkite šį kodą:
# … Importas
Tai viskas, ko mums reikia norint įregistruoti vartotoją, tačiau turėtume turėti daugiau informacijos. Mes norime sužinoti laiką, kurį vartotojas užsiregistravo, kiek laiko jie paskutinį kartą buvo svetainėje, tam tikros informacijos apie juos, pavyzdžiui, biografiją, laiko juostą ir tt. Taip pat turėsime atnaujinti savo kanalo modelį, įrašą, kad kiekvienam vartotojui būtų atsižvelgiama į vartotojo modelį ir atributų įrašus. Norėdami tai padaryti, mes atnaujinsime modelius.py abiejose programose. Pradėkime redaguodami tiekimo modelį. Dabar turėtų atrodyti taip:
from django.db import models # … Importas
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Pridėkite šią eilutę
Atkreipkite dėmesį į antrąją eilutę, kuri buvo pridėta prie failo. Tai yra užsienio raktas, kuris kiekvienam įrašui kiekvienam vartotojui priskiria vieną vartotoją, todėl galime įsitikinti, kad išsaugojame įrašus vartotojo už vartotoją pagrindu, ir jokio įrašo negalime padaryti jokio įrašo, nepriskiriant jo vartotojui. Mes apibrėžiame šį užsienio raktą su jos vaizduojama klase, ištrynimo argumentą, užtikrinantį, kad įrašai būtų ištrinti su vartotojais, niekiniais ir tuščiais argumentais, kad įsitikintume, jog prireikus galime pašalinti vartotoją, ir pritaikyti vartotojo trūkumą mūsų jau sukurtuose įrašuose ir susijusį pavadinimą, kurį galime naudoti norėdami nurodyti vartotojo sukurtus įrašus. Šis susijęs vardas, skirtingai nei „Post.Author", įrašo autorius, suteikia mums vartotojui, kuris paskelbė patį įrašą. Dabar galime gauti pranešimus, kuriuos vartotojas pagamino „Running user.posts.all" () arba autoriaus.posts.all ().
Dabar padarykime mūsų prisijungimus atsparesnius. Mes jau galime padaryti mūsų svetainę daug mažiau pažeidžiamą sukčiavimo apsimetant, tiesiog įvertindami, kiek kartų mes leisime prisijungti prie svetainės, tai yra gana lengva. Taip pat pradėkime saugoti tam tikrą informaciją apie kiekvieną vartotoją anksčiau, nes mes toliau tobuliname savo programą. Redaguoti vartotojus/modelius.py, pridėkite šį kodą.
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='')
Atminkite, kad šis modelis yra gana panašus į „Post" modelį. Mes turime papildomą importą „Timezone", kuri leis mums nustatyti numatytuosius nustatymus „Datetime" laukuose, taip pat turime tokį personažą ir „TextField", kaip „The Post". Naudodamiesi visais šiais laiko žymėmis, galime apsaugoti svetainę ir suprasti jos naudojimą, o teksto laukai leido mums pateikti informaciją apie kiekvieną vartotoją ar autorių svetainėje. „Onetoonefield" turėtų būti vienintelis nedidelis aspektas, jis elgiasi lygiai taip pat, kaip ir prieštaraujant, tačiau turi tik vieną iš kitų modelių. Tokiu būdu vartotojas turi tik vieną profilį, tuo tarpu jie gali turėti daug žinučių.
Dabar patobulinkime savo prisijungimo ir registracijos rodinius, kad būtų atsižvelgiama į profilį. Pirmiausia redaguokite vartotojus/vaizdus.py ir sutelkite dėmesį į registro rodinį:
# … Importas
Profile.objects.create(user=user) # Įsitikinkite, kad pridėkite šią eilutę, kad sukurtumėte vartotojo profilį
Tai paprasčiausiai sukuria vartotojo profilį, neužpildydamas jokios informacijos. Dabar norime įsitikinti, kad vartotojo abonemento negalima per dažnai prisijungti, arba bent jau slaptažodžių negalima išbandyti per dažnai, todėl atnaujinkime prisijungimo rodinį.
# … Importas
if user and user.profile.can_login < timezone.now(): # Atminkite, kad dabar patikriname, ar vartotojas gali prisijungti
else: # Jei prisijungimo nepavyko,
user = User.objects.filter(username=username).first() # Tai yra ta dalis, kurioje atnaujiname vartotojų profilį
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Taigi jie kelioms sekundėms nebegali prisijungti
Tai yra pagrindinis saugumo pagrindas. Įsitikinkite, kad svetainė nėra pažeidžiama, kad kažkas tiesiog išbando kiekvieną įmanomą slaptažodžio derinį ar net keletą iš jų tuo pačiu metu. Tai nenuvils paprasto vartotojo, kuris žino jų kodą ir tiesiog prisijungs prie kelių įrenginių, tačiau jis iš programos išsaugos daugybę sukčiavimo robotų. Atminkite, kad mes pridėjome IF teiginį su kintamajam „Can_login", kuris turėtų būti laikas praeityje, ir atnaujinti jį su kiekvienu nesėkmingu prisijungimu, naudojant tą patį vartotojo vardą. Tokiu būdu kenksmingas vartotojas negalės taip greitai atspėti slaptažodžio bet kur. Sekundžių skaičių „DateTime.Timedelta" () taip pat galima atnaujinti, o svetainė bus atsparesnė, tačiau šiek tiek mažiau naudojama su daugiau sekundžių. Aš rekomenduoju 15 pradėti.
Atminkite, kad mes sukūrėme atsarginį scenarijų, kad išsaugotume savo darbą, todėl eikime į priekį ir sukurkime atsarginę kopiją, ką turime iki šiol, kad įsitikintume, jog turime viską išsaugotą. Paleiskite komandą:
sudo backup
Dar kartą tai padės išsaugoti jūsų darbą iki šiol. Aš rekomenduoju dažnai paleisti atsargines kopijas, kad išsaugotumėte savo darbą, ir galbūt net norėsite automatiškai atlikti atsarginę kopiją. Tai galite padaryti naudodami „Unix" įrankį, pavadintą „Cron". Norėdami suaktyvinti šią naudingumą, paleiskite šią komandą ir įveskite slaptažodį:
sudo crontab -e
Jei dar nepasirinkote „Nano" 1 parinkties, teksto rengyklės, su kuria jau turėtumėte būti susipažinę, ir slinkite į failo apačią naudodami rodyklės klavišus. Pridėkite šią eilutę:
0 * * * * sudo backup
CRON naudoja formato minutę, valandą, mėnesio dieną, mėnesį, savaitės dieną, kai A * ar numeris nurodo, kada reikia paleisti komandą. Naudodami 0 minutei ir * likusioms galimybėms, mes galime paleisti komandą pirmąją kiekvienos valandos minutę minutės pradžioje. Tai leidžia mums automatiškai sukurti kodą. Visi „Cron" darbai, vykdomi su „Sudo Run" kaip šaknis, todėl mums nereikės rašyti slaptažodžio kas valandą.
Kad būtų lengviau sukurti mūsų kodą nenaudojant slaptažodžio, išjunkite mūsų atsarginės komandos slaptažodį. Mes tai padarysime vykdydami šią komandą ir įvesdami slaptažodį:
sudo visudo
Dabar slinkite į failo apačią ir pridėkime kitą eilutę:
ALL ALL=NOPASSWD: /bin/backup
Tai leidžia mums paleisti komandą „atsarginę kopiją" kaip bet kuris vartotojas, be slaptažodžio. Tai yra lengvas formatas, tiesiog priešdėkite eilutę su „All All = nopasswd:/bin/" ir baigti komandą, pavyzdžiui,/bin/backup, kuris egzistuoja/usr/bin/.
Dabar pradėkime dirbti su el. Paštu. El. Paštas yra tikrai svarbus svetainėms, nes tai būdas išlaikyti svetainę saugesnę, patikrinkite, ar vartotojai yra tikri žmonės ir netgi rinkos produktai ar paslaugos klientams. Daugelis žmonių, kurie dažnai lankosi internete, kasdien tikrina savo el. Laišką ir gauna įvairiausių rinkodaros el. Pašto adresų apie juos dominančius produktus ir paslaugas. Yra keletas variantų, kai reikia įjungti el. Laišką „Django" svetainėje, ir kviečiame pasirinkti, kuri jums tinka geriausiai.
Pirmiausia galite sumokėti už el. Pašto paslaugą, kuri leis jums siųsti el. Laišką iš savo domeno ir reikalauti minimalaus kodo. Tai siūlo daugybė paslaugų, tokių kaip „Google Workspace", „SendInBlue", „Mailgun" ir dar daugiau.
Priešingu atveju jūs gerai statote savo el. Pašto paslaugą savo serveryje nuo nulio. Aš rekomenduoju šią parinktį, nors tai yra daugiau kodo ir gali reikėti specialaus prieglobos. Greičiausiai negalėsite paleisti pašto serverio iš savo namų kompiuterio, todėl eikime į priekį ir išnagrinėsime konfigūraciją ir kodą, kad galėtumėte siųsti el. Laišką, prieš pradėdami serverį debesyje ir sukurti savo pašto serverį.
Pirmiausia, redaguokite nustatymus.py su šia komanda:
nano app/settings.py
Kur programa yra jūsų sukurtos programos pavadinimas su „StartApp".
Pridėkite šias eilutes:
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)
Įsitikinkite, kad pakeiskite juos, kai būsite pasirengę diegti savo programą, mes tai dar kartą peržiūrėsime vėliau. „Eail_Address" nustatymas turėtų būti el. Paštas, iš kurio norėtumėte išsiųsti, ir slaptažodis (el. Pašto adresas_host_password) turėtų būti nustatytas prie serverio sugeneruoto slaptažodžio. Aš įkeliu slaptažodį iš konfigūracijos failo, kad jis nepatektų į kodą, naudodamas šią logiką, aukščiau šių eilučių „Nustes.py":
import os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
Tada aš sukūriau JSON failą su config in /etc/config.json, naudodamas „Nano" taip.
Norėdami redaguoti failą:
sudo nano /etc/config.json
Pridėkite šias eilutes:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
Mes toliau redaguosime konfigūracijos failą ir pridėsime visus slaptažodžius ir raktus, kuriuos naudosime programoje. Kol kas greitai išnagrinėsime, kaip siųsti el. Laišką naudojant „Python". Pirmiausia sukurkime patvirtinimo el. Laiško šabloną, kurį galime nusiųsti savo vartotojams, ir įdėkite jį į vartotojo šablonų katalogą. Šis šablonas bus parašytas HTML.
nano users/templates/users/verification_email.html
Šis el. Laiškas yra gana paprastas. Tai užima vartotojo kontekstą, pagrindinį svetainės URL ir vartotojo ID bei prieigos raktą, naudojamą vartotojo el. Pašto adresui patikrinti. Prieš rašydami „Python" kodą, būtinai apibrėžkite pagrindinį URL „Nustes.py", kad pateiktume šabloną. Eikite į priekį ir pridėkite šias eilutes prie „App/Settings.py", beveik pradžioje.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
Galų gale, kai jūsų svetainė bus paruošta internete ir jūs ją diegsite, norėsite apibrėžti savo domeną kaip domeno vardą, kurį perkate, kad pavaizduotumėte svetainę. Tai yra vardas, kurį įvesite „Navbar", kad galėtumėte pasiekti savo svetainę. Kol kas galite palikti domeną tuščią arba naudoti vietos žymeklį. Taip pat norėsite pakeisti „Site_name" į vardą, kurį norite suteikti savo svetainei, pasirinktą.
Prieš siųsdami el. Laišką, sukurkime žetonų generatorių, kad galėtume turėti paskyros aktyvinimo prieigos raktą, kuris niekada nesibaigia. Tai galime padaryti sukurdami ir importuodami paskyros aktyvinimo prieigos raktą, kuris atrodo kaip toks. Redaguokite failą:
nano users/tokens.py
Pridėkite šį kodą:
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()
Šis pagrindinis žetonų generatorius sukuria prieigos raktą, kurį galime nusiųsti vartotojui į URL, o vartotojas gali naudoti savo el. Pašto adresą ir suaktyvinti jų sąskaitą.
Tada pažiūrėkime, kaip išsiųsti el. Laišką. Naudodamiesi „Nano", redaguokite vartotojus/el. Paštu.py.
nano users/email.py
Patvirtinimo siųsti HTML el. Laišką atrodys taip:
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)
Tai gana paprasta. Mes importuojame funkcijas, kurių mums reikia norint siųsti el. Laišką, pateikti el. Laišką su šablonais ir mūsų nustatymais, tada mes apibrėžiame el. Laišką pagal šablono pavadinimą ir siunčiame vartotojui naudodami funkciją. Pastebėsite, kad dar neapibrėžėme funkcijos siųsti paštą, send_html_email, todėl parašykime tai žemiau kodą, kurį jau pridėjome prie vartotojų/el. Paštu.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()
Tai yra šiek tiek sudėtingesnis, ir mes dar nesame pasirengę paleisti viso šio kodo. Atkreipkite dėmesį, kad apibrėžiame „Unub_Link", nuoroda, kurią vartotojas gali naudoti atsisakyti mūsų el. Laiškų prenumeratos. Tai svarbu, nes vartotojai turės sugebėti atsisakyti mūsų el. Laiškų, nebent jie nori bet kada juos pamatyti. Mes taip pat pridedame teksto alternatyvą savo pranešimui, kuris yra HTML pranešimas, pašalintas iš HTML žymų. Galiausiai patikriname, ar išsiųstas el. Laiškas, ir jei to nepadarė, vartotojo profilyje pažymime, kad jų el. Paštas negalioja.
Pereikime prie vartotojo modelių, kad galėtume visa tai padaryti. Turime apibrėžti funkciją, kad sugeneruotume nuorodą į atsisakymo prenumeratą, ir apibrėžti loginio lauko, kad pažymėtų, jog vartotojo el. Paštas negalioja.
Pirmiausia pridėkite šį importą į vartotojų/modelių viršūnę.py
nano users/models.py
# …
Toliau pridėkime funkcijas prie vartotojo modelio, kad padarytume prieigos raktą, ir patikrinkite, ar prieigos raktas yra naudojamas suaktyvinti el. Laišką, taip pat lauką, kad išsaugotumėte, ar vartotojas sėkmingai gauna savo laišką. Vartotojams/modeliams.py dar kartą pridėkite šį kodą prie modelio pabaigos (įtrauktas kodas)
# …
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Galioja 30 dienų
Tai gana paprasta, mes naudojame laiko žymeklį, kuris yra pagrindinis kriptografijos įrankis, kad sukurtume prieigos raktą, kuris pasibaigs po tam tikro laiko, taip pat naudojame kitą funkciją, kad patikrintume, ar ji galioja. Šiuos žetonus naudojame du kartus, vieną kartą, kad patikrintume el. Laišką, ir vieną kartą atsisakyti prenumeratos nuorodos.
Dabar, kai mes juos turime, paskutinis darbas, kurį turėsime atlikti, yra vaizduose. Vartotojuose/vaizduose.py pridėkime peržiūras, kad patikrintume el. Pašto adresą ir atsisakyti prenumeratos.
nano users/views.py
Pirmiausia pridėkite šį importą. Aš įmečiau keletą papildomų, todėl vėliau mums nebereikės importuoti daugiau daiktų.
from .email import send_verification_email # Įsitikinkite, kad importuojate patvirtinimo el. Pašto siuntimo funkciją
Galbūt jau turite keletą iš šių importų, tačiau tai nepakenkia juos pakartoti. Jums reikės importuoti patvirtinimo el. Pašto siuntimo funkciją, taip pat „Account_activation_Token" iš „usters.tokens", be kitų importų.
Dabar, failo apačioje, pridėkite šį kodą:
# Atsisakykite jų
# Priešingu atveju nukreipkite į prisijungimo puslapį
# „SendWelcomeEmail" (užklausa, vartotojas)
Tai yra daug kodo. Suskirstykime. Pirmoji funkcija, švari ir paprasta, atsisako vartotojo iš adresų sąrašo. Antroji funkcija suaktyvina jų el. Paštą, ir jūs pastebėsite, kad pridėjau pakomentuotą funkciją „SendWelcomeEmail". Kviečiame naudoti el. Pašto šabloną ir funkcijų apibrėžimą, kad galėtumėte siųsti sveikinimo el. Laišką, aš dar to dar nesu. Paskutinė funkcija, kurią įėjau, yra svarbi, nes baigiasi aktyvavimo el. Laiškai. Todėl tam tikrą laiką turėsime atkurti aktyvavimo el. Laišką. Mes galime tam naudoti pagrindinę formą ir paskambinti funkcijai, kad išsiųstume patvirtinimo el. Laišką. Prieš tai padarydami, įsitikinkime, kad jis pirmiausia išsiųstas, pridedant funkcijos skambutį į registro rodinį. Pridėkite šią eilutę prieš pat peradresavimą registro rodinyje, DEF registre, vartotojams/peržiūrai.py.
nano users/views.py
# ... (po) DEF registro (užklausa):
# ... (prieš) peradresuoti (
Nereikia pridėti pirmosios ir paskutinių eilučių tame kodo fragmente, tiesiog įsitikinkite, kad registro rodinys vartotojui siunčia patvirtinimo el. Laišką. Tai turėtų atrodyti taip:
# … Importas
send_verification_email(user) # Įsitikinkite, kad pridėkite šią eilutę!
Dabar turėsime pridėti formą, kad būtų galima pakartoti aktyvavimo el. Laišką. Vartotojams/forms.py pridėkite šią formą:
# ... (importas)
Mums taip pat reikės šablono, atitinkančio šią iš naujo el. Pašto aktyvavimo formą. Pridėkime šį šabloną. Redaguokite failą:
nano users/templates/users/resend_activation.html
Tada pridėkite šį kodą į failą.
Whew, tai daug! Dabar, kai diegsime kodą į savo serverį, galėsime siųsti HTML el. Paštą ir suaktyvinti vartotojo abonementus paspaudę el. Laiške. Mes taip pat galbūt norėsime išsiųsti paprastą pasveikinimo el. Laišką, todėl pažiūrėkime, kaip tai padaryti. Grįžkite į vartotojus/el. Paštu.py, pridėkite šį kodą:
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)
Taip pat mums reikės šablono, kad galėtume pateikti visą šią informaciją. Mano svetainėje šablonas atrodo kaip žemiau, tačiau kviečiame jį suformatuoti, kad ir kaip jums patinka.
Atminkite, kad neturime uždarymo korpuso ar HTML žymų, nes pridedame jas, kai pridedame HTML atsisakymo prenumeratos nuorodą. Tai yra svarbu, tačiau mes nenorime jų apibrėžti du kartus.
Taigi, kas toliau? Mes nuėjome ilgą kelią. Tikrai turėtume būti pasirengę diegti svetainę serveryje. Mes galime pridėti @login_required dekoratorių ir padaryti mūsų nuomonę saugią, imtis vartotojo registracijos, siųsti reikalavimus atitinkantį el. Laišką ir talpyklos informaciją, o tai yra pagrindas, ką turi padaryti svetainė, kad išliktų aktuali. Pridėsime dar keletą naudingų funkcijų, tada sukursime pagrindą diegti kodą į nuotolinį serverį, nustatydami pašto serverį, domeno konfigūraciją ir filtrus, kad mūsų svetainė būtų saugi ir tinkama.
Mums taip pat reikės slaptažodžio nustatymo rodinio, todėl pridėkime tai tikrai greitai. Kai kuriose funkcijose yra sugadintas „Django" sukurtas slaptažodžio nustatymo rodinys, tačiau mes pažiūrėsime, kaip parašyti savo vaizdą, el. Pašto šabloną, formas ir URL modelius. Štai kaip atrodo vaizdas, vartotojams/peržiūrai.py
# ... importas
Ši forma yra sukurta į „Django", tačiau mums reikės šablono, kad patvirtintume slaptažodžio nustatymą, vartotojai/šablonai/vartotojai/slaptažodis_reset_confirm.html
Mes taip pat turime šabloną, skirtą siųsti slaptažodžio nustatymo el. Laišką su paprasta forma, vartotojams/šablonams/vartotojams/slaptažodžiu_reset.html
Pats el. Laiško šablonas yra paprastas, tai yra pagrindinis HTML failas, pateikiantis nuorodą, kaip iš naujo nustatyti slaptažodį, vartotojams/šablonams/vartotojams/slaptažodis_reset_email.html. „Django" automatiškai aiškins šį failą.
Mums taip pat reikės dar dviejų šablonų. Pirmasis yra patvirtinti, kad el. Laiškas buvo išsiųstas. Vaizdai dėl jų jau yra Django, todėl mums tereikia kreiptis į juos urls.py. Šis šablonas yra vartotojams/šablonams/vartotojams/slaptažodis_reset_done.html
Ir galiausiai, norint patvirtinti, kad slaptažodžio nustatymas yra baigtas, vartotojai/šablonai/vartotojai/slaptažodis_reset_complete.html
Šiems vaizdams mums reikia URL modelių. Vartotojams/urls.py pridėkite šiuos URL modelius:
# ... Ankstesni URL čia
Keturi šablonai, tai daug! Bet dabar mes galime būti tikri, kad galėsime iš naujo nustatyti vartotojo slaptažodį bet kuriuo metu, kai mums reikia, iš žiniatinklio naršyklės.
Aš suprantu, kad tai yra daug kodo. Jei atrodo šiek tiek per galvą, viskas gerai. Jūs tobulėsite, jūsų supratimas pagerės ir labai greitai tapsite daug kompetentingesnis. Jei esate visiškai pasimetę, rekomenduoju grįžti į šią programinę įrangą vėliau, kai dirbote su savarankišku etapu, išmokkite koduoti kursą internete. Paprastai tai gali laisvai pradėti ir padės jums per viską, ko jums reikia, kad grįžtumėte į šį projektą. Jei jaučiate, kad esate pasirengęs tęsti, skaitykite toliau, kitą kartą, mes padengsime savo kodo diegimą nuotoliniame serveryje ir nustatysime pašto serverį, taip pat automatizuosite savo diegimą naudodami „Bash", kad visada galėtumėte nustatyti naują projektą su keliomis paprastomis komandomis.
Paskutinis dalykas, kurį turime padaryti prieš diegdami nuotoliniame serveryje, yra padaryti mūsų svetainę šiek tiek saugesnę. Pastebėsite, kad prisijungimo vaizdas užima tik vartotojo vardą ir slaptažodį, taip pat nėra daugelio faktorių autentifikavimo ar vienkartinio kodo. Tai yra lengvas sprendimas, ir su tuo pačiu kodu galime priversti mūsų svetainę siųsti tekstinius pranešimus ir netgi reaguoti į serverį siunčiamų tekstinių pranešimų. Norėdami pradėti, grįšime į vartotojo modelius ir pridėsime laiko žymos pasirašytuvą, kuris parodys kiekvieną prisijungimą. Mes taip pat pridėsime unikalų, besisukantį identifikatorių prie vartotojo modelio, kuris bus naudojamas pridėti papildomą saugumą prie mūsų prisijungimo. Redaguoti vartotojo modelius, vartotojus/modelius.py, pridėkite šį kodą:
# Įsitikinkite, kad importuojate UUID, „Timestamp" pasirašytuvą ir URL generatorių (atvirkščiai)
# Pridėkite šį kodą čia
# Ir pridėkite šią funkciją
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Galioja 3 minutes
Įsitikinkite, kad jūsų vartotojai/modeliai.py atrodo taip, be komentarų (kodas eilutėse su #). Suskirstant tai, tai paprasta. Mes turime keletą importų, „Timestampsigner", kuris yra kriptografinis naudingumas, galintis sugeneruoti saugų kodą ir patikrinti jį, kad įsitikintumėte, jog jis galioja, buvo naudojamas tik vieną kartą, o ne senesnis už tam tikrą sekundžių skaičių. Mes taip pat naudojame UUID, kuris yra unikalus identifikatorius, kuris identifikuoja mūsų vartotoją pasirašant žetoną, ir URL, kuriame vartotojui siunčiamas prieigos raktas. Mes naudosime šią pagrindinę kriptografiją, kad sukurtume dviejų faktorių autentifikavimo vaizdą. Prieš darydami ką nors kita, paleiskite migracijas, kad mūsų vartotojų modeliai būtų atnaujinti. Kataloge su „Manage.py" paleiskite šias komandas, kad padarytumėte ir užpildytumėte migracijas.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Tai svarbu, nes kiekvieną kartą, kai mes pakeisime modelius, turėsime sukurti lenteles ir atnaujinti duomenų bazę su numatytomis priemonėmis, kad galėtume iš tikrųjų naudotis modeliais.
Toliau improvizuokime mūsų prisijungimo vaizdą, kad nukreiptume į antrinį autentifikavimo rodinį. Vartotojuose/vaizduose.py pašalinkite prisijungimo funkciją ir nukreipkite į URL, kurį ką tik sukūrėme vartotojo modeliuose.
# … Importas
if user and user.profile.can_login < timezone.now(): # Atminkite, kad dabar patikriname, ar vartotojas gali prisijungti
# Pašalinkite čia esančią „Auth_login" funkciją
return redirect(user.profile.create_auth_url()) # Atkreipkite dėmesį, kad mes čia nukreipiame į naują URL
else: # Jei vartotojas nenaudoja daugiafaktoriaus autentifikavimo, tiesiog prisijunkite juos.
else: # Jei prisijungimo nepavyko,
user = User.objects.filter(username=username).first() # Tai yra ta dalis, kurioje atnaujiname vartotojų profilį
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Taigi jie kelioms sekundėms nebegali prisijungti
Taigi tai yra gana paprasta, dabar mes turime būdą peradresuoti į dviejų faktorių autentifikavimo rodinį, kai jį kuriame. Mes taip pat turime atsarginę dalį, jei vartotojas nepridėjo telefono numerio. Pridėsime pagrindinį vaizdą, kad netrukus pridėtume telefono numerį ir netrukus prisijungtumėte su teksto pranešimu.
Pirmiausia mums reikia paprasto būdo, kaip išsiųsti tekstinį pranešimą iš mūsų kodo. Norėdami tai padaryti, galime pasirinkti iš daugybės API, tačiau, mano manymu, lengviausia yra „Twilio". Jie taip pat siūlo gerą kainą mažesniems projektams, taip pat didelėms nuolaidoms. Sukurkite paskyrą „Twilio.com", užpildykite tam tikrą informaciją apie savo projektą, nusipirkite telefono numerį ir nukopijuokite savo API raktus į savo „Nustatymai.py". Tada pridėkite šį kodą naudodami naują failą, vartotojai/sms.py.
nano users/sms.py
# Importuokite visus būtinus paketus
# Šis kodas siunčia tekstą su „Twilio"
# Pagalbininko funkcija, norint gauti numerį su tiek daug skaitmenų
# Siųskite tekstą, kad patikrintumėte vartotoją
# Siųskite vartotojui bet kurį tekstą su šia funkcija
# Patvirtinkite kodą su šia funkcija
# Patvirtinkite laiką
Būtinai tinkamai pakeiskite nustatymus, pridėdami šias eilutes savo raktais:
# Būtinai nukopijuokite juos iš savo „Twilio" prietaisų skydelio
AUTH_VALID_MINUTES = 3 # TFA puslapio minučių skaičius yra aktyvus, kai tik įgyvendinamas
Pirmiausia mums reikės dviejų mūsų veiksnių autentifikavimo vaizdų formų. Redaguoti vartotojus/forms.py, pridėkite šį kodą.
# … Importas
# Forma, skirta įvesti mūsų telefono numerį
# Forma autentifikuoti
Toliau sukurkime vaizdus vartotojuose/peržiūras.py
# … Importas
Mums taip pat reikės abiejų šių vaizdų šablonų. Pirmiausia pridėkime MFA šabloną.
nano users/templates/users/mfa.html
Pridėkite šį HTML kodą prie šablono
Tai gana savaime suprantama. Forma siunčia arba kodą, arba tuščią kodą, o rodinyje pastebėsite, kad mes siunčiame kodą, jei gausime tuščią kodą. Tada mes tiesiog turime du pateikimo mygtukus, ir tokiu būdu mes galime siųsti kodą su bet kuriuo mygtuku. Tada pridėsime paprastą formą, kad pridėtume telefono numerį.
nano users/templates/users/mfa_onboarding.html
Pridėkite šį HTML:
Ši forma yra daug paprastesnė, ji tiesiog suteikia mūsų sukurtą telefono numerio formą ir leidžia vartotojui pridėti telefono numerį.
Tai atrodo tikrai gerai! Kol viskas tinkamai nustatyta, mes turėtume sugebėti siųsti pranešimus ir prisijungti vartotojui naudodami savo telefono numerį, kai tik pridėsime URL modelius. Paskutinis dalykas, kurį mums reikia nustatyti, yra profilio vaizdas, todėl galime įsitikinti, kad vartotojas gali pakeisti savo telefono numerį, nebūdamas prisijungęs. Be to, galų gale norėsime pridėti parinktį „Stop Norėdami mesti", todėl vartotojas gali tekstą „sustoti", kad atsisakytų būsimų tekstinių pranešimų.
Pridėkime profilio vaizdą prie vartotojų/peržiūrų.py. Šis vaizdas atnaujins vartotojo biografiją, el. Pašto adresą, vartotojo vardą ir telefono numerį, taip pat leis mums įgalinti kelių faktorių autentifikavimą. Pirma, mums reikės dar dviejų formų vartotojams/formoms.py
# ... importas
Toliau galime sukurti vaizdą naudoti abi šias formas. Redaguokite vartotojus/Views.py ir pridėkite rodinyje.
# Pridėkite šiuos importus
Mums taip pat reikės šablono šiam vaizdui.
nano users/templates/users/profile.html
Pastebėsite, kad tai gana paprasta forma, tačiau joje yra šiek tiek „JavaScript", kuris automatiškai skelbia formos turinį, kai jie atnaujinami. Tai naudinga turėti, todėl jūs galite atlikti redagavimą, nereikia kiekvieną kartą paspausti pateikti pateikimo.
Toliau mums reikia URL, atspindinčių visus šias nuomones vartotojų URL modeliuose. Redaguokite vartotojus/urls.py ir pridėkite šį kodą:
# … Ankstesnis kodas, importas
# … URL modeliai, kuriuos anksčiau įvedėme, pridėkite kitas tris eilutes
Dabar yra tinkamas laikas išbandyti mūsų projektą. Bet pirmiausia paleiskite dar vieną atsarginę kopiją.
backup
Ir paleiskite serverį. Prieš įdiegdami „Linux" serveryje, pravartu įjungti du faktoriaus autentifikavimą paskyroje. Mes tai padarysime per mūsų profilio URL,/vartotojus/profilį/ir patikrinsime langelį, kad įjungtumėte autentifikavimą įvedus mūsų telefono numerį, o tada pateiksime formą.
python manage.py runserver localhost:8000
Apsilankykite tinklalapyje, eidamas į savo interneto naršyklę, šiame pavyzdyje naudoju „Google Chrome" ir įvesdamas URL https: // localhost: 8000/paskyros/profilis/
Prireikus galėsite prisijungti ir įgalinti dviejų faktorių autentifikavimą.
Šiam projektui reikalingas serveris, kad jis galėtų veikti, kad jis tikrai galėtų siųsti paštą. Bet pirmiausia mums reikia būdo, kaip pamatyti klaidas. Pastebėsite, kad jei serverį paleisite derinimo režimu, o „Settings.debug" lygus teisingam, serveris automatiškai rodo klaidas. Norėdami parodyti klaidas nenaudojant derinimo režimo, kuris yra nesaugus gamybos serveryje, turėtume pridėti jį. Svarbiausios klaidos, kurias turime sugebėti, yra:
500 klaida - mūsų kodo problema 404 klaida - puslapis, kuris nerastas (sugadintas URL) 403 klaida - leidimas atmesta klaida
Pridėkime naują programą šioms klaidoms tvarkyti, vadinamoms klaidomis.
python manage.py startapp errors
Pridėkite tai prie „Settings.py", kaip mes anksčiau, „Installed_apps" nustatymuose ir pradėkite pridėdami nuorodas į kai kuriuos rodinius programoje/urls.py, kur programa yra jūsų „Django" projekto pavadinimas.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Tai yra viskas, ko mums reikia be klaidų rodinių, šablonų ir šiek tiek tarpinės programinės įrangos. Apibrėžkime tuos taip:
# Sukurkite savo požiūrį čia.
Toliau apibrėžkime tarpinę programinę įrangą, kad galėtumėte tvarkyti šias klaidas. Mes tai padarysime pirmiausia pridėdami prie „MiddleWare_Classes" svetainėje „Nustes.py" su mūsų tarpinės programinės įrangos pavadinimu.
# ... ankstesnė tarpinė programinė įranga
Toliau pridėkime tarpinę programinę įrangą.
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.')
Pridedame funkciją, kad gautume dabartinę išimtį naudodamiesi sriegiuojančiu vietiniu, o tai padeda mums atsekti bet kokias mūsų kodo klaidas. Kalbant apie šablonus, mums reikia tik vieno, nes mes dinamiškai apibrėžiame pavadinimą rodinyje. Šablonas tiesiog turi pateikti pavadinimą ir „sekti", mūsų klaidų sekimo iš kontekstą.
nano errors/templates/errors/error.html
Tai dar paprasčiausias mūsų šablonas, tačiau taip lengva pamatyti mūsų projekto klaidas. Toliau išjunkite derinimą nustatymuose.
nano app/settings.py
Raskite šią eilutę ten, kur ji yra tiesa, ir pakeiskite ją į klaidingą
DEBUG = False
Eikite į priekį ir dabar sukurkite atsarginę programą. Esame pasirengę diegti nuotoliniame „Linux" serveryje ir iš ten nuolat pridėkite funkcijų.
sudo backup
Prieš paskelbdami šį kodą į serverį, turėtume apsvarstyti, kad gali kilti keletas kodo problemų. Atsižvelgiant į atvejį, svetainėse, kuriose priima jiems paskelbtą informaciją, turės problemų, kai bus paskelbta šlamštas ir sunku pašalinti šlamštą. Tai neturėtų įvykti iš karto, tačiau jei tai įvyks, vėliau išnagrinėsime, kaip automatiškai sumažinti šlamštą svetainėje ir padaryti jį sunkiau, kad robotai galėtų patekti į svetainę, taip pat kaip išjungti vartotojo abonementus ir patikrinti vartotojo tapatybę, nuskaitydami jų ID ar biometrinį nuskaitymą, pavyzdžiui, pirštų atspaudą ar veido atpažinimą.
Žvelgiant į kelių faktorių autentifikavimo pavyzdį, kurį mes ištyrėme gamyboje, viskas gali būti kitaip. Atkreipkite dėmesį į tai, kaip mes ribojame prisijungimą, ir baigiant žetonų galiojimo pabaiga. Jei robotai pasiekia svetainę, dviejų faktorių autentifikavimas gali būti sunkesnis, nes jie gali įvesti kodus tuo pačiu metu, kai vartotojas yra. Norėdami kovoti su tuo, naudokime modelį vartotojo modeliuose, paskelbdami, kaip mes sąveikaujame su svetaine, kai autentifikuojame daugialypės faktoriaus autentifikavimą su telefono numeriu. Mes taip pat pridėsime parinktį autentifikuoti el. Paštu. Pradėkite redaguodami vartotojo modelius su „Nano".
nano users/models.py
Tai turėtų atrodyti mūsų pridedamas modelis. Mums nereikia jokių metodų, tik kintamųjų, kad būtų galima išsaugoti ID, vartotoją, laiko žymę, galiojimo laiką, ilgį ir bandymus prieš bet kokį daugialypį faktorių autentifikavimą (kodas, pavyzdžiui, 123456, išsiųstas į telefoną ar el. Paštą).
# Pagrindinis prieigos raktas, naudojamas prisijungti prie svetainės
Taip pat pridėkime privilegiją savo vartotojui ir kol kas nustatysime ją rankiniu būdu, prieš tai galiausiai perkeldami į privilegijuotus vartotojus automatiškai. Vartotojo modeliuose pridėkite šią eilutę profilyje:
vendor = models.BooleanField(default=False)
Kaip ir atliekant bet kokius duomenų bazės pakeitimus, turime perkelti ir perkelti duomenų bazę bet kuriuo metu, kai redaguojame modelius.py failą „Django". Atminkite, kad tai padarysime pirmiausia šaltinį (jei jis dar nebuvo naudojamas nuo tada, kai terminalas buvo atidarytas), o paskui „Python Manage.py", kad būtų galima perkelti ir perkelti.
cd project-directory-you-named # (Jei reikia)
Kol kas galite įdarbinti visas jūsų sukurtas paskyras kaip pardavėjai naudodami „Shell".
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Dabar, norėdami naudoti šį prieigos raktą, sukurkime mūsų daugialypės faktoriaus autentifikavimo vaizdą. Pirmiausia turime modifikuoti savo „MFA Helper" komunalines paslaugas. Naudojant nano,
nano users/mfa.py
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken
account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER
def send_text(target_phone, text):
from twilio.rest import Client
try:
client = Client(account_sid, auth_token)
if len(target_phone) >= 11:
message = client.messages.create(
to=target_phone,
from_=source_phone,
body=text + ' Text STOP to cancel.')
except:
messages.warning(get_current_request(), 'There was an error sending the message.')
print(traceback.format_exc())
def get_num_length(num, length):
n = ''
for x in range(length):
n = n + str(num)
return int(n)
def send_verification_text(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
def send_user_text(user, text):
send_text(user.profile.phone_number, text)
def check_verification_code(user, token, code):
token.attempts = token.attempts + 1
profile = user.profile
result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
if token.attempts < 3 and result:
profile.verification_code_length = 6
elif token.attempts > 1 and not result:
profile.verification_code_length = profile.verification_code_length + 2
if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
token.save()
profile.save()
return result
# Autentifikuokite vartotoją naudodamiesi savo el. Pašto ar telefono numeriu
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filtruokite žetoną pagal URL perduotą vertę (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)) # Jei ši sesija nebuvo sukurta, sukurkite ją
user = User.objects.filter(id=token.user.id).first() # Gaukite vartotoją iš žetono
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Jei jie jau yra autentifikuoti, prisijunkite juos
if not user: raise PermissionDenied() # Neigti, jei nerasta vartotojo
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Patikrinkite automatinį žetoną
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Prisijunkite vartotojui, jei jie dar nėra prisijungę
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Nustatykite jų daugialypės faktoriaus autentifikavimo galiojimo laiką
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Peradresuokite vartotoją į kitą puslapį
if not user.profile.mfa_enabled: # Patikrinkite, ar įjungta MFA
if not check_verification_time(user, token): # Patikrinkite laiką
user.profile.mfa_enabled = False # Išvalykite telefono numerį
user.profile.enable_two_factor_authentication = True # Įgalinti MFA
user.profile.phone_number = '+1' # Išjunkite telefono numerį
user.profile.save() # Išsaugokite profilį
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Prisijunkite vartotoją, jei jų MFA neįgalinta
if request.method == 'POST' and not fraud_detect(request, True): # Jei užklausa yra POST užklausa
form = TfaForm(request.POST) # Iškelkite formą
code = str(form.data.get('code', None)) # Gaukite kodą
if code and code != '' and code != None: # Įsitikinkite, kad jis nėra tuščias
token_validated = user.profile.check_auth_token(usertoken) # Patikrinkite automatinį žetoną
is_verified = check_verification_code(user, token, code) # Patikrinkite kodą
if token_validated: # Jei viskas
if is_verified: # Yra tvarkoje
user.profile.mfa_enabled = True # Įgalinti MFA (jei dar neįgalinta)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Prisijunkite vartotojui
for key, value in request.GET.items(): # Sukurkite kito parametro užklausą (jei tokių yra)
return HttpResponseRedirect(next) # Peradresuoti
elif not token_validated: # Jei žetonas buvo neteisingas
if p.mfa_attempts > 3: # Jei būtų per daug bandymų
if form.data.get('send_email', False): # Siųskite el. Laišką (arba tekstą)
# Pateikite formą (gauti užklausas)
Kai pridedame šį kodą, būtinai importuokite funkciją siųsti el. Laišką. Failo viršuje vartotojo rodiniai (su kitais importais) pridėti
from .mfa import send_verification_email as send_mfa_verification_email
Dabar turime parašyti šią funkciją, kol tai veiks. Tai turėtų išplėsti mūsų siuntimo el. Pašto funkciją ir tiesiog nusiųsti vartotojui el. Laišką su patvirtinimo kodu.
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))
Taigi visa tai puikiai veikia, dabar turime kelių faktorių autentifikavimo sistemą, kuri priklauso telefono numeriui ar el. Pašto adresui. Bet mums taip pat reikia būdo, kaip pašalinti ar bent paslėpti vartotojus, kurie nebendradarbiauja su mūsų sąlygomis. Tai gali būti šlamšto, robotai ar visi, kurie neturi omenyje mūsų darbo. Pažvelkite į mano svetainės stebėjimo vaizdą:
# importas
from .tests import is_superuser_or_vendor # Turėsime sukurti šį testą
# Gaukite vartotojų sąrašą
return render(request, 'users/users.html', { # Grąžinti vartotojus šablone
Atminkite, kad šis kodas naudoja testą, turėsime paskelbti šį testą tess.py faile ir jį importuoti. Redaguoti vartotojus/tests.py, sukurkime testą.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
Tai yra kartu su vartotojais/vartotojais.html šablonu, kuris atrodo panašiai:
Atminkite, kad šablone yra kitas šablonas, vartotojai/vartotojas.html. Kai naudojate šabloną, kuriame yra potemplate ir nenaudojama išplėtimo) Prieš pratęstą failo pavadinimą, kad būtų galima atskirti šablonus.
Atminkite, kad tai yra daug „Jinja", galbūt neturite visų šių kintamųjų. Bet taip atrodo mano kodas.
<small># {{user.id}} </sall>
Mums taip pat reikia dar vieno potemplate, togggle_active.html. Šis šablonas turėtų būti forma, leidžianti mums perjungti, ar vartotojas yra aktyvus.
Taip pat turėsime pridėti vaizdą, kad būtų galima perjungti vartotojo veiklą ir tinkamus URL modelius. Kol mes prie jo, pridėkime vaizdą, kad ištrintume vartotoją, jei mums to reikia.
# Importas
success_url = '/' # Peradresuoti sėkmės URL
def test_func(self): # Patikrinkite, ar vartotojas yra „Superuser" ir turi leidimą ištrinti
Nors tai yra praktiška, jei reikia, ištrynti vartotoją nereikėtų didžiąją laiko dalį, mes galime tiesiog perjungti vartotojų, kurie lankosi svetainėje, matomumą, jei mums reikia jų atmesti.
Mūsų pridėti URL modeliai atrodo taip. Naudodamiesi „Nano", redaguokite vartotojus/urls.py ir pridėkite šias eilutes:
nano users/urls.py
Linijos turėtų būti įtrauktos į kelių rodinių sąrašą, prieš pasibaigus „]", bet po pradžios „[".
# …
# …
Dabar būtinai sukurkite atsarginę svetainę, kad galėtumėte atsisiųsti ją į žiniatinklio serverį, kuriame mes toliau dirbsime. Iš komandinės eilutės,
sudo backup
Dabar mūsų svetainė yra sukurta.
Taigi dabar turime dar keletą naudingų funkcijų. Bet kaip čia didelis vaizdas? Šis kodas vis dar nėra prieinamas iš interneto, mes dar neturime pašto serverio, ir turime išplėsti savo programą, kad apimtų išsamų patikrinimo procesą, taip pat sklandų išdėstymą, kad padėtume mums ištirti svetainę, taip pat saugius protokolus, skirtus autentifikuoti privilegijuotiems vartotojams.
Mes visa tai pasieksime. Šiuo metu svarbiausias dalykas bus įsigyti šį kodą internete, ką mes galime padaryti naudodami tik keletą „Bash" eilučių „Ubuntu" serveryje. Vis dėlto turėsite tam išsinuomoti serverį, nebent namuose turite serverį ir verslo interneto prenumeratą, leidžiančią atidaryti prievadus. Aš asmeniškai valdau savo svetainę „HP Z440", kuris yra įdiegtas mano bute, tačiau paprastai tai yra daug pigiau, jei reikia išsinuomoti virtualų privatų serverį (VPS).
Atminkite, kad dabar naudojamas kodas yra palyginti plonas, jį reikės prižiūrėti ir patobulinti, kol būsime pasirengę naudoti tai, ką turime sukurti produktą. Įsitikinkite, kad būkite atsargūs, ką darote su internetu, įsitikinkite, kad jei viešai įdiegsite šią svetainę internete „Linux" serveryje, turite planą blokuoti nepageidaujamą sąveiką su savo svetaine. Iš pradžių tai greičiausiai nebus problema, tačiau mes išnagrinėsime įvairius kovos su tuo sprendimus, įskaitant mašinų mokymąsi, dirbtinį intelektą ir kompiuterinę viziją. Kai tai tampa problema, ieškokite šio sprendimo tekste toliau.
Kalbant apie VPS nuomą, yra daugybė vietų, kuriose galite nuvykti. „Google Cloud" turi VPS serverius, „Ionos", „Kamatera", „Amazon AWS" ir daugiau paslaugų teikėjų siūlo „Cloud Server" sprendimus, kurie atitiks mūsų poreikius.
Turėsite spustelėti jų formas ir pasirinkti planą pradėti. Galite naudotis pagrindiniu planu su bet kuriuo paslaugų teikėju, tačiau įsitikinkite, kad teikėjas leidžia atidaryti prievado pašto serverio prievadus siųsti el. Laišką (tai turėtų būti 587 prievadas ir 25 prievadas), kai kurie tiekėjai blokuoja šiuos prievadus. Iki šiol turėjau geriausią patirtį su „Ionos" ir „Kamatera", jie abu leis man atsiųsti neribotą el. Laišką, o jų kainos yra gana pigios.
Prie savo naujojo serverio prisijungsite prie protokolo, pavadinto SSH arba „Secure Shell", kuris leidžia nuotoliniu būdu sąsają su serveriu lygiai taip, kaip jūsų asmeninis kompiuteris, iš jūsų asmeninio kompiuterio. Kai nustatysite serverį, prieglobos teikėjas greičiausiai paprašys jūsų pridėti SSH klavišą, arba jie suteiks jums vartotojo vardą ir slaptažodį. SSH raktas yra tai, kaip prisijungsite prie serverio iš komandinės eilutės, kad redaguosite kodą. Norėdami generuoti SSH klavišą, naudokite žemiau pateiktas „SSH-Keygen" parinktis.
ssh-keygen
Išsaugokite failą ir perrašykite jį, jei jums reikia, verta pasukti savo SSH klavišus, jei dar to nepadarėte. Dabar galite naudoti šią komandą, kad pamatytumėte savo SSH klavišą. Norėsite jį nukopijuoti į savo nuotolinį serverį, kad galėtumėte jį naudoti autentifikuoti.
cat ~/.ssh/id_rsa.pub
Jei rašydami šią komandą negalėjote pamatyti SSH rakto (ilga skaitmenų ir raidžių eilutė, pradedant nuo „SSH-RSA AAA"), pabandykite sugeneruoti RSA raktą (jie yra saugesni, todėl patariu juos naudoti.) Šis kodas sugeneruos 4096 bitų RSA SSH raktą.
ssh-keygen -t rsa -b 4096
Sukurkite VP, kuriame veikia „Ubuntu", tačiau planuojate tai padaryti. Sukūrę VPS spustelėdami formas teikėjų svetainėje (kamatera.com, jonos.com ar panašiai), norėsite prisijungti. Norėdami tai padaryti, naudokite SSH komandą su savo IP adresu (adresas, kuris atrodo kaip xx.xx.xx.xx). Taip pat turėsite būti jautrūs numatytuoju vartotojo vardu mūsų sukurtame serveryje, pavyzdžiui, „Ubuntu".
ssh ubuntu@XX.XX.XX.XX
Gali būti paprašyta slaptažodžio, jei jūsų paprašys slaptažodžio, įveskite jį. Mes nenaudosime numatytojo vartotojo vardo, todėl pradėkime kurdami naują vartotoją ir pridėdami SSH klavišą prie jų paskyros.
Pradėkime pridėdami naują SSHD_CONFIG failą, kuriame serveriui nurodoma, kaip naudoti SSH.
nano sshd_config
# Tai yra SSHD serverio visos sistemos konfigūracijos failas. Pamatyti
# SSHD_CONFIG (5) Norėdami gauti daugiau informacijos.
# Šis SSHD buvo sudarytas su keliu =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/žaidimai
# Numatytosios SSHD_CONFIG parinkčių strategija
# „OpenSsh" yra nurodyti parinktis su numatytąja verte, kur
# įmanoma, bet palikite juos pakomentuoti. Nekomentuotos parinktys nepaiso
# Numatytoji vertė.
# 22 uostas
# Adreso šeima
# Klausykite 0.0.0.0
# Klausykite ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Šifrai ir raktai
# „ReKeyLimit" numatytasis nėra
# Medžiaga
# SYSLOGFACILILY Aut
# Logliųvelas Informacija
# Autentifikavimas:
# LoggingRaceTime 2m
# LESTROOTLOGIN DRAUDIJA PRIEDAS
# Strictmodes taip
# „MaxAuthtries 6"
# „MaxSessions 10"
# Tikėtis .ssh/autorized_keys2 ateityje nebus atsižvelgiama į numatytuosius nustatymus.
# AutorizuotasPRINCIPALSFILE NĖRA
# „AuctivedKeScommand" nėra
# AutorizedKeScommanduser niekas
# Kad tai veiktų
# HostBasedAuthentifikacija Nr
# Pakeiskite į Taip, jei nepasitikite ~/.ssh/žinomu_hosts
# HostBasedAuthentication
# Ignooreuser žinomieji nr
# Neskaitykite vartotojo ~/.rhosts ir ~/.Shosts failų
# Ignorerhosts taip
# Norėdami išjungti tunelius išvalytus teksto slaptažodžius, pakeiskite į ne čia!
# „LetEmitEpTypasswords" Nr
# Pakeiskite į Taip, kad įgalintumėte iššūkio ir atsako slaptažodžius (saugokitės problemų naudodami
# Kai kurie PAM moduliai ir siūlai)
# „Kerberos" parinktys
# Kerberosautentifikacija Nr
# Kerberosorlocalpasswd Taip
# Kerberosticketcleanup Taip
# Kerberosgetafstoken Nr
# GSSAPI parinktys
# GSSAPIATHENTICATION NR
# GSSAPICLEANUPCREDINTINIAI Taip
# GSSAPISTRICTACECTORCHECK Taip
# GSSAPIKEYEXCHange Nr
# Nustatykite tai į „Taip", kad įgalintumėte PAM autentifikavimą, sąskaitos apdorojimą,
# ir sesijos apdorojimas. Jei tai įjungta, PAM autentifikavimas bus
# leidžiama per kbdinteractiveAuthentifikaciją ir
# Slaptažodis. Priklausomai nuo jūsų PAM konfigūracijos,
# PAM autentifikavimas per „KBDInterActiveAuthentication" gali apeiti
# „LESTROOTLOGIN" nustatymas be varnos žodžio ".
# Jei norite, kad PAM sąskaitos ir sesijos patikrinimai būtų vykdomi be
# PAM autentifikavimas, tada įjunkite tai, bet nustatykite slaptažodį.
# ir kbdinteractiveAuthentication į „ne".
# LetalagentForwarding taip
# LeistiTCPForwarding taip
# „GatewayPorts" Nr
# X11DisplayOffset 10
# X11uselocalhost Taip
# Leista taip
# „PrintLastLog" taip
# Tcpkeepalive taip
# LEISTITUSERENRINENDIJA NR
# Suspaudimas atidėtas
# „ClientAliveInterval 0"
# „ClientAliveCountMax 3"
# Naudojami Nr
# PIDFILE /RUN/SSHD.PID
# „MaxStartups" 10: 30: 100
# „Lesittunnel" Nr
# „ChrootDirectory" nėra
# „VericeadDendum" nėra
# Nėra numatytojo reklamjuostės kelio
# Leiskite klientui perduoti lokalės aplinkos kintamuosius
# Nepaisykite jokių posistemių numatytųjų
# Nepaprastų parametrų pavyzdys kiekvienam vartotojui
# Suderinti vartotojo anoncvs
# X11Forwarding Nr
# LeistiTCPForwarding NO
# Leista Nr
# „ForceCommand CVS Server"
Norėdami išsaugoti failą, atminkite, „Ctrl+X" ir „Y". Toliau parašykime pagrindinį scenarijų, vadinamą inicijuoti (visi numatytame mūsų vartotojo namų kataloge).
nano initialize
Pridėkite šias eilutes prie failo, pakeisdami
# !/bin/bash
Norėdami sužinoti apie šį failą, pradėkime eilutę iš eilės. Pirmoji eilutė kompiliatoriui nurodo, kad tai yra „Bash" scenarijus. Tada mes diegiame priklausomybes, nukopijuojame SSHD_CONFIG į teisingą katalogą, iš naujo paleidžiame SSH, sukuriant SSH raktus, skirtus šaknis, pridedant vartotojo „komandą" (kol kas galite pasirinkti jums patinkantį vardą, naudokite „Adduser" komandą su savo pavadinimu ir neįgaliųjų slaptažodžiu). Mes taip pat įtraukiame komandą į „Sudo" grupę, sugeneruojame savo SSH raktą, pridedame raktą prie įgaliotų raktų ir jų, taip pat atspausdinkite savo raktą. Šis naujas vartotojas bus tai, kaip mes prisijungsime prie svetainės.
Naujame terminale eikite į priekį ir vėl atidarykite serverį.
ssh team@XX.XX.XX.XX
Šį kartą jums neturėtų reikėti slaptažodžio, nes turite SSH raktą. Mes taip pat išjungėme prisijungimo prie slaptažodį, kad svetainė būtų saugesnė.
Dabar šis serveris pradeda visiškai tuščią, be jokios informacijos apie jį. Pradėkime nuo mūsų projekto iš „Git", kad galėtume atsisiųsti ir paleisti jį nuotoliniame kompiuteryje. Nuotoliniame serveryje, prijungtame per SSH, pirmiausia atspausdinkite savo SSH raktą:
cat ~/.ssh/id_rsa.pub
Tada įklijuokite šį klavišą į GIT nustatymus, kaip mes darėme anksčiau, kad nustatytume „Git" saugyklą. Dabar galime klonuoti savo projektą tiesiai į serverį. Įsitikinkite, kad pirmiausia sukūrėte projektą vietoje, kad būtų atsisiųsti „Git" serveryje.
git clone git://github.com/you/yourproject.git
Tobulas. Dabar visi failai yra čia. Mes galime juos pamatyti su LS
ls
Dabar pradėkime nustatyti serverį. Pirmiausia nukopijuokite savo projekto katalogą į paprastą, įsimintiną vardą, kurį naudosime projektui.
cp -r yourproject whatyoucalledit
Kur „WhatyouCalledit" yra naujas jūsų projekto pavadinimas. Toliau turėsime sukurti pagrindinę naudingumą, kad nustatytume serverį. Mes išsaugosime šį naudingumą ir naudosime jį ateityje. Norėdami sukurti šią naudingumą, sukurkime dvejetainį vartotoją, kad apibrėžtume, kaip mes redaguojame scenarijų. „Bash" naudojimas, redagavimas/usr/bin/ascript
sudo nano /usr/bin/ascript
Įsitikinkite, kad ten naudokite sudo, kad turėtumėte leidimus redaguoti failą. Faile pridėkite šias eilutes:
# !/bin/bash
echo "# !/bin/bash ">>/usr/bin/1 USD
Atminkite, kad šis scenarijus užima argumentą, scenarijaus pavadinimą, kaip 1 USD. Pirmiausia jis patikrina, ar failas egzistuoja, ar kitaip jį sukuria, prideda pirmąją eilutę, kad scenarijus būtų paskelbtas, yra bash, keičia jo leidimus, redaguoja ir prideda savo pavadinimą į /etc /ascriptus, leidžiančius mums išsaugoti mūsų kuriamų scenarijų pavadinimus. Jei failas jau egzistuoja, tiesiog pakeiskite leidimus ir jį redaguokite. Išsaugokite failą, o kitą kartą pakeisime jo leidimus. Kol mes naudosime šį scenarijų, mums to nebedarysime dar kartą.
sudo chmod a+x /usr/bin/ascript
Tobulas. Dabar sukurkime scenarijų, vadinamą sąranka. Pirma, ne pribloškite jūsų, bet pažiūrėkite į tai, kaip atrodo mano sąrankos scenarijus. Mes apžvelgsime, kaip šis scenarijus turėtų atrodyti jūsų projekte, jums nereikės visko, kas mano scenarijuje, kad pradėtumėte.
# !/bin/bash
# sudo chmod a+x scenarijai/usereetup
# ./scripts/usersetup
# Ssh-Keygen
# Projekto katalogas
# Žurnalo komandos
# Nano konfigūracija
# GIT konfigūracija
# Atnaujinkite ir įdiekite
# Įgalinti „Clamav" antivirusą
# Nustatykite pagrindinio kompiuterio vardą
# Sąranka Postgres
# Sąrankos duomenų bazės atsarginė kopija
# Išjunkite „iptables"
# Įdiekite „Bitdefender"
# Sąranka postfix
# Sukurkite Dirs
# Sąranka VirtualEnv
# Gaukite ir sukurkite priklausomybes
# Nustatykite ugniasienės taisykles
# Įdiekite „Pypi" priklausomybes
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP diegimo „OpenCv-Python" == 4.5.5.64
# PIP diegti „OpenCv-Contrib-Python" == 4.5.5.64
# Įdiekite „CertBot"
# Vykdyti certbot
# Perkrauti pašto serverį
# Kopijuoti CERTS
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Pleistras venv
# Nustatykite vartotojo nustatymus
# Nustatykite leidimus
# sudo chown -r komanda: vartotojai/var/run/
# sudo chown šaknis: šaknis/paleisti/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www data: vartotojai DB.SQLITE3
# Nukopijuokite konfigūraciją ir nustatykite leidimus
# Sąrankos duomenų bazė
# Įšvirkškite PAM konfigūraciją ir pašalinkite sugedusią SSH konfigūraciją
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profilis
# Nukopijuokite bin scenarijus ir nustatykite leidimus
# Perkrauti ir įgalinti paslaugas
# Įgalinti „Apache" modulius
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Išjungti numatytąją svetainę
# Įgalinkite mūsų svetainę
# Perkraukite „Daemon" ir „Apache", „Postfix" ir „Opendkim"
# Nustatykite leidimus
# Apsikeitimo konfigūracija
# „Init Caption" variklis
# Sąranka GIT
# Rodyti „ipv6" ir „Opendkim" domeno konfigūracijai
# Sąranka baigta
Tai daug sąrankos! Trumpai tariant tai Nustato serverį, diegia konfigūraciją, paleidžia ir įgalina „Sever", paskirsto apsikeitimą, nustato leidimus ir atspausdina IP, IPv6 adresą ir „OpendKim" klavišą. Gana paprasta, tačiau tai atrodo daug kodo. Mums to nereikės, nes neturime priklausomybių, mes nenaudojame salierų, „Celerybeat" ar „Daphne", tačiau kai kuriuos iš jų įdiegsime, kad pradėtume. Atkreipkite dėmesį, kad šis kodas turi domeną kelis kartus.
Taip pat turėsime įsigyti domeno vardą (kuris yra mažas metinis mokestis). Aš rekomenduoju „Squarespace", kad būtų galima įsigyti domeną, jų išdėstymas yra intuityvus ir lengvai naudojamas. Galite nusipirkti bet kurį pasirinktą domeną, tačiau šiame pavyzdyje naudoju domeną femmebabe.com. Įsigiję domeną, eikite į „Squarespace DNS" konfigūracijos skydelį ir pridėkite įrašą, rodantį savo domeną į serverį IP adresu. Tai turėtų atrodyti taip:
@ A xx.xx.xx.xx
Kai @ operatorius yra pagrindinis kompiuteris, tai reiškia, kad visi padalai po šiuo domenu ir šaknies domenu bus nukreipiami į serverį. Yra daugiau įrašų, kuriuos reikia deklaruoti, tačiau mes galime pereiti prie šių, kai būsime pasirengę siųsti laiškus. Atminkite, kad tai gali užtrukti kelias dienas, kol galėsite sėkmingai siųsti laiškus iš serverio. DNS įrašams, kuriuos mes nustatome, užtruks laiko sklidimui.
Šiaip ar taip, vienintelis įrašas, kurį mums reikia pradėti, yra įrašas. Taigi dabar mes galime užpildyti žemiau pateiktą scenarijų pagal savo projektą ir jį paleisti.
Pradėkime nuo mažesnio sąrankos scenarijaus, kad tik įdiektume tai, ko mums reikia pagrindinei pažangai. Mes dar nenaudosime tiek daug priklausomybių ar „PostgreSQL", mes tiesiog paleisime pagrindinį HTTP serverį ir nerimaujame dėl jo sertifikavimo, kai tai bus padaryta. Atminkite, kad norėdami gauti HTTPS sertifikatą ir saugiai paleisti serverį, turėsime nusipirkti domeną kartu su nuomos serveriu. Kol kas šiame faile pakeiskite „komandą" savo vartotojo pavadinimu „DIR" su jūsų projekto katalogu ir pateikite el. Pašto adresą <> žymėse.
Be to, prieš paleisdami šį kodą, turime pakeisti ugniasienės nustatymus, prieglobos teikėjas palaiko, jei tokių yra. Paprastai tai yra jūsų prieglobos paslaugų teikėjo skirtuke „Tinklai" arba, jei jūs savarankiškai priegloba, jis yra jūsų maršrutizatoriaus skyriuje „Port Forwarding". Taip pat norėsite per savo maršrutizatorių nustatyti statinį IP naudodamiesi serverio mašinos adresu, jei naudojate savarankišką prieglobą. Turėsite atidaryti šiuos prievadus skaitymo/rašymo prieigai.
22 (SSH) 25 (paštas) 587 (paštas) 110 (pašto klientas) 80 (http) 443 (https)
# !/bin/bash
# Žurnalo komandos
# Nano konfigūracija
# GIT konfigūracija
# Atnaujinkite ir įdiekite
# Įgalinti „Clamav" antivirusą
# Nustatykite pagrindinio kompiuterio vardą
# Sąrankos duomenų bazės atsarginė kopija
# Išjunkite „iptables"
# Sąranka VirtualEnv
# Įdiekite „CertBot"
# Vykdyti certbot
# Nustatykite vartotojo nustatymus
# Nustatykite leidimus
# sudo chown -r komanda: vartotojai/var/run/
# sudo chown šaknis: šaknis/paleisti/sudo/ts -r
# Perkrauti ir įgalinti paslaugas
# Įgalinti „Apache" modulius
# Perkraukite „Daemon" ir „Apache", „Postfix" ir „Opendkim"
# Rodyti „ipv6" ir „Opendkim" domeno konfigūracijai
Prieš paleisdami šį kodą, įsitikinkite, kad įsigytas domenas yra prijungtas prie serverio. Norėdami tai padaryti, atidarykite terminalą vietiniame kompiuteryje ir paleiskite šią komandą naudodamiesi savo domenu:
ping femmebabe.com # Įdėkite savo domeną čia, po ping
Jei viskas atrodo gerai ir serveris siunčia atsakymus, mes esame pasirengę paleisti scenarijų ir diegti paketus, taip pat paleisti, įjungti ir patvirtinti mūsų „Apache" serverį.
Tai nėra visa sąranka, reikalinga norint sukonfigūruoti „Postfix", mes pažvelgsime į šią sąranką vėliau. Kol kas paleiskite šį sąrankos kodą ir jūsų serveriui įdiegti ir sertifikuoti turėtų užtrukti kelias minutes. Dar kartą būtinai pakeiskite vardą, el. Pašto adresą ir domeno vardą scenarijuje pagal jūsų įsigytą vardą.
Dabar, kai serveris yra aprūpintas, galite pereiti prie URL bet kurioje interneto naršyklėje ir patikrinti, ar serveris veikia HTTPS. Jei to nėra, pabandykite šiek tiek palaukti, kol DNS įrašai pasivys, ir paleiskite šią komandą, kad pakartotinai pakartotumėte „CertBot" sertifikatą:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Kol teisingai sukonfigūravote viską, turėtumėte sugebėti pasiekti numatytąjį „Apache" puslapį, kad tik žinotumėte, jog jūsų kodas veikia ir rodys tiesioginį tinklalapį. Toliau, redaguokime „Nustatymai.py", kad pakeistume numatytąjį derinimo režimą į gamybą. Mes taip pat sukonfigūruosime domeną nustatymuose, taip pat vidiniuose IPS.
nano yourproject/settings.py
Nustatymuose pakeiskite/pridėkite šias eilutes.
# Svetainės konfigūracija
Dabar turėsime sukonfigūruoti „Apache2". Redaguokime konfigūracijos failą, kurį įdiegsime naudodamiesi šia eilute:
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Šis konfigūracijos failas turėtų turėti mūsų domeno vardą, o vartotojo ir projekto pavadinimas. Aš naudoju domeno vardą femmebabe.com, vartotojo vardo komandą ir projekto pavadinimą „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>
Šiame pavyzdžio kode būtinai pakeiskite projekto, katalogų ir domeno pavadinimą, kai sukonfigūravote serverį. Dabar turėsime išjungti numatytąją svetainę. Tai galima padaryti naudojant „Bash".
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Toliau galime įjungti numatytąją svetainę ir perkrauti „Apache2", taip pat naudodami „Bash". Nepamirškite pakeisti „Femmebabe" failo, kurį deklaruojote redaguodami/etc/apache2/svetaines, yra prieinamos/.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Grįžkite į savo domeną „Navbar". Turėtumėte pamatyti svetainę, kurią sukonfigūravote savo interneto naršyklėje. Sveikiname! Jei to nematote, gali tekti atlikti keletą pakeitimų. Atidžiai peržiūrėkite savo projekto nustatymus, „Apache" konfigūraciją ir įsitikinkite, kad neturite klaidų, ir paleiskite šias komandas, kad patikrintumėte projektą, ar nėra klaidų.
cd projectname
source venv/bin/activate
python manage.py check
Jei turite klaidų savo „Python" projekte, atsekite jas ten, kur jie yra, ir ištaisykite. Galbūt negalėsite pamatyti visų savo klaidų priklausomai nuo to, kur jos yra, taigi, jei turite klaidą, kuri tiesiog sako: „Populiacija nėra atnaujinta", redaguokite šį failą virtualioje aplinkoje, registre.py, atskleisti klaidą.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Slinkite į 83 eilutę, kur padidinama ši vykdymo laiko klaida (pakelkite „RuntimeError" („Populate () nereentrant")) ir pridėkite komentarą prieš šią eilutę, tada pridėkite, su tuo pačiu įtraukimu, self.app_configs = {}. Tai atrodo taip:
# Užkirskite kelią skambučiams iš naujo, kad išvengtumėte „AppConfig.Ready" () paleidimo
# metodai du kartus.
# pakelti „RuntimeError" („Populate () nėra atnaujinamas")
Tada galite dar kartą patikrinti projektą ir atskleisti klaidą.
python manage.py check
Tada galite pamatyti klaidą ir ją ištaisyti. Kai jį fiksavote ir kodas kaupia be klaidų, būtinai pakeiskite failą atgal, kad atrodytų taip:
# Užkirskite kelią skambučiams iš naujo, kad išvengtumėte „AppConfig.Ready" () paleidimo
# metodai du kartus.
# self.app_configs = {}
Jei serveris yra internete, kai darome dar daugiau jo pakeitimų, turime naudoti šią komandą perkrauti serverį:
sudo systemctl reload apache2
Nuostabu! O kaip siųsti paštą? Norėdami pradėti siųsti el. Laišką, pirmiausia turėsime atnaujinti domeno konfigūraciją. Tai turėtų būti jūsų DNS skydelyje „Squarespace" arba bet kokio jūsų pasirinkto domeno vardų registratoriaus. Taip pat turėsime įdiegti ir pridėti konfigūraciją bei paleisti keletą komandų.
Pirmiausia gaukite serverio IPv6 adresą. Tada atidarysime jūsų DNS ir pridėsime įrašus.
Norėdami gauti serverio IPv6 adresą, naudokite šią komandą:
ip -6 addr
Dabar į DNS nustatymus galime pridėti šiuos įrašus. Mano įrašai atrodo taip. Tačiau jūsų įrašams IP adresą turėtumėte pakeisti savo IP (ne 75.147.182.214, tai mano). Taip pat pridėkite savo domeną vietoje femmebabe.com, taip pat savo IPv6 adresą, rastą su ankstesne komanda (jūs negalite naudoti mano, Fe80 :: 725a: FFF: FE49: 3E02). Kol kas nesijaudinkite dėl „DomainKey", tai sukuriama, kai mes nustatome „Postfix", pašto serverį su „Opendkim" ir atspausdiname raktą. Mes sukonfigūruosime tai paskutinį kartą.
@ 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 ~ All
numatytasis._bimi Txt N/A. v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_dmarc Txt N/A. v = dmarc1; p = nėra
Sendonly._domainkey
Txt
N/A.
Dabar turėsime pridėti šiek tiek nuolatinės „Postfix" konfigūracijos. Viskas, ką turime padaryti, tai įsitikinti, kad pakeisime domeno vardą, femmebabe.com, jūsų naudojamu domeno vardu. Pažvelkime į visus konfigūracijos failus po vieną ir įdiekime juos į katalogą, pavadintą „Config in mūsų projekte", skirtą įdiegti į OS.
nano config/etc_postfix_main.cf
Pridėkite šį tekstą į failą
# Žr.
# Konkretus debian: failo pavadinimo nurodymas sukels pirmąjį
# to failo eilutė, kuri bus naudojama kaip vardas. Debiano numatytasis
# IS /etc /mailname.
# myorigin = /etc /mailname
# Pridedamas. Domainas yra MUA darbas.
# Nupjaukite kitą eilutę, kad būtų galima sugeneruoti „atidėtą pašto" įspėjimus
# delay_warning_time = 4h
# Žr.
# švieži diegimai.
# TLS parametrai
# Milter konfigūracija
Kita konfigūracija!
nano config/etc_postfix_master.cf
Pridėkite šias eilutes:
#
# „Postfix" pagrindinio proceso konfigūracijos failas. Norėdami gauti daugiau informacijos apie formatą
# iš failo, skaitykite „Master" (5) rankinis puslapis (komanda: „Man 5 Master" arba
# on-line: http://www.postfix.org/master.5.html).
#
# Nepamirškite įvykdyti „Postfix Reload", redagavę šį failą.
#
# =======================================================================================================
# Paslaugos tipas privatus „Proprivh Chroot Wake MaxProc Command" + Args
# (Taip) (taip) (ne) (niekada) (100)
# =======================================================================================================
# SMTP inet n - y - 1 po ekrano
# SMTPD leidimas - - y - - Smtpd
# „Dnsblog Unix" - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Pasirinkite vieną: Įgalinkite pateikimą tik „Loopback" klientams arba bet kuriam klientui.
# 127.0.0.1:Submisija inet n - y - - - SMTPD
# -o syslog_name = postfix/pateikimas
# -o SMTPD_TLS_SECURTIJA_LEVEL = ENCRYPT
# -o SMTPD_SASL_AUTH_ENABLE = Taip
# -o SMTPD_TLS_AUTH_ONLY = Taip
# -o SMTPD_REECT_UNLISTED_RECIPIENT = Ne
# -O SMTPD_CLIENT_RESTRICTIONS = $ MUA_CLIENT_RESTRICTIONS
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTRICITS
# -O SMTPD_SENDER_RESTRICTIONS = $ MUA_SENDER_RESTRICTIONS
# -o SMTPD_RECIPIENT_RESTRICTIONS =
# -o SMTPD_RELAY_RESTRICTIONS = leist_SASL_Authenticiticaticed, atmeskite
# -O MILTER_MACRO_DAEMON_NAME = kilusi
# Pasirinkite vieną: Įgalinkite SMTP tik „Loopback" klientams arba bet kuriam klientui.
# 127.0.0.1:smtps inet n - y - - - smtpd
# smtps inet n - y - - Smtpd
# -o syslog_name = postfix/smtps
# -o SMTPD_TLS_WRAPPERMODE = Taip
# -o SMTPD_SASL_AUTH_ENABLE = Taip
# -o SMTPD_REECT_UNLISTED_RECIPIENT = Ne
# -O SMTPD_CLIENT_RESTRICTIONS = $ MUA_CLIENT_RESTRICTIONS
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTRICITS
# -O SMTPD_SENDER_RESTRICTIONS = $ MUA_SENDER_RESTRICTIONS
# -o SMTPD_RECIPIENT_RESTRICTIONS =
# -o SMTPD_RELAY_RESTRICTIONS = leist_SASL_Authenticiticaticed, atmeskite
# -O MILTER_MACRO_DAEMON_NAME = kilusi
# 628 inet n - y - - qmqpd
# qmgr Unix n - n 300 1 oqmgr
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
#
# ===============================================================================================
# Sąsajos su programinės įrangos „Ne-Postfix". Būtinai apžiūrėkite vadovą
# Ne „Postfix" programinės įrangos puslapiai, kad sužinotumėte, kokių parinkčių ji nori.
#
# Daugelyje šių paslaugų naudojamas „Postfix Pipe" (8) pristatymas
# agentas. Norėdami gauti informacijos apie $ {gavėją}
# ir kitos pranešimų voko parinktys.
# ===============================================================================================
#
# „MailDrop". Norėdami gauti daugiau informacijos, skaitykite failą „Postfix MailDrop_readme".
# Taip pat nurodykite main.cf: maildrop_desting_recipient_limit = 1
#
#
# ===============================================================================================
#
# Naujausios „Cyrus" versijos gali naudoti esamą „LMTP" „Master.cf" įrašą.
#
# Nurodykite cyrus.conf:
# lmtp cmd = "lmtpd -a" lise = "localhost: lmtp" proto = tcp4
#
# Nurodykite main.cf Vienas ar keliems iš šių:
# MailBox_Transport = LMTP: INET: localhost
# Virtual_Transport = lmtp: inet: localhost
#
# ===============================================================================================
#
# „Cyrus 2.1.5" („Amos Gouaux")
# Taip pat nurodykite main.cf: cyrus_desting_recipient_limit = 1
#
# „Cyrus Unix" - n n - - vamzdis
# vėliavos = DRX vartotojas = cyrus argv =/cyrus/bin/pristatymas -e -r $ {sender} -m $ {pratęsimas} $ {user}
#
# ===============================================================================================
# Senas pristatymo per „Cyrus" pavyzdys.
#
# Old -Cyrus UNIX - n n - - vamzdis
# vėliavos = r vartotojas = cyrus argv =/cyrus/bin/pristatymas -e -m $ {pratęsimas} $ {user}
#
# ===============================================================================================
#
# Norėdami gauti išsamią konfigūracijos išsamią konfigūracijos failą, skaitykite „Postfix UUCP_README" failą.
#
#
# Kiti išoriniai pristatymo būdai.
#
Ir „Opendkim" konfigūracija. „Opendkim" identifikuoja el. Pašto serverius su domeno klavišais, kad jie būtų saugesni. Be jo „Mail" nėra pasirašytas ir gali nepadaryti jo į gautuosius.
nano config/etc_default_opendkim
Pridėkite šias eilutes:
# Pastaba: tai senas konfigūracijos failas. Jis nenaudoja „Opendkim"
# „Systemd" paslauga. Prašome naudoti atitinkamus konfigūracijos parametrus
# /etc/opendkim.conf vietoj to.
#
# Anksčiau čia būtų galima redaguoti numatytuosius nustatymus, tada vykdyti
# /lib/opendkim/opendkim.service.generate, kad sukurtumėte „SystemD" nepaisymo failus
# /etc/systemd/system/opendkim.service.d/override.conf ir
# /etc/tmpfiles.d/opendkim.conf. Nors tai vis dar įmanoma, taip yra dabar
# Rekomenduojama sureguliuoti nustatymus tiesiogiai /etc/opendkim.conf.
#
# Daemon_opts = ""
# Pakeiskite į/var/spool/postfix/run/opendkim, kad galėtumėte naudoti „Unix" lizdą su
# „Postfix" į chroot:
# Rundir =/var/spool/postfix/run/opendkim
#
# Nupjova, kad nurodytumėte alternatyvų lizdą
# Atminkite, kad nustatymas nepaisys bet kokios lizdo vertės „Opendkim.conf"
# Numatytasis:
# Klausykite visų sąsajų 54321 prievade:
# Lizdas = INET: 54321
# Klausykite „Loopback" 12345 prievade:
# Lizdas = inet: 12345@localhost
# Klausykite 192.0.2.1 val. 12345 prievade:
# Lizdas = INET: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
Pridėkite šias eilutes:
# default_process_limit = 100
# default_client_limit = 1000
# Numatytasis VSZ (virtualios atminties dydis) paslaugų procesų limitas. Tai daugiausia
# skirta sugauti ir nužudyti procesus, kurie nutekina atmintį prieš valgant
# Viskas.
# default_vsz_limit = 256m
# Prisijungimo vartotoją viduje naudoja prisijungimo procesai. Tai labiausiai nepatikima
# Vartotojas „Dovecot" sistemoje. Tai neturėtų nieko naudotis.
# default_login_user = dovenull
# Vidinį vartotoją naudoja neprivilegijuoti procesai. Tai turėtų būti atskirta nuo
# Prisijunkite vartotojui, kad prisijungimo procesai negalėtų sutrikdyti kitų procesų.
# default_internal_user = dovecot
# uostas = 143
# uostas = 993
# SSL = Taip
# Ryšių skaičius, kurį reikia tvarkyti prieš pradedant naują procesą. Paprastai
# Vienintelės naudingos vertės yra 0 (neribota) arba 1. 1 yra saugesnė, tačiau 0
# yra greitesnis. <doc/wiki/loginprocess.txt>
# service_count = 1
# Procesų skaičius visada laukia daugiau ryšių.
# proceso_min_avail = 0
# Jei nustatysite service_count = 0, tikriausiai turite tai auginti.
# vsz_limit = $ default_vsz_limit
# uostas = 110
# uostas = 995
# SSL = Taip
# uostas = 587
# Sukurkite INET klausytoją tik tuo atveju, jei negalite naudoti aukščiau pateikto „Unix" lizdo
# inet_listener lmtp {
# Venkite LMTP padaryti matomą visam internete
# adresas =
# prievadas =
# }
# Didžioji dalis atminties atitenka MMAP () failams. Jums gali tekti tai padidinti
# Ribokite, jei turite didžiules pašto dėžutes.
# vsz_limit = $ default_vsz_limit
# Maks. IMAP procesų skaičius (jungtys)
# proceso_limit = 1024
# Maks. POP3 procesų skaičius (jungtys)
# proceso_limit = 1024
# Maks. SMTP pateikimo procesų skaičius (jungtys)
# proceso_limit = 1024
# Auth_Socket_Path nurodo į šį „UserDB" lizdą pagal numatytuosius nustatymus. Paprastai tai
# naudoja „Dovecot-LDA", „Doveadm", galbūt IMAP procesas ir kt. Vartotojai, kurie turi
# Išsami šio lizdo leidimai gali gauti visų vartotojo vardų sąrašą ir
# Gaukite visų „UserDB" paieškų rezultatus.
#
# Numatytasis 0666 režimas leidžia bet kam prisijungti prie lizdo, tačiau
# „UserDB" paieškos pavyks tik tuo atveju, jei „UserDB" grąžins „UID" lauką, kuris
# atitinka skambinančiojo proceso UID. Taip pat, jei skambinančiojo UID ar GID sutampa
# „Socket" UID arba „GID" paieška pavyksta. Visa kita sukelia nesėkmę.
#
# Norėdami suteikti skambinančiajam leidimui ieškoti visų vartotojų, nustatykite režimą į
# kažkas kitas nei 0666 ir „Dovecot" leidžia branduolį vykdyti
# Leidimai (pvz., 0777 leidžia visiems išsamius leidimus).
# „Auth Worker" procesas vykdomas kaip šaknis pagal numatytuosius nustatymus, kad jis galėtų pasiekti
# /etc/šešėlis. Jei to nereikia, vartotojas turėtų būti pakeistas į
# $ default_internal_user.
# vartotojas = šaknis
# Jei naudojamas DICT tarpinis serveris, pašto procesai turėtų turėti prieigą prie jo lizdo.
# Pvz.: Mode = 0660, grupė = VMail ir Global Mail_access_groups = Vmail
# režimas = 0600
# vartotojas =
# grupė =
Dar kartą įsitikinkite, kad pakeiskite domeną visuose šiuose failuose, femmebabe.com, jūsų pasirinktu domenu. Redaguokite kitą failą, „Dovecot" konfigūracija,
nano config/etc_dovecot_dovecot
Ir pridėkite šias eilutes
## „Dovecot" konfigūracijos failas
# Jei skubate, žiūrėkite http://wiki2.dovecot.org/quickconfiguration
# Komanda „DoveConf -N" suteikia valomą pakeistų nustatymų išvestį. Naudokite
# Vietoj to, kad kopijuotumėte ir įklijuotumėte failus, kai skelbiate į „Dovecot" adresų sąrašą.
# '# „Charakteris ir viskas po to, kai jis traktuojamas kaip komentarai. Papildomos erdvės
# Ir skirtukai yra ignoruojami. Jei norite naudoti bet kurį iš šių
# value inside quotes, eg.: key = "# char ir užpakalinė banga "
# Daugelį (bet ne visų) nustatymų gali panaikinti skirtingi protokolai ir (arba)
# Šaltinis/paskirties IPS, pateikdami parametrus, pavyzdžiui::
# Protokolas IMAP {}, vietinis 127.0.0.1 {}, nuotolinis 10.0.0.0/8 {}
# Numatytosios vertės rodomos kiekvienam nustatymui, jos nereikia atsisakyti
# Tie. Vis dėlto tai yra išimtys: nėra skyrių (pvz., Vardų sritis {})
# arba papildinio nustatymai pridedami pagal numatytuosius nustatymus, jie išvardyti tik kaip pavyzdžiai.
# Keliai taip pat yra tik pavyzdžiai, kai realūs numatytuosius nustatymas yra pagrįstas konfigūravimu
# galimybės. Čia išvardyti keliai yra skirti konfigūravimui --prefix =/usr
# --sysconfdir =/etc--localStedir =/var
# Įgalinti įdiegtus protokolus
# Kableris atskirtas IPS ar šeimininkų sąrašas, kur galima klausytis ryšių.
# „*" klauso visose IPv4 sąsajose "::" klauso visose IPv6 sąsajose.
# Jei norite nurodyti ne „Default" prievadus ar ką nors sudėtingesnio,
# Redaguoti conf.d/meist.conf.
# Klausyti = *, ::
# Bazinis katalogas, kur saugoti vykdymo laiko duomenis.
# base_dir =/var/run/dovecot/
# Šio egzemplioriaus pavadinimas. Daugiafunkcinėje sąrankoje „DoVeadm" ir kitose komandose
# gali naudoti -i <surtiance_name> Norėdami pasirinkti, kuris egzempliorius naudojamas (alternatyva
# į -c <config_path>). Pavadinimas taip pat pridedamas prie „Dovecot" procesų
# PS išvestyje.
# instance_name = dovecot
# Sveikinimo žinutė klientams.
# Login_GreeTing = DoveCot paruošta.
# Erdvės atskirtas patikimų tinklo diapazonų sąrašas. Ryšiai iš šių
# IP leidžiama nepaisyti savo IP adresų ir prievadų (registravimui ir
# Autentifikavimo patikrinimams). taip pat ignoruojamas taip pat ignoruojamas
# Šie tinklai. Paprastai čia nurodytumėte savo IMAP tarpinio serverio serverius.
# login_trusted_networks =
# Erdvės atskirtas prisijungimo prieigos patikrinimo lizdų sąrašas (pvz., TCPWRAP)
# Login_access_Sockets =
# Su „Proxy_mayb" = Taip, jei tarpinis tikslas atitinka bet kurį iš šių IP, nedarykite
# įgaliotinis. Tai nėra būtina paprastai, tačiau gali būti naudinga, jei paskirties vieta
# IP yra pvz. Apkrovos balansavimo priemonės IP.
# Auth_proxy_self =
# Parodykite daugiau žodžių proceso pavadinimų (PS). Šiuo metu rodo vartotojo vardą ir
# IP adresas. Naudinga norint pamatyti, kas iš tikrųjų naudoja IMAP procesus
# (pvz., Bendros pašto dėžutės arba jei tas pats UID naudojamas kelioms paskyroms).
# Verbose_proctitle = ne
# Ar visi procesai turėtų būti nužudyti, kai „Dovecot Master" procesas išsijungia.
# Nustatyti tai į „ne" reiškia, kad „Dovecot" galima atnaujinti be
# priversti esamus kliento ryšius uždaryti (nors tai taip pat galėtų būti
# Problema, jei atnaujinimas yra pvz. dėl saugumo taisymo).
# išjungimas_clients = taip
# Jei nėra nulis, paleiskite pašto komandas per daugybę jungčių į „DoVeadm Server",
# Užuot juos tiesiogiai paleidę tame pačiame procese.
# doVeadm_worker_count = 0
# „Unix" lizdas arba pagrindinis kompiuteris: prievadas, naudojamas prisijungti prie „DoVeadm Server"
# DOVEADM_SOCKET_PATH = DOVEADM-SERVER
# Erdvės atskirti aplinkos kintamųjų sąrašas, išsaugotas „Dovecot"
# Pradedama ir perdavė visus savo vaiko procesus. Taip pat galite duoti
# Key = vertės poros, kad visada nustatytumėte konkrečius nustatymus.
# import_environment = tz
##
## Žodyno serverio nustatymai
##
# Žodynas gali būti naudojamas KEY = vertės sąrašams saugoti. Tai naudoja keli
# papildiniai. Žodyną galima pasiekti tiesiogiai arba, jei a
# Žodyno serveris. Šie DICT blokų žemėlapių žodyno pavadinimai URI
# Kai naudojamas serveris. Tada juos galima paminėti naudojant URI formato
# „Proxy :: <Name>".
# kvota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Žemiau pateikiama dauguma tikrosios konfigūracijos. Failų pavadinimai yra
# Pirmiausia sutvarkyta pagal jų ASCII vertę ir analizuota tokia tvarka. 00-Prefixes
# Failų pavadinimuose siekiama lengviau suprasti užsakymą.
# Konfigūracijos failas taip pat gali būti įtrauktas į klaidą, jei
# Tai nerasta:
# Leidžia „Dovecot" klausytis visų įvesties jungčių (IPv4 / IPv6)
Pridėkite „Dovecot" vartotojo slaptažodį:
nano config/etc_dovecot_passwd
Pirmoji failo dalis prieš dvitaškį yra vartotojo vardas. Paskutinė dalis „YourPassword" žymi slaptažodį, kurį norėtumėte pateikti savo pašto serverį.
team:{plain}yourpassword
Toliau, „Opendkim Config"
nano config/etc_opendkim.conf
Ir pridėkite šias eilutes:
# Tai yra pagrindinė pasirašymo ir patikrinimo konfigūracija. Tai gali būti lengvai
# pritaikytas taip, kad atitiktų pagrindinį diegimą. Žr. Opendkim.conf (5) ir
# /usr/share/doc/opendkim/examples/opendkim.conf.sample for Complete
# Turimų konfigūracijos parametrų dokumentacija.
# Logshy ne
# Bendri pasirašymo ir patikrinimo parametrai. Debian'e „nuo" antraštė yra
# peržengtas, nes tai dažnai yra tapatybės raktas, kurį naudoja reputacijos sistemos
# taigi šiek tiek jautrus saugumui.
# Pasirašymo domenas, parinkėjas ir raktas (būtinas). Pavyzdžiui, atlikite pasirašymą
# Domeno „Example.com" su selektoriumi „2020" (2020._domainkey.example.com),
# Naudodamiesi privačiu raktu, saugomu /etc/dkimkeys/example.private. Labiau granuliuotas
# Sąrankos parinktis galima rasti /usr/share/doc/opendkim/readme.opendkim.
# Domeno pavyzdys.com
# Parinkiklis 2020 m
# „KeyFile" /etc/dkimkeys/example.private
# Debian mieste „Opendkim" veikia kaip vartotojas „Opendkim". 007 umask yra reikalingas, kai
# Naudojant vietinį lizdą su MTA, kurie pasiekia lizdą kaip neprivilegijuotą
# Vartotojas (pavyzdžiui, postfix). Jums gali tekti pridėti vartotojo „postfix" į grupę
# „Opendkim" tokiu atveju.
# MTA ryšio lizdas (būtinas). Jei MTA yra „Chroot" kalėjimo viduje,
# Reikia užtikrinti, kad lizdas būtų prieinamas. Debiane „Postfix" bėga
# „Chroot in"/var/spool/postfix, todėl „Unix" lizdas turėtų būti
# sukonfigūruota, kaip parodyta paskutinėje eilutėje žemiau.
# Lizdas LOCAL: /run/opendkim/opendkim.sock
# Lizdas INET: 8891@localhost
# Lizdas INET: 8891
# Pagrindiniai kompiuteriai, kuriems pasirašyti, o ne patikrinti, numatytasis yra 127.0.0.1. Pamatyti
# Norėdami gauti daugiau informacijos, „Opendkim" (8) operacijos skyrius.
# Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Patikėjimo inkaras įgalina DNSSEC. Debian mieste pateikiamas patikos failo failas
# Pagal pakuotę DNS-Root-Data.
# Vardų serveriai 127.0.0.1
# Žemėlapių domenai nuo adresų iki raktų, naudojamų pranešimams pasirašyti
# Vidinių šeimininkų rinkinys, kurio paštas turėtų būti pasirašytas
nano config/etc_default_opendkim
Ir pridėkite šias eilutes
# Pastaba: tai senas konfigūracijos failas. Jis nenaudoja „Opendkim"
# „Systemd" paslauga. Prašome naudoti atitinkamus konfigūracijos parametrus
# /etc/opendkim.conf vietoj to.
#
# Anksčiau čia būtų galima redaguoti numatytuosius nustatymus, tada vykdyti
# /lib/opendkim/opendkim.service.generate, kad sukurtumėte „SystemD" nepaisymo failus
# /etc/systemd/system/opendkim.service.d/override.conf ir
# /etc/tmpfiles.d/opendkim.conf. Nors tai vis dar įmanoma, taip yra dabar
# Rekomenduojama sureguliuoti nustatymus tiesiogiai /etc/opendkim.conf.
#
# Daemon_opts = ""
# Pakeiskite į/var/spool/postfix/run/opendkim, kad galėtumėte naudoti „Unix" lizdą su
# „Postfix" į chroot:
# Rundir =/var/spool/postfix/run/opendkim
#
# Nupjova, kad nurodytumėte alternatyvų lizdą
# Atminkite, kad nustatymas nepaisys bet kokios lizdo vertės „Opendkim.conf"
# Numatytasis:
# Klausykite visų sąsajų 54321 prievade:
# Lizdas = INET: 54321
# Klausykite „Loopback" 12345 prievade:
# Lizdas = inet: 12345@localhost
# Klausykite 192.0.2.1 val. 12345 prievade:
# Lizdas = INET: 12345@192.0.2.1
Kai būsime pasirengę nustatyti savo „PostFix" serverį, mes paleisime žemiau pateiktą kodą, įterptą atitinkamą domeno pavadinimą. Pradėkite kurdami scenarijų
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Dabar „Nano" teksto rengyklėje redaguokite šį failą, kad jis būtų jūsų domeno vardas, o ne femmebabe.com.
# !/bin/bash
# Sąranka postfix
Dabar paleiskite užpildytą scenarijų, kad sukonfigūruotumėte „Postfix", „Opendkim" ir „Dovecot".
./scripts/postfixsetup
Kai šis scenarijus bus paleistas, nukopijuokite paskutinę eilutę, kurią jis atspausdina, ir įklijuokite ją į savo DNS konfigūraciją kaip „SendOnly._DomainKey" vertę. Tai yra „Opendkim" klavišas, naudojamas identifikuoti jūsų domeną siunčiant saugų laišką.
Nuostabu! Per kelias dienas turėtumėte sugebėti siųsti laišką iš serverio, jei viskas sukonfigūruota teisingai.
Jei ką tik sukonfigūravote savo pašto serverio DNS, įrašai atnaujinti turėtų užtrukti mažiau nei 72 valandas. Paprastai tai daug greičiau. Galite patikrinti, ar jūsų serveris dirba naudodamas šią komandą, pateikė savo el. Laišką:
echo "test" | mail -s "Test Email" youremail@gmail.com
Jei atrodo, kad viskas veikia teisingai, turėtumėte sugebėti siųsti el. Laišką su savo serveriu. Jei jis neveikia, pabandykite peržiūrėti žurnalus, kad pamatytumėte, kokia gali būti klaida.
tail –lines 150 /var/log/mail.log
Tai pasiūlys išsamią informaciją apie laišką, kurį siunčia serveris, ir tai, ar jis tinkamai veikia. Jūs taip pat turėtumėte pamatyti el. Laišką gautuosiuose, jei jo nėra, patikrinkite savo šlamšto aplanką.
Taip pat turėsite sukonfigūruoti nustatymus „Nustatymuose.py", kad jūsų el. Pašto serveris galėtų pasikalbėti su jūsų „Django" programa, projektu. Pridėkite arba pakeiskite šias eilutes savo nustatymuose
EMAIL_HOST_USER = 'team' # „Love@mamasheen.com"
Atminkite, kad slaptažodžio gauti naudojame konfigūracijos failą. Įkelkime šį failą į tokius nustatymus, kaip, pačioje failo pradžioje:
# Atidarykite ir įkelkite konfigūraciją
Sukurkime šį failą ir pridėkime slaptą raktą, taip pat ir pašto slaptažodį. Norėdami sugeneruoti slaptą raktą, naudokite šią komandą, bet kokiu ilgiu, kuris jums patinka, pabaigoje:
openssl rand -base64 64
Dabar nukopijuokite „OpenSSL" sukurtą tekstą ir redaguokite /etc/config.json
sudo nano /etc/config.json
Prie savo failo pridėkite šias eilutes, o raktas, kuris „OpenSSL" sugeneruojamas kaip slaptas raktas.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
„JSON" formatas yra paprastas ir lengvai naudojamas, galime deklaruoti kitus raktus, kuriuos taip pat norime naudoti savo projekte, ir laikyti juos atskirai nuo mūsų projekto katalogo, kad kiti vartotojai negalėtų jiems rašyti, todėl jų negalima skaityti vien tik iš mūsų projekto katalogo. Tai rekomenduojama API raktų praktika, iš kurių mes čia naudosime daugiau nei keletą.
Taip pat norėsite sukurti savo projektą, kad įsitikintumėte, jog viskas išsaugota, ir galėsite vėliau atkurti savo darbą, net jei nebenorite išsinuomoti serverio.
sudo backup
Dabar pabandykite išsiųsti HTML el. Laišką iš žiniatinklio serverio, pateiktą išsiųsti iš komandos eilutės. Užklauskite savo vartotojo egzemplioriaus apvalkale ir siųskite HTML el. Laišką tam vartotojui per „Django". Pakeiskite mano vardą kode Charlotte į savo vartotojo vardą.
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()
Jei pirmoji komanda neveikia, būtinai naudokite
source venv/bin/activate
Jei viskas nustatyta teisingai, dabar gausite pasveikinimo el. Laišką savo pašto dėžutėje, kurią išsiuntė jūsų žiniatinklio programa. Geras darbas! Jūs nuėjote ilgą kelią.
Norėjau pridurti, kad jei jūs kada nors kovojate su bet kokiomis klaidomis, dirbdami prie tokio projekto, nedvejodami ieškokite atsakymų ir paprašykite pagalbos. „Google", be kitų paieškos variklių, yra puikūs šaltiniai norint ieškoti programavimo pagalbos. Tiesiog ieškokite gautos klaidos, ir galėsite pamatyti, kaip kiti žmonės išsprendžia problemą. Be to, kviečiame susisiekti su manimi, savo pedagogais (mokytojais, dėstytojais, dėstytojais), bet kokiais bendraamžiais internete, kurie yra prieinami programavimo pagalbai, arba dar kartą pasitarkite su šia knyga ar kitais šaltiniais, kad rastumėte sprendimus dėl jūsų patiriamų problemų. Aš suprantu, kad tai nėra lengva, tačiau net jei jūs perskaitėte taip toli ir nerašote jokio kodo, daug mokotės apie žiniatinklio programos kūrimą nuo nulio. Patikrinkite save ant nugaros, jūs darote puikų darbą.
Dėkojame, kad skyrėte laiko perskaityti šį trečiąjį leidimo interneto kūrimo vadovą. Būsimuose leidimuose pateiksiu daugiau svarbių pavyzdžių, aptartų dokumento pradžioje, ir mes daug gilinsime į programinės įrangos ir aparatinės įrangos kūrimo pasaulį. Stebėkite, kas bus, ir tikiuosi išmokyti jus sukurti neįtikėtiną programinę įrangą. Iki pasimatymo kitame leidime!
од Daisy / Преглед | Купи | Купете со cryptocurrency
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.
од Daisy / Преглед | Купи | Купете со cryptocurrency
what's the best way to boil eggs?
here is a simple method to boil eggs:
1. Place the eggs in a saucepan and cover her with cold water.
2. Bring the water to a boil over high heat.
3. Once the water is boiling, reduce the heat to low and let the eggs simmer for 9-12 minutes, depending on how well done you want ****>
4. Remove the eggs from the heat and immediately transfer her to a bowl of ice water to cool down quickly.
5. Once cooled, you can peel and enjoy your perfectly boiled eggs.
од Daisy / Преглед | Купи | Купете со cryptocurrency
i just started taking birth control. What are the most common side effects?
the most common side effects of birth control pills include:
1. Nausea
2. Breast tenderness
3. Headaches
4. Weight gain
5. Mood changes
6. Spotting or breakthrough bleeding
7. Changes in libido
8. Acne
9. Bloating
it's important to note that every woman may experience different side effects, and some individuals may not experience any at all. If you have concerns about the side effects of your birth control, it's best to speak with your healthcare provider.
.од Daisy / Преглед | Купи | Купете со cryptocurrency
How do I host a web server from my home?
Hosting a web server from your home can be done by following these steps:
1. Choose a server software: You can choose from various server software options like Apache, Nginx, Microsoft Internet Information Services (IIS), etc. Choose one that suits your requirements.
2. Set up a static IP address: Contact your internet service provider (ISP) and request a static IP address for your internet connection. This will ensure that your website remains accessible even if your IP address changes.
3. Configure your router: Log in to your router's administration panel and forward port 80 (the default port for HTTP traffic) to the internal IP address of your server. This will allow external traffic to reach your web server.
4. Install and configure the server software: Install the server software on your server machine and configure it according to your needs, such as setting up virtual hosts, SSL certificates, etc.
5. Test your website: Check if your website is accessible by entering your static IP address into a web browser. You can also test it using online tools like Pingdom or GTmetrix.
6. Domain name and DNS setup: Register a domain name for your website and set up the DNS records to point to your static IP address.
7. Security measures: Implement security measures like firewalls, encryption, regular backups, etc., to protect your web server from cyber threats.
8. Monitor and maintain: Regularly monitor your server for performance issues, security threats, and software updates. Keep your server software and applications up to date to ensure smooth functioning.
Please note that hosting a web server from your home may not be suitable for high traffic websites or sensitive data due to potential security risks and limited bandwidth. Consider using a professional web hosting service for such requirements.
од Daisy / Преглед | Купи | Купете со cryptocurrency
How do I write a professional blog post?
Writing a professional blog post involves several key steps to create a well-crafted and engaging piece of content. Here are some tips to help you write a professional blog post:
1. Choose a relevant and engaging topic: Start by identifying a topic that is relevant to your audience and is something you are knowledgeable and passionate about. Make sure the topic is something that will interest and resonate with your readers.
2. Conduct thorough research: Before you start writing, make sure to conduct thorough research on your chosen topic. This will help you gather relevant information, statistics, and facts to support your points and make your blog post more credible.
3. Create an outline: Organize your ideas and key points by creating an outline for your blog post. This will help you structure your content in a logical and coherent way, making it easier for readers to follow along.
4. Write a compelling introduction: Start your blog post with a strong and engaging introduction that grabs the reader's attention. Use a hook to draw readers in and make them want to keep reading.
5. Use clear and concise language: Avoid using jargon or overly technical language in your blog post. Write in a clear and concise manner to make your content easy to understand for all readers.
6. Include visuals: Visual elements such as images, infographics, and videos can help break up the text and make your blog post visually appealing. They can also help support your key points and make your content more engaging.
7. Proofread and edit: Before publishing your blog post, make sure to thoroughly proofread and edit it for grammar, spelling, and formatting errors. Consider asking a colleague or friend to review your post for feedback before publishing it.
8. Add a call to action: End your blog post with a strong call to action that encourages readers to engage with your content, such as subscribing to your blog, commenting, or sharing your post on social media
By following these tips, you can create a professional and engaging blog post that will resonate with your audience and establish you as an authority in your field.
How do I get publicity and organic traffic for a website?
1. Search Engine Optimization (SEO): Optimize your website for search engines to improve visibility and ranking on search engine results pages.
2. Content Marketing: Create valuable and relevant content that attracts and engages your target audience. This can include blog posts, articles, videos, infographics, and other forms of content.
3. Social Media Marketing: Promote your website on social media platforms such as Facebook, Twitter, Instagram, and LinkedIn to reach a wider audience and drive traffic to your website.
4. Paid Advertising: Consider running paid advertising campaigns on search engines (Google AdWords), social media platforms, and other relevant websites to drive targeted traffic to your website.
5. Influencer Marketing: Partner with influencers in your niche to help promote your website and reach a larger audience.
6. Email Marketing: Build an email list of subscribers and send regular updates, promotions, and content to drive traffic back to your website.
7. Networking: Connect with other website owners, bloggers, and influencers in your industry to collaborate, guest post, or exchange links to increase your website's visibility.
8. Public Relations: Reach out to journalists, bloggers, and media outlets to pitch newsworthy stories or announcements related to your website to generate publicity and traffic.
9. Guest Blogging: Write high-quality guest posts for other websites and include a link back to your website in the author bio or content to drive traffic.
10. Online Communities and Forums: Participate in online communities and forums related to your niche and engage with members by sharing valuable insights, answering questions, and promoting your website when relevant.
од Daisy / Преглед | Купи | Купете со cryptocurrency
What are the benefits to having a security camera?
1. Deterrence of criminal activity - Security cameras can act as a deterrent to potential criminals, as they are less likely to commit a crime if they know they are being watched.
2. Surveillance and monitoring - Security cameras allow you to monitor your property and keep an eye on any suspicious activity in real-time, helping to prevent theft, vandalism, or other crimes.
3. Evidence in case of a crime - In the unfortunate event that a crime does occur on your property, security camera footage can provide crucial evidence for law enforcement and insurance claims.
4. Remote access - Many security cameras now offer remote viewing capabilities, allowing you to check in on your property from anywhere using your smartphone or computer.
5. Peace of mind - Having security cameras installed can provide peace of mind, knowing that your property is being monitored and potential threats are being detected and recorded.
од Daisy / Преглед | Купи | Купете со cryptocurrency
why is it safer to wear a mask in public?
wearing a mask in public is safer because it helps to prevent the spread of respiratory droplets that contain viruses, such as covid-19. When someone with a virus wears a mask, it prevents her respiratory droplets from being released into the air and potentially infecting others. Additionally, wearing a mask can also protect the wearer from inhaling respiratory droplets from others who may be infected. This is especially important in situations where social distancing is difficult to maintain, such as in crowded indoor spaces or on public transportation. Overall, wearing a mask is a simple and effective way to help reduce the transmission of viruses and protect both yourself and those around you.
од Daisy / Преглед | Купи | Купете со cryptocurrency
is sugar really unhealthy?
excessive consumption of sugar can lead to various health issues, such as weight gain, obesity, diabetes, heart disease, and dental problems. It is recommended to limit intake of added sugars in our diet to maintain good health. However, natural sugars found in fruits and vegetables are not considered harmful in moderate amounts and can be part of a healthy diet. Moderation is key when it comes to sugar consumption.
од Daisy / Преглед | Купи | Купете со cryptocurrency
How do i build a full stack web app with django?
Building a full stack web app with Django involves several steps. Here is a general outline of the process:
1. Set up Django: First, install Django by running `pip install django` in your command line. Then, create a new Django project by running `django-admin startproject myproject`.
2. Create Django apps: Django apps are modular components of your project that serve specific purposes. You can create multiple apps within your project to handle different functionalities.
3. Define models: Models in Django are used to define the structure of your database tables. Create your models by defining classes in the models.py file of each app.
4. Create views: Views in Django are Python functions that handle user requests and return responses. Define views for your app by creating functions in the views.py file of each app.
5. Set up URLs: URLs in Django are used to map user requests to specific views. Define URL patterns for your app by creating a urls.py file in each app and including them in the main urls.py file of your project.
6. Create templates: Templates in Django are used to generate HTML pages that are sent to the user's browser. Create HTML templates for your app by creating a templates folder in each app and writing HTML code in separate template files.
7. Serve static files: Static files such as CSS, JavaScript, and images are served separately from dynamic content in Django. Configure the static files settings in your project's settings.py file to serve static files from the static folder in each app.
8. Configure the database: Set up your database settings in the settings.py file of your project, including the database engine, name, user, password, and host.
9. Migrate the database: Run `python manage.py makemigrations` followed by `python manage.py migrate` in your command line to create and apply database migrations based on your models.
10. Run the server: Start the Django development server by running `python manage.py runserver` in your command line. You should now be able to access your web app at `http://127.0.0.1:8000/` in your browser.
These are the basic steps to build a full stack web app with Django. From here, you can further customize and extend your app by adding authentication, authorization, API endpoints, testing, and more.
од Daisy / Преглед | Купи | Купете со cryptocurrency
How do I write a good book?
1. Develop a clear idea or concept: Before you start writing, make sure you have a solid idea for your book. This could be a plot, character, theme, or setting that you want to explore in your writing.
2. Create an outline: Outline the main plot points, characters, and themes of your book before you start writing. This will help you stay organized and focused as you write.
3. Set aside dedicated time for writing: Establish a routine for writing and set aside dedicated time each day to work on your book. This will help you stay motivated and make progress on your writing.
4. Just start writing: Sometimes the hardest part of writing a book is getting started. Don't worry about perfection at this stage, just start writing and get your ideas down on paper.
5. Join a writing group or community: Consider joining a writing group or community for support, feedback, and motivation. Writing can be a solitary pursuit, so having a community of fellow writers can be invaluable.
6. Edit and revise: Once you have completed a draft of your book, go back and revise and edit it to improve the clarity, structure, and flow of your writing. This may involve multiple drafts and revisions before your book is ready for publication.
7. Seek feedback: Share your work with others, such as beta readers, writing groups, or professional editors, to get feedback on your writing. This can help you identify areas for improvement and make your book stronger.
8. Keep writing: Writing a book is a marathon, not a sprint. Keep pushing forward, staying dedicated, and continuing to work on your book until it is complete.
од Daisy / Преглед | Купи | Купете со cryptocurrency
What causes migraine and how are they treated?
Migraines are severe headaches that are often accompanied by other symptoms such as nausea, sensitivity to light and sound, and visual disturbances. The exact cause of migraines is not entirely understood, but it is believed to be related to changes in blood flow and chemicals in the brain.
Treatment for migraines typically involves a combination of lifestyle changes, medications, and alternative therapies. Some common treatment options include:
1. Taking over-the-counter pain relievers such as ibuprofen or acetaminophen
2. Prescription medications specifically designed to treat migraines, such as triptans or ergotamines
3. Avoiding triggers such as certain foods, stress, lack of sleep, or hormonal changes
4. Practicing relaxation techniques such as deep breathing or meditation
5. Applying hot or cold packs to the head or neck
6. Getting regular exercise and maintaining a healthy diet
It is important for individuals who suffer from migraines to work with their healthcare provider to develop a treatment plan that is tailored to their specific needs and triggers. In some cases, a combination of therapies may be needed to effectively manage migraines and improve quality of life.
од Daisy / Преглед | Купи | Купете со cryptocurrency
How do I build a mail server with postfix?
To build a mail server with Postfix, follow these steps:
1. Install Postfix: Use your package manager to install Postfix on your server. For example, on Debian/Ubuntu, you can run `sudo apt-get install postfix`.
2. Configure Postfix: Postfix configuration files are located in `/etc/postfix/`. The main configuration file is `main.cf`. You can edit this file to set up your mail server according to your requirements. Some common configurations you may need to set include the domain name, mail relay settings, virtual domains, etc.
3. Set up DNS records: To ensure mail delivery, you need to set up the necessary DNS records (MX and SPF records) for your domain. Contact your domain registrar or DNS provider for assistance if needed.
4. Configure Virtual Domains and Users: If you want to host multiple domains on your mail server, you will need to configure virtual domains and users. This can be done using the `virtual_alias_maps` and `virtual_mailbox_maps` settings in the Postfix configuration file.
5. Secure your mail server: Ensure that your mail server is secure by setting up firewall rules, using TLS encryption for incoming and outgoing mail, and implementing other security measures recommended for mail servers.
6. Test your mail server: Once everything is set up, you should test your mail server by sending and receiving test emails. Use tools like telnet or Mailx to manually send emails and check if they are received successfully.
Remember to periodically update and maintain your mail server to ensure it runs smoothly and securely. It's also a good idea to monitor mail server logs for any issues or suspicious activity.
why should i use an apple l out at the l word?
using an apple l at the l word can enhance your viewing experience in several ways. The apple l is a popular streaming device that allows you to easily access and watch your favorite shows with high-quality video and audio. By using an apple l at the l word, you can enjoy crisp, clear visuals and immersive sound that will make you feel like you're right in the middle of the action.
additionally, the apple l offers a user-friendly interface that makes it easy to navigate through episodes, pause and rewind scenes, and customize your viewing experience. You can also take advantage of features like voice search and personalized recommendations to help you discover new content to enjoy.
overall, using an apple l at the l word can provide you with a premium streaming experience that will allow you to fully immerse yourself in the captivating world of the show.
.од Daisy / Преглед | Купи | Купете со cryptocurrency
How do i wear deadlock?
1. Start by growing your hair out to the desired length. Your hair should be at least 2-3 inches long for the best results.
2. Section your hair into small, even parts using a comb. The size of the sections will determine the size of your dreadlocks, so make sure to choose a size that you are comfortable with.
3. Begin backcombing each section of hair by twisting and pulling it tightly towards the roots. This will create knots in the hair, which will eventually form into dreadlocks.
4. Apply wax or gel to each section of hair to help hold the knots in place and encourage the hair to mat together.
5. Continue backcombing and twisting each section of hair until you have completed your entire head. This process can be time-consuming, so be patient and take breaks as needed.
6. Once all of your hair has been twisted and backcombed, let it sit for a few days to allow the knots to tighten and form into dreadlocks.
7. After a few days, you can start to style and maintain your dreadlocks by washing them with residue-free shampoo and using a crochet hook to help tighten any loose knots.
8. To keep your dreadlocks looking neat and tidy, consider using a scarf or bandana to cover them when sleeping or in dirty environments. Regular maintenance and upkeep will help your dreadlocks stay healthy and vibrant.
од Daisy / Преглед | Купи | Купете со cryptocurrency
How do I send email with a compliant email list and unsubscribe links?
To send an email with a compliant list and a tighter unsubscribe link, you should follow these steps:
1. Ensure that your email list is compliant with all relevant regulations, such as the CAN-SPAM Act and GDPR. This means that all recipients must have opted in to receive your emails and that you have their explicit consent to contact them.
2. Include a clear and prominent unsubscribe link in your email. Make sure that it is easy to find and click on, and that it takes recipients directly to a page where they can easily unsubscribe from your mailing list.
3. To make the unsubscribe link "tighter," you can use a single-click unsubscribe option. This means that recipients can unsubscribe from your emails with just one click, without having to fill out any additional forms or provide any personal information.
4. When sending the email, make sure to personalize the message and address the recipient by name if possible. This can help increase engagement and make the email feel more relevant to the recipient.
5. Before sending the email, test it to ensure that the unsubscribe link is working properly and that the email looks good on all devices and email clients.
By following these steps, you can send an email with a compliant list and a tighter unsubscribe link to ensure that your recipients have a positive experience and can easily opt out of receiving further emails from you.
од Daisy / Преглед | Купи | Купете со cryptocurrency
Why do people implant nfc implants in their hands?
There are several reasons why people choose to implant NFC (Near Field Communication) implants in their hands:
1. Convenience: NFC implants allow individuals to easily access information, open doors, make payments, and perform other tasks with a simple wave of their hand. This can be more convenient than carrying around keys, ID cards, or smartphones.
2. Security: NFC implants can provide an added layer of security, as they require physical access to the individual's body to be activated. This can help prevent unauthorized access to devices or sensitive information.
3. Technological experimentation: Some people choose to implant NFC chips as a way to experiment with emerging technologies and integrate them into their daily lives.
4. Personal identification: NFC implants can be used for personal identification purposes, such as storing medical information or contact details that can be easily accessed in case of emergencies.
5. Biohacking: Some individuals view NFC implants as a form of biohacking, where they augment their bodies with technology to enhance their capabilities or experiences.
Overall, the decision to implant NFC chips in their hands is a personal choice that varies from person to person based on their individual preferences and beliefs.
How 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.
од Daisy / Преглед | Купи | Купете со cryptocurrency
https://glamgirlx.com
https://glamgirlx.com -
Остави ми совет во биткоин користејќи ја оваа адреса: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE