Käytännöllinen verkkopohjainen syvä oppiminen ja tietoturva esimerkillä Kolmas painos Charlotte Harper 3. heinäkuuta 2024 Päivitetty/muunnetaan 3. kesäkuuta 2025
Esipuhe:
Verkon ohjelmistojen turvallisuusnäkökohdat ovat tärkeä osa minkä tahansa web -kehittäjän suunnitelmaa ja toteuttamista suunnitellessaan luotettavaa, vakaata ja hyödyllistä prototyyppiä käytännöllisiin tarkoituksiin. DOM (dokumenttiobjektin merkinnät), kun se on toteuttanut HTML: n, JavaScriptin ja CSS: n sekä taustaohjelmistojen toteuttamisen Pythonille, C/C ++: lle, Javalle ja Bashille, antaa web -kehittäjille vapauden ja voiman luoda laaja valikoima projekteja, jotka ilmaisevat luovuuden, helpon käytön ja toiminnallisuuden, kuvaavat kaikkialla olevia käyttöä, ja kevyen käyttäjän. Aika tai tee jotain tekemistä Internetissä, yleensä kosketusnäytön älypuhelinlaitteella. Suurin osa ihmisistä ei edes tiedä mistä aloittaa, kun he haluavat rakentaa verkkosivuston tyhjästä, heillä on taipumus aloittaa toisen henkilön verkkosivustolla ja rakentaa jotain rajoitettua toiminnallisuutta, luotettavuutta, helppokäyttöisyyttä ja erityisesti luovuutta, kun heillä olisi ollut käytettävissä olevia viimeisimpiä tehokkaita työkaluja, jotta ne voidaan rakentaa jotain hyödyllistä tuhlaamatta aikaa painostavia painikkeita, ja etenkin rahat, jotka maksavat kalliita liittyviä liittyviä ja joustavia käyttämiä koskevia rajoituksia, jotka ovat käyttäneet sitä, että harvat ihmiset halusivat käyttää sitä. Jos sinulla on muutaman minuutin lukeminen tämän kirjan läpi ja oppia mitä haluan opettaa sinulle tai jopa puhua kanssani henkilökohtaisesti tavoitteistasi ja hankkia ohjeita oikeaan suuntaan, ja olet motivoitunut oppimaan koodaamaan ja kirjoittamaan omaa ohjelmistoa, ottamaan tämä kirja kotiin ja varaa jonkin aikaa oppimaan rakentamaan seuraavat vaikuttavat, voimakkaat, virtaviivaiset ja tärkeät verkkosovellukset, verkkosivusto, joka on kaikki mitä tahansa ja tekee tarkalleen haluamasi ja kohtaavat yleisösi.
Minusta: Olen ohjelmistokehittäjä, jolla on laaja kokemus C/C ++, Java, Python, HTML, CSS ja JavaScript. Rakennan verkkosivustoja, joita ihmiset haluavat käyttää, haluan käydä ja jopa saada riippuvaisen käyttämään vain oppia, luoda uudelleen ja tappaa aikaa ja mikä tärkeintä, myyn ohjelmistoja. Jos sinulla olisi idea siitä, kuinka halusit verkkosivuston näyttämään ja toimimaan, olit valmis tukemaan minua, jotta voin vastata omat tarpeesi vastaamaani omasi ja olet valmis kattamaan verkkosivuston suorittamisen kustannukset, rakentaisin sinulle seuraavan YouTuben, Tiktokin, Twitterin, Googlen tai jopa korkean teknologian tietoturvasovelluksen, jonka voit käyttää. Sen sijaan, että yrittäisin myydä sinulle aikani, yritän ostaa omasi: Haluan puhua itsesi rakentamisesta (verkkosivusto) jo olemassa olevilla tiedoilla ja opettaa sinulle, mitä sinun on oltava riippumaton ohjelmistokehittäjä, yrittäjä, mikä johtaa menestyvää uraa millä tahansa haluamallasi alalla. Ja anna minun tehdä selvä, koulutus, jonka annan sinulle, on epävirallinen. Voit mennä kouluun ja oppia tämän kaiken muodollisella koulutuksella tai jopa lukea tämän kirjan koulussa, suorittaa tehtävät ja viedä paljon koulutuksestasi, mutta en laita sinua muodollisesti kuumaan istuimeen ja pyydä sinua suorittamaan tehtävät. En ole professori, voit ajatella minua kuin ystävä, joka haluaa opastaa sinua kohti omaa henkilökohtaista menestystäsi ajavaa uraa. Ja en myöskään myy sinulle menestystä, sinun on ostettava se aikasi. Koodin oppimisessa on jyrkkä oppimiskäyrä, eikä se ollut koskaan helppoa tai edes piti olla. Sinun on työskenneltävä niin kovasti kuin mahdollista ja jatkettava epäonnistumista ja yritettävä uudelleen, vaikka olet turhautunut oppiaksesi ja rakentaaksesi sovelluksia itse. Se on itse koodin luonteessa. Koodia johtaa kääntäjä, joka on suunniteltu antamaan ohjelmoijan virheilmoitukset, ja nämä opettavat sinulle, kuinka koodata, vaikka kopioisit vain virhettä hakukoneesi ja luet muiden ihmisten esimerkkejä. Ja minun on sanottava, että sinun ei tarvitse olla erittäin rikas, älykäs, menestyvä tai jopa yksityiskohtainen tai järjestetty sovelluksen rakentamiseksi. Tietokone huolehtii organisaatiosta puolestasi. Sinun on vain jatkettava kokeilun ja virheen kautta, ylläpidettävä keskittymistä ja työskentelemään kovasti tekemäsi suhteen, ja sinulla on erittäin menestyvä ura koko tekemäsi.
Kuka olen: Ymmärrän, että viimeinen osa koski enemmän oppimista ja otettavan tapoja tästä kirjasta. Kuka olen tarkalleen? Se on monimutkainen kysymys. Olen epäselvä siitä, että kärsin sairauksista, jotka voivat vaikeuttaa minua edes koodaamaan tai kirjoittamaan tätä kirjaa toisinaan esittäen samalla haasteita sosialisointi- ja identiteettikysymyksillä, jotka vaikeuttavat elämääni, kun kyse on esittelystä itseni. Lyhyesti sanottuna, jos luet tätä kirjaa, toit sen kotiin, koska selasit sen läpi ja ajattelit, että se oli hyödyllinen tai vaikka luit vain niin pitkälle, olen sinulle samanlainen henkilö, joka haluaa nähdä sinun onnistuneen kaikessa tekemässäsi. Olen itse insinööri, ohjelmistokehittäjä ja opiskelija, ja kirjoitan tämän kirjan muille opiskelijoille, jotka haluavat tehdä heidän elämänsä helpommaksi pitämällä käsikirjan, jota he tarvitsevat elämänsä helpottamalla antamalla esimerkkejä kopioimiseksi, joka sopii yhteen kuin iso palapeli toimivaan, hyödylliseen, suureen, toimivaan, yhtenäiseen ja kiinnostavaan sovellukseen, joka voi ajaa menestystä riippumatta liiketoiminnasta. Suurelta osin tämän teen: Rakennan sovelluksia auttaakseni itseäni ja muita ihmisiä onnistumaan. Olen myös kirjailija, vaikka tämä on ensimmäinen julkaisuni, jonka aion suorittaa, jotta voitaisin salkuni yhteen hyödylliseksi asiakirjaksi, ja olen myös taiteilija. Myönnän tämän sinulle, olen eräänlainen outo ihminen. En ole täydellinen, minulla on ollut INS -laki edes johtaen minua jättämään korkeakoulut ja yliopistot ja jättämään valtiot yrittääkseen antaa itselleni nimeä enemmän menestystä. Olen syntymästään nainen, käytän meikkiä, otan valokuvia itsestäni, pukeudun mekkoihin ja muihin naisten vaatteisiin ja pysyn tietoisena itsestäni naisena luonteeltaan. Minulla on aiemmin ollut ongelmia muiden ihmisten kanssa, jotka johtavat taisteluihin WebAppien kirjoittamisen ja rakentamisen kanssa, ja pyydän anteeksi, että en ole pystynyt saamaan tätä kirjaa käsissäsi aikaisemmin: tarvitsit tätä. Haluat lukea ja kirjoittaa koodia, joka näyttää minun ja toimii minun kaltaiseni ja tekee saman asian, mutta vielä paremmin, koska jos sinulla on varaa ostaa tätä kirjaa näppäimistön mashoamisen sijasta, kuten minä vain luodaksesi kirjan itse, joka itse pyydät rahaa, sinulla on resurssit, joita tarvitset menestyäksesi elämässäsi. Minulla oli kaikenlaisia kysymyksiä perheen kasvaessa, terveystiloissa, lääkäreissä, tiedotusvälineissä ja laissa, ja koodini heijastaa syvästi feminismiä ja naisluontoa jakautuneessa ja turhautuneessa maailmassa. Tämä kirja on kuitenkin asia, josta välitän syvästi, vauva, portfolioni ja toimeentuloni, joten arvostan harkintaa, kun otat tekstin kotiin ja huokosi sen yli oppiaksesi minulta. Muista, että en ole täydellinen, tässä kirjassa on virheitä, tarkistuksia ja uusia painikkeita, ja sinun on mietittävä loogisella aivoillasi parhaalla mahdollisella tavalla, jotta saat onnistuneen kokemuksen kirjoituksessani. Ymmärrä myös, että tarkoitan sinulle hyvin, vaikka kohtaat haasteita kirjoittaessasi. Ajattele sitä näin: Kun voit vuokrata tietokonejärjestelmän tehdäksesi kaiken, mitä voit kuvitella digitaalisessa tilassa, tallentaa kaikki kohtaamasi tiedot, analysoida ja järjestää sitä ja ymmärtää sen, kohtaa väistämättä vaikeuksia niissä olevien tietojen kanssa ja jopa julkaisemasi tiedoilla. Kerron teille tämän, koska kohdan samat vaikeudet. Käytä tätä kirjaa omalla vastuullasi, työskentele yhteisösi ja yhteisöidesi kanssa, jotta voit rakentaa ohjelmistoja turvallisessa ympäristössä, äläkä vie asioita henkilökohtaisesti, kun epäonnistut tai edes onnistut väärällä tavalla: näin sain tämän farjan ja miksi voin tuoda sinulle tämän tekstin ja auttaa sinua menestymään poistumatta hulluudesta. Työskentelemme, Internet. Et ehkä ole kovin perehtynyt siihen, kuka olen vain muutamalla sanalla, mutta kehotan teitä lukemaan, tunnet minut, kun jatkat lukemista ja ymmärrät minua rakennettaessa omia projekteja suorittamaan työsi. Tämän kirjan kanssa ei ole kotitehtäviä, kunhan professorit tai opettajat eivät anna sinulle mitään, mutta kehotan sinua rakentamaan itse salkun projektia, kun luet, samoin kuin Capstone -projekti, joka esittelee kuinka voit soveltaa oppimasi. Capstone -projektini on perusta suurimmalle osalle tämän kirjan lukemistasi, koska se sisältää koodin aikaisemmista projekteistani, koodista, jonka olen luonut ja oppinut kirjoittamaan metodisesti käsin, ja laaja valikoima ideoita ja vinkkejä, jotka ovat auttaneet minua menestymään siihen pisteeseen, että voin kehittää yksinkertaisen sovelluksen, joka on täysin esillä ja näyttää ja käyttäytyy suositulle sovelluksellesi tai perheesi käyttämällä, Internetissä, mainostettuna, mainostettuna ja uutisissa.
Mikä tämä kirja on: Tämä kirja on esimerkki. Löydät koodin, ohjeet koodin koodin oppimiseksi, koodin virheenkorjaamisesta ja korjaamisesta, vianetsintävaiheista, ohjeista koodin varmuuskopioinnin ja tallentamisen, ottamisesta uudelleen, jos joku rikkoo koodisi, turvata koodisi, luo koodisi, rakenna interaktiivisia verkkosivustoja, jotka ovat viihdyttäviä, kiinnostavia ja koukuttavia, ja saat kuvan, jonka kuvaan ja Rakennat ehdottomasti parhaan valon ollaksesi mahdollisimman houkuttelevin loppukäyttäjille, verkkosivustosi kävijöille. Tässä kirjassa esittelen useita esimerkkejä ohjelmistosuunnittelusta keskittyen verkkoon sekä alustana että turvallisuutena. Aloitamme oppimiskokemuksen rakentamalla perusprojektin UNIX -kuoren avulla varmuuskopiointi- ja komentosarjojen ominaisuuksilla. Sitten tarkastelemme perusblogisivustoa, päivittää blogiimme valokuva- ja videoominaisuuksilla sekä käyttää näitä ominaisuuksia käyttääksesi tietoturvaratkaisuja ilmaisella ohjelmistolla ja turvaamme palvelimemme käyttämällä liukettavissa olevaa todennusmoduulia (PAM). Tarkastelemme sitten tiedostojen käsittelyä ja käsittelyä, tutkimalla videon muokkaamista, äänen lahjoitusta, viivakoodin skannausta ja optisen hahmon tunnistusta muun muassa. Matkan varrella tutkimme sovellusliittymiä, jotka auttavat meitä tekemään ohjelmistostamme hyödyllisempiä ja turvallisempia ilmaisia ja maksettuja vaihtoehtoja. Matkan varrella tutkimme fyysistä turvallisuutta ja militanttityökaluja, kuten ampuma -aseita ja ammusten suunnittelua ja valmistusta, mukaan lukien tynnyrin ja toistimien suunnittelu, torni- ja droonisuunnittelu sekä muut päämiehet, jotka integroitumme nykyisen verkon ohjelmistoihimme ohjelmistomme suojaamiseksi ja itsepuolustuksen ja resulssin osoittamiseksi. Otamme taukoja pelien, 2D- ja 3D -renderointimoottorien rakentamiseen ja työskentelemme sulautettujen laitteistojen kanssa tapaustutkimusesimerkkeissä perusulotteisten renderöintiohjelmistojen ja vastaavasti silikonikumuun valettujen elektronisen värähtelevän hierontalaitteesta. Matkan varrella käytämme myös jo saatavilla olevia koneoppimisratkaisuja ohjelmistomme parantamiseksi paremmin. Käytämme myös verkossa käytettävissä olevia osaketyökaluja prosessin virtaviivaistamiseksi ja kiinnittämiseksi. Tämä kirja on opas menestyksellesi verkkosovelluksen rakentamisessa ja sen integroimisessa tietokone- ja sulautettujen mekaanisten järjestelmien ammattimaiseen verkostoon, ja kaiken kaikkiaan opas ohjelmistojen rakentamiseen ja sulautettuihin laitteistoihin, joilla ei ole taustatietoa tai aiempaa kokemusta.
Mitä tämä kirja ei ole: Jos todella haluat verkkosivuston, voit vain perustaa yksinkertaisen myymälän ja myydä tarvitsemasi, postita blogi, lähettää valokuvia tai videoita tai muuten kirjoittamatta koskaan yhtä koodirinjaa. Tämä kirja ei ole se. Tämä kirja opettaa sinulle, kuinka rakentaa ohjelmistoja, jotka ovat hyödyllisempiä, täysin esillä olevia, toimivia ja turvallisia kuin mikään jo löytämäsi ohjelmisto, koska se ottaa käyttöön viimeisimmän prototyyppien ohjelmiston, voi olla kallista ylläpitää mittakaavassa vanhempia yrityksiä, jotka eivät vedota taaksepäin, kääntäneet yritykset, jotka on asetettu ansaitsemaan rahaa ihmisille, jotka eivät todellakaan tee mitään. Jos seuraat tätä kirjaa tarkkaan, sinun kannattaa kirjoittaa koodia, tutkimuskoodia, rakentaa omia sovelluksiasi ja ansaitset rahaa tekemästäsi. Annan rahaa tästä kirjasta, jopa varhaisessa vaiheessa, koska se sisältää tietoja, joita ihmiset tarvitsevat ja haluan lukea, ja ostavat jo, kun he ostavat tai käyttävät sovelluksiani. Tämä kirja ei rakenna sinulle sovellusta, mutta se osoittaa sinulle oikeaan suuntaan ja aseistaa sinut tarvitsemillasi työkaluilla sekä taitoilla ja vinkillä, jotka helpottavat omaa menestystäsi verkkoon rakentaaksesi ohjelmistoja jokaisella koodilla, joka sinun on kirjoitettava esimerkkinä, valmiina yhdistämään yhdessä ohjelmistosi ja kannattajasi, vieraat, asiakas-, ystävät, perheet, vierailijat, urakoitsijat sekä Internetin haluamasi käyttää ja tukea.
Mitä opit: Tämä kirja opettaa sinulle, kuinka rakentaa ja myydä ohjelmistoja, todella toimivia, hyödyllisiä ohjelmistoja, mediatallennusta, tietoturvaominaisuuksia, kuten kasvojentunnistusta, koneiden luettavissa olevaa vyöhykkeen viivakoodin skannausta, Web -sovellusliittymiä videon ja valokuvien todentamiseen, tallentamiseen ja tarjoamiseen sekä viesteihin, kuten Bluetooth ja lähellä kenttä (NFC). Tämä kirja opettaa sinulle, kuinka käyttää verkkotietokonetta, keskittyen Debian Linuxiin, kuinka rakentaa bash -koodi tehdäksesi ohjelmiston asentamisesta ja varmuuskopioinnista saumattoman, automaattisen tuulen, kuinka rakentaa Python -koodi bacend -palveluna palvelemaan dynaamisia viestejä, tyyliä hienosti käyttämällä CSS -tyylejä, joilla on bootstrap. Tarkoitukset, ID -skannaus, kuvan ja videoiden maltillisuus, data -mikrotransaktiot ohjelmiston turvallisuuden, maksun käsittelyn, salausvaluuttakaupan, asynkronisten tehtävien ja paljon muuta. Opit kuinka rakentaa omat Bluetooth -laitteet paristojen, laturien, mikrokontrollerien, piirien, moottorien ja anturien kanssa, käyttämällä juotos-, lanka- ja 3D -painettuja sekä valettuja materiaaleja. Esittelen 3D -suunnittelupäälliköitä, joita käytetään lisäaineiden valmistukseen ja työkaluihin ja suulakkeisiin, joten pystyt valmistamaan omat sulautetut laitteistot, joissa on integroituja akkuja, latureita, elektronisia piirejä ja toiminnallisia lähtöjä. ja verkostoitu ne Bluetoothilla ja verkkoon. Erityisesti tutkimme kahta tapaustutkimusta, värähtelevää hierontalaitetta ja kotitekoista ampuma -aseita, jotka molemmat ovat ohjelmoituja OpenSCAD: ssä, joka on saatavana graafisena rajapinta- tai komentorivi -apuohjelmana ja joka voidaan integroida verkkoon nopeampien tulosten saavuttamiseksi. Opit kuinka rakentaa ja ottaa käyttöön verkkosivuston alusta alkaen ilman aikaisempaa kokemusta, tehdä siitä toimiva, turvallinen, kaunis, hyödyllinen ja mikä tärkeintä käytännöllinen. Opit kuinka käyttää koneoppimista ja tietokoneen visiota tehdäksesi sivuston turvallisemman ja käytännöllisemmän, tallentamaan videoita ja ääntä verkkosivustoltasi, lahjoita äänesi, tehdä musiikkia ja moduloida ääntä luodaksesi hyödyllisiä näytteitä ja kuinka murtaa melu hyödyntämällä muita verkkosivustoja rakentamaan parhaat mahdolliset verkkosivustoverkostot, jotka voit linkittää suoraan omasi jakamaan kaikki hyödylliset tiedot, joita sinulla on tarjottavanaan, ja vielä tärkeämpää tuoda ihmisiä ohjelmistoosi ja liiketoimintaan. Tämä kirja keskittyy eniten mediaan, tietoturvaan ja koneoppimiseen, jotka ovat kolmea suurta komponenttia, jotka auttavat sinua rakentamaan hyödyllisiä ohjelmistoja verkkoon kiinnittämällä oikeat käyttäjät ja poistamalla väärät tavalla, joka on realistinen, käytännöllinen, kädet ja kiinnostava samalla automaattinen ja tukeva. Tämä kirja opettaa UNIX: ää, erityisesti Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript ja useita hyödyllisiä ohjelmistopaketteja Pythonille, kuten pyyntöihin, sekä hyödyllisiä bash -ohjelmistoja, kuten Git ja FFMPEG. Aion myös opettaa sinulle kauppaa kryptovaluutan automaattisesti ja suorittaa maksuja kryptovaluutossa tai tavallisista maksukorteista jopa maksamalla kävijöillesi osaa tuloistasi, jos päätät tehdä niin. Opetan sinulle, kuinka ansaita rahaa verkkosivustoltasi myös mainonnan avulla, kuinka valmistaa sovelluksesi hakukoneisiin ja tehdä siitä nopeasti, sijoittuu ensimmäiseen sijoitukseen siihen, mitä asiakkaasi etsii sinua, ja sijoittamalla mahdollisimman moniin yleisiin hakuihin. Opetan sinulle, kuinka myydä ohjelmistosi, mainostaa sitä, vetoaa palveluitasi etsimään asiakkaille ja tehdä itsellesi nimi Internetissä jo olemassa olevien keinojen kautta, ovat edullisia ja toimivat hyvin. Opetan sinulle, kuinka tallentaa tietosi pilvitietokoneisiin, jotka toimivat sinulle ja tallentamaan tietosi halvalla, miten suunnitella ja rakentaa verkkosivusto, joka tekee käyttäjien haluamasi ja mitä haluat, ja kuinka pitää käyttäjät kiinnostuneina asettamalla sivustosi puhelimiensa hankkimiseen ilmoituksesi, sähköpostitse, tekstiviesteihin, puheluihin ja lisää siten, että käyttäjät palauttaisivat verkkosivustollesi. Tämä kirja keskittyy tiedotusvälineiden julkaisemisen ja jakeluun suurten määrien käytännöllisyyteen tekstistä valokuviin videoihin ääniin, tekemällä hyvän vaikutelman loppukäyttäjistä (asiakaskuntasi) ja myymällä itseäsi millä tahansa tavalla, jonka teet luodaksesi verkkosivuston, joka edustaa sinua ja vain sinua, ja tekee sinusta, ohjelmistostasi ja yrityksestäsi, joka näyttää hyvältä parhaalla mahdollisella tavalla. Opit minulta myös muutamia vinkkejä ja temppuja, koodausvinkkejä, käytännöllistä turhamaisuutta, kuten meikkiä ja valokuvausta, mallintamista ja näyttelemistä sekä muuta, mikä on tärkeää kuvata itseäsi ja yrityksesi parhaan mahdollisen valon avulla käyttämällä kaikkia käytettävissä olevia työkaluja jakellessasi niin paljon sisältöä kuin tarvitset terveellisissä tasoissa, jotta ohjelmistosi saadaan hedelmällisyyteen ilman vaivaa, työtä tai rahaa kuin on välttämätöntä. Tätä kirja on nimeltään "käytännöllinenVerkkopohjainen syvä oppiminen ja tietoturva esimerkillä "Syy: Se käsittelee koodin oppimista, erityisesti Webille, erityisesti keskittyen turvallisuuteen, käytännöllisestä näkökulmasta, esimerkkejä työkoodista, joka palvelee tekstissä hahmoteltuja käytännön tarkoituksia. Tämän tekstin oppimiskomponentti kattaa myös koneoppimisen, koodin, jonka näytät, kuinka web -tietokonetta, joka käsittelee tietotekniikkaa koskevaa tietoa ja videota. Parannus, kuvakuvateksti ja muut kuvista hankitut ennustemittarit, kuten kuvan luonne aitoksi, tietokoneen käänteiseksi kuvaksi tai optiseksi kopioksi (kuva kuvasta tai painetun kuvan). Kasvojen kanssa. käyttö). Jokaisella, joka rakentaa moitteettomasti turvallista ohjelmistoa, on jonkin verran käsitystä siitä, mitä tämä tarkoittaa. Ohjelmisto on luonnostaan epävarma, koska sen käyttämämme laitteet ja tilit eivät ole aina käytettävissäsi, ne voivat olla kaikkien ohjelmistojen huonon aikomusten käsissä, ja siksi ne voivat aiheuttaa riskin itse ohjelmistolle. Tämä on jotain tämän kirjan painopiste. Verkottu tietokone on oletuksena suojattu pitkällä avainmerkillä, nimeltään ja SSH tai Secure Shell -näppäin, ja se on muuten parhaiten suojattu verkkopalvelimella, koska verkkopalvelin tarjoaa avoimen pääsyn sekä itse palvelimella toimivien taiteen tietoturvatyökalujen. Verkkopalvelimella on pääsy käyttäjän verkkoselaimeen, joka on kiistatta käyttäjän laitteen tehokkain osa, koska se on paikka, johon käyttäjä voi käyttää verkkoa. Tämä työkalupakki voi tehdä tekstin, näkemäsi verkkosivut ja voi myös tallentaa kuvia, ääntä ja videota (kuten valokuvan kasvoista tai valtion tunnus), voi lukea ja kirjoittaa Bluetooth -radiolaitteille ja voi lukea ja kirjoittaa lähikenttätranspondereitteille, edullisille näppäimistöille, FOB: lle, tarroille, renkaisille ja jopa siru -implensille ainutlaatuisten siteiden kanssa, jotka voidaan luettaa ja kirjautua tietoon, joka on valmistettu beb -palvelimista. Kaikkien käytettävissäsi olevien työkalujen käyttäminen tällä kirjalla varustat itsesi tietoon turvallisen verkkosivuston rakentamiseksi, ja kaiken kaikkiaan suojattu verkkojärjestelmä, joka toimii sinulle, tekee tarjouksesi ja näyttää ja tuntuu
Mistä aloittaa: Olet tervetullut ohittamaan osion ohi aloitan tämän kirjan tai millä tahansa osiolla tarkalle tarvitsemillesi koodille, varsinkin jos sinulla on kokemusta koodauksesta ennen edellä mainituista työkaluista, kuvaan yksityiskohtaisesti tässä kirjassa sekä dokumentoimalla käyttötapauksia ja sen käytännön esimerkkejä. Jos sinulla ei ole kokemusta koodin kirjoittamisesta, suosittelen, että luet kaiken tämän kirjan, ja suosittelet erityisesti lukemista aiempia osioita varmistaaksesi, että tämä kirja on sinulle sopiva. Jos tämä kirja ei ole sinulle oikea, harkitse sen lahjoittamista ystävälle tai sukulaiselle, joka saattaa olla kiinnostunut oppimaan itse verkkosekinaisuutta, ja harkitse jopa sen lainaamista ja oppimista heiltä täyttämään aukot, joissa epäonnistuin sinua opettajana tai muut opettajat tekivät ennen minua. Aloita missä haluat, jokainen tämän kirjan osa on hyödyllinen, jos aiot rakentaa hyödyllisen sovelluksen, ja harkitse, että parhaat sovellukset on rakennettu loppukäyttäjän mielessä: Tunne asiakkaasi. Nyt tunnet minut, tiedät tämän kirjan ja olet valmis aloittamaan. Aluksi napata tietokone (jopa halvin kannettava tietokone laatikkomyymälästä, Amazon tai vanha työpöytä toimii ja aseta se sinulle sopivalla tavalla.
Kuinka lukea tämä kirja: Teksti korostettu, tarkoittaa, että teksti kuuluu komentokehotteeseen, jossa kirjoitat suorittamasi koodin. Komentokehotus on voimakkaasti näppäimistön keskittynyt ja vaatii vain vähän napsauttamista, työnkulun nopeuttamista ja asioiden helpottamista.
Aloittaminen: Sukellamme sisään. Aloitamme rakennuskoodilla paikalliselle koneelle ja aloitamme rakentamatta Internetiin kytkettyä verkkosivustoa. Tämä on turvallisempaa aloittaa, ei maksa mitään, ja se on sinulle helppoa. Käyttöjärjestelmästäsi riippuen bash -kuoreen pääsy on hiukan erilainen. Mac OS: lle suosittelen virtuaalikoneen asentamista tässä vaiheessa, koska saat eniten yhteensopivuutta virtuaalikoneen kanssa. Eri palveluntarjoajat, kuten VirtualBox ja Paralells, voivat suorittaa virtuaalikoneen sinulle, vaikka Ubuntu on myös mahdollista asentaa suoraan koneeseen, jos haluat käyttää alkuperäistä ympäristöä, jota suositellaan nopean, virtaviivaisen kokemuksen luomiseksi. Jos käytät Linuxia tai Windowsia, joita suosittelen, projektin luominen pitäisi olla melko helppoa. Avaa päätelaite, säädä mitoitus kun näet sopivuuden ja aloita seuraavan vaiheen 2. Jos käytät Windowsia, seuraa vaihetta 1.
Vaihe 1: - Vain Windows -käyttäjät Windowsissa avaa komentokehote järjestelmänvalvojana ja kirjoita WSL –Astall
Vaihe 2: - Jatka täältä tai ohita vaihe 1 tähän, jos et käytä Windowsia Aloita luomalla projektin avoimessa päätelaitteessa (käyttöjärjestelmästäsi riippuen, nimeltään Ubuntu Windowsissa, päätelaite Macissa tai Linuxissa tai samanlainen nimi). Teemme tämän Mkdir -komennolla, joka luo hakemiston. Jos sinun on luotava hakemisto projektin tallentamiseksi, jota suositellaan, käytä CD -komentoa vaihtamaan hakemistoon ja ja ja ja
CD/POATE/TO/DIRECTORY - Polku on kansiot (tiedostot), jotka edeltävät kohdehakemistoasi, oletuspolusi on ~ tai/koti/käyttäjänimi (missä käyttäjänimi on käyttäjänimesi). Kirjoita CD tai CD ~ vaihtamaan oletushakemistoon Mkdir -esimerkki - korvaa "esimerkki" hakemiston nimellä
Nyt sinulla on toimiva hakemisto projektillesi. Koska on niin tärkeää, että tämä hakemisto on tallennettu, jos sinun on vaihdettava toiseen koneeseen tai asennettava kirjoittamasi koodi niin, että se on valmis verkkoon, rakennamme skriptin varmuuskopioidaksesi hakemistosi muutaman seuraavan vaiheen aikana. Mutta komentosarjan rakentaminen vie vähän koodia, ja koodi on automatisoitava mahdollisimman hyödyllinen. Joten rakennetaan käsikirjoitus ensin skriptien rakentamiseksi. Aloitetaan luomalla komentosarja ja tekemällä siitä suoritettava. Käytämme tätä sudoa, chmodia ja kosketusta, ja kutsumme komentosarjaa "AS Cript".
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Nyt olemme luoneet komentosarjan, tehneet siitä suoritettavan ja olemme valmiita muokkaamaan sitä. Nano on tekstieditori, jonka avulla voit muokata tekstiä napsauttamatta, mikä on paljon helpompaa kuin graafisen käyttöliittymän käyttäminen. Voit muokata tiedostoa nanolla käyttämällä Nanoa ja sitten polkua tiedostoon. Komentosarjan tekemisen tekemiseksi se on melko samanlainen kuin käsikirjoituksen tekeminen. Käytämme samaa koodia kuin yllä, korvaamalla komentosarjan nimen "AScript" argumenttiparametrilla, 1 dollaria. Tämän avulla voimme soittaa komentosarjaksi kirjoittamalla yksinkertaisesti sudo -kirjoituslehden, jolloin voimme luoda minkä tahansa uuden skriptin korvaamalla "sanomalehti" käsikirjoituksesi nimellä. Nanon koodin pitäisi näyttää:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
Ja nanon sulkemiseksi voimme pitää ohjausnäppäintä painettuna ja paina X, sitten y tarkistaa, että tallennamme tiedostoa ja saavuttaaksesi palautuksen. Nyt sen sijaan, että kirjoitamme nämä kolme komentoa muokataksesi skriptiä, pystymme kirjoittamaan sudo -konferenssin muokkaamaan komentosarjaa uudelleen. Tämä toimii! Ja mikä tahansa uusi komentosarja voidaan suorittaa helposti kutsumalla sitä kuoreen. Tallennataan nyt työmme: Kirjoitamme varmuuskopiokomentosarja, jotta voit tallentaa uuden komentosarjan ja varmuuskopioida sen sitten projektihakemistoon, samalla kun varmuuskopioidaan varmuuskopiot.
sudo ascript backup
Nyt Nanossa:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Missä/polku/hakemisto/hakemisto on polku projektiin, jonka olet luonut MKDIR: llä. Myöhemmin opimme kuinka kopioida tällaiset toistuvat polut silmukka- ja luettelolla, joka on vähemmän koodi, mutta nyt pidetään se yksinkertaisena ja meillä on muutama rivi. Suorita tämä komentosarja ja varmuuskopioi koodisi tallentamalla tiedosto nanoon ohjauksella+x, y ja paluu ja kirjoita alla
backup
Jos sinua pyydetään lainkaan salasanaa luettaessa tätä kirjaa ja seuraavan kuoressa, kirjoita käyttäjän salasana oikein, sinulla on kolme yritystä, ennen kuin sinun on suoritettava komento uudelleen. Voit käyttää ylös ja alas nuolia komentojen uudelleenkäyttöön ja muokata niitä, jos sinun on suoritettava mitä tahansa kahdesti. Yksinkertainen painamalla ylös ja alas ajoittain valitaksesi komento, ennen kuin muokkaat komennon oikealla, vasemmalla nuolella ja poista näppäin sekä näppäimistö ja käyttämällä sitä palautuksella.
Onnittelut! Onnistuit luomaan mahtavan varmuuskopion komentosarjan, joka varmuuskopioi kaksi tärkeätä kuorikomentosarjaa työhakemistoon. Saatamme siirtää asioita myöhemmin, kun projekti kasvaa, mutta tämä toimii nyt. Siirrytään pilveen varmuuskopiointiin, käytämme Githubia tähän (vaikka varmuuskopiointia varten on olemassa lukuisia muita Git -ratkaisuja, ne ovat suunnilleen samoja.) Git on verision Control -ohjelmisto, jonka avulla voit varmuuskopioida ohjelmistosi muokkauksia palvelimelle, samalla kun voit myös ladata ohjelmiston kokonaiset kopiot salasanalla tai avaimella. Ohjelmiston tallentamisessa on tärkeä asia, varsinkin kun siirrymme suojattuihin Linux -esiintymiin, jotka joskus rikkovat, kun yksi koodirivi epäonnistuu, jättäen sinut lukittumaan, kun koodisi ei ehkä ole varmuuskopiota, jos et saa mahdollisuutta varmuuskopioida sitä automaattisesti, minkä kattamme.
Jos et vielä käytä Ubuntu -virtuaalikonetta tässä vaiheessa, suosittelen tässä vaiheessa Ubuntu -virtuaalikoneen käyttämistä, koska se tekee elämästäsi helpompaa asennettaessa kaikki tarvittavat paketit toimivasi verkkosivuston rakentamiseksi ja tietokoneellesi. Siirrämme koodin verkkopalvelimeen lähitulevaisuudessa, mutta haluamme varmistaa, että verkkopalvelimen takana on ainakin muutama tietoturvakerros, jotka vastustavat tietojenkalastelua, ja käyttävät useita Linux -paketteja tämän tekemiseksi. Jos haluat silti käyttää Mac -käyttöjärjestelmää, olet tervetullut etsimään ja asentamaan tarvittavat paketit verkossa, mutta jokaiselle kirjalle tai sarjalle ei ehkä ole vaihtoehtoja jokaiselle paketille.
Lisäämme muutaman komennon sitoutuaksesi työmme varmuuskopiointikirjoituksen kanssa suorittamalla komento Sudo -script -varmuuskopio.
# Niin
Säästä uudelleen hallitse X.
Nyt meidän on tehtävä yksi aika kokoonpano tähän projektiin. Koska se on pian GIT -projekti, meidän ei tarvitse kirjoittaa jokaista komentoa joka kerta, kun otat käyttöön GIT -arkistosta, mutta saamme tämän ripustaessamme, kun kirjoitamme käyttöönottokriptejämme. Aluksi varmistamme, että olemme oikeassa hakemistossa ja alustamme GIT -arkiston ja luodaan SSH -avaimet.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Kun kirjoitamme SSH-Keygen, uusi avain tulisi tallentaa kotikansioon nimeltä .SSH. Sitä kutsutaan id_rsa.pub. Löydämme tämä avain ja kopioidaan se. Nähdä se,
cd ~
cat .ssh/id_rsa.pub
Kopioi viimeisen komennon palauttama teksti ja luo tili GIT -palveluntarjoajallasi (ihannetapauksessa GitHub) ennen SSH -avaimen lisäämistä tiliisi. Kun sinulla on tili, napsauta oikeaa ylävalikkoa ja kirjoita asetukset, ennen kuin lisäät SSH -näppäimesi SSH- ja GPG -avaimiin valikkoon Access -alla. Valitse Lisää SSH -avain ja lisää omasi liittämällä se sisään ja antamalla sille otsikko, ennen kuin pelastat ja palautat GitHubiin uuden arkiston luomiseksi. Tämä on samanlainen muille GIT -palveluntarjoajille, sinun on luettava heidän asiakirjat. Anna arkistossa uudessa arkiston kokoonpanossa kuvaileva nimi ja päätä, haluatko julkaista sen, ja muista määrittää tiedostoja vielä sisällyttämistä varten. Kun arkisto on luotu, kopioi klooni SSH -URL -osoitteella ja liitä se seuraavaan komentoon.
git remote add git://… (your remote URL)
Nyt voit siirtyä takaisin arkistoon CD -levyllä, tunnet tämän. Kokeile varmuuskopiot nyt varmuuskopiolla
Hienoa! Nyt voimme todella saada koodauksen. Asennetaan Django nyt, kun meillä on hyvä käsitys bashista ja gitistä. Django antaa meille automaattisesti varmuuskopioida ohjelmistomme, Bash voi tehdä tämän myös, mutta Djangolla tulisi olla yksinkertaisempi turvallisempi toteutus (se voidaan poistaa käytöstä ja määrittää helpommin).
Asentaaksesi ohjelmiston Ubuntuun, käytämme sudo apt-get-komentoa. Päivitetään ensin ja päivitetään jo jo ollut ohjelmisto. Tämä voidaan tehdä sudo apt-get -päivityksellä ja sudo apt-get päivitys -y. Asennamme seuraavaksi Python ja virtuaalinen ympäristömme, koodimme koti, seuraavalla komennolla: sudo apt-get asenna python-is-python3 python3-venv
Tämä on kaikki mitä tarvitset mennäksesi Djangon kanssa ohjelmistoasennuksiin Ubuntu -ilmentymään. Windows and Linuxille tämän pitäisi olla melko suoraviivaista, mutta MAC: lle saatat haluta asentaa virtuaalikoneen ja Linuxin siihen ilmaisella tai maksettulla virtuaaliympäristöllä, kuten VirtualBox tai Paralells Desktop, ja luo yllä olevat vaiheet Ubuntu -ympäristön asettamiseksi. Ubuntu on tässä tapauksessa kriittinen, koska se on verkkosivustojen suorittama ohjelmisto ja se antaa heille mahdollisuuden isännöidä verkkosivustoja kaikilla edellä mainituilla ohjelmistoilla.
Kaivataan Django.
Uudelleen hakemistossamme CD: llä:
python -m venv venv # Luo virtuaaliympäristön, johon koodi tallennetaan
source venv/bin/activate # Aktivoi virtuaaliympäristön
django-admin startproject mysite . # Missä mysite on projekti, jonka aloitan nykyisessä hakemistossa.
Django on juuri aloittamassa meidät, koska Django isännöi verkkopalvelinta ja tekee kaiken tarvitsemme paikallisen perusverkkosivuston saamiseksi. Nyt kun Django on asennettu, muokkaamme asetuksia hiukan saadaksemme toimimaan kuinka tarvitsemme. Ensinnäkin, luodaan uusi sovellus
python manage.py startapp feed
Huomaat, että ensimmäistä sovellusta kutsutaan syötteeksi. Sovellusta tulisi kutsua mitä haluat, ja luomme uusia sovelluksia, mutta kunkin sovelluksen nimen on oltava johdonmukainen joka kerta, kun sovellukseen viitataan koodissa. Lisätäksesi uuden sovelluksen, muokkaamme aina asetuksia.py toisessa hakemistossa, jonka sovellus on luotu, nimeltään StartProject, jäljempänä sovellus. Nanon avulla,
nano app/settings.py
Löydä asetuksissa asennettuja_appeja ja erota [] 3 riviin. Lisää 'syöte' tai sovelluksesi nimi käyttämällä neljää tyhjästä keskilinjasta. Tämän asetusten osion pitäisi näyttää:
INSTALLED_APPS = [
'feed',
]
Ennen kuin unohdamme, testataan, että Django toimii. Käyttämällä komentoa python management.py RunServer 0.0.0.0:8000, voimme suorittaa palvelimen ja navigoida sitten tietokoneen selaimessa, joka käyttää koodia http: // localhost: 8000 ja katso esimerkki verkkosivustosta (se toimii!) Lopeta palvelin CONTROL C: llä, sama kuin mikä tahansa muu komento.
Nyt kaivataan Python -koodin kirjoittamiseen. Djangolla on kolme pääkomponenttia, jotka kaikki suoritetaan koodilla kokonaan. Komponentteja kutsutaan malliksi, näkymäksi ja malleiksi, ja kukin on korkeammalla ja alemmalla tasolla ennen kuin verkkosivusto toimitetaan käyttäjälle.
Malli on koodi, joka tallentaa tietokantaan tietoja hakua, lajittelua ja renderointia varten.
Näkymä päättää, kuinka malli tehdään, manipuloidaan ja muokataan, melkein jokainen näkymä käyttää mallia suoraan.
Malli on HTML -koodi, jossa on joitain ylimääräisiä kelloja ja pilliä, joita kutsutaan mallikieliksi. Näkymä, jossa se on täynnä python -koodia ja kontekstia, kuten malleja ja tietoa (USUAL -jouset ja kokonaisluvut), esitetään malli.
Djangolla on myös muita komponentteja, mukaan lukien, mutta ei rajoittuen:
Asetukset, jotka määrittävät sovelluksen keskustellessamme.
URL -osoitteet, jotka ovat malleja, joita käyttäjä seuraa saadaksesi pääsyn verkkosovelluksen tiettyihin osiin.
Lomakkeet, jotka määrittelevät, kuinka palvelimelle lähetetään tiedot käsitellään ja tehdään tietokantaan sekä käyttäjälle. Nämä ovat perusta palvelimen puolella olevien tietojen käsittelemiselle, ja ne voivat hyväksyä minkä tahansa tyyppiset tiedot tietokonevarastoista, etenkin tekstijonoista, numeroista ja tosi/vääristä booleista (yleensä valintaruudut).
Mallit, jotka ovat HTML -koodi- ja malliskieliä, ja silta Pythonin ja HTML: n välisen aukon, mikä tarkoittaa, että Python -tietoja voidaan toimittaa HTML -koodina, johon kuka tahansa voi käyttää ja pystyy suojaamaan verkkosivuston rajoitetulla pääsyllä, samalla kun Python -koodi on käytettävissä ja hyödyllinen erilaisissa tarkoituksissa etälaitteessa, jota ei tarvitse olla lähellä palvelinta.
Staattiset tiedostot, jotka ovat yleensä JavaScriptiä, ja sen kirjastot, joita palvelin palvelee ja jotka on linkitetty malliin.
Mediatiedostot, joita palvelin palvelee tai jotka ovat ulkoisesti isännöitään tai jotka on juuri kirjoitettu palvelimelle ennen käsittelyä ja lähetetään toiselle palvelimelle (ämpäri) isännöintiin.
Väliohjelmisto, joka on koodikappaleita, jotka suoritetaan samanaikaisesti kuin jokainen näkymä ja jota pidetään näkymässä "mukana".
Kontekstiprosessorit, jotka käsittelevät kunkin näkymän kontekstin ja joita käytetään lisäyksen lisäämiseen.
Testit, jotka vahvistaavat, että käyttäjä tai pyyntö läpäisee tietyt vaatimukset ennen näkymän esittämistä.
Kuluttajat, jotka sanovat, kuinka WebSocketit käsittelevät viestintää ja reagoivat siihen.
Järjestelmänvalvoja, jota käytetään mallien rekisteröimiseen, jotta niitä voidaan manipuloida yksityiskohtaisesti Django -järjestelmänvalvojan sivulla, jossa tietokantaa voidaan hallita graafisen rajapinnan kautta.
Selleri, joka määrittelee asynkroniset tehtävät Django -koodin osat voivat aloittaa, ennen kuin siirryt heti seuraavaan tehtävään tai koodiriviin.
Djangolla voi olla monia muita komponentteja, joista keskustelemme yksityiskohtaisesti täällä. On olemassa paljon tapoja tehdä Djangosta toiminnallisempia, lisäämällä WebSocketit, jotka ovat nopeita, virtaviivaisia viestintäkanavia, selleriä, jotka suorittavat asynkronisia tehtäviä, ja lukuisia muita ohjelmistopaloja Djangon laajentamiseksi, etenkin näkymätoiminnoissa, joissa suurin osa koodista suoritetaan. Näkymätoiminnot ovat avainasemassa, koska ne yleensä julistavat jokaisen koodin, joka on erityinen tietylle URL -URL -mallille tai palvelimen osalle.
Tutkitaan ensin näkymätoiminnot. Näkymätoiminnot alkavat tuonnista, jotka kuvaavat koodia, jota käytetään näkymässä ja määritetään käyttämällä tavallisia toimintomääritelmiä tai luokkia. Yksinkertaisimmat näkemykset määritetään funktion määritelmän def: n avulla ja palauttavat HTTPRESPONS -mallin perusmallilla. Aloitetaan määrittelemällä perusnäkymä palauttaaksesi teksti "Hello World". Muista, että joka kerta, kun lisäät koodia DEF: n kaltaisen lausunnon jälkeen, jos, jos jne., Sinun on lisättävä 4 välilyöntiä jokaiselle edeltävälle määritelmälle, jota haluat soveltaa toimintoosi. Pääsemme siihen, mitä kukin näistä tarkoittaa pian.
Muokkaa sivustomme hakemistosta Feed/Views.Py -tiedostoa nanon avulla ja lisää seuraavat rivit tiedoston loppuun.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
Djangon HttPresponse reagoi tekstimerkkijonolla, joka on merkitty avaamisella ja sulkemisella ". Joka kerta kun siirrät tietoja toimintoon tai luokkaan, kuten pyyntö tai merkkijono, sinun on käytettävä suluista (, avaaminen ja sulkeminen).
Tämä ei ole kaikki, mitä meidän on vielä nähtävä näkemyksemme. Emme tietenkään ole kertoneet palvelimelle, jossa näkymä on tarkalleen, meidän on silti määritettävä polku, jolla näkymän tulisi tehdä. Aloitetaan määrittelemällä peruspolku sovelluksissa/urls.py -sovelluksessa, ja pääsemme myöhemmin polkuryhmiin.
Lisää app/url.py
from feed import views as feed_views
Määritetään nyt näkymäkuvio. Näkymäkuvioissa on kolme komponenttia, polkukomponentti, joka kertoo palvelimelle, jossa näkymä on palvelimen sisällä (URL -polku, jonka käyttäjä kirjoittaa navigointipalkkiin siirtyäksesi verkkosivustolle), näkymäkomponentti, jossa näkymä on määritetty, ja ystävällinen nimi näkymälle, jotta se on helppo hakea kuviota, kun se työskentelee toisella näkymällä tai toisella näkymisellä, niin että se voidaan päivittää, jos se on tarpeen, jos se on tarpeen toiselle näkymälle tai saadaksesi enemmän loogista nimeä. On järkevää tehdä asioita tällä tavalla ja olla joustava, koska koodipohjasi on jatkuvasti muuttuva ympäristö, joka tarvitsee joustavuutta ja improvisaatiota voidakseen olla arvokasta ja helppo työskennellä. Tässä on miltä näkymäsi näyttää, voit lisätä tämän UrlPatterns = [App/urls.py -osaan. Näkymäkuvio määritetään edellä kuvattuilla kolmella komponentilla ja funktiolla, jota kutsutaan polulle. URL -mallit ovat luettelo, joten varmista aina, että lopetat jokaisen kohteen pilkulla, koska tämä erottaa jokaisen. Jokaisen kohteen tulisi myös mennä uudelle riville, jälleen kerran neljällä välilyönnillä, aivan kuten Settingy.py -sovellus. Määrittelemme näkymän ensimmäisen komponentin tyhjellä merkkijonotoiminnolla, jotta voimme luoda näkymän, joka toimii verkkopalvelimen juurihakemistossa. Urls.py pitäisi nyt näyttää tältä:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
Tämä on perusta Django -verkkosivuston luomiselle, joka on täysin staattinen. Jotta voimme tehdä dynaamisemman verkkosivuston, josta voimme aloittaa välimuistiin, kuten kuvat, videot, ääni ja paljon muuta, meidän on käytettävä malleja, joita tutkimme seuraavaksi. Tarkastellaan toistaiseksi koodimme ja suoritetaan palvelin. Jos haluat tarkistaa virheet virheiden varalta: Suorita:
python manage.py check
Jos virheilmoituksia on, sinun tulee tarkistaa huolellisesti sovellukseesi tekemäsi muutokset ja nähdä, onko jotain, joka on korjattava, kuten vieras tai puuttuva tila, ylimääräinen merkki, suljettu merkkijono, mikä tahansa kirjoitusvirhe, mikä tahansa vahingossa poistettu merkki tai jotain muuta. Virhesanoman (jos sinulla on) lukemalla, sinun pitäisi pystyä näkemään polku luomasi tai muokkaamasi tiedostoon rivinumeron mukana, joten katso tiedosto ja rivi ja katso, pystytkö korjaamaan jotain siellä olevaa. Jos olet korjannut ongelman, suorita yllä oleva komento uudelleen. Kun ohjelmisto on valmis ajamaan ja toimii, näet tulosteen "Järjestelmätarkistus ei tunnista mitään ongelmia". Nyt olet valmis menemään. Suorita palvelin:
python manage.py runserver 0.0.0.0:8000
Avaa nyt verkkoselain ja siirry osoitteeseen http: // localhost: 8000. Sinun pitäisi nähdä mielestäsi HttPresponse -funktion suluissa ja lainauksissa palautettu teksti. Tämä on vain perusesimerkki, mutta jos olet tehnyt sen niin pitkälle, ymmärrät perusteet siitä, kuinka Linux, Bash, Python ja Django toimivat. Kaivataan syvemmälle tietokannan mallinnukseen ja tutkitaan python -luokan voimaa tiedon tallentamisessa. Sitten alamme saada otteen HTML: lle ja CSS: lle ennen kuin teemme sivustostamme täysin esillä olevan, joustavan ja turvallisen JavaScriptin ja koneoppimisen avulla.
Luokat tallennetaan sovelluksesi malleihin. Käyttämällä nanoa, muokkaa sovellusta/malleja.py ja lisää uusi luokka. Luokka määritellään luokan määritelmällä ja se on läpäissyt superluokan, josta se perii tässä tapauksessa mallit.Model. Luokan nimi tulee luokan määritelmän jälkeen, ja luokan määritelmän A jälkeen: (paksusuolen) käytetään ennen luokkaan sidottua määritelmiä ja funktiomääritelmiä alla. Luokkamme tarvitsee henkilötodistuksen, jota voimme käyttää sen noutamiseen ja sen pitämiseen ainutlaatuisena, ja se tarvitsee myös tekstikenttää jonkin tiedon tallentamiseksi. Myöhemmin voimme lisätä aikaleiman, tiedostot, booleanit (tosi tai väärät määritelmät, jotka voivat auttaa koodiamme tekemään päätöksiä siitä, mitä mallin kanssa tehdään, ja niitä voidaan käyttää sen lajitteluun), ilmentymä mallin sitomiseksi palvelimeen kirjautuneelle käyttäjälle ja muille. Pakkaamme alla oleva koodi:
from django.db import models # Tuonti, jota käytetään luokan määrittelemiseen ja sen ominaisuuksiin
class Post(models.Model): # Itse luokan määritelmä
id = models.AutoField(primary_key=True) # Mallimme tunnus, automaattisesti luotu avain, joka antaa meille mahdollisuuden kysyä mallia, pitää sen ainutlaatuisena ja on hyödyllinen, kun meidän on oltava vuorovaikutuksessa mallin kanssa, kun se on luotu.
text = models.TextField(default='') # Luokkakaupat, tässä tapauksessa, jotkut tekstit, oletuksena tyhjään merkkijonoon.
Sulje ja tallenna tiedosto, kuten teimme ennen loppuun.
On olemassa monia muita kenttiä ja vaihtoehtoja, joita tutkimme päivittäessäsi tätä luokkaa sovelluksemme kehittyessä, mutta tämä on sovelluksen luomisen perustarpeet jonkin tekstin lähettämiseen. Tämä malli ei kuitenkaan toimi yksin. Kuten aiemmin on kuvattu, tarvitsemme mukautetun näkymän ja mukautetun URL -osoitteen, jotta tämä malli toimisi, ja tarvitsemme myös lomakkeen mallin kanssa. Tutkitaan ensin lomaketta.
Muokkaa App/Forms.Py -lomake nanolla ja lisää seuraavat rivit. Tarvitsemme kahta tuontia, lomakurssiamme sekä luomamme mallin (Feed.models.post), mallin kaltaisen luokan määritelmän ja kentän sekä META -nimisen alaluokan kanssa, joka määrittelee mallin, jonka muoto on vuorovaikutuksessa. Lomakkeella voi olla myös alustustoiminto, joka asettaa sen pyynnön, mallin tai muuten tietojen perusteella, tutkimme tätä myöhemmin.
Mallimuodot ovat niin hyödyllisiä, koska ne voivat luoda mallin tai myös muokata mallia, joten käytämme niitä molemmille. Määritetään yksi muotoisina.
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',)
Tämä on perusteet, miltä muoto ja malli näyttävät. Tätä mallimuotoa voidaan käyttää viestin välittämiseen tai muokkaamiseen, sen sisältämän tekstin muuttamiseen. Tarkastelemme tämän lomakkeen integroimista seuraavaksi näkymäksi. Ensinnäkin, siirrämme siirrot ja siirrämme tietokantaa, jotta koodimme voi olla vuorovaikutuksessa mallin kanssa, kun se toimii. Suorita seuraavat komennot:
python manage.py makemigrations
python manage.py migrate
Tämän suorittaminen kestää minuutin, mutta kun se tapahtuu, se antaa sinun käyttää mallia näkymiin, väliohjelmaan tai muualle ohjelmistoon. Jatkamme tekemällä näkymä, missä voimme nähdä mallisimme. Muokkaa syöttöä/näkymä.py ja lisää seuraava koodi, kuten todettiin. Sinun ei tarvitse lisätä mitään # allekirjoituksen jälkeen, että koodi on kommentteja, joita käytetään koodin tietojen osoittamiseen. Aloitamme tuomalla mallimme näkymiin ja lisäämällä sen kontekstiin, jossa voimme tehdä siitä mallin luettelosta näytölle. Seuraavaksi lisäämme mallin, johon voimme tehdä lomakkeen ja mallin painikkeella luodaksesi uuden objektin mallin perusteella ja lähettää sen palvelimelle. Tämä kuulostaa monimutkaiselta, joten otetaan se vain askel askeleelta. Ennen kuin lopetamme näkymän, luodaan malli, joka vain tekee mallin ja varmistamme, että näemme sen luomalla uuden viestin kuoreen. Näin tämän näkymän pitäisi näyttää:
posts = Post.objects.all() # Kysely kaikki tietokannan viestit toistaiseksi
Tämä kaikki näyttää melko yksinkertaiselta, kunnes pääsemme pohjaan. Render, funktion palauttama arvo HTTP -vastauksessa, kuten edellinen esimerkki, ottaa aina pyynnön ensimmäisenä syötteensä, hyväksyy kontekstin (tässä tapauksessa tietokannan viestejä), jotka voidaan nyt tehdä mallissa, ja palauttaa funktiossa määritetyn mallin. Malli tulee olemaan HTML -asiakirja, jossa on vähän kieltä nimeltä Jinja2, joka tekee Python -tiedot HTML: ään.
Aloita mallejen luominen tekemällä kaksi hakemistoa syötteeseen.
mkdir feed/templates
mkdir feed/templates/feed
Seuraavaksi muokkaa malli yllä olevassa hakemistossa, syöttö/malleja/syöte ja lisää koodi tähän esimerkkiin. Katsotaanpa tämän esimerkin mallia.
Tämä on hyvin yksinkertainen malli. Se määrittelee HTML -tunnisteiden avaamisen ja sulkemisen, asiakirjatyyppisen tunnisteen, runkotunnisteen, jossa on legenda -otsikko, taukotunniste, joka lisää pienen rivin näytön yli, ja A: lle, joka tekee jokaisen viestin viesteiden luettelossa mallin kappaleena. Tämä on kaikki mitä tarvitaan viestien tekemiseen, mutta tietokannassa ei vielä ole ketään. Luotaan joitain kuoren kanssa. Voimme ajaa kuoren hallinnassa.py
python manage.py shell
Tuo nyt postimallimme
from feed.models import Post
Seuraavaksi luomme yksinkertaisen viestin merkkijonolla ja poistumme kuoresta. Merkkijono voi olla mikä tahansa, niin kauan se on kelvollinen teksti.
Post.objects.create(text='hello world')
exit()
Viimeiseksi meidän on lisättävä URL -malli syötteemme. Koska syöttösovelluksemme käyttää useita URL -osoitteita ja haluamme pitää tiedostokokoja pieninä, luodaan paikallinen URLS.Py syöttösovellukseen, joka näyttää tältä:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
Meidän on myös muokattava URLS.PY: tä perussovelluksessa, riippumatta siitä, mitä päätimme kutsua, tämä oli ensimmäinen luomamme hakemisto. Muokkaa sovellusta/app.py ja lisää seuraavat URL -mallit
from django.urls import include # ylhäällä
# ... Edellinen koodi täällä
Nyt kun suoritamme palvelinta python management.py RunServer -sovelluksella, näemme luomamme sivun, koska meillä on malli, näkymä ja malli sekä URL -URL -malli sekä tietokannan kohteet. Seuraavaksi otetaan käyttöön luomamme lomake ja aloitetaan omien viestien luominen. Mutta ennen kuin kirjoitamme liikaa koodia, tehdään varmuuskopio käyttämällä aiemmin kirjoittamaamme käsikirjoituksella. Suorita tämä skripti kuoressa, odota hetki, ja kaikki koodi varmuuskopioidaan Git -arkistoomme.
backup
Lomakkeen toteuttaminen on suhteellisen yksinkertaista. Tuomme lomakkeen, lisäämme postipyyntökäsittelijän näkymään ja tallentamme viestin tietokantaan ennen ohjausta samaan näkymään. Voimme käyttää jo tuotuja uudelleenohjaustoimintoa, ja toinen toiminto, nimeltään Reverse, saadaksesi URL -osoitteen näkymäkuviolle. Kysymme tästä merkkijonolla 'syöte: syöte', koska mukana olevan kuvion nimitila on syöte ja näkymää kutsutaan myös syötteeksi.
posts = Post.objects.all() # Kysely kaikki tietokannan viestit toistaiseksi
if request.method == 'POST': # Käsittele postipyyntö
form = PostForm(request.POST) # Luo lomakkeen ilmentymä ja tallenna tiedot siihen
if form.is_valid(): # Validoi lomake
form.save() # Tallenna uusi objekti
return redirect(reverse('feed:feed')) # Ohjaa samaan URL -osoitteeseen get -pyynnön kanssa
'form': PostForm(), # Varmista, että siirrät lomake kontekstiin, jotta voimme tehdä sen.
Nyt meidän on päivitettävä malli uuden lomakkeen huomioon ottamiseksi. Voimme tehdä tämän käyttämällä
Hajotellaan tämä. Siellä on uusi lomakeluokka, merkki, itse lomake ja lähetyspainike. Melko yksinkertainen, mutta kun tarkastelemme sitä, ehkä haluamme saada sen näyttämään paremmalta. Se toimii, voimme lähettää uusia viestejä lomakkeen kanssa ja ne tallennetaan nyt tietokantaan. Täällä tapahtuu muutamia asioita. Käytämme HTML -tunnisteita ilmoittamaan, että asiakirja on HTML -asiakirja, käytämme mallitunnistetta ({ %… %}), jotta lomakkeelle ja toiselle, {{…}} antaa lomakkeen. Meillä on myös silmukka tekstin tekemiseen lohkotunnisteiden ja mallitunnisteen avulla. Lohkotunnisteet ovat todella tärkeitä, koska voimme määritellä, kuinka mallin osiot tehdään niiden kanssa, ja mallitunnisteet ovat perusta siihen, kuinka asetamme muuttujat koodiin.
Nyt meidän on saatava sovelluksemme näyttämään paremmalta, koska toistaiseksi se näyttää todella perusteelliselta. Voimme tehdä tämän käyttämällä CSS: ää, joko sisäiseen tai luokkiin, jotka on sidottu jokaiseen asiakirjan objektiin. CSS on todella mukava, koska se kertoo kaiken sivulla, miltä sen pitäisi näyttää, ja voi tehdä siitä todella hyvältä. On olemassa muutamia kirjastoja, jotka voivat tehdä tämän, mutta henkilökohtainen menoni on bootstrap.
Bootstrap voidaan ladata heidän verkkosivustolta,getbootStrap.com/. Kun olet painamalla painiketta, lue asennusasiakirjat ja kopioidaksesi koodin sisällyttämällä CDN -osioon. Tarvitset tämän koodin HTML -asiakirjan yläosassa, nimeltä Head. Mennään myös eteenpäin ja luodaan perusmalli, jotta meidän ei tarvitse luoda näitä linkkejä uudelleen jokaisessa mallissa.
Tee uusi hakemisto nimeltään malleja mkdir -malleilla ja muokkaa sitten malleja/base.html.
Sen pitäisi näyttää tältä:
Muista kopioida CSS ja JavaScript, .CSS- ja .JS -tiedostot, koska tarvitsemme JavaScriptin, jotta sivustostamme tulee tulevaisuudessa toiminnallisempi.
Palataan nyt bash -kuoreen ja suoritetaan nopea komento. Muista, että jos joudut koskaan pääsemään virtuaaliympäristöön, kirjoita lähde Venv/bin/aktivoi. Tämän avulla voit asentaa Python -paketit paikallisesti tavalla, joka antaa Djangolle käyttää niitä. Jotta Django BootStrap -luokkien luomat lomakkeet saavat, käytämme Python -pakettia, nimeltään Crispy Forms. Voimme ladata tämän seuraavalla komennolla
pip install django-crispy-forms
Kun tämä on asennettu, lisää se asetukset.py
# … Edellinen koodi täällä
Nyt takaisin syöttömalliin voimme poistaa joitain asioita. Poistamme asiakirjan alku ja loppu ja korvataan se perinnöllä perusmallistamme, laajennukset ja lohkon määritelmä. Lisäksi lisäämme mallisuodattimen tuonnin kuormalla ja mallisuodattimen lomakkeeseen. Lopuksi lisätään bootstrap -luokka lomakkeen painikkeeseen, jotta se näyttää enemmän painikkeelta. Sen pitäisi näyttää tältä:
Kaunis! Se on jo vähän koodia. Seuraavaksi meidän pitäisi testata se ja varmistaa, että voimme nähdä, että kaikki näyttää hyvältä, ja varmista myös, että kaikki toimii kunnolla. Suorita palvelin aikaisempien ohjeiden mukaisesti ja varmista, että sivusto näyttää ja toimii kunnossa. Hienoa työtä! Olet valmis siirtymään seuraavaan vaiheeseen, johon lisäämme käyttäjän kirjautumistoiminnot käyttämällä samanlaisia URL -osoitteita, muotoja, näkymiä ja malleja. Perusmalli on tärkeä, ja jatkamme sen muokkaamista ja muutoksia tarpeen mukaan, mutta keskitymme toistaiseksi sivustostamme turvallisemmaksi, antamalla käyttäjille mahdollisuuden kirjautua sisään käyttäjänimellä ja passkoodilla, ja lopulta vielä tärkeämpiä tietoja, jotka auttavat pitämään sovelluksesi turvassa ja oman tilisi käytettävissäsi vain sinä.
Tätä varten meidän on käytettävä Djangoon rakennettua käyttäjamallia. Käyttäjämalli on tietokantamalli, kuten viestimme, joka voidaan tehdä käyttäjän kirjauttamiseksi verkkosivustoon. Jatkossa, ennen kuin siirrämme sivuston Internetiin, laajennamme tätä mallia muilla sille omistetuilla malleilla ja rakennamme kirjautumiselle vastustuskykyisiä kirjautumistoimenpiteitä. Aloitamme käyttämällä joitain sisäänrakennettuja kirjautumismuotoja, jotka Django tarjoaa. Luo ensin uusi sovellus, jota käytämme malleja ja näkymiä peruskirjautumissivulle. Luomme myös muita sovelluksia, jotka edustavat jatkuvia kirjautumishaasteita sovelluksen turvaamiseksi, mukaan lukien pincode, kasvojentunnistus, lähellä kenttäviestintää, ulkoisia laitteita, monitekijöiden todennusta ja sormenjälkitunnistusta.
Puhuimme jo sovelluksen perustamisesta. Hakemistostamme, virtuaaliympäristön sisällä, ohita hallinta. Nämä väitteet
python manage.py startapp users
Nyt meillä pitäisi olla hakemisto uudelle sovellukselle. Aloitetaan luomalla näkymä siihen hakemistoon, joka vastaa käyttäjän kirjautumista. Django on rakentanut näkymät käyttäjän kirjautumisiin, mutta nämä eivät sovellu meille, koska tarvitsemme mukautetun näkymän, joka on mieluiten määritelmän avulla.
Tässä näkemyksessä aloitamme tarkistamalla postipyyntö, siirrä pyynnön.Post Djangosta tuodaan kirjautumismuotoon, todentaa käyttäjätilin ja kirjaudu käyttäjälle ennen niiden ohjaamista syöttösovellukseemme.
Lisää käyttäjät/Views.py seuraa seuraava koodi
username = request.POST['username'] # Hanki käyttäjänimi ja salasana postipyyntöstä
password = request.POST['password'] # Todenta käyttäjä
Tämä on kaikki mitä tarvitset peruskirjautumisnäkymään. Luotaan nyt näkymälle lomake laajentamalla perusmallia. Aloitamme luomalla uuden hakemiston malleille käyttäjien kansioon.
mkdir users/templates
mkdir users/templates/users
Nyt meidän pitäisi pystyä muokkaamaan käyttäjiä/malleja/käyttäjät/login.html. Kun olemme siinä, luomme mallin, jonka avulla käyttäjä voi kirjautua.
nano users/templates/users/login.html
Nyt mallissa,
Tämä on kirjautumismallin perusteet. Se on todella kuin muut rakenteen malli, mutta se näyttää hiukan erilaiselta, kun se tehdään. Voimme kopioida tämän koodin rakentaaksemme toisen hyvin samanlaisen mallin nimeltä Register.html, jossa muutamme sanamuotoa ja käytämme uutta rakentamamme lomaketta. Tehdään malli ensin. Muokkaa käyttäjiä/malleja/käyttäjät/rekisteröinti.html ja lisää seuraava koodi:
Rakennetaan nyt lomake käyttäjän rekisteröintiä varten ja ympyrömme takaisin näkymiin ennen kuin päivitämme käyttäjän kirjautumisen mallilla. Teemme tämän lomakkeen aloittamisen, mutta lisäämme tulevaisuudessa lisätietoja ja turvallisuusominaisuuksia, kuten sopimuksia ja Captchaa. Muokkaa lomakkeita nano -käyttäjien/forms.py kanssa ja lisää seuraava koodi.
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']
Joten meillä on täällä toinen muoto, joka toimii melko yksinkertaisesti. Se on käyttäjärekisterin lomake, jossa on käyttäjänimi, sähköposti ja salasana sekä vahvistanut salasanakenttä. Huomaa, että tämä lomake ei laajenna tavallisia muotoja Yksi kenttä on määritelty samalla tavalla, ja luokan meta määrittelee mallin. Lomake vastaa loput lomakkeeseen kirjoitetut tiedot. Suurin osa tästä on jo olemassa Djangon sisäänrakennetussa UserCreationFormissa, joten käytämme sitä luokan perustana (ohitetaan suluissa).
Seuraavaksi tutkimme näkymää käyttäjän rekisteröimiseksi nyt, kun meillä on lomake ja malli. Tämä on modelmorm, aivan kuten uudessa postinäkymässä. Muokkaa käyttäjiä/View.py ja lisää seuraava koodi:
# … Tuonti
Tämä on kaikki mitä tarvitsemme käyttäjän rekisteröimiseksi, mutta meillä pitäisi olla lisätietoja. Haluamme tietää ajan, jonka käyttäjä rekisteröitiin, mihin aikaan he olivat viimeksi sivustolla, joitain tietoja heistä, kuten elämäkerta, aikavyöhyke jne. Myös meidän on päivitettävä syöttömallimme, postitse, jotta voimme ottaa käyttäjämallin ja määriteviestit jokaiselle käyttäjälle. Jotta voimme tehdä niin, päivitämme mallit.py molemmissa sovelluksissa. Aloitetaan muokkaamalla syöttömalli. Sen pitäisi näyttää tästä nyt:
from django.db import models # … Tuonti
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Lisää tähän riviin
Kiinnitä huomiota toiseen riviin, joka lisättiin tiedostoon. Tämä on ulkomainen avain, joka määrittelee jokaisen viestin yhdelle käyttäjälle viestiä kohti, joten voimme varmistaa, että tallennamme viestejä käyttäjän käyttäjän perusteella, eikä viestiä voida tehdä käyttäjälle määrittämättä sitä. Määrittelemme tämän ulkomaisen avaimen, jonka se edustaa, poistamme argumentin varmistaaksesi, että viestit poistetaan käyttäjien, tyhjien ja tyhjien argumenttien kanssa varmistaaksemme, että voimme tarvittaessa poistaa käyttäjän ja mukautua käyttäjän puuttumiseen jo luomiin viesteihin, ja siihen liittyvän nimen, jota voimme käyttää käyttäjän luomiin viestiobjekteihin. Tämä liittyvä nimi, toisin kuin Post.Author, viestin kirjoittaja, antaa meille käyttäjän, joka lähetti itse viestin. Voimme nyt saada käyttäjän tekemän käyttäjän käyttäjän käyttäjän suorittamalla käyttäjä.poss.all () tai kirjoittaja.posts.all ().
Tehdään nyt kirjautumisistamme joustavampia. Voimme jo tehdä sivustostamme paljon vähemmän alttiita tietojenkalastelulle yksinkertaisesti rajoittamalla lukumäärää, kuinka monta kertaa sallimme kirjautumisen sivustoon, tämä on melko helppoa. Aloitetaan myös joitain tietoja jokaisesta käyttäjästä aiemmin, kun jatkamme sovelluksemme kehittämistä. Käyttäjien/malleja.py, lisää seuraava koodi.
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='')
Huomaa, että tämä malli on melko samanlainen kuin postimalli. Meillä on ylimääräinen tuonti, aikavyöhyke, jonka avulla voimme asettaa oletusarvot DateTime -kenttiin, ja meillä on myös merkki- ja tekstikenttä, kuten viesti. Kaikkien näiden aikaleimojen käyttäminen auttaa meitä turvaamaan sivuston ja ymmärtämään sen käytön, ja tekstikentät antavat meille tietoa jokaisesta käyttäjästä tai kirjoittajasta verkkosivustolla. OneToonefieldin tulisi olla ainoa pieni huomio, se käyttäytyy täsmälleen samalla tavalla kuin ennustettu, mutta vain yksi seuraavaa mallia kohti. Tällä tavalla käyttäjällä on vain yksi profiili, kun taas heillä voi olla monia viestejä.
Parannetaan nyt kirjautumis- ja rekisteröintinäkymämme profiilin huomioon ottamiseksi. Ensinnäkin muokkaa käyttäjiä/Views.py ja keskity rekisteröintiäkymään:
# … Tuonti
Profile.objects.create(user=user) # Muista lisätä tämä rivi käyttäjälle profiilin luomiseksi
Tämä yksinkertaisesti luo käyttäjälle profiilin täyttämättä mitään tietoa. Nyt haluamme varmistaa, että käyttäjätiliä ei voida kirjautua liian usein tai ainakin salasanoja ei voida kokeilla liian usein, joten päivitetään kirjautumisnäkymä.
# … Tuonti
if user and user.profile.can_login < timezone.now(): # Huomaa, että tarkistamme nyt, voiko käyttäjä kirjautua sisään
else: # Jos kirjautuminen ei onnistunut,
user = User.objects.filter(username=username).first() # Tämä on osa, jossa päivitämme käyttäjien profiilin
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Joten he eivät voi kirjautua uudelleen muutaman sekunnin ajan
Tämä on turvallisuuden perusta. Varmista, että sivusto ei ole alttiita jollekin vain kokeilemaan kaikkia mahdollisia salasanan yhdistelmiä tai edes muutamia heistä samanaikaisesti. Tämä ei ole turhauttavaa tavalliselle käyttäjälle, joka tuntee heidän passikoodinsa ja vain kirjautuu sisään muutamaan laitteeseen, mutta se pitää lukuisat tietojenkalastelurobotit poissa sovelluksesta. Huomaa, että lisäsimme if -lauseen muuttujan, Can_loginin kanssa, sen pitäisi olla aika aikaisemmin, ja päivittää se jokaisella epäonnistuneella kirjautumisella samalla käyttäjätunnuksella. Tällä tavoin haitallinen käyttäjä ei voi arvata salasanaa missään lähellä niin nopeasti. Myös sekuntien lukumäärä DateTime.TimeDelta () voidaan päivittää, ja verkkosivusto on joustavampi, mutta hieman vähemmän käytettävissä useamman sekunnin kuluttua. Suosittelen 15 aloittaa.
Muista, että rakensimme varmuuskopioskriptin tallentaaksemme työmme, joten siirrytään eteenpäin ja varmuuskopioimme sitä, mitä meillä on toistaiseksi varmistaaksemme, että kaikki on tallennettu. Suorita komento:
sudo backup
Jälleen kerran tämä säästää työsi toistaiseksi. Suosittelen käyttämään usein varmuuskopioita työn tallentamiseksi, ja saatat jopa haluta suorittaa varmuuskopiointi automaattisesti. Voit tehdä tämän käyttämällä Cron -nimistä UNIX -apuohjelmaa. Aktivoidaksesi tämän apuohjelman suorittamalla seuraava komento ja kirjoita salasana:
sudo crontab -e
Jos et ole jo valinnut vaihtoehtoa 1 Nanolle, tekstieditori, jonka sinun tulee jo tuntea, ja vieritä tiedoston alaosaan nuolinäppäimillä. Lisää seuraava rivi:
0 * * * * sudo backup
Cron käyttää muotoilua minuuttia, tuntia, kuukauden päivä, kuukausi, viikonpäivä, missä * tai numero edustaa komennon suorittamista. Käyttämällä 0 minuutin ajan ja * loput vaihtoehdot, voimme suorittaa komennon jokaisen tunnin ensimmäisen minuutin ajan minuutin alussa. Tämä antaa meille varmuuskoodin varmuuskoodin automaattisesti. Kaikki Cronin työpaikat, jotka suoritetaan sudo -juonella juurina, joten meidän ei tarvitse kirjoittaa salasanaa tunnissa.
Poista varmuuskoodikomennomme salasana käytöstä käyttämättä salasanaa käyttämättä salasanaa käyttämättä. Teemme tämän suorittamalla seuraavan komennon ja syöttämällä salasanan:
sudo visudo
Vieritään nyt tiedoston pohjaan ja lisätään toinen rivi:
ALL ALL=NOPASSWD: /bin/backup
Tämän avulla voimme suorittaa komennon "varmuuskopio" kuin kuka tahansa käyttäjä, ilman salasanaa. Tämän muoto on helppoa, vain etuliite rivillä "All All = Nopasswd:/bin/" ja päättyy komentoon, esimerkiksi/bin/varmuuskopiointiin, joka on olemassa/usr/bin/.
Aloitetaan nyt sähköpostin kanssa. Sähköposti on todella tärkeä verkkosivustoille, koska se on tapa pitää verkkosivusto turvallisempana, tarkista, että käyttäjät ovat oikeita ihmisiä ja jopa markkinoida tuotteita tai palveluita asiakkaille. Monet ihmiset, jotka ovat usein Internetissä, tarkistavat sähköpostinsa päivittäin ja saavat kaikenlaisia markkinointipostiviestiä tuotteista ja palveluista, joista he ovat kiinnostuneita. On olemassa muutamia vaihtoehtoja, kun kyse on sähköpostin sallimisesta Django -verkkosivustolla, ja olet tervetullut valitsemaan kumpi sopii sinulle parhaiten.
Ensinnäkin voit maksaa sähköpostipalvelusta, jonka avulla voit lähettää sähköpostia verkkotunnuksestasi ja vaatii minimaalisen koodin. On monia palveluita, jotka tarjoavat tätä, kuten Google Workspace, Sendinblue, MailGun ja muut.
Muuten olet hyvin rakentamassa omaa sähköpostipalvelusi palvelimesi tyhjästä. Suosittelen tätä vaihtoehtoa, vaikka se on enemmän koodia ja saattaa vaatia erityistä isännöintia. Et voi käynnistää postinpalvelinta kotikomitealta todennäköisimmin, joten siirrytään eteenpäin ja tutkitaan kokoonpano ja koodi lähettääksesi sähköpostia ennen kuin aloitamme palvelimen pilvessä ja luomme oman postipalvelimen sisällä.
Ensinnäkin, muokkaa asetuksia.py seuraavalla komennolla:
nano app/settings.py
Missä sovellus on StartApp -sovelluksen luomasi sovelluksen nimi.
Lisää seuraavat rivit:
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)
Muista muuttaa näitä, kun olet valmis ottamaan käyttöön sovelluksesi, käymme uudelleen myöhemmin. Sähköposti_address -asetuksen tulisi olla sähköposti, jonka haluat lähettää, ja salasanan (sähköposti_host_password) tulisi asettaa palvelimelle luomasi salasanalle. Ladataan salasanan konfigurointitiedostosta pitääksesi sen koodista seuraavan logiikan avulla, näiden rivien yläpuolella asetukset.py:
import os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
Sitten olen perustanut JSON -tiedoston config /etc/config.json -sovelluksella nanon avulla seuraavasti.
Tiedoston muokkaaminen:
sudo nano /etc/config.json
Lisää seuraavat rivit:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
Jatkamme Config -tiedoston muokkaamista ja lisäämme kaikki sovelluksessa käytetyt salasanat ja avaimet. Tarkastellaan toistaiseksi nopeasti, kuinka lähettää sähköpostia Pythonin avulla. Luotaan ensin malli tarkistusviestille, jonka voimme lähettää käyttäjille ja laittaa se käyttäjän mallien hakemistoon. Tämä malli kirjoitetaan HTML: ssä.
nano users/templates/users/verification_email.html
Tämä sähköposti on melko yksinkertainen. Se vie käyttäjän kontekstin, sivuston perus -URL -osoitteen sekä käyttäjätunnuksen ja tunnuksen, joita käytetään käyttäjän sähköpostin tarkistamiseen. Muista määritellä perus -URL -osoite asetuksissa.py ennen kuin kirjoitamme jonkin python -koodin mallin tekemiseksi. Mene eteenpäin ja lisää seuraavat rivit APP/Asetukset.py, lähellä alkua.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
Lopulta, kun sivustosi on valmis Internetiin ja otat sen käyttöön, sinun kannattaa määritellä verkkotunnuksesi verkkotunnukseksi, jonka ostat sivuston edustamiseksi. Tämä on nimi, jonka kirjoitat Navbariin, jotta pääset sivustoosi. Toistaiseksi voit jättää verkkotunnuksen tyhjäksi tai käyttää paikkamerkkiä. Haluat myös muuttaa sivuston nimen nimeksi, jonka haluat antaa sivustollesi, valitsemastasi.
Ennen kuin lähetämme sähköpostia, luodaan tunnusgeneraattori, jotta meillä voi olla tilin aktivointirhe, joka ei koskaan vanhene. Voimme tehdä tämän rakentamalla ja tuomalla seuraavan näytöltä näyttävän tilin aktivointirunon. Muokkaa tiedostoa:
nano users/tokens.py
Lisää seuraava koodi:
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()
Tämä perustunnusgeneraattori luo tunnuksen, jonka voimme lähettää käyttäjän URL -osoitteeseen ja käyttäjä voi käyttää tarkistaakseen sähköpostinsa ja aktivoida heidän tilinsä.
Seuraavaksi katsotaan, kuinka lähettää sähköpostia. Muokkaa käyttäjiä/sähköposti.py käyttämällä nanoa.
nano users/email.py
Vahvistuksen HTML -sähköpostin lähettäminen näyttää tältä:
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)
Tämä on melko yksinkertaista. Tuotamme toiminnot, jotka meidän on lähetettävä sähköposti, lähetetään sähköposti malleilla ja asetuksillamme, ja määrittelemme sitten sähköpostin mallin nimellä ja lähetämme sen käyttäjälle toiminnon avulla. Huomaat, että emme ole vielä määrittäneet toimintoa lähettääksesi postin, Send_html_email, joten kirjoitetaan tämä jo käyttäjille/sähköpostiosoitteisiin.
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()
Tämä on hiukan monimutkaisempi, emmekä ole vielä valmiita suorittamaan kaiken tämän koodin. Huomaa, että määrittelemme UNSUB_LINK, linkki, jota käyttäjä voi käyttää sähköpostien tilaamiseen. Tämä on tärkeää, koska käyttäjien on kyettävä poistamaan sähköpostimme, elleivät he halua nähdä niitä milloin tahansa. Lisäämme myös tekstiviestimme tekstin vaihtoehdon, joka on HTML -viesti, joka on poistettu HTML -tunnisteista. Viimeiseksi tarkistamme, onko lähetetty sähköposti, ja jos se ei ollut, merkitsemme käyttäjän profiilissa, että heidän sähköpostinsa ei ole kelvollinen.
Siirrytään takaisin käyttäjämalleihin, jotta voimme tehdä tämän kaiken toimimaan. Meidän on määritettävä toiminto linkin luomiseksi tilauksen peruuttamiseen ja määritettävä Boolen -kenttä merkitsemään, että käyttäjän sähköposti ei ole kelvollinen.
Lisää ensin seuraavat tuonnit käyttäjien/mallien yläosaan
nano users/models.py
# Niin
Lisätään seuraavaksi käyttäjämalliin toiminnot, jotta saadaan tunnus ja tarkistat sähköpostin aktivointiin käytetyn tunnuksen, samoin kuin kentän säästääksesi, vastaanottaako käyttäjä onnistuneesti postinsa. Lisää käyttäjät/mallit.py uudelleen seuraava koodi mallin loppuun (sisennetty koodi)
# Niin
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Voimassa 30 päivää
Tämä on melko yksinkertaista, käytämme TimestampSigneria, joka on perussalaustyökalu, luodaksemme tunnuksen, joka vanhenee tietyn ajan kuluttua, ja käytämme myös toista toimintoa tarkistaaksemme, onko se kelvollinen. Käytämme näitä merkkejä kahdesti, kerran sähköpostin tarkistamiseksi ja kerran tilauksen peruuttamisen linkin saamiseksi.
Nyt kun meillä on nämä, viimeinen työstä, joka meidän on tehtävä, on näkemyksissä. Lisäämällä käyttäjät/Views.py -näytöt sähköpostiosoitteen tarkistamiseksi ja tilauksen peruuttamiseksi.
nano users/views.py
Lisää ensin seuraava tuonti. Heitin muutaman ylimääräisen, joten meidän ei tarvitse tuoda lisää tuotteita myöhemmin uudelleen.
from .email import send_verification_email # Varmista, että tuodaan vahvistussähköpostin lähetystoiminto
Sinulla voi olla jo joitain näistä tuonnista, mutta niiden toistaminen ei haittaa. Sinun on tuotava varmennussähköpostin lähetystoiminto sekä ACCORT_ACTIVATION_TOKOKOKOKSION.TOKENS, muun muassa.
Lisää nyt tiedoston alaosaan seuraava koodi:
# Peruuta ne
# Muuten ohjata sisäänkirjautumissivulle
# SendWelcomeMail (pyyntö, käyttäjä)
Tämä on paljon koodia. Hajotetaan se. Ensimmäinen toiminto, puhdas ja yksinkertainen, peruuttaa käyttäjän postituslistasta. Toinen toiminto aktivoi heidän sähköpostinsa, ja huomaat, että lisäsin kommentoidun toiminnon, SendWelcomeMail. Olet tervetullut käyttämään sähköpostiosoitteita ja toimintojen määritelmää lähettääksesi tervetuliais sähköpostiviestin, en vain ole vielä. Viimeinen toiminto, jonka heitin, on tärkeä, koska aktivointiviestit päättyvät. Siksi meidän on palautettava aktivointiviesti uudelleen jonkin aikaa. Voimme käyttää peruslomakketta tähän ja soittaa toiminnolle tarkistusviestin lähettämiseksi. Ennen kuin teemme tämän, varmistamme, että se lähetetään ensisijaisesti lisäämällä toimintopuhelun rekisteriin. Lisää tämä rivi juuri ennen Regist -näkymän uudelleenohjausta, def Register, käyttäjät/View.py.
nano users/views.py
# … (After) def Register (pyyntö):
# … (Ennen) uudelleenohjaus (
Sinun ei tarvitse lisätä ensimmäisiä ja viimeisiä rivejä kyseiseen koodinpäähän. Varmista vain, että rekisterin näkymä lähettää varmennuspostiviestin käyttäjälle. Sen pitäisi näyttää tältä:
# … Tuonti
send_verification_email(user) # Lisää tämä rivi!
Nyt meidän on lisättävä lomake aktivointiviestien uudelleensijoittamiseksi. Lisää käyttäjät/forms.py seuraa seuraava lomake:
# … (Tuonti)
Tarvitsemme myös tätä uudelleenlähetystä sähköpostin aktivointimuotoa vastaavan mallin. Lisätään tämä malli sisään. Muokkaa tiedostoa:
nano users/templates/users/resend_activation.html
Lisää seuraavaksi seuraava koodi tiedostoon.
Whew, se on paljon! Nyt, kun otat koodin käyttöön palvelimellemme, voimme lähettää HTML -sähköpostia ja aktivoida käyttäjätilit napsauttamalla sähköpostia. Haluamme ehkä myös lähettää yksinkertaisen tervetuliaispostiviestin, joten katsotaan, miten se tehdään. Lisää käyttäjät/sähköposti.py, lisää seuraava koodi:
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)
Tarvitsemme myös mallin kaikkien näiden tietojen antamiseksi. Verkkosivustollani malli näyttää alla, mutta olet tervetullut muotoilemaan sitä haluamallasi tavalla.
Huomaa, että meillä ei ole sulkemista runko- tai HTML -tunnisteita, koska lisäämme ne sisään, kun lisäämme HTML -peruuttamislinkin. Nämä ovat tärkeitä, mutta emme halua määritellä niitä kahdesti.
Joten mitä seuraavaksi? Olemme edenneet pitkälle. Oikeasti, meidän pitäisi olla valmiita ottamaan sivuston käyttöön palvelimelle. Voimme lisätä @login_Required -sisustusarkin ja tehdä näkemyksistämme turvallisuuden, ottaa käyttäjän kirjautumiseen, lähettää yhteensopivia sähköposteja ja välimuistitiedot, mikä on perusta sille, mitä verkkosivusto tarvitsee pysyäkseen asiaankuuluvaksi. Lisäämme vielä muutaman hyödyllisen ominaisuuden ja rakennamme sitten perustan koodimme käyttöönotolle etäpalvelimelle, postin palvelimen asettamiselle, verkkotunnuksen kokoonpanolle ja suodattimille, jotta sivustostamme olisi turvallinen ja tarkoituksenmukainen.
Tarvitsemme myös salasanan palautusnäkymän, joten lisätään se todella nopeasti. Djangon sisäänrakennettu salasanan palautusnäkymä on rikki joissakin toiminnoissa, mutta tarkastelemme kuinka kirjoittaa oma näkymämme, sähköposti -malli, lomakkeet ja URL -mallit. Tässä on näkymä, käyttäjät/View.py
# ... tuonti
Tämä lomake on rakennettu Djangoon, mutta tarvitsemme mallin vahvistaaksesi salasanan palautuksen, käyttäjät/malli/käyttäjät/salasana_reset_confirm.html
Meillä on myös malli lähettää salasanan palautusviesti yksinkertaisella lomakkeella käyttäjillä/malleissa/käyttäjillä/salasana_reset.html
Itse sähköpostin malli on yksinkertainen, se on HTML -tiedoston perustiedosto, joka antaa linkin salasanan nollaamiseksi, käyttäjillä/malleissa/käyttäjillä/salasana_reset_email.html. Django tulkitsee tämän tiedoston automaattisesti.
Tarvitsemme myös kaksi muuta mallia. Ensimmäinen on vahvistaa, että sähköposti on lähetetty. Näkemykset näille ovat jo Djangossa, joten meidän on vain puututtava niihin URLS.PY: ssä. Tämä malli sijaitsee käyttäjiä/malleja/käyttäjiä/salasana_reset_done.html
Ja viimeiseksi, vahvistaaksesi, että salasanan nollaus on valmis, käyttäjät/mallit/käyttäjät/salasana_reset_complete.html
Nyt tarvitsemme URL -mallia näihin näkymiin. Lisää käyttäjät/urls.py seuraavat URL -osoitteet:
# ... Aikaisemmat URL -osoitteet täällä
Neljä mallia, se on paljon! Mutta nyt voimme varmistaa, että pystymme nollaamaan käyttäjän salasanan milloin tahansa tarvitsemme, kaikki selaimesta.
Ymmärrän, että tämä on paljon koodia. Jos se näyttää vähän pään yli, se on ok. Parannat, ymmärryksesi paranee, ja sinusta tulee paljon pätevämpi koodin kanssa pian. Jos olet täysin kadonnut, suosittelen palaamaan takaisin tähän ohjelmistoon myöhemmin työskennellessäsi itsenäisen oppimisen koodaamaan kurssia verkossa. Nämä ovat yleensä vapaa aloittamaan, ja opastavat sinut kaiken, mitä tarvitset menestyäksesi, kun palaat tähän projektiin. Jos sinusta tuntuu, että olet valmis jatkamaan, lukemme seuraavaksi, kattamme koodin käyttöönoton etäpalvelimelle ja asettamalla postipalvelimen sekä automatisoimalla käyttöönoton Bashin avulla, jotta voit aina asettaa uuden projektin muutamalla yksinkertaisella komennolla.
Viimeinen asia, joka meidän on tehtävä ennen sijoittamista etäpalvelimelle, on tehdä sivustostamme hieman turvallisempi. Huomaat, että kirjautumisnäkymässä vain käyttäjätunnus ja salasana ei ole monikerrointen todennusta tai yhden kerran koodia. Tämä on helppo korjaus, ja samalla koodilla voimme saada sivustomme lähettämään tekstiviestejä ja jopa reagoida palvelimelle lähetettyihin tekstiviesteihin. Aluksi palaamme käyttäjämalleihin ja lisäämme aikaleiman allekirjoittajan, joka edustaa kutakin kirjautumista. Lisäämme myös ainutlaatuisen, pyörivän tunnisteen käyttäjämalliin, jota käytetään lisäämään lisäturvakirjautumiseen kirjautumiseen. Käyttäjämallien muokkaaminen, käyttäjät/mallit.py, lisää seuraava koodi:
# Muista tuoda UUID, aikaleiman allekirjoittaja ja URL -Generaattori (päinvastainen)
# Lisää tämä koodi tähän
# Ja lisää tämä toiminto
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Voimassa 3 minuutin ajan
Varmista, että käyttäjät/mallit.py näyttää tältä kommenttien lisäksi (koodi riviltä #). Hajottaen tämän, se on yksinkertaista. Meillä on muutama tuonti, aikaleikkauskirje, joka on salausapuohjelma, joka voi luoda suojatun koodin ja varmistaa sen varmistaaksemme, että se on kelvollinen, käytetty vain kerran, eikä ole vanhempi kuin tietty määrä sekuntia. Käytämme myös UUID: tä, joka on yksilöivä tunniste, joka tunnistaa käyttäjän tunnuksen allekirjoittamisessa, ja URL -osoitteessa, jossa merkki lähetetään käyttäjälle. Käytämme tätä perussalausta rakentaaksesi kahden tekijän todennusnäkymän. Ennen kuin teemme jotain muuta, suoritetaan siirrot, jotta käyttäjämallimme päivitetään. Suorita seuraavat komennot Management.py -hakemistossa, jotta voit tehdä ja suorittaa muuttoliikkeet.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Tämä on tärkeää, koska joka kerta kun teemme muutoksia malleihin, meidän on luotava taulukot ja päivitettävä tietokanta oletusarvoilla, ennen kuin voimme tosiasiallisesti käyttää malleja.
Seuraavaksi improvisoidaan kirjautumisnäkymme ohjataksesi toissijaisen todennuksen näkymään. Poista Users/View.py -sovelluksessa kirjautumistoiminto ja ohjata uudelleen käyttäjämalleissa juuri luomamme URL -osoitteeseen.
# … Tuonti
if user and user.profile.can_login < timezone.now(): # Huomaa, että tarkistamme nyt, voiko käyttäjä kirjautua sisään
# Poista auth_login -toiminto, joka oli täällä
return redirect(user.profile.create_auth_url()) # Huomaa, että ohjaamme uuteen URL -osoitteeseen täällä
else: # Jos käyttäjä ei käytä monitektorista todennusta, kirjaudu vain sisään.
else: # Jos kirjautuminen ei onnistunut,
user = User.objects.filter(username=username).first() # Tämä on osa, jossa päivitämme käyttäjien profiilin
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Joten he eivät voi kirjautua uudelleen muutaman sekunnin ajan
Joten tämä on melko yksinkertaista, meillä on nyt tapa ohjata kahteen tekijän todennusnäkymään, kun luomme sen. Meillä on myös varaus, jos käyttäjä ei ole lisännyt puhelinnumeroa. Lisäämme perusnäkymän lisätäksesi puhelinnumeron pian ja kirjaudumme pian tekstiviestiin.
Ensinnäkin tarvitsemme helpon tavan lähettää tekstiviesti koodistamme. Tätä varten voimme valita useista sovellusliittymistä, mutta mielestäni helpoin on Twilio. Ne tarjoavat myös hyvän hinnoittelun pienemmille projekteille sekä irtotavarana alennuksille. Luo tili Twilio.com -sivustolle, täytä joitain yksityiskohtia projektistasi, osta puhelinnumero ja kopioi sovellusliittymäsi avaimet asetukset.py. Lisää sitten tämä koodi uuteen tiedostoon, käyttäjät/sms.py.
nano users/sms.py
# Tuo kaikki tarvittavat paketit
# Tämä koodi lähettää tekstin Twiliolla
# Helper -toiminto saadaksesi numeron niin monella numerolla
# Lähetä teksti tarkistaaksesi käyttäjän
# Lähetä käyttäjälle minkä tahansa tekstin tällä toiminnolla
# Vahvista koodi tällä toiminnolla
# Vahvistaa aika
Muista muuttaa asetukset asianmukaisesti, lisäämällä nämä rivit näppäimisiisi:
# Muista kopioida nämä Twilio -kojetaulusta
AUTH_VALID_MINUTES = 3 # Minuutin lukumäärä TFA -sivu on aktiivinen kerran
Ensinnäkin tarvitsemme lomakkeita kahdelle tekijän todennusnäkymälle. Käyttäjien/forms.py: n muokkaaminen lisää seuraava koodi.
# … Tuonti
# Lomake puhelinnumeromme syöttämiseksi
# Lomake todentamiseksi
Seuraavaksi luodaan näkymät käyttäjille/Views.py
# … Tuonti
Tarvitsemme myös malleja molemmille näille näkemyksille. Lisätään ensin MFA -malli.
nano users/templates/users/mfa.html
Lisää tämä HTML -koodi malliin
Tämä on melko itsestään selvää. Lomake lähettää joko koodin tai tyhjän koodin, ja huomaat, että lähetämme koodin, jos saamme tyhjän koodin. Sitten meillä on vain kaksi lähetyspainiketta, ja tällä tavalla voimme lähettää koodin jommallakummalla painikkeella. Seuraavaksi lisäämme yksinkertaisen lomakkeen lisätäksesi puhelinnumeron.
nano users/templates/users/mfa_onboarding.html
Lisää seuraava HTML:
Tämä lomake on paljon yksinkertaisempi, se vain tekee luomamme puhelinnumeron ja antaa käyttäjän lisätä puhelinnumeron.
Tämä näyttää todella hyvältä! Niin kauan kuin kaikki on asennettu oikein, meidän pitäisi pystyä lähettämään viestejä ja kirjaamaan käyttäjä heidän puhelinnumeronsa kanssa heti, kun lisäämme URL -mallit. Viimeinen asia, joka meidän on asetettava, on profiilinäkymä, jotta voimme varmistaa, että käyttäjä voi muuttaa puhelinnumeronsa ilman kirjautumista sisään. Lopulta myös haluamme lisätä "Stop to Quit" -vaihtoehdon, jotta käyttäjä voi "lopettaa" lopettaaksesi tulevat tekstiviestit.
Lisätään profiilinäkymä käyttäjille/View.py. Tämä näkymä päivittää käyttäjän bio-, sähköposti-, käyttäjänimi- ja puhelinnumeron ja antaa meille mahdollisuuden ottaa käyttöön monitekijän todennus. Ensinnäkin tarvitsemme vielä kaksi muotoa käyttäjiä/forms.py
# ... tuonti
Seuraavaksi voimme luoda näkymän, jota voidaan käyttää molemmat nämä muodot. Muokkaa käyttäjiä/View.py ja lisää näkymä.
# Lisää nämä tuonti
Tarvitsemme myös mallin tähän näkemykseen.
nano users/templates/users/profile.html
Huomaat, että tämä on melko yksinkertainen muoto, mutta siinä on jonkin verran JavaScriptiä, joka lähettää lomakkeen sisällön automaattisesti, kun ne päivitetään. Tätä on hyödyllistä, joten pystyt tekemään muokkauksia joutumatta painamaan lähettämistä joka kerta.
Seuraavaksi tarvitsemme URL -osoitteita, jotka edustavat kaikkia näitä näkymiä käyttäjien URL -osoitteessa. Muokkaa käyttäjiä/urls.py ja lisää tämä koodi:
# … Edellinen koodi, tuonti
# … Lisää seuraavat kolme riviä URL -URL -mallit, jotka olemme aiemmin syöneet
Nyt on hyvä aika testata projektimme. Mutta ensin suoritetaan uusi varmuuskopio.
backup
Ja suorita palvelinta. Ennen kuin siirrymme Linux -palvelimeen, on hyvä idea ottaa käyttöön kaksi tekijätodennusta tilillä. Teemme tämän menemällä profiili -URL -osoitteeseen,/käyttäjät/profiili/, ja valitamme ruudun sallimaan todennuksen puhelinnumeromme kirjoittamisen jälkeen ja lähettämällä sitten lomake.
python manage.py runserver localhost:8000
Vieraile verkkosivustolla siirtymällä verkkoselaimeen, käytän tässä esimerkissä Google Chromea ja kirjoitan URL -osoitteeseen https: // localhost: 8000/tilit/profiili/
Voit tarvittaessa kirjautua sisään ja ottaa käyttöön kaksi tekijän todennusta.
Tämä projekti tarvitsee palvelimen toimimaan, jotta se voi todella lähettää postia. Mutta ensin tarvitsemme tavan nähdä virheitä. Huomaat, että jos suoritat palvelimen virheenkorjaustilassa, kun asetukset.debug on yhtä suuri kuin totta, palvelin näyttää virheet automaattisesti. Virheiden näyttämiseksi käyttämättä virheenkorjaustilaa, joka on vaarallinen tuotantopalvelimella, meidän pitäisi lisätä näkymä siihen. Tärkeimmät virheet, jotka meidän on kyettävä käsittelemään, ovat:
Virhe 500 - ongelma koodissamme Virhe 404 - sivu, jota ei löytynyt (rikki URL) VIRHE 403 - Lupa kielsi virheen
Lisätään uusi sovellus näiden virheiden käsittelemiseksi, nimeltään virheet.
python manage.py startapp errors
Lisää tämä asetukset.py, kuten aiemmin teimme, asennettuun_apps -asetukseen ja aloita lisäämällä viitteitä joihinkin näkymiin App/URLS.PY: ssä, missä sovellus on Django -projektisi nimi.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Tämä on kaikki mitä tarvitsemme virheiden, mallien ja vähän väliohjelman lisäksi. Määritetään ne niin:
# Luo näkemyksesi täältä.
Määritämme seuraavaksi väliohjelman näiden virheiden käsittelemiseksi. Teemme tämän lisäämällä ensin Middleware_Classes -sovellukseen asetusten.py, väliohjelmamme nimellä.
# ... Edellinen väliohjelmisto
Lisätään seuraavaksi väliohjelmisto.
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.')
Lisäämme toiminnon saadaksesi nykyisen poikkeuksen käyttämällä kierteitä paikallista, mikä auttaa meitä jäljittämään koodimme kaikki virheet. Mallien suhteen tarvitsemme vain sellaisen, koska määrittelemme otsikon dynaamisesti. Malli on vain tehtävä otsikko ja "jäljitys", virheitämme asiayhteydestä.
nano errors/templates/errors/error.html
Tämä on vielä yksinkertaisin malli, mutta se on kuinka helppoa on nähdä projektimme virheet. Seuraavaksi poistetaan virheenkorjaus käytöstä asetuksissa.
nano app/settings.py
Löydä tämä rivi, jossa se on asetettu totta, ja muuta se vääriksi
DEBUG = False
Mene eteenpäin ja varmuuskopioi sovellus nyt. Olemme valmiita ottamaan käyttöön Etä Linux -palvelimelle ja lisäämällä ominaisuuksia sieltä.
sudo backup
Ennen kuin lähetämme tämän koodin palvelimelle, meidän on otettava huomioon, että koodissa voi olla joitain ongelmia. Tapauksesta riippuen sivustoilla, jotka hyväksyvät heille lähetetyt tiedot, on ongelmia roskapostin lähettämiseen ja roskapostin poistamisvaikeudet. Tämän ei pitäisi tapahtua heti, mutta jos se tapahtuu, tutkimme myöhemmin, miten sivustolla olevat roskapostia voidaan ohjata automaattisesti ja teemme robottien kovempaa pääsyä sivustoon sekä käyttäjätilien deaktivointi ja käyttäjän henkilöllisyystodistus heidän henkilöllisyystodistuksestaan tai biometrisestä skannauksesta, kuten sormenjälki tai kasvojen tunnustus.
Tarkasteltaessa monitekijöiden todennusesimerkkiä, jota tutkimme tuotannossa, asiat voivat olla erilaisia. Huomaa, kuinka korkoa rajoittavat kirjautumiset ja vanhentuvat rahakkeet. Jos robotit käyttävät sivustoa, kaksi tekijän todennusta voi olla vaikeampaa, koska ne voivat syöttää koodeja samanaikaisesti käyttäjän. Tämän torjumiseksi käytämme mallimallia käyttäjämallissa, ilmoittamalla, kuinka olemme vuorovaikutuksessa sivuston kanssa, kun todennamme monitekijän todennusta puhelinnumerolla. Lisäämme myös vaihtoehdon todentaa sähköpostilla. Aloita muokkaamalla käyttäjämalleja nanolla.
nano users/models.py
Tämän lisäämämme mallin pitäisi näyttää. Emme tarvitse mitään menetelmiä, vain muuttujia tunnuksen, käyttäjän, aikaleiman, vanhentumisen, pituuden ja yrityksien tallentamiseksi minkä tahansa monitekijän todennusta vastaan (koodi, kuten 123456, lähetetty puhelimeen tai sähköpostille).
# Perustunnus kirjautui sisään verkkosivustoon
Lisätään myös käyttöoikeus käyttäjällemme, ja asetamme sen nyt manuaalisesti, ennen kuin lopulta siirrymme etuoikeutettuihin käyttäjiin automaattisesti. Lisää tämä rivi profiiliin käyttäjämalleihin:
vendor = models.BooleanField(default=False)
Kuten kaikki tietokannan muutokset, meidän on tehtävä siirrot ja siirrettävä tietokanta aina, kun muokkaamme malleja.py -tiedostoa Djangossa. Muista, että tämän tekemiseksi käytämme ensin lähdettä (jos sitä ei ole jo käytetty päätelaitteen avoimesta) ja sitten python manag.py siirtymien ja siirtymisen tekemiseksi.
cd project-directory-you-named # (tarvittaessa)
Toistaiseksi voit ottaa kaikki myyjiksi luomasi tilit kuoren avulla.
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Kehitämme nyt monitekijän todennusnäkymämme tämän tunnuksen käyttämiseen. Ensinnäkin meidän on muokattava MFA -auttaja -apuohjelmiamme. Nanon avulla,
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
# Todenta käyttäjä heidän sähköpostinsa tai puhelinnumeronsa avulla
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Suodata merkki URL -osoitteessa läpäisemällä arvolla (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)) # Jos tätä istuntoa ei ole luotu, luo se
user = User.objects.filter(id=token.user.id).first() # Hanki käyttäjä tokenista
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Jos ne ovat jo todennettuja, kirjaudu sisään
if not user: raise PermissionDenied() # Kielletä, jos käyttäjää ei löydy
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Tarkista Auth -tunnus
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Kirjaudu sisään käyttäjälle, jos niitä ei ole jo kirjautunut sisään
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Aseta vanheneminen heidän monitekijän todennukseen
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Ohjaa käyttäjä seuraavalle sivulle
if not user.profile.mfa_enabled: # Tarkista, onko MFA käytössä
if not check_verification_time(user, token): # Tarkista aika
user.profile.mfa_enabled = False # Tyhjennä puhelinnumero
user.profile.enable_two_factor_authentication = True # Ottaa käyttöön MFA
user.profile.phone_number = '+1' # Poista puhelinnumero käytöstä
user.profile.save() # Tallenna profiili
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Kirjaudu käyttäjälle, jos heidän MFA: ta ei ole käytössä
if request.method == 'POST' and not fraud_detect(request, True): # Jos pyyntö on postipyyntö
form = TfaForm(request.POST) # Välittömä muoto
code = str(form.data.get('code', None)) # Saada koodi
if code and code != '' and code != None: # Varmista, että se ei ole tyhjä
token_validated = user.profile.check_auth_token(usertoken) # Tarkista Auth -tunnus
is_verified = check_verification_code(user, token, code) # Tarkista koodi
if token_validated: # Jos kaikki
if is_verified: # On kunnossa
user.profile.mfa_enabled = True # Ota MFA käyttöön (ellei ole jo käytössä)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Kirjaudu sisään käyttäjälle
for key, value in request.GET.items(): # Rakenna querystring seuraavalle parametrille (jos sellainen on)
return HttpResponseRedirect(next) # Ohjata
elif not token_validated: # Jos merkki oli virheellinen
if p.mfa_attempts > 3: # Jos yrityksiä olisi liian paljon
if form.data.get('send_email', False): # Lähetä sähköposti (tai teksti)
# Tee lomake (saada pyyntöjä)
Kun lisäämme tähän koodiin, muista tuoda toiminto sähköpostin lähettämiseksi. Lisää tiedoston yläosaan (muiden tuontien kanssa)
from .mfa import send_verification_email as send_mfa_verification_email
Nyt meidän on kirjoitettava tämä toiminto ennen kuin jokin näistä toimii. Sen tulisi laajentaa Lähetä sähköpostitoimintoamme ja lähettää vain sähköposti käyttäjälle varmennuskoodilla.
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))
Joten tämä kaikki toimii hienosti, nyt meillä on monitekijän todennusjärjestelmä, joka riippuu puhelinnumerosta tai sähköpostista kirjautumiseen. Mutta tarvitsemme myös tavan poistaa tai ainakin piilottaa käyttäjiä, jotka eivät ole yhteistyössä ehtojen kanssa. Nämä voivat olla roskapostittajia, robotteja tai ketään, joka ei tarkoita hyvin työhömme. Katso näkymää, joka minulla on käyttäjien seurannasta verkkosivustollani:
# tuonti
from .tests import is_superuser_or_vendor # Meidän on luotava tämä testi
# Hanki luettelo käyttäjistä
return render(request, 'users/users.html', { # Palauta käyttäjät mallissa
Huomaa, että tämä koodi käyttää testiä, meidän on ilmoitettava tämä testi test.Py -tiedostossa ja tuodaan se. Käyttäjien/testien muokkaaminen, luodaan testi.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
Tämä on yhdessä käyttäjien/käyttäjien.html -mallin kanssa, joka näyttää jotain tällaiselta:
Huomaa, että malli sisältää toisen mallin, käyttäjät/User.html. Kun käytät mallia, jossa on aloitusmerkintä ja joka ei käytä, on hyvä idea lisätä alaviiva () Ennen tiedoston nimeä laajennettava, mallien erottamiseksi.
Huomaa, että tämä on paljon jinjaa, sinulla ei ehkä ole kaikkia näitä muuttujia määritelty. Mutta tämä koodini näyttää.
<small># {{user.id}} </small>
Tarvitsemme myös toisen alitilaa, toggle_active.html. Tämän mallin tulisi olla lomake, jonka avulla voimme vaihtaa käyttäjän aktiivisen.
Meidän on myös lisättävä näkymä käyttäjän toiminnan vaihtamiseen ja sopiviin URL -osoitteisiin. Kun olemme siinä, lisätään näkymä käyttäjän poistamiseksi, jos tarvitsemme sitä.
# Tuonti
success_url = '/' # Menestys -URL -osoitteen uudelleenohjaus
def test_func(self): # Testaa, onko käyttäjä superkäyttäjä ja sillä on lupa poistaa
Vaikka tämä on käytännöllistä tarvittaessa, käyttäjän poistamisen ei pitäisi olla välttämätöntä suurimman osan ajasta, voimme vain muuttaa sivustolla käyvien käyttäjien näkyvyyttä, jos meidän on hylättävä ne.
Lisäsimme URL -mallit näyttävät tältä. Nanon kanssa muokkaa käyttäjiä/urls.py ja lisää nämä rivit:
nano users/urls.py
Rivien tulisi mennä käyttäjän näkemysten polkujen luetteloon ennen päättymistä "]", mutta alun jälkeen "[".
# Niin
# Niin
Varmista nyt, että varmuuskopioida sivusto, jotta voit ladata sen verkkopalvelimelta, jonka parissa jatkamme. Komentoriviltä,
sudo backup
Nyt sivustomme on varmuuskopioitu.
Joten nyt meillä on vielä muutama hyödyllinen ominaisuus. Mutta entä täällä oleva iso kuva? Tätä koodia ei vieläkään pääse Internetistä, meillä ei ole vielä postilaitetta, ja meidän on laajennettava sovellustamme sisällyttämään kattava varmennusprosessi sekä sujuvat asetteluja, jotka auttavat meitä tutkimaan sivustoa sekä suojattujen protokollien kanssa etuoikeutettujen käyttäjien todentamiseksi.
Pääsemme kaiken tämän. Tärkein asia on vain saada tämä koodi verkossa, mitä voimme tehdä vain muutamalla rivillä bash -palvelimella Ubuntu -palvelimella. Sinun on kuitenkin vuokrattava palvelin tähän, ellei sinulla ole kotona olevaa palvelinta ja yrityksen Internet -tilaus, jonka avulla voit avata portit. Suoritan henkilökohtaisesti verkkosivustoni HP Z440: llä, joka on asennettu huoneistooni, mutta se on yleensä paljon halvempaa Virtuaalisen yksityisen palvelimen (VPS) vuokraamiseen.
Muista, että nyt käyttämämme koodi on suhteellisen ohut, se on ylläpidettävä ja parannettava ennen kuin olemme valmiita käyttämään tuotteen rakentamista. Varmista, että olet varovainen, mitä teet Internetin kanssa, varmista, että otat tämän sivuston julkisesti Linux -palvelimen verkkoon, sinulla on suunnitelma estää ei -toivotut vuorovaikutukset verkkosivustosi kanssa. Tämä todennäköisesti ei ole aluksi ongelma, mutta tutkimme tämän torjumiseksi erilaisia ratkaisuja, mukaan lukien koneoppiminen, tekoäly ja tietokoneen visio. Kun siitä tulee ongelma, katso edelleen tätä tekstistä ratkaisua varten.
VPP: n vuokraamisessa on paljon paikkoja, joihin voit mennä. Google Cloudissa on VPS -palvelimia, Ionos, Kamatera, Amazon AWS ja muut palveluntarjoajat tarjoavat Cloud Server -ratkaisuja, jotka vastaavat tarpeitamme.
Sinun on napsautettava niiden lomakkeita ja valittava suunnitelma aloittaaksesi. Voit mennä perussuunnitelman kanssa minkä tahansa palveluntarjoajan kanssa, mutta varmista, että palveluntarjoaja antaa sinun avata Port Mail Server -portit lähettääksesi sähköpostia (tämän tulisi olla portti 587 ja portti 25), jotkut palveluntarjoajat estävät nämä portit. Toistaiseksi minulla on ollut paras kokemus Ionosista ja Kamaterasta, molemmat antavat minulle mahdollisuuden lähettää rajoittamaton sähköposti ja heidän hinnoittelu on aika halpaa.
Voit muodostaa yhteyden uuteen palvelimeen SSH: n nimeltä SSH tai Secure Shell -protokolla, jonka avulla voit etäpinnan palvelimeen tarkalleen kuten henkilökohtaisen tietokoneesi, henkilökohtaisesta tietokoneestasi. Kun asetat palvelimen, hosting -palveluntarjoaja todennäköisesti pyytää sinua lisäämään SSH -avaimen, tai he antavat sinulle käyttäjänimen ja salasanan. SSH -avain on, kuinka kirjaudut sisään komentoriviltä palvelimelle koodin muokkaamiseksi. Luo SSH-avaimen alla olevien SSH-KeyGen-vaihtoehtojen avulla.
ssh-keygen
Tallenna tiedosto ja korvaa se tarvittaessa, on hyvä kääntää SSH -näppäimiä, jos et vielä ole. Nyt voit käyttää seuraavaa komentoa nähdäksesi SSH -avaimen. Haluat kopioida sen etäpalvelimelle, jotta voit käyttää sitä todentamiseen.
cat ~/.ssh/id_rsa.pub
Jos et pystynyt näkemään SSH-avainta kirjoittaessasi tätä komentoa (pitkä numero- ja kirjainjono "SSH-RSA AAA"), kokeile luoda RSA-avain (ne ovat turvallisempia, joten suosittelen niiden käyttämistä.) Seuraava koodi tuottaa 4096 bittin RSA SSH -näppäimen.
ssh-keygen -t rsa -b 4096
Luo VPS, joka käyttää Ubuntua, kuitenkin aiot tehdä tämän. Kun olet luonut VPS: n napsauttamalla Providers -verkkosivuston lomakkeita (kamera.com, ionos.com tai vastaavat), sinun kannattaa kirjautua sisään. Jos haluat tehdä tämän, käytä SSH -komentoa IP -osoitteesi kanssa (osoite, joka näyttää xx.xx.xx.xx). Sinun on myös oltava herkkä oletuskäyttäjätunnukselle luomillemme palvelimella, esimerkiksi Ubuntu.
ssh ubuntu@XX.XX.XX.XX
Sinua voidaan pyytää salasana, jos sinulta pyydetään salasana, kirjoita se sisään. Emme käytä oletuskäyttäjänimeä, joten aloitetaan luomalla uusi käyttäjä ja lisäämällä SSH -avain heidän tililleen.
Aloitetaan lisäämällä uusi SSHD_Config -tiedosto, joka kertoo palvelimelle, kuinka SSH: ta käytetään.
nano sshd_config
# Tämä on SSHD-palvelinjärjestelmän koko määritystiedosto. Nähdä
# shd_config (5) saadaksesi lisätietoja.
# Tämä SSHD on koottu polulla =/USR/Local/Sbin:/USR/Local/Bin:/USR/SBIN:/USR/BIN:/SBIN:/BIN:/USR/Games
# Strategia, jota käytetään asetettujen SSHD_Config -asetusten kanssa
# OpenSSH: n on määritettävä vaihtoehdot oletusarvollaan missä
# mahdollista, mutta jätä heidät kommentoi. Kommentoitumattomat vaihtoehdot ohittavat
# Oletusarvo.
# Satama 22
# Osoiteperhe kaikki
# Kuuntele 0,0,0,0
# Kuuntele
# Hoskey/etc/ssh/ssh_host_rsa_key
# Hoskey/etc/ssh/ssh_host_ecdsa_key
# Hoskey/etc/ssh/ssh_host_ed25519_key
# Salaukset ja avain
# RekeyLIlMit -oletus ei ole mitään
# Puunkorjuu
# Syslogfacity Auth
# Loglevel -tiedot
# Todennus:
# LogingRaceTime 2m
# Sallirrootlogin kieltää password
# Tiukkamodit kyllä
# Maxauthtries 6
# MaxSessions 10
# Odottaa .SSH/valtuutetun_keys2 jätetään huomiotta tulevaisuudessa.
# ValtuutettuPrincipalsFile Ei mitään
# ValtuutetutKeysCommand Ei mitään
# ValtuutetutKeyscommanduser kukaan ei
# Jotta tämä toimisi, tarvitset myös isäntänäppäimiä/etc/ssh/ssh_chold_hosts
# HostbasedAuthentication No
# Vaihda kyllä, jos et luota ~/.ssh/tunnetuksi_hostiksi
# Isäntä
# Ohjaajatieto
# Älä lue käyttäjän ~/.rhosts ja ~/.shosts -tiedostoja
# Tietäjät
# Tunneloitujen selkeiden tekstisalasanojen poistaminen käytöstä vaihda ei täällä!
# Sallia
# Vaihda kyllä, jotta haastevaste-salasanat mahdollistaisivat (varoon ongelmia
# Jotkut PAM -moduulit ja langat)
# Kerberos -vaihtoehdot
# Kerberosauthentication ei
# Kerberosorlocalpasswd kyllä
# Kerriticketcleanup kyllä
# KerberosgetAfSTOKOKO EI
# GSSAPI -vaihtoehdot
# GSSAPIAUTHENCINTION NO
# GSSAPICLEANUPCREDENTICS KYLLÄ
# GSSAPTRICTACPTORCHECK KYLLÄ
# Gssapikeyexchange no
# Aseta tämä 'kyllä', jotta PAM -todennus, tilinkäsittely
# ja istunnon käsittely. Jos tämä on käytössä, PAM -todennus tulee
# sallitaan kbdinteractiveauthentication ja
# Salasanaa. PAM -määrityksestäsi riippuen,
# PAM -todennus KBDinterActiVeauthentication voi ohittaa
# "sallirrootloginin ilman password" -asetusta.
# Jos haluat vain PAM -tilin ja istuntotarkastusten suorittamisen ilman
# PAM -todennus, ota tämä sitten käyttöön, mutta aseta salasana -authentication
# ja kbdinteractiveauthentication 'ei'.
# Sallia
# SalliTCPForwarding Kyllä
# Gatewayports Ei
# X11DisplayOffset 10
# X11uselocalhost Kyllä
# LAPITTY KYLLÄ
# PrintLastLog kyllä
# Tcpkepeealive kyllä
# Satamaympäristö ei
# Puristus viivästynyt
# CONSICILIVIIVIONV 0
# CONSTILIVECOUNTMAX 3
# Käytetyt nro
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Lupatnel Ei
# Chrootdirectory Ei mitään
# Versioddendum Ei mitään
# Ei oletushäiriöitä
# Anna asiakkaan välittää paikallisympäristömuuttujia
# Ohita Ei alajärjestelmät oletusarvo
# Esimerkki käyttäjän periaatteessa olevista asetuksista
# Vastaa käyttäjän anoncvs
# X11forwarding ei
# Sallia
# Sallittu ei
# ForceCommand CVS -palvelin
Muista, että Ctrl+x ja y tallentaa tiedosto. Seuraavaksi kirjoitetaan peruskomentosarja nimeltä Alusta (kaikki käyttäjän oletushakemistossa).
nano initialize
Lisää nämä rivit tiedostoon korvaamalla
# !/Bin/bash
Aloitetaan rivi rivillä. Ensimmäinen rivi kertoo kääntäjälle, että tämä on bash -komentosarja. Sitten asennamme riippuvuuksia, kopioimalla SSHD_Configin oikeaan hakemistoon, käynnistämällä SSH uudelleen, luomalla SSH -näppäimiä juurille, lisäämällä käyttäjän 'tiimi' (voit valita tämän nimen, jota haluat, Adduser -komentoa heidän nimensä kanssa ja poistettu käytöstä salasana nyt). Lisäämme myös joukkueen Sudo -ryhmään, luomme heidän SSH -avaimensa, lisäämme avaimemme myös valtuutettuihin avaimiin ja heidän omiinsa ja tulostamaan heidän avaimensa. Tämä uusi käyttäjä on se, kuinka kirjaudumme sivustoon.
Mene uudessa päätelaitteessa ja avaa palvelin uudelleen.
ssh team@XX.XX.XX.XX
Sinun ei pitäisi tarvita salasanaa tällä kertaa, koska sinulla on SSH -avain. Olemme myös poistettu käytöstä salasanalla, jotta sivusto on turvallisempi.
Nyt tämä palvelin käynnistyy täysin tyhjänä ilman tietoja. Aloitetaan kloonaamalla projekti Gitistä, jotta voimme ladata ja ajaa sen etäkoneelle. Tulosta SSH -avain ensin SSH: n kautta kytkettynä etäpalvelimella:
cat ~/.ssh/id_rsa.pub
Liitä seuraavaksi tämä avain GIT -asetuksiin, kuten teimme ennen Git -arkistomme perustamista. Voimme nyt kloonata projektimme suoraan palvelimelle. Varmista, että olet varmuuskopioinut projektia ensin paikallisesti, jotta se on GIT -palvelimella ladattava.
git clone git://github.com/you/yourproject.git
Täydellinen. Nyt kaikki tiedostot ovat täällä. Voimme nähdä ne LS: llä
ls
Aloitetaan nyt palvelimen perustaminen. Kopioi ensin projektihakemisto yksinkertaiseen, ikimuistoiseen nimeen, jota käytämme projektiin.
cp -r yourproject whatyoucalledit
Missä "Whatyoucalledit" on projektisi uusi nimi. Seuraavaksi meidän on rakennettava perusapuohjelma palvelimen asettamiseksi. Säästämme tämän apuohjelman ja käytämme sitä tulevaisuudessa. Luodaan tämä apuohjelma, luodaan käyttäjäbinaari määritelläksesi kuinka muokkaamme komentosarjaa. Käyttämällä bashia, muokkaa/usr/bin/ascripti
sudo nano /usr/bin/ascript
Varmista, että käytät sudoa siellä, jotta sinulla on käyttöoikeuksia tiedoston muokkaamiseen. Lisää tiedostoon nämä rivit:
# !/Bin/bash
echo "# !/Bin/bash ">>/usr/bin/$ 1
Muista, että tämä käsikirjoitus ottaa argumentin, komentosarjan nimen 1 dollarilla. Ensin se tarkistaa, onko tiedosto olemassa, vai luo muuten sen, lisää ensimmäisen rivin, jonka mukaan skripti on bash, muuttaa sen käyttöoikeuksiaan, muokata sitä ja lisää nimensä /etc /nimellä Cripts, jonka avulla voimme tallentaa luomamme skriptien nimet. Jos tiedosto on jo olemassa, muuta vain käyttöoikeuksia ja muokkaa sitä. Tallenna tiedosto, ja seuraavaksi muutamme sen käyttöoikeuksia. Niin kauan kuin käytämme tätä käsikirjoitusta, meidän ei tarvitse tehdä sitä uudestaan.
sudo chmod a+x /usr/bin/ascript
Täydellinen. Luotaan nyt skripti nimeltä SETUP. Ensinnäkin, et hukkua sinua, vaan katso, miltä asennuskomentosarjani näyttää. Käymme läpi sen, miltä tämän käsikirjoituksen pitäisi näyttää projektissasi, et tarvitse kaikkea käsikirjoituksessani aloittaaksesi.
# !/Bin/bash
# sudo chmod a+x skriptit/käyttäjättup
# ./scripts/usersetup
# ssh-avaingen
# Projektihakemisto
# Lokikomennot
# Nano -kokoonpano
# Git -kokoonpano
# Päivitä ja asenna
# Ota Clamav -virustorjunta
# Aseta isäntänimi
# Asennus Postgres
# Asetustietokannan varmuuskopiointi
# Poista Iptables käytöstä
# Asenna bitdefender
# Asennus postfix
# Luo dirs
# Asennus virtualenv
# Hanki ja rakenna riippuvuuksia
# Aseta palomuurisäännöt
# Asenna PYPI -riippuvuudet
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# Pip asenna OpenCV-Python == 4.5.5.64
# Pip asenna OpenCV-Contrib-Python == 4.5.5.64
# Asenna CertBot
# Suorita certbot
# Lataa postipalvelin uudelleen
# Kopiosertifikat
# sudo cp /etc/letSencrypt/live/femmebabe.com/privkey.pem frivkey.pem
# sudo cp /etc/letSencrypt/live/femmebabe.com/cert.pem cert.pem
# Patch Venv
# Aseta käyttäjän asetukset
# Aseta käyttöoikeudet
# sudo chown -r -tiimi: käyttäjät/var/juoksu/
# sudo chown -juuri: Juuri/juoksu/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: käyttäjät db.sqlite3
# Kopioi kokoonpano ja aseta käyttöoikeudet
# Asetustietokanta
# Injektio PAM -konfigurointi ja poista viallinen SSH -kokoonpano
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profiili
# Kopioi roskakorit ja aseta käyttöoikeudet
# Lataa ja ota palvelut käyttöön
# Ota Apache -moduulit käyttöön
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Poista oletussivusto käytöstä
# Ota sivustomme käyttöön
# Lataa daemoni ja käynnistä uudelleen Apache, Postfix ja OpenKim
# Aseta käyttöoikeudet
# Vaihda kokoonpano
# Aloitusmoottori
# Asennus
# Näytä IPv6 ja OpenKim verkkotunnuksen kokoonpanolle
# Asennus valmis
Se on paljon asennusta! Lyhyesti sanottuna, tämä koodi loki komennot, määrittää Nanon ja Git, kopioi tiedostojen kautta, lataa ja asentaa Ubuntu APT -paketit, Python -riippuvuudet, määrittää postFix: n, määrittää PostGresQL: n (tietokantapalvelin) ja lataa tietokannan, määrittää UFW: n. Palvelin ylöspäin, asentaa kokoonpanot, käynnistyy ja mahdollistaa seuraamisen, allokoi vaihda, asettaa käyttöoikeudet ja tulostaa IP-, IPv6 -osoitteen ja OpenKim -avaimen. Melko yksinkertainen, mutta se näyttää paljon koodilta. Emme tarvitse paljon tästä, koska meillä ei ole riippuvuuksia, emme käytä selleriä, selleriä tai Daphnea, mutta asennamme joitain niistä joka tapauksessa aloittamiseksi. Huomaa, että tässä koodissa on verkkotunnus, joka on julistettu useita kertoja.
Meidän on myös ostettava verkkotunnus (joka on pieni vuosipalkkio). Suosittelen Squarespace -verkkotunnuksen ostamista varten, niiden asettelu on intuitiivinen ja helppokäyttöinen. Voit ostaa minkä tahansa valitsemasi verkkotunnuksen, mutta käytän tässä esimerkissä verkkotunnusta femmebabe.com. Kun olet ostanut verkkotunnuksen, siirry Squarespace DNS -määrityspaneeliin ja lisää A -tietue, joka osoittaa verkkotunnuksen palvelimelle IP -osoitteen avulla. Sen pitäisi näyttää tältä:
@ A xx.xx.xx.xx
Kun @ operaattori isäntänä, tarkoittaen kaikki tämän alueen ja juurten verkkotunnuksen aliverkkotunnukset ohjaavat kaikki palvelimelle. Ilmoittamista on enemmän tietueita, mutta voimme siirtyä näihin, kun olemme valmiita lähettämään postia. Muista, että voi kestää useita päiviä, ennen kuin pystyt lähettämään postin onnistuneesti palvelimelta. Asettamamme DNS -tietueiden levittäminen vie aikaa.
Joka tapauksessa ainoa aloitustietue on levy. Joten nyt voimme täyttää alla olevan skriptin projektimme mukaan ja suorittaa sen.
Aloitetaan pienemmällä asennuskomentosarjalla vain asentaaksesi sen, mitä tarvitsemme perusedellytykseen. Emme vielä käytä niin paljon riippuvuuksia tai PostgreSQL: ää, aloitamme vain HTTP -palvelimen ja olemme huolissamme sen varmentamisesta, kun se on tehty. Muista, että saadaksesi HTTPS -sertifikaatin ja suorittaa palvelin turvallisesti, meidän on ostettava verkkotunnus yhdessä vuokra -palvelimen kanssa. Korvaa nyt "tiimi" tässä tiedostossa käyttäjän nimellä "DIR" projektisi hakemistolla ja toimittamalla sähköpostiosoitteesi ja verkkotunnuksesi <> tunnisteissa.
Lisäksi ennen tämän koodin suorittamista meidän on vaihdettava asetukset palomuuriin, jota isännöintipalveluntarjoaja tukee, jos sellaista on. Yleensä tämä on isäntäpalveluntarjoajan 'verkkojen' -välilehdessä tai jos olet itse isännöinti, se on reitittimen Portin edelleenlähetysosassa. Haluat myös asettaa staattisen IP: n reitittimen kautta palvelinkoneen osoitteella, jos käytät itsetuntoa. Sinun on avattava seuraavat portit luku-/kirjoituskäyttöön.
22 (SSH) 25 (posti) 587 (posti) 110 (posti -asiakas) 80 (http) 443 (https)
# !/Bin/bash
# Lokikomennot
# Nano -kokoonpano
# Git -kokoonpano
# Päivitä ja asenna
# Ota Clamav -virustorjunta
# Aseta isäntänimi
# Asetustietokannan varmuuskopiointi
# Poista Iptables käytöstä
# Asennus virtualenv
# Asenna CertBot
# Suorita certbot
# Aseta käyttäjän asetukset
# Aseta käyttöoikeudet
# sudo chown -r -tiimi: käyttäjät/var/juoksu/
# sudo chown -juuri: Juuri/juoksu/sudo/ts -r
# Lataa ja ota palvelut käyttöön
# Ota Apache -moduulit käyttöön
# Lataa daemoni ja käynnistä uudelleen Apache, Postfix ja OpenKim
# Näytä IPv6 ja OpenKim verkkotunnuksen kokoonpanolle
Varmista ennen tämän koodin suorittamista, että ostamasi verkkotunnus on kytketty palvelimeen. Jos haluat tehdä tämän, avaa pääte paikalliselle koneellesi ja suorita tämä komento verkkotunnuksellasi:
ping femmebabe.com # Aseta verkkotunnuksesi tähän pingin jälkeen
Jos kaikki näyttää hyvältä ja palvelin lähettää vastauksia, olemme valmiita suorittamaan komentosarjan ja asentamaan paketit sekä käynnistämään, ottamaan käyttöön ja varmentamaan Apache -palvelimemme.
Tämä ei ole kaikki asennus, jota tarvitaan postfixin määrittämiseen, tarkastelemme tätä asennusta enemmän myöhemmin. Suorita nyt tämä asennuskoodi, ja palvelimen asentaminen ja sertifiointi kestää muutaman minuutin. Muista jälleen kerran korvata nimi, sähköposti ja verkkotunnus komentosarjassa ostamasi nimen mukaisesti.
Nyt kun palvelin on varustettu, voit siirtyä URL -osoitteeseen missä tahansa verkkoselaimessa ja tarkistaa, että palvelin käyttää HTTPS: tä. Jos ei ole, yritä odottaa vähän aikaa, ennen kuin DNS -tietueet tarttuvat ja suorita sitten seuraava komento uudelleenrrytoidaksesi CertBot -sertifikaattia:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Niin kauan kuin olet määrittänyt kaiken oikein, sinun pitäisi pystyä pääsemään Apachen oletussivulle vain tietääksesi, että koodisi toimii ja näyttää live -verkkosivut. Seuraavaksi muokkataan asetuksia.py muuttaaksesi oletusvikatilamme tuotantoon. Määritämme myös verkkotunnuksen asetuksissa sekä sisäisissä IP -laitteissa.
nano yourproject/settings.py
Asetuksissa muuta/lisää nämä viivat.
# Sivuston kokoonpano
Nyt meidän on määritettävä Apache2. Muokkaa konfigurointitiedostoa, jonka otat käyttöön tällä rivillä:
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Tässä konfigurointitiedostossa tulisi olla verkkotunnuksemme ja käyttäjän ja projektin nimi. Käytän verkkotunnusta femmebabe.com, käyttäjänimitiimiä ja projektin nimi Femmebabe.
ServerSignature Off
ServerTokens Prod
<IfModule mod_ssl.c>
<VirtualHost *:80>
Redirect permanent / https://femmebabe.com/
</VirtualHost>
<VirtualHost *:443>
ServerName femmebabe.com
ServerAdmin team@femmebabe.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
Alias /static /home/team/femmebabe/static
<Directory /home/team/femmebabe/static>
Require all granted
</Directory>
Alias /media/icons /home/team/femmebabe/media/
<Directory /home/team/femmebabe/media>
Require all granted
</Directory>
<Directory /home/team/femmebabe/femmebabe>
<Files wsgi.py>
Require all granted
</Files>
</Directory>
WSGIScriptAlias / /home/team/femmebabe/femmebabe/wsgi.py
WSGIDaemonProcess femmebabe python-path=/home/team/femmebabe/ python-home=/home/team/femmebabe/venv header-buffer-size=100000000000 user=team
WSGIProcessGroup femmebabe
WSGIApplicationGroup %{GLOBAL}
<Directory /home/team/femmebabe/static>
Options Indexes FollowSymLinks
AllowOverride All
</Directory>
<IfModule mod_rewrite.c>
RewriteEngine on
RewriteCond %{REQUEST_URI} \.(css|webp|webm|gif|png|mp3|wav|jpeg|jpg|svg|webp)$ [NC]
RewriteCond %{HTTP_REFERER} !^https://femmebabe.com/media/.*$ [NC]
RewriteRule ^(.+?)/$ /media/$1 [F,L]
</IfModule>
Include /etc/letsencrypt/options-ssl-apache.conf
SSLCertificateFile /etc/letsencrypt/live/femmebabe.com/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/femmebabe.com/privkey.pem
Header set X-Frame-Options: "SAMEORIGIN"
Header set Access-Control-Allow-Origin "https://femmebabe.com"
TimeOut 60000
LimitRequestBody 0
<FilesMatch ".(ico|pdf|flv|jpg|jpeg|png|gif|webp|JPG|JPEG|wav|mp3|mp4|public|js|css|swf|webp|svg)$">
Header set Cache-Control "max-age=30, public"
</FilesMatch>
</VirtualHost>
</IfModule>
<IfModule mod_ssl.c>
<VirtualHost *:80>
ServerName femmebabe.com
ServerAdmin team@femmebabe.com
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
RewriteEngine on
RewriteCond %{SERVER_NAME} =femmebabe.com
RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
</IfModule>
Varmista, että korvaa projektin, hakemistojen ja verkkotunnuksen nimen tässä esimerkkikoodissa, kun määrität palvelinta. Nyt meidän on poistettava oletussivusto käytöstä. Tämä voidaan tehdä bashilla.
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Seuraavaksi voimme ottaa käyttöön oletussivuston ja ladata Apache2, käyttämällä myös bashia. Muista korvata Femmebabe sen tiedoston nimellä, jonka olet ilmoittanut muokkaamalla IN/etc/apache2/sivustoja, saatavilla/.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Palaa takaisin verkkotunnuksellesi Navbarissa. Sinun pitäisi nähdä sivusto, jonka olet määrittänyt verkkoselaimessa. Onnittelut! Jos et näe sitä, saatat joutua tekemään joitain muutoksia. Tarkista huolellisesti projektisi asetukset, Apache -määritykset ja varmista, että sinulla ei ole virheitä, ja suorita seuraavat komennot tarkistaaksesi projektin virheiden varalta.
cd projectname
source venv/bin/activate
python manage.py check
Jos sinulla on virheitä Python -projektissasi, jäljitä ne missä ne ovat ja korjaa ne. Et ehkä pysty näkemään kaikkia virheitäsi riippuen siitä, missä ne ovat, joten jos sinulla on virhe, joka sanoo yksinkertaisesti "Appulaation ei ole reentrant", muokkaa seuraavaa tiedostoa virtuaaliympäristössä, Registry.py, paljastaaksesi virheen.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Vieritä riviin 83, jossa tämä ajonaikainen virhe nostetaan (nosta apertimeError ("populate () ei ole reentrant")) ja lisää kommentti ennen tätä riviä ja lisäämällä sitten samalla sisennyksellä Self.app_configs = {}. Tämä näyttää tältä:
# Estä reentrant -puhelut välttääksesi appConfig.Ready ()
# Menetelmät kahdesti.
# nosta RuntimeError ("Populate () ei ole reentrant")
Voit sitten tarkistaa projektin uudelleen ja paljastaa virheen.
python manage.py check
Sitten voit nähdä virheen ja korjata sen. Kun sinulla on se korjattu ja koodi kääntyy ilman virheitä, muista muuttaa tiedosto takaisin niin, että näyttää siltä:
# Estä reentrant -puhelut välttääksesi appConfig.Ready ()
# Menetelmät kahdesti.
# self.app_configs = {}
Edellyttäen, että palvelin on verkossa, kun teemme siihen muita muutoksia, meidän on käytettävä seuraavaa komentoa palvelimen uudelleen ladataksesi:
sudo systemctl reload apache2
Mahtava! Mutta entä postin lähettäminen? Sähköpostin lähettämisen aloittamiseksi meidän on ensin päivitettävä verkkotunnuksen kokoonpano. Tämän pitäisi olla DNS -paneelissasi Squarespacessa tai missä tahansa valitsemasi verkkotunnuksen rekisterinpitäjällä. Meidän on myös asennettava ja lisättävä kokoonpano ja suoritettava muutama komento.
Ensinnäkin, saadaan palvelimen IPv6 -osoite. Sitten avaamme DNS ja lisäämme tietueet.
Jos haluat saada palvelimen IPv6 -osoitteen, käytä tätä komentoa:
ip -6 addr
Nyt voimme lisätä seuraavat tietueet DNS -asetuksiin. Tietueeni näyttävät tältä. Tietueillesi sinun on kuitenkin korvata IP -osoite IP -osoitteella (ei 75.147.182.214, se on minun). Lisää myös verkkotunnuksesi femmebabe.com -sivuston tilalle, samoin kuin edellisellä komennolla löydetty IPv6 -osoitteesi (et voi käyttää minun, Fe80 :: 725a: FFF: FE49: 3E02). Älä ole huolissasi DomainKeysta toistaiseksi, tämä luodaan, kun asetamme postfixin, postilaitoksen, OpenKimin kanssa ja tulostamme avaimen. Määritämme tämän viimeisen.
@ @ Eräs 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 ~ Kaikki
Oletus._bimi Txt N/a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_Dmarc Txt N/a v = dmarc1; p = ei mitään
Lähdonly._Domainkey
Txt
N/a
Nyt meidän on lisättävä PostFix -tiedostoon jatkuvaa kokoonpanoa. Ainoa mitä meidän on tehtävä, on varmistaa, että korvaamme verkkotunnuksen, femmebabe.com, verkkotunnuksella, jota käytät. Tarkastellaan kaikkia konfigurointitiedostoja yksi kerrallaan ja asennetaan ne hakemistoon, nimeltään Config -projektimme, asentaaksesi käyttöjärjestelmään.
nano config/etc_postfix_main.cf
Lisää tämä teksti tiedostoon
# See /usr/share/postfix/main.cf.dist kommentoitu, täydellisempi versio
# Debian -spesifinen: Tiedostonimen määrittäminen aiheuttaa ensimmäisen
# Tiedoston rivi, jota käytetään nimellä. Debian -oletus
# on /etc /mailName.
# myorigin = /etc /mailName
# Liittyminen .domain on MUA: n työ.
# Uncomment Seuraava rivi "viivästyneiden postin" varoituksen tuottamiseksi
# viiveen_warning_time = 4h
# Katso http://www.postfix.org/compatibility_readme.html - oletusarvo 3.6
# tuoreet asennukset.
# TLS -parametrit
# Milter -kokoonpano
Seuraava kokoonpano!
nano config/etc_postfix_master.cf
Lisää nämä rivit:
#
# Postfix -pääprosessin määritystiedosto. Lisätietoja muodossa
# Tiedostosta, katso Master (5) Manuaalinen sivu (komento: "Man 5 Master" tai
# Online: http://www.postfix.org/master.5.html).
#
# Älä unohda suorittaa "PostFix Reload" tämän tiedoston muokkaamisen jälkeen.
#
# ===============================================================================================
# Palvelutyyppi yksityinen Uriv Chroot Wakeup MaxProc Command + Args
# (Kyllä) (kyllä) (ei) (ei koskaan) (100)
# ===============================================================================================
# SMTP INET N - Y - 1 PostScreen
# SMTPD PASS - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Valitse yksi: Ota käyttöön lähetys vain silmukka -asiakkaille tai mille tahansa asiakkaalle.
# 127.0.0.1:Submission inet n - y - - SMTPD
# -o syslog_name = postfix/lähetys
# -o smtpd_tls_security_level = salattu
# -o smtpd_sasl_auth_enable = kyllä
# -o smtpd_tls_auth_only = kyllä
# -o smtpd_reject_unlisted_reciPient = ei
# -o smtpd_client_restrictions = $ MUA_CLIENT_RESTICTICESS
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restrictions = lupa_sasl_authenticated, hylkääminen
# -o milter_macro_daemon_name = lähtö
# Valitse yksi: Ota SMTPS käyttöön vain silmukka -asiakkaille tai jokaiselle asiakkaalle.
# 127.0.0.1:SMTPS INET N - Y - - SMTPD
# SMTPS INET N - Y - - SMTPD
# -o syslog_name = postfix/smtps
# -o smtpd_tls_wrapperMode = kyllä
# -o smtpd_sasl_auth_enable = kyllä
# -o smtpd_reject_unlisted_reciPient = ei
# -o smtpd_client_restrictions = $ MUA_CLIENT_RESTICTICESS
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restrictions = lupa_sasl_authenticated, hylkääminen
# -o milter_macro_daemon_name = lähtö
# 628 INET N - Y - - QMQPD
# QMGR UNIX N - N 300 1 OQMGR
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
#
# ==============================================================================
# Rajapinnat ei-postfix-ohjelmistoon. Muista tutkia käsikirja
# Ei-PostFix-ohjelmiston sivut selvittääksesi mitä vaihtoehtoja se haluaa.
#
# Monet seuraavista palveluista käyttävät Postfix -putkea (8) toimitus
# agentti. Katso putken (8) Man -sivu tietoa $ {vastaanottajasta}
# ja muut viestin kirjekuoren vaihtoehdot.
# ==============================================================================
#
# MailDrop. Katso lisätietoja PostFix MailDrop_Readme -tiedostosta.
# Määritä myös main.cf: maildrop_destination_recipient_limit = 1
#
#
# ==============================================================================
#
# Viimeaikaiset Cyrus -versiot voivat käyttää olemassa olevaa "LMTP" Master.CF -merkintää.
#
# Määritä cyrus.conf:
# lmtp cmd = "lmtpd -a" kuuntele = "localhost: lmtp" proto = tcp4
#
# Määritä Main.cf: ssä yksi tai useampi seuraavista:
# postilaatikko_transport = lmtp: inet: localhost
# Virtual_transport = lmtp: inet: localhost
#
# ==============================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Määritä myös main.cf: cyrus_destination_recipient_limit = 1
#
# Cyrus unix - n n - - putki
# liput = drx käyttäjä = cyrus argv =/cyrus/bin/toimitus -e -r $ {lähettäjä} -m $ {Extension} $ {käyttäjä}
#
# ==============================================================================
# Vanha esimerkki toimituksesta Cyruksen kautta.
#
# Old -Cyrus Unix - n n - - putki
# liput = r käyttäjä = cyrus argv =/cyrus/bin/toimitus -e -m $ {laajennus} $ {käyttäjä}
#
# ==============================================================================
#
# Katso PostFix UUCP_ReadMe -tiedosto määritystiedot.
#
#
# Muut ulkoiset toimitusmenetelmät.
#
Ja OpenKim -kokoonpano. OpenKim tunnistaa sähköpostipalvelimet verkkotunnusnäppäimillä, jotta ne olisivat turvallisempia. Ilman sitä postia ei allekirjoitettu eikä ehkä pääse postilaatikkoon.
nano config/etc_default_opendkim
Lisää nämä rivit:
# Huomaa: Tämä on vanha kokoonpanotiedosto. OpenKim ei käytä sitä
# Järjestelmäpalvelu. Käytä vastaavia määritysparametreja
# /etc/opendKim.conf sen sijaan.
#
# Aikaisemmin on muokata oletusasetuksia täällä ja suorita sitten
# /lib/opendkim/opendkim.service.generse systemD -ohitustiedostojen luomiseksi osoitteessa
# /etc/systemd/system/opendkim.service.d/override.conf ja
# /etc/tmpfiles.d/opendKim.conf. Vaikka tämä on edelleen mahdollista, se on nyt
# Suositellaan asetusten säätämiseen suoraan /etc/opendkim.conf.
#
# Demon_opts = ""
# Vaihda/Var/Spool/Postfix/Run/OpenKim käyttämään UNIX -pistorasiaa
# Postfix chrootissa:
# Rundir =/var/spool/postfix/run/opendkim
#
# Uncommentti vaihtoehtoisen pistorasian määrittämiseksi
# Huomaa, että tämän asettaminen ohittaa kaikki pistorasian arvot OpenKim.confissa
# Oletus:
# Kuuntele kaikki portin 54321 rajapinnat:
# Pistorasia = INET: 54321
# Kuuntele Loopbackilla portissa 12345:
# Pistorasia = INET: 12345@localhost
# Kuuntele 192.0.2.1 satamassa 12345:
# Socket = INET: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
Lisää nämä rivit:
# oletus_process_limit = 100
# Default_client_limit = 1000
# Oletusarvo VSZ (virtuaalimuistin koko) -raja palveluprosesseille. Tämä on pääasiassa
# tarkoitettu saamaan ja tappamaan prosessit, jotka vuotavat muistia ennen kuin he syövät
# kaikki.
# Default_vsz_limit = 256m
# Kirjautumisprosessit käyttävät sisäänkirjautumiskäyttäjää sisäisesti. Tämä on epäluotettavin
# käyttäjä DoveCot -järjestelmässä. Sillä ei pitäisi olla pääsyä mihinkään.
# Default_login_user = Dovenull
# Sisäistä käyttäjää käyttävät epäilyttämättömät prosessit. Sen pitäisi olla erillinen
# Kirjaudu sisään käyttäjä, jotta kirjautumisprosessit eivät voi häiritä muita prosesseja.
# Default_internal_user = dovecot
# Portti = 143
# portti = 993
# ssl = kyllä
# Käsitettävissä olevien yhteyksien lukumäärä ennen uuden prosessin aloittamista. Tyypillisesti
# Ainoat hyödylliset arvot ovat 0 (rajoittamaton) tai 1. 1 on turvallisempi, mutta 0
# on nopeampi. <doc/wiki/loginprocess.txt>
# Service_count = 1
# Prosessien lukumäärä, jotka aina odottavat lisää yhteyksiä.
# Process_min_avail = 0
# Jos asetat Service_count = 0, sinun on todennäköisesti kasvatettava tämä.
# vsz_limit = $ oletus_vsz_limit
# Portti = 110
# portti = 995
# ssl = kyllä
# portti = 587
# Luo INET -kuuntelija vain, jos et voi käyttää yllä olevaa UNIX -pistorasiaa
# inet_listener lmtp {
# Vältä LMTP: n näkyvää koko Internetissä
# osoite =
# portti =
# }
# Suurin osa muistista menee mmap () -tiedostoihin. Saatat joutua lisäämään tätä
# Rajoita, jos sinulla on valtavia postilaatikoita.
# vsz_limit = $ oletus_vsz_limit
# Enintään IMAP -prosessien lukumäärä (yhteydet)
# Process_limit = 1024
# Enintään POP3 -prosessien lukumäärä (yhteydet)
# Process_limit = 1024
# Enintään SMTP -lähetysprosessien lukumäärä (yhteydet)
# Process_limit = 1024
# Auth_Socket_Path osoittaa tähän käyttäjänDB -pistorasiaan oletuksena. Se on tyypillisesti
# käyttävät dovecot-lda, doveadm, mahdollisesti IMAP-prosessi jne.
# Täydelliset käyttöoikeudet tähän pistorasiaan voivat saada luettelon kaikista käyttäjänimistä ja
# Hanki kaikkien käyttäjät -hakujen tulokset.
#
# Oletusarvo 0666 -tila antaa kenelle tahansa muodostaa yhteyden pistorasiaan, mutta
# UserDB -hakut onnistuvat vain, jos UserDB palauttaa "UID" -kentän, joka
# vastaa soittajan prosessin UID: tä. Myös jos soittajan UID- tai GID vastaa
# pistorasian uid tai gid haku onnistuu. Kaikki muu aiheuttaa epäonnistumisen.
#
# Aseta moodi
# jotain muuta kuin 0666 ja Dovecot antaa ytimen valvoa
# käyttöoikeudet (esim. 0777 sallii kaikkien täyden käyttöoikeuden).
# Auth -työntekijän prosessi suoritetaan oletuksena juurina, jotta se voi käyttää
# /etc/varjo. Jos tätä ei tarvita, käyttäjää tulisi muuttaa
# $ Default_internal_user.
# Käyttäjä = juuri
# Jos DICT -välityspalvelinta käytetään, postiprosesseilla tulisi olla pääsy pistorasiaan.
# Esimerkiksi: mode = 0660, ryhmä = vmail ja globaali mail_access_groups = vmail
# tila = 0600
# käyttäjä =
# ryhmä =
Muista jälleen kerran korvata verkkotunnus kaikissa näissä tiedostoissa, femmebabe.com valitsemasi verkkotunnuksella. Muokkaa seuraavaa tiedostoa, Dovecotin kokoonpano,
nano config/etc_dovecot_dovecot
Ja lisää nämä viivat
## Dovecot -määritystiedosto
# Jos sinulla on kiire, katso http://wiki2.dovecot.org/quickconfiguration
# "Doveconf -n" -komento antaa puhtaan tulosteen muutetuista asetuksista. Käyttää sitä
# Tiedostojen kopioinnin ja liittämisen sijasta lähetettäessä Dovecot -postituslistalle.
# '# 'Lahmo ja kaikkea sitä sen jälkeen, kun sitä kohdellaan kommentteina. Ylimääräiset tilat
# ja välilehdet jätetään huomiotta. Jos haluat käyttää kumpaakaan näistä nimenomaisesti, laita
# value inside quotes, eg.: key = "# char ja treading välilehde "
# Useimmat (mutta eivät kaikki) asetukset voivat ohittaa eri protokollat ja/tai
# Lähde/kohde IPS sijoittamalla asetukset esimerkiksi:
# Protocol IMAP {}, paikallinen 127.0.0.1 {}, Remote 10.0.0.0/8 {}
# Jokaiselle asetukselle esitetään oletusarvot, sitä ei vaadita sopimukseen
# ne. Nämä ovat kuitenkin poikkeuksia tähän: ei osia (esim. Nimitila {})
# tai plugin -asetukset lisätään oletusarvoisesti, ne on lueteltu vain esimerkkinä.
# Polut ovat myös vain esimerkkejä siitä, että todelliset oletusarvot perustuvat konfigurointiin
# vaihtoehdot. Tässä luetellut polut ovat konfigurointiin -prefix =/usr
# -SYSCONFDIR =/jne.
# Ota asennetut protokollat käyttöön
# Pilkku erotettu luettelo IPS: stä tai isännistä, missä kuunnella yhteyksiä.
# "*" kuuntelee kaikkia IPv4 -rajapintoja, "::" kuuntelee kaikkia IPv6 -rajapintoja.
# Jos haluat määrittää ei-default-portit tai jotain monimutkaisempaa,
# Muokkaa conf.d/master.conf.
# kuuntele = *, ::
# Perushakemisto, johon ajonaikaiset tiedot tallennetaan.
# base_dir =/var/run/dovecot/
# Tämän ilmentymän nimi. Moni-instance-asennuksessa Doveadm ja muut komennot
# voi käyttää -i <instance_name> valitaksesi mitä ilmentymiä käytetään (vaihtoehto
# to -c <config_path>). Esimerkin nimi lisätään myös dovecot -prosesseihin
# PS -lähtö.
# ilmentymä_nimi = dovecot
# Tervehdysviesti asiakkaille.
# login_greeting = dovecot valmis.
# Avaruuserottunut luettelo luotettavista verkkoalueista. Näistä yhteydet
# IP: t saavat ohittaa heidän IP -osoitteensa ja portit (kirjautumiseen ja
# todennustarkastukset). Myös
# Nämä verkot. Tyypillisesti määrität IMAP -välityspalvelimen palvelimet täällä.
# login_trusted_networks =
# Avaruuserottunut luettelo kirjautumiskäyttötarkastuslippuista (esim. TCPWRAP)
# login_access_sockets =
# Välityspalvelimen kanssa
# välitys. Tämä ei ole välttämätöntä normaalisti, mutta se voi olla hyödyllinen, jos kohde
# IP on esim. kuormituksen tasapainottajan IP.
# auth_proxy_self =
# Näytä lisää verbose -prosessinimikkeitä (PS). Näyttää tällä hetkellä käyttäjänimi ja
# IP -osoite. Hyödyllinen nähdäksesi kuka todella käyttää IMAP -prosesseja
# (esim. Jaetut postilaatikot tai jos samaa UID: tä käytetään useisiin tileihin).
# verbose_proctitle = ei
# Pitäisikö kaikki prosessit tapeta, kun Dovecot Master -prosessi sammuu.
# Tämän asettaminen "ei" tarkoittaa, että dovecot voidaan päivittää ilman
# pakottaa olemassa olevat asiakasyhteydet sulkemaan (vaikka se voi olla myös
# Ongelma, jos päivitys on esim. turvallisuuskorjauksen takia).
# sammutus_Clients = kyllä
# Jos nolla ei ole, suorita postikomennot tämän monien yhteyksien kautta Doveadm-palvelimeen,
# sen sijaan, että suoritettaisiin suoraan samassa prosessissa.
# doveadm_worker_count = 0
# UNIX -pistorasia tai isäntä: Portti, jota käytetään yhdistämiseen Doveadm -palvelimeen
# doveadm_socket_path = doveadm-server
# Avaruuserottunut luettelo ympäristömuuttujista, jotka säilyvät dovecotissa
# Käynnistys ja siirretty kaikkiin lapsensa prosesseihin. Voit myös antaa
# avain = arvoparit aina määrittämään tiettyjä asetuksia.
# tuonti
##
## Sanakirjapalvelimen asetukset
##
# Sanakirjaa voidaan käyttää avaimen = arvoluetteloiden tallentamiseen. Tätä käyttävät useat
# laajennukset. Sanakirjaan pääsee joko suoraan tai vaikka a
# Sanakirjapalvelin. Seuraavat Dict Block -karttojen sanakirjojen nimet URI: lle
# Kun palvelinta käytetään. Näihin voidaan sitten viitata URI: n avulla muodossa
# "Välityspalvelin :: <Nimi>".
# kiintiö = mysql: /etc/dovecot/dovecot-dect-sql.conf.ext
# Suurin osa todellisesta kokoonpanosta sisältyy alla. Tiedostonimet ovat
# ensin lajiteltu heidän ASCII -arvonsa mukaan ja jäsennetty tässä järjestyksessä. 00-Prefixes
# Tiedostonimissä on tarkoitus helpottaa tilauksen ymmärtämistä.
# Konfigurointitiedosto voidaan myös yrittää sisällyttää antamatta virhettä, jos
# Sitä ei löydy:
# Mahdollistaa Dovecot kuunnella kaikkia syöttöyhteyksiä (IPv4 / IPv6)
Lisää salasana DoveCot -käyttäjälle:
nano config/etc_dovecot_passwd
Tiedoston ensimmäinen osa ennen paksusuolia on käyttäjänimi. Viimeinen osa "Yourpassword" tarkoittaa salasanaa, jonka haluat antaa postilaitteesi.
team:{plain}yourpassword
Seuraavaksi OpenKim -konfigurointi
nano config/etc_opendkim.conf
Ja lisää nämä viivat:
# Tämä on peruskokoonpano allekirjoittamiseen ja todentamiseen. Se voi helposti olla
# Mukautettu sopimaan perusasennukseen. Katso OpenKim.conf (5) ja
# /usr/share/doc/opendkim/examples/opendkim.conf.sample for Complete
# Käytettävissä olevien määritysparametrien dokumentointi.
# Loki, ei
# Yleiset allekirjoitus- ja todentamisparametrit. Debianissa "From" -otsikko on
# Ylimiehet, koska se on usein mainejärjestelmien käyttämä henkilöllisyys avain
# ja siten jonkin verran turvallisuusherkkä.
# Verkkotunnuksen, valitsin ja avaimen allekirjoittaminen (vaaditaan). Suorita esimerkiksi allekirjoittaminen
# Verkkotunnukselle "Esimerkki.com" valitsemalla "2020" (2020._domainkey.example.com),
# käyttämällä yksityistä avainta tallennettuna /etc/dkimkeys/example.private. Rakeinen
# Asennusvaihtoehdot löytyvät osoitteesta /usr/share/doc/opendkim/readme.opendkim.
# Verkkotunnus esimerkki.com
# Valitsija 2020
# KeyFile /etc/dkimkeys/example.private
# Debianissa OpenKim toimii käyttäjän "OpenKim". 007: n umaskki vaaditaan, kun
# Käyttämällä paikallista pistorasiaa MTA: lla, joka käyttää pistorasiaa ei-etuna olevina
# käyttäjä (esimerkiksi PostFix). Saatat joutua lisäämään käyttäjän "postfix" ryhmään
# "OpenKim" siinä tapauksessa.
# MTA -yhteyden pistorasia (vaaditaan). Jos MTA on Chroot -vankilassa,
# On varmistettava, että pistorasia on saatavilla. Debianissa Postfix juoksee sisään
# siksi chroot in/var/spool/postfix, siksi unix -pistorasian olisi oltava
# Konfiguroitu alla olevalla rivillä näkyy.
# Pistorasia paikallinen: /run/opendkim/opendkim.sock
# Socket INET: 8891@localhost
# Pistorasia INET: 8891
# Isännät, joille on allekirjoitettava tarkistamisen sijaan, oletus on 127,0.0.1. Nähdä
# OpenKimin (8) toiminta -osa saadaksesi lisätietoja.
# Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Luottamusankkuri mahdollistaa DNSSEC: n. Debianissa rahastoankkuritiedosto toimitetaan
# paketin mukaan dns-root-data.
# Nimikevers 127.0.0.1
# Kartta -verkkotunnukset osoitteista näppäimiin, joita käytetään viestien allekirjoittamiseen
# Joukko sisäisiä isäntiä, joiden posti tulisi allekirjoittaa
nano config/etc_default_opendkim
Ja lisää nämä viivat
# Huomaa: Tämä on vanha kokoonpanotiedosto. OpenKim ei käytä sitä
# Järjestelmäpalvelu. Käytä vastaavia määritysparametreja
# /etc/opendKim.conf sen sijaan.
#
# Aikaisemmin on muokata oletusasetuksia täällä ja suorita sitten
# /lib/opendkim/opendkim.service.generse systemD -ohitustiedostojen luomiseksi osoitteessa
# /etc/systemd/system/opendkim.service.d/override.conf ja
# /etc/tmpfiles.d/opendKim.conf. Vaikka tämä on edelleen mahdollista, se on nyt
# Suositellaan asetusten säätämiseen suoraan /etc/opendkim.conf.
#
# Demon_opts = ""
# Vaihda/Var/Spool/Postfix/Run/OpenKim käyttämään UNIX -pistorasiaa
# Postfix chrootissa:
# Rundir =/var/spool/postfix/run/opendkim
#
# Uncommentti vaihtoehtoisen pistorasian määrittämiseksi
# Huomaa, että tämän asettaminen ohittaa kaikki pistorasian arvot OpenKim.confissa
# Oletus:
# Kuuntele kaikki portin 54321 rajapinnat:
# Pistorasia = INET: 54321
# Kuuntele Loopbackilla portissa 12345:
# Pistorasia = INET: 12345@localhost
# Kuuntele 192.0.2.1 satamassa 12345:
# Socket = INET: 12345@192.0.2.1
Kun olemme valmiita määrittämään Postfix -palvelimen, suoritamme alla olevan koodin sopivan verkkotunnuksen nimillä. Aloita luomalla käsikirjoitus
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Nyt Nanossa, tekstieditori, muokkaa tätä tiedostoa, joten se sisältää verkkotunnuksesi femmebabe.com -sivuston sijasta.
# !/Bin/bash
# Asennus postfix
Suorita nyt valmis skripti määrittääksesi Postfix, OpenKim ja DoveCot.
./scripts/postfixsetup
Kun tämä skripti on suoritettu, kopioi viimeinen rivi, jonka se tulostaa ja liitä se DNS -kokoonpanoosi, arvona lähetyksen._Domainkey. Tämä on OpenKim -avain, jota käytetään verkkotunnuksesi tunnistamiseen, kun lähetetään suojattua postia.
Mahtava! Muutamassa päivässä sinun pitäisi pystyä lähettämään postia palvelimelta, jos kaikki on määritetty oikein.
Jos olet juuri määrittänyt postipalvelimen DNS, tietueiden päivittäminen kestää alle 72 tuntia. Se on yleensä paljon nopeampaa. Voit tarkistaa, toimiiko palvelimesi käyttämällä tätä komentoa, toimittamalla sähköpostiosoitteesi:
echo "test" | mail -s "Test Email" youremail@gmail.com
Jos kaikki näyttää toimivan oikein, sinun pitäisi pystyä lähettämään sähköpostia palvelimen kanssa. Jos se ei toimi, yritä katsoa lokit nähdäksesi, mikä virhe voi olla.
tail –lines 150 /var/log/mail.log
Tämä tarjoaa verbose -tietoja palvelimen lähettämistä postista ja toimiiko se oikein. Sinun pitäisi pystyä näkemään sähköpostia myös postilaatikossa, jos sitä ei ole siellä, tarkista roskapostikansio.
Sinun on myös määritettävä asetukset asetusten.py -asetuksesi, jotta sähköpostipalvelimesi voi puhua Django -sovelluksesi, projektin kanssa. Lisää tai korvaa nämä rivit asetuksissasi
EMAIL_HOST_USER = 'team' # 'Love@mamasheen.com'
Huomaa, että käytämme konfigurointitiedostoa salasanan saamiseksi. Ladataan tämä tiedosto asetuksissa, kuten tiedoston alussa.:
# Avaa ja lataa kokoonpano
Luodaan tämä tiedosto ja lisätään siihen salainen avain sekä post -salasana. Voit luoda salaisen avaimen käyttämällä tätä komentoa millä tahansa pituudella, jonka haluat lopussa:
openssl rand -base64 64
Kopioi nyt tekstin, jonka OpenSSL luodaan ja edit /etc/config.json
sudo nano /etc/config.json
Lisää seuraavat rivit tiedostoosi avaimella, joka OpenSSL luodaan salaisena avaimena.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
JSON -muoto on yksinkertainen ja helppo käyttää, voimme julistaa myös muut avaimet, joita haluamme käyttää projektissamme tällä tavalla, ja pitää ne erillään projektihakemistostamme, jotta muut käyttäjät eivät voi kirjoittaa heille, joten niitä ei voida lukea pelkästään projektihakemistostamme. Tätä on suositeltavaa käytäntöä API -avaimille, joista käytämme täällä enemmän kuin muutama.
Haluat myös varmuuskopioida projektisi varmistaaksesi, että kaikki on tallennettu, ja voit palauttaa työsi myöhemmin, vaikka et enää halua vuokrata palvelinta.
sudo backup
Kokeile nyt lähettää HTML -sähköpostia verkkopalvelimelta, mikäli lähettäminen komentoriviltä toimii. Kysyt käyttäjä -ilmentymään kuoressa ja lähetä HTML -sähköposti kyseiselle käyttäjälle Djangon kautta. Vaihda nimeni koodissa, Charlotte, käyttäjätunnuksesi.
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()
Jos ensimmäinen komento ei toimi, muista käyttää
source venv/bin/activate
Edellyttäen, että kaikki on asetettu oikein, saat nyt Web -sovelluksesi lähettämän postilaatikon tervetuliais -sähköpostin. Hyvä työ! Olet edennyt pitkälle.
Halusin lisätä, että jos kamppailet koskaan virheitä, kun työskentelet tällaisen projektin parissa, älä epäröi etsiä vastauksia ja pyytää apua. Google on muun muassa hakukoneiden joukossa hienoja resursseja ohjelmointiaan etsimiseen. Etsi vain saamasi virhe, ja näet kuinka muut ihmiset ratkaisevat ongelman. Lisäksi olet tervetullut ottamaan minuun yhteyttä, opettajasi (opettajat, professorit, tutorit), kaikki Internet -ikätoverit, jotka ovat käytettävissä ohjelmointiapua varten, tai ota yhteyttä tähän kirjaan uudelleen tai muita resursseja löytääksesi ratkaisuja kokemasi aiheisiin. Ymmärrän, että tämä ei ole helppoa, mutta vaikka olet lukenut tästä pitkälle etkä kirjoita koodia, opit paljon verkkosovelluksen rakentamisesta tyhjästä. Patt itseäsi takaosaan, teet hienoa työtä.
Kiitos, että käytit aikaa tämän kolmannen painos web -kehitysoppaan lukemiseen. Tuleviin painoksiin sisällytän enemmän tärkeitä esimerkkejä, joita käsitellään asiakirjan alussa ja sukeltamme paljon syvemmälle ohjelmistojen ja laitteistojen kehityksen maailmaan. Pysy ajan tasalla siitä, mitä on tulossa, ja odotan innolla opettavan sinulle uskomattoman ohjelmiston rakentamista. Nähdään seuraavassa painoksessa!
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
.par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
.par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
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.
par Daisy / Voir | Acheter | Acheter avec la crypto-monnaie
https://glamgirlx.com
https://glamgirlx.com -
Laissez-moi un pourboire en Bitcoin en utilisant cette adresse: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE