Praktično spletno učenje in varnost po zgledu Tretja izdaja Charlotte Harper 3. julij 2024 Posodobljeno/pretvorjeno 3. junija 2025
Predgovor:
Varnostni vidiki pri gradnji programske opreme za splet so pomemben del katerega koli načrta in izvedbe spletnega razvijalca, hkrati pa inženiring prototip, ki je zanesljiv, stabilen in uporaben za praktične namene. DOM (Oznaka objekta dokumenta) z izvajanjem HTML, JavaScript in CSS ter zaledje programske opreme, ki izvaja Python, C/C ++, Java in Bash Če želite ubiti čas ali nekaj narediti na internetu, običajno na napravi pametnih telefonov na dotik. Večina ljudi sploh ne bi vedela, kje začeti, ko želijo zgraditi spletno mesto iz nič, ponavadi bi se začeli na spletnem mestu druge osebe in zgradili nekaj omejenega v funkcionalnosti, zanesljivosti, enostavnosti uporabe in zlasti ustvarjalnosti, ko bi lahko imeli na voljo vsa najnovejša močna orodja, da bi si ustvarili nekaj koristnega, ne da bi zapravili čas, ki je prikazal, da je mogoče, da bi se pri tem, da bi se lahko uporabljali, da bi se zbrali, da bi se pripravili na program, ki so jih imeli na voljo. Če imate nekaj minut, da preberete to knjigo in se naučite, česa vas želim naučiti, ali celo osebno govorite o svojih ciljih in dobite nekaj napotkov v pravo smer in ste motivirani, da se naučite kodirati in pišete svojo programsko opremo, to knjigo odnesite domov in namenite nekaj časa, da se naučite graditi naslednje, močne, racionalizirane in pomembne spletne aplikacije, ki je točno in na srečo.
O meni: Sem razvijalec programske opreme, ki ima široko paleto izkušenj v C/C ++, Java, Python, HTML, CSS in JavaScript. Zgradim spletna mesta, ki jih ljudje želijo uporabljati, želijo obiskati in se celo zasvojijo z uporabo samo za učenje, poustvarjanje in ubijanje časa, in kar je najpomembneje, prodajam programsko opremo. Če ste imeli idejo, kako natančno želite, da bi spletno mesto izgledalo in delovalo, ste bili pripravljeni podpreti, da lahko izpolnjujem lastne potrebe, medtem ko se srečujem z vašimi, in sami ste pripravljeni pokriti stroške vodenja spletnega mesta, bi vam sestavil naslednji YouTube, Tiktok, Twitter, Google ali celo visokotehnično varnostno aplikacijo, ki jo lahko dostopate. Namesto da bi vam poskušal prodati svoj čas, poskušam kupiti vaš: želim vas govoriti, da boste sami izdelali aplikacijo (spletno mesto) z informacijami, ki že obstajajo, in naučiti vas, kaj morate biti neodvisni razvijalec programske opreme, podjetnik, ki vodi uspešno kariero na katerem koli področju. In naj bom jasen, izobrazba, ki vam jo dam, bo neformalna. Lahko bi šli v šolo in se tega naučili s formalno izobrazbo ali celo prebrali to knjigo v šoli, izpolnili svoje naloge in odvzeli veliko svojega izobraževanja, vendar vas uradno ne bom postavil na vroč sedež in vas prosil za dokončanje nalog. Nisem tvoj profesor, lahko me mislite kot na prijatelja, ki vas želi usmeriti v kariero, ki jo vodi vaš osebni uspeh. In tudi vam ne prodajam uspeha, morali ga boste kupiti s svojim časom. Učenje kodiranja ima strmo krivuljo učenja in nikoli ni bilo enostavno ali bi moralo biti. Delati morate čim bolj trdo in še naprej poskusiti in poskusiti in poskusiti znova, tudi ko ste frustrirani, da se sami naučite in gradite aplikacije. To je v naravi same kode. Kodo vodi prevajalnik, ki je zasnovan tako, da daje sporočila o napaki programerja, in ta vas bodo naučili, kako kodirati, tudi če napako preprosto kopirate v iskalnik in berete primere drugih ljudi. In moram reči, da vam ni treba biti izjemno bogat, pameten, uspešen ali celo podrobno usmerjen ali organiziran za izgradnjo aplikacije. Računalnik skrbi za to organizacijo za vas. Morate samo vztrajati skozi preizkus in napake, ohraniti osredotočenost in trdo delati pri tem, kar počnete, in imeli boste zelo uspešno kariero v celoti tega, kar počnete.
Kdo sem: Zavedam se, da je bil zadnji odsek bolj o učenju in vaši poti iz te knjige. Kdo sem točno? To je zapleteno vprašanje. Sama mi ni jasna, saj trpim zaradi zdravstvenih stanj, ki mi lahko otežujejo celo kodiranje ali pisanje te knjige na trenutke, hkrati pa predstavljam izzive z vprašanji socializacije in identitete, ki otežujejo življenje, ko gre za uvajanje sebe. Skratka, če berete to knjigo, ste jo prinesli domov, ker ste jo prelistali in mislili, da je koristno, ali celo, če ste pravkar prebrali tako daleč, sem vam podobno misleč posameznik, ki želi videti, da vam uspe v vsem, kar počnete. Sam sem inženir, razvijalec programske opreme in študent in pišem to knjigo za druge študente, ki želijo olajšati življenje, tako da imajo priročnik o programski opremi, ki jo potrebujejo olajšati življenje, tako da dajejo primere, da se skupaj kopirajo kot velika uganka v delovno, uporabno, veliko, funkcionalno, kohezivno in vključevanje uspeha, ki lahko vodi uspeh, ki lahko vodijo uspeh. V glavnem to počnem: gradim aplikacije, da pomagam sebi in drugim ljudem. Tudi jaz sem avtor, čeprav je to moja prva publikacija, ki jo nameravam dokončati, da bi svoj portfelj sestavil v uporaben dokument, in tudi jaz sem umetnik. To vam bom priznal, nekako sem čudna oseba. Nisem popoln, vodil sem se z zakonom, ki me celo vodi, da zapustim šole in univerze in zapustim države, da bi si z več uspeha poskušal narediti ime zase. Po rojstvu sem ženska, nosim ličila, fotografiram sebe, nosim obleke in druga ženska oblačila in po naravi se zavedam sebe kot samice. V preteklosti sem imel težave z drugimi ljudmi, ki vodijo do boja s pisanjem in gradnjo WebApps -a, in opravičujem se, da te knjige nisem mogel prej dobiti v vaših rokah: to ste potrebovali. Želeli boste brati in pisati kodo, ki je videti kot moja in deluje kot moja, in počne isto, še bolje pa, ker če si lahko privoščite, da kupite to knjigo, namesto da bi s tipkovnico zarezali kot jaz, da ustvarite knjigo, ki zahteva denar za to, imate vire, ki jih potrebujete za uspeh v življenju. Imela sem najrazličnejše težave z odraščanjem družine, zdravstvenimi stanji, zdravniki, mediji in zakonom, moja koda pa globoko odraža boj, ki je feminizem in ženska narava v razdeljenem in frustriranem svetu. Vendar je ta knjiga nekaj, kar me globoko zanima, moj otrok, portfelj in preživetje, zato cenim vaš premislek, ko besedilo odnesete domov in ga previdno poglejte, da se lahko naučim od mene. Upoštevajte, da nisem popoln, ta knjiga bo imela napake, revizije in nove izdaje, in s svojimi logičnimi možgani boste morali razmišljati, kolikor je mogoče, da boste imeli uspešno izkušnjo z mojim pisanjem. Prav tako razumejte, da dobro mislim za vas, tudi ko se med pisanjem soočate z izzivi. Razmislite o tem tako: ko lahko samo najamete računalniški sistem, da naredite vse, kar si lahko predstavljate v digitalnem prostoru, shranite vse informacije, s katerimi se srečujete, analizirate in organizirate, in jih razumete, boste neizogibno naleteli na težave z informacijami, ki jih zaužijete in celo objavljate. To vam povem, ker naletim na enake težave. Use this book at your own risk, work with your community and communities available to you to build software within a safe setting, and don't take things to personally when you fail or even succeed in the wrong way: That's how I got this far, and why I can bring you this text and help you succeed without diverging off on a path of madness that leaves me ruined, torn and frayed while I encounter the ordinary problems everyone does on a global scale thanks to the paralellistic global scale of the network on ki bomo delali, internet. Morda niste zelo seznanjeni s samo nekaj besedami, vendar vas spodbujam, da berete naprej, spoznali me boste, ko me boste še naprej brali in razumeli, ko gradite svoje projekte, da dokončate svoje delo. S to knjigo ne bo domače naloge, če vam profesorji ali učitelji ne dodelijo nobenega, vendar vas močno spodbujam, da sami sestavite portfelj projektov, ko berete, pa tudi projekt Capstone, ki prikazuje, kako lahko uporabite, kar ste se naučili. Moj projekt Capstone je osnova za večino tega, kar boste prebrali v tej knjigi, saj vključuje kodo iz mojih prejšnjih projektov, kodo, ki sem jo ustvaril in se naučil pisati ročno, in široko paleto idej in nasvetov, ki so mi pomagali, da uspem, ko lahko v celoti prikličem aplikacijo, ki je v celoti predstavljena in se vam zdi, da je vaš prijatelj ali družine, ki bi jih lahko oglaševali.
Kaj je ta knjiga: Ta knjiga je vadnica po zgledu. You can find code here, instructions for how to learn to code, information on debugging code and fixing errors, troubleshooting steps, instructions on how to back up and save your code, re-deploy if anyone breaks your code, secure your code, deploy your code, build interactive websites that are entertaining, engaging, and addictive, and you will get a sense of who I am, why this is important, and how to portray yourself, your app and company image, as well as the software Zgradite v absolutno najboljšo luč, da boste čim bolj privlačni za svoje končne uporabnike, obiskovalce vašega spletnega mesta. V tej knjigi bom prikazal številne primere oblikovanja programske opreme s poudarkom na spletu kot platformi in varnosti. Učno izkušnjo bomo začeli z gradnjo osnovnega projekta z uporabo lupine Unix z varnostnimi in skriptnimi funkcijami. Nato bomo preučili osnovno spletno mesto na spletnem dnevniku, nadgradili naš blog s fotografijami in video funkcijami, te funkcije pa uporabili za uporabo varnostnih rešitev z uporabo brezplačne programske opreme in zaščitili naš strežnik s pomočjo vtičnega modula za preverjanje pristnosti (PAM). Nato bomo med drugimi koncepti pregledali ravnanje s datotekami in obdelavo, raziskovali urejanje videov, glasovno donacijo, skeniranje črtne kode in optično prepoznavanje znakov. Na poti bomo preučili API -je, ki nam bodo pomagali, da bo naša programska oprema bolj uporabna in varna, z brezplačnimi in plačanimi možnostmi. Na poti bomo raziskovali fizično varnost in militantna orodja, kot so oblikovanje in proizvodnja strelnega orožja in streliva, vključno z oblikovanjem sodov in ponavljalnikov, oblikovanjem turret in brezpilotnih letal ter drugimi ravnatelji, ki jih bomo vključili v našo programsko opremo na obstoječi omrežju, da bi zaščitili našo programsko opremo in pokazali samoobrambo in razsiljevanje. Na poti se bomo odpravili na gradnjo iger, 2D in 3D motorjev za upodabljanje in sodelovali z vgrajeno strojno opremo v primerih študije primera osnovne dimenzijske programske opreme za upodabljanje in elektronskega vibrirajočega masažerja, ki ga vlijejo v silikonsko gumo. Ob poti bomo uporabili tudi rešitve za strojno učenje, ki so že na voljo, da bi bolje zagotovili svojo programsko opremo. Za racionalizacijo in zagotovitev postopka bomo uporabili tudi zalog orodja, ki so na voljo za splet. Ta knjiga je vodnik za vaš uspeh pri izdelavi spletne aplikacije in vključevanjem s profesionalno mrežo računalnikov in vgrajenih mehanskih sistemov ter na splošno vodnik za gradnjo programske opreme in vgrajene strojne opreme brez osnovnega znanja ali prejšnjih izkušenj.
Kaj ta knjiga ni: Če resnično želite imeti spletno mesto, lahko samo nastavite preprosto trgovino in prodate tisto, kar potrebujete, objavite blog, objavite fotografije ali videoposnetke ali kako drugače, ne da bi kdaj napisali eno samo vrstico kode. Ta knjiga ni to. Ta knjiga vas bo naučila, kako zgraditi programsko opremo, ki je bolj uporabna, v celoti predstavljena, funkcionalna in varna kot katera koli programska oprema, ki jo že najdete, saj namešča najnovejšo programsko opremo, ki je še vedno prototipa, morda je draga za izvajanje v obsegu, v katerem bodo starejša podjetja delovala, in ne privlači za nazaj, zbrana podjetja, ki so postavljena za ljudi, ki v resnici ne delajo ničesar. Če natančno sledite tej knjigi, boste želeli napisati kodo, raziskovalno kodo, sestaviti svoje aplikacije in zaslužili boste od tega, kar počnete. Denar bom zaslužil iz te knjige, tudi v zgodnjih fazah, ker vsebuje informacije, ki jih ljudje potrebujejo in želijo brati, in že kupujejo, ko kupujejo ali uporabljajo moje aplikacije. Ta knjiga ne bo zgradila aplikacije za vas, vendar vas bo usmerila v pravo smer in vas oborožila z orodji, ki jih potrebujete, in spretnosti in nasvetov, ki bodo olajšali vaš uspeh pri gradnji programske opreme za splet, z vsako vrstico kode, ki jo boste morali napisati kot primer, pripravljeni, da vas združijo v programsko opremo, ki jo želite, in jih želite podpirati.
Kaj se boste naučili: Ta knjiga vas bo naučila, kako graditi in prodati programsko opremo, resnično funkcionalno, uporabno programsko opremo, medijsko snemanje, varnostne funkcije, kot so prepoznavanje obraza, skeniranje črtne kode za berljivo cono, spletni API -ji za overjanje, snemanje in upodabljanje videoposnetkov in fotografij ter izmenjavo sporočil, kot sta Bluetooth in blizu polja (NFC). Ta knjiga vas bo naučila, kako uporabljati omrežni računalnik, s poudarkom na Debian Linuxu, kako zgraditi kodo Bash za namestitev in varnostno kopiranje programske opreme brezhibno, avtomatizirano vetrič, kako zgraditi kodo Python kot podporo za postrežbo z dinamičnimi sporočili, stil stvari lepo s pomočjo spletnih strani, ki jih lahko nanašajo interaktivni mediji, ki jih je treba z omrežjem, ki jih lahko omrežja in interaktivirajo, z omrežnimi devizi in interaktivnost Preverjanje ali druge namene, skeniranje ID -ja, moderacija slik in videov, podatkovnih mikrotransakcij, da se vaša programska oprema varna, obdelava plačil, trgovanje s kripto valutami, asinhrone naloge in še več. Naučili se boste, kako sestaviti svoje lastne naprave Bluetooth, z baterijami, polnilnimi polnilci, mikrokontrolerji, vezji, motorji in senzorji z uporabo spajkalnice, žice in 3D natisnjenih ter lisnih materialov. Prikazal bom 3D -oblikovalske načele, ki se uporabljajo za izdelavo dodatkov in izdelavo orodij in matric, tako da boste lahko izdelali lastne vgrajene, strojne naprave z integriranimi baterijami, polnilniki, elektronskimi vezji in funkcionalnimi izhodi. in jih omrejte z Bluetoothom in spletom. Konkretno bomo preučili dve študiji primerov, vibrirajoči masager in domače strelno orožje, tako programirano v OpenSCAD, ki je na voljo kot grafični vmesnik ali pripomoček ukazne vrstice in ga je mogoče vključiti v splet za hitrejše rezultate. Naučili se boste, kako zgraditi in uvajati spletno mesto od zgoraj brez predhodnih izkušenj, narediti je funkcionalno, varno, lepo, uporabno in najpomembneje praktično. Naučili se boste, kako uporabljati strojno učenje in računalniško vizijo, da bo spletno mesto varno in bolj praktično, snemali video in zvok s svojega spletnega mesta, podarili svoj glas, ustvarili glasbo in modulirali zvok, da ustvarite koristne vzorce in kako prebiti hrup z uporabo drugih spletnih mest, da sestavite najboljšo možno mrežo spletnih strani, ki jih lahko povežete neposredno, da delite vse koristne informacije in jih boste bolj pomembne. Ta knjiga bo najbolj usmerjena na medije, varnost in strojno učenje, ki so glavne tri komponente, ki vam bodo pomagale sestaviti uporabno programsko opremo za splet, tako da boste vključili prave uporabnike in odklopili napačne na način, ki je realen, praktičen, ročen in vpleten, hkrati pa tudi samodejno in trden. Ta knjiga uči UNIX, zlasti Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript in številne uporabne programske pakete za Python, kot so zahteve, kot tudi koristna programska oprema BASH, kot sta Git in FFMPEG. Prav tako vas bom naučil, kako samodejno tržiti s kripto valutami in plačevati v kripto valutah ali z običajnimi debetnimi karticami, hkrati pa celo izplačate svojim obiskovalcem delež svojega prihodka, če se odločite za to. Naučil vas bom, kako zaslužiti z vašega spletnega mesta tudi z oglaševanjem, kako pripraviti svojo aplikacijo za iskalnike in jo hitro uvrstiti v prvo uvrstitev za tisto, kar bodo vaše stranke iskale, da vas bodo našli, in se uvrstili v čim več skupnih iskanj. Naučil vas bom, kako prodati svojo programsko opremo, jo oglaševati, privlačiti stranke, ki iščejo vaše storitve, in si na internetu poimenujete ime prek avenij, ki že obstajajo, so poceni in dobro delujejo. I will teach you how to save your data on cloud computers that work for you and save your data cheaply, how to plan and build a website that does what your users want and what you want, and how to keep your users engaged by putting your site a tap away on their phones with notifications, email, text messages, phone calls, and more avenues to bring your users back to your website at your disposal behind the click of a button secured to you only. Ta knjiga se bo osredotočila na praktičnost objavljanja in distribucije medijev v velikih količinah, od besedila do fotografij do videoposnetkov do zvoka, naredila dober vtis na končne uporabnike (vašo stranko) in se prodajate na kakršen koli način, da ustvarite spletno mesto, aplikacija, ki je samo vas, in omogoča, da vaša programska oprema in vaše podjetje izgledajo dobro na najboljši način. Od mene se boste naučili tudi nekaj nasvetov in trikov, od nasvetov za kodiranje, praktične nečimrnosti, kot so ličila in fotografija, modeliranje in igranje, in še več, kar bo pomembno za prikaz sebe in vašega podjetja v najboljši možni luči z uporabo vseh orodij, ki so vam na voljo, medtem ko boste razdelili toliko vsebine, kot je potrebno, da se vaša programska oprema ne bo več, kot je, da ne bo več denarja. Ta knjiga se imenuje "praktičnaWeb Based Deep Learning and Security by Example" for a reason: It deals with learning to code, specifically for the web, specifically with a focus on security, from a practical standpoint, with examples of working code that serves the practical purposes outlined in the text. The learning component of this text also encompasses machine learning, the code I will show you how to run for the web that will handle computer vision, facial recognition, image and video moderation, image enhancement, resolution Izboljšanje, napis slike in druge naloge, kot so meritve napovedi, na primer narava slike kot verodostojne, računalniško prevožene slike ali optična kopija (fotografija slike ali tiskana fotografija) je zelo pomembno, če se lahko pojavijo, da bi se lahko uporabljali v uporabi. S svojim obrazom lahko strežniški računalnik naredite ta varno, računalnik, ki bi vas običajno prosil za uporabniško ime in geslo in se prijavil, morda s potrditvenim žetonom za vsako novo prijavo ali nov IP naslov, vendar je mogoče, da je programska oprema, ki je na voljo, ali pa je dovolj, ali je to dovolj, kot je mogoče, da je vaša programska oprema ali vsaka programska oprema preveč. spletno mesto, ki ga uporabljate). Vsak, ki gradi programsko opremo, ki je brezhibno varna, ima nekaj občutka za to, kar to pomeni. Programska oprema je sama po sebi negotova, ker naprave in računi, ki jih uporabljamo za dostop, niso vedno na voljo, bi lahko bili v rokah vsakogar, ki ima slabo namero programske opreme in zato lahko tvegate za samo programsko opremo. To je nekaj v središču te knjige. Omrežni računalnik je privzeto zavarovan z dolgim ključem žetonom, imenovanim in ssh ali varnostnim ključem SSH, sicer pa je najbolje zavarovan s spletnim strežnikom, saj spletni strežnik zagotavlja odprt dostop in najsodobnejša orodja za varnostno varnost, ki se izvajajo na samem strežniku. Spletni strežnik ima dostop do uporabnikovega spletnega brskalnika, ki je zagotovo najmočnejši del uporabnikove naprave, saj je to mesto, kjer lahko uporabnik dostopa do omrežne programske opreme. This toolkit can render text, the webpages you see, and can also record images, audio and video (like a photo of a face or a state ID), can read and write to Bluetooth radio devices, and can read and write to near field transponder tags, inexpensive key cards, fobs, stickers, rings and even chip implants with unique serial numbers that can be read and written to with data generated and validated by a web server tied to the web mesto. Z uporabo vseh na voljo orodij, s to knjigo se boste opremili z znanjem za izgrad
Kje začeti: Vabljeni, da preskočite mimo razdelka, s katerim začnem s to knjigo ali katerega koli razdelka, natančno kodo, ki jo potrebujete, še posebej, če imate izkušnje s kodiranjem pred ali katero koli od zgoraj omenjenih orodij, ki jih bom podrobno opisal v tej knjigi, pa tudi dokumentiranje primerov uporabe in praktičnih primerov. Če nimate izkušenj s pisanjem kode, vam toplo priporočam, da preberete vso to knjigo in še posebej priporočam, da preberete prejšnje razdelke, da se prepričate, da je ta knjiga prava za vas. Če ta knjiga ni prava za vas, jo razmislite o daru prijatelju ali sorodniku, ki bi ga bilo mogoče sami učiti o razvoju spleta in celo razmisliti o izposoji in učite se od njih, da bi zapolnili vrzeli, kjer sem vas kot učitelj ali drugi učitelji uspel pred mano. Začnite, kjer boste, bo vsak del te knjige koristen, če nameravate sestaviti uporabno aplikacijo in upoštevajte, da so najboljše aplikacije zgrajene s končnim uporabnikom v mislih: poznajte svojo stranko. Zdaj me poznate, poznate to knjigo in ste pripravljeni na začetek. Za začetek zgrabite računalnik (tudi najcenejši prenosnik iz trgovine, Amazon ali starega namizja deluje in ga nastavite na način, ki deluje za vas.
Kako prebrati to knjigo: Besedilo je poudarjeno, označuje, da besedilo spada v ukazni poziv, kjer boste napisali kodo, ki jo zaženete. Ukazni poziv je močno osredotočen na tipkovnico in zahteva malo, da ne kliknete, pospešite vaš potek dela in olajšate stvari.
Začetek: Potopimo se. Začeli bomo z gradbeno kodo na lokalnem stroju in začeli brez gradnje spletnega mesta, povezanega z internetom. To je varnejše za začetek, nič ne stane in vam je enostavno. Odvisno od vašega operacijskega sistema se bo vgradnjo v bash lupino nekoliko razlikovalo. Za Mac OS priporočam namestitev virtualnega stroja na tej točki, saj boste z virtualnim strojem dobili največ združljivosti. Različni ponudniki, kot sta VirtualBox in Paralells, lahko za vas zaženejo virtualni stroj, čeprav je mogoče tudi na stroj namestiti Ubuntu, če raje uporabljate izvorno okolje, ki je priporočljivo za ustvarjanje hitre, racionalizirane izkušnje. Če uporabljate Linux ali Windows, ki ga priporočam, bi moralo biti zelo enostavno ustvariti projekt. Odprite svoj terminal, prilagodite velikost, kot se vam zdi primerno, in začnite slediti koraku 2. Če uporabljate Windows, sledite koraku 1.
1. korak: - Samo uporabniki sistema Windows V sistemu Windows odprite ukazni poziv kot skrbnik in vnesite WSL -Sinstall
2. korak: - Nadaljujte tukaj ali preskočite 1. korak do tukaj, če ne uporabljate Windows V odprtem terminalu (odvisno od vašega OS -a, imenovanega Ubuntu v sistemu Windows, terminal v Macu ali Linuxu ali podobno ime), začnete z ustvarjanjem projekta. To počnemo z ukazom mkdir, ki ustvarja imenik. Če morate ustvariti imenik za shranjevanje projekta, ki je priporočljiv, uporabite ukaz CD, da se spremenite v imenik in in in
CD/pot/do/imenik - Pot so mape (datoteke), ki pred vašim ciljnim imenikom, vaša privzeta pot je ~ ali/doma/uporabniško ime (kjer je uporabniško ime vaše uporabniško ime). Če želite spremeniti privzeti imenik, vnesite CD ali CD ~ Primer mkdir - zamenjajte "primer" z imenom imenika
Zdaj imate delovni imenik za svoj projekt. Ker je tako pomembno, da se ta imenik shrani, če morate preklopiti na drug stroj ali namestiti kodo, ki jo napišete, tako da je pripravljena za splet, bomo v naslednjih korakih sestavili skript za varnostno kopiranje imenika. Toda izgradnja skripta je potrebna malo kode in kodo je treba avtomatizirati, da bo čim bolj uporabna. Torej, sestavimo scenarij, da najprej sestavimo skripte. Začnimo z ustvarjanjem skripta in ga izvemo. Za to bomo uporabili Sudo, CHMOD in se dotaknili ter poklicali skript "ascript".
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Zdaj smo ustvarili skript, ga izvedli in ga pripravljeni urejati. Nano je urejevalnik besedil, ki vam bo omogočil, da urejate besedilo, ne da bi kliknili, kar je veliko lažje kot uporaba grafičnega uporabniškega vmesnika. Če želite urediti datoteko z nano, uporabite nano in nato pot do datoteke. Če želite narediti scenarij, ki naredi skript, je dokaj podobno kot na prvem mestu izdelava našega skripta. Uporabili bomo isto kodo kot zgoraj, in zamenjali ime skripta, "ascript" s parametrom argumenta, 1 USD. To nam omogoča, da pokličemo scenarij tako, da vpišemo preprosto Sudo Ascript Newscript, ko lahko ustvarimo kateri koli nov skript tako, da z imenom vašega skripta nadomestimo "rekord". Koda v Nano bi morala videti:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
Za zapiranje nano lahko zadržimo kontrolno tipko in pritisnemo X, nato pa y, da označimo, da shranimo datoteko in pritisnemo na vrnitev. Zdaj, namesto da bi te tri ukaze vtipkali za urejanje skripta, bomo lahko vpišeli Sudo Ascript Ascript, da bomo ponovno uredili skript. To deluje! In kateri koli nov scenarij lahko enostavno zaženete tako, da ga pokličete v lupino. Shranimo svoje delo zdaj: Napišimo skript za varnostno kopijo, da shranimo naš novi skript in ga nato podkrepimo v našem imeniku projekta, hkrati pa varnostno kopiranje skripta za varnostno kopiranje.
sudo ascript backup
Zdaj, v Nano:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Kjer je/pot/do/imenik je pot do projekta, ki ste ga ustvarili z MKDIR. Pozneje se bomo naučili kopirati, kot je taka, s zanko in seznamom, kar je manj kode, za zdaj pa naj bo preprosto in imamo nekaj vrstic. Če želite zagnati ta skript in varnostno kopiranje kode, datoteko shranite v nano s Control+X, Y in vrnite ter vpišite spodaj v svojo lupino
backup
Če vas med branjem te knjige in spremljanja v lupini sploh pozovete za geslo, pravilno vnesite svoje uporabniško geslo, boste imeli tri poskuse, preden boste morali ponovno zagnati ukaz. S puščicami navzgor in navzdol lahko ponovite ukaze in jih uredite, če morate dvakrat zagnati karkoli. Preprosto pritisnite navzgor in navzdol, da izberete ukaz, preden uredite ukaz z desno, levo puščico in izbrišite tipko ter tipkovnico ter ga zaženete z vrnitvijo.
Čestitke! Uspelo vam je ustvariti super skript za varnostno kopijo, ki v vašem delovnem imeniku varnostno kopira dva pomembna skripta lupine. Stvari se lahko premaknemo pozneje, ko se projekt poveča, vendar to za zdaj deluje. Pojdimo na varnostno kopijo v oblaku, za to bomo uporabili GitHub (čeprav obstajajo številne druge Git rešitve za varnostno kopijo, vse so približno enake.) Git je programska oprema za nadzor Verision Control, ki vam omogoča varnostno kopiranje popravkov programske opreme, ko jih naredite na strežnik, hkrati pa vam omogočajo tudi prenesete celotne kopije programske opreme za geslom ali ključem. To je ključnega pomena za shranjevanje vaše programske opreme, še posebej, ker se preselimo na zavarovane primere Linuxa, ki se včasih zlomijo, ko ena sama vrstica kode ne uspe, pri čemer vas zaklene, medtem ko vaša koda morda ne bo podprta, če ne boste dobili možnosti, da bi jo samodejno podprli, kar bomo pokrili.
Če na tej točki že ne uporabljate virtualnega stroja Ubuntu, na tej točki priporočam, da uporabite virtualni stroj Ubuntu, ker vam bo olajšalo življenje, ko boste namestili vse potrebne pakete, da boste v računalniku izdelali delovno spletno mesto in predhodno delovanje globokega učenja. Kodo bomo v bližnji prihodnosti premaknili na spletni strežnik, vendar želimo zagotoviti, da je za našem spletnem strežniku vsaj nekaj plasti varnosti, ki so odporni na lažno predstavljanje, in uporabili številne pakete Linuxa, da bi to lahko storili. Če še vedno želite uporabljati MAC OS, lahko poiščete in namestite potrebne pakete v spletu, vendar za vsak paket morda ne bo drugih možnosti, ki jih bo ta knjiga ali serija zajemala.
Dodajmo nekaj ukazov, da bomo opravili svoje delo s skriptom varnostne kopije, tako da zaženemo varnostno kopijo ukaza sudo ascript.
# ...
Še enkrat, nadzorujte x, da shranite.
Zdaj moramo narediti neko konfiguracijo za ta projekt. Ker bo kmalu projekt GIT, nam ni treba vtipkati vsakega ukaza vsakič, ko bomo napotili iz skladišča GIT, vendar bomo to obesili, ko bomo zapisali naše skripte za uvajanje. Za začetek poskrbimo, da smo v pravem imeniku in inicializiramo skladišče GIT in ustvarimo tipke SSH.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Ko vtipkamo SSH-Keygen, je treba nov ključ shraniti v domači mapi pod mapo z imenom .Ssh. Imenuje se id_rsa.pub. Poiščimo ta ključ in ga kopiramo. Da ga vidim,
cd ~
cat .ssh/id_rsa.pub
Kopirajte besedilo, ki ga vrne zadnji ukaz, in ustvarite račun pri ponudniku GIT (v idealnem primeru GitHub), preden dodate ključ SSH v vaš račun. Ko imate račun, kliknite zgornji desni meni in vnesite nastavitve, preden v meniju Access dodate tipko SSH v tipkah SSH in GPG. Izberite Dodajte tipko SSH in dodajte svoj tako, da ga prilepite in mu dajte naslov, preden se shranite in vrnete v GitHub, da ustvarite novo skladišče. To je podobno za druge ponudnike GIT, morali boste prebrati njihovo dokumentacijo. V novi konfiguraciji skladišča dajte svojemu skladišču opisno ime in se odločite, ali ga želite objaviti, in se prepričajte, da še ne konfigurirate nobenih datotek za vključitev. Ko je skladišče ustvarjeno, kopirajte klon s SSH URL in ga prilepite v naslednji ukaz.
git remote add git://… (your remote URL)
Zdaj se lahko s CD -jem vrnete nazaj v svoje skladišče, s tem boste seznanjeni. Preizkusite svojo varnostno kopijo skripta zdaj z varnostno kopijo
Super! Zdaj lahko resnično dobimo kodiranje. Namestimo Django zdaj, ko se dobro razumemo na Bashu in Gitu. Django nam bo dovolil samodejno varnostno kopirati našo programsko opremo, Bash lahko to stori tudi, vendar bi moral Django imeti enostavnejšo varnejšo izvedbo (lažje jo je onemogočiti in konfigurirati).
Za namestitev programske opreme v Ubuntu bomo uporabili ukaz sudo apt-get. Najprej posodobimo in nadgradimo programsko opremo, ki smo jo že imeli. To je mogoče storiti s posodobitvijo Sudo Apt-get in Sudo Apt-get-Gent -y. Nato namestimo Python in naše virtualno okolje, dom naše kode, z naslednjim ukazom: Sudo Apt-get Namestite python-is-python3 python3 -nv
To je vse, kar morate nadaljevati z Django v smislu namestitve programske opreme v primerku Ubuntu. Za Windows in Linux bi to moralo biti dokaj enostavno, toda za Mac boste morda želeli namestiti navidezni stroj in Linux na njej s pomočjo brezplačnega ali plačanega virtualnega okolja, kot sta VirtualBox ali Paralells Desktop in ustvarite zgornje korake, da bi nastavili okolje Ubuntu. Ubuntu je v tem primeru ključnega pomena, ker je programska oprema, ki jo spletna mesta izvajajo, in omogoča, da gostijo spletna mesta z vso zgoraj omenjeno programsko opremo.
Pojdimo v django.
V našem imeniku spet s CD -jem:
python -m venv venv # Ustvari virtualno okolje, kjer je shranjena koda
source venv/bin/activate # Aktivira virtualno okolje
django-admin startproject mysite . # Kjer je MySite projekt, ki ga začnem v svojem trenutnem imeniku.
Django nas šele začne, saj Django gosti spletnega strežnika in dela vse, kar potrebujemo, da dobimo osnovno lokalno spletno mesto. Zdaj, ko imamo Django nameščen, uredimo nastavitve, da bo delovalo tako, kot potrebujemo. Najprej ustvarimo novo aplikacijo
python manage.py startapp feed
Opazili boste, da se prva aplikacija imenuje Feed. Aplikacijo je treba poklicati, kar želite, in ustvarili bomo nove aplikacije, vendar mora biti ime vsake aplikacije dosledno vsakič, ko se v kodi sklicuje aplikacija. Če želite dodati novo aplikacijo, bomo vedno uredili nastavitve.py v drugem imeniku, ki ga je ustvarila aplikacija, imenovana v StartProject, v nadaljevanju aplikacije. Uporaba nano,
nano app/settings.py
V nastavitvah poiščite nameščene_apps in ločite [] na 3 vrstice. Uporaba štirih presledkov na prazni sredinski črti, dodajte 'Feed' ali ime vaše aplikacije. Ta razdelek nastavitev.py bi moral biti videti:
INSTALLED_APPS = [
'feed',
]
Preden pozabimo, preizkusimo, da Django deluje. S pomočjo ukaza python Manage.py RunServer 0.0.0.0:8000 lahko zaženemo strežnik in nato povišamo v spletnem brskalniku v računalniku, ki zažene kodo na http: // localhost: 8000 in si ogledate primer spletne strani (deluje!) Strežnik zapusti s nadzorom C, enako kot kateri koli drugi ukaz.
Zdaj pa se podamo v pisanje kode Python. Django ima tri glavne komponente, vse pa v celoti vodijo kodo. Komponente se imenujejo model, pogled in predlogo, vsaka pa je na višji in nižji ravni, preden se spletna stran dostavi uporabniku.
Model je koda, ki shrani informacije v bazo podatkov za iskanje, razvrščanje in upodabljanje.
Pogled odloča, kako se model upodablja, manipulira in spreminja, skoraj vsak pogled bo neposredno uporabil model.
Predloga je koda HTML z nekaj dodatnimi zvonovi in žvižgami, imenovanimi jezik predloge. Predloga je predstavljena s pogledom, kjer je napolnjena s kodo Python in kontekstom, kot so modeli in informacije (uslualski struni in cela števila).
Django ima tudi druge komponente, vključno z, vendar ne omejeno na:
Nastavitve, ki konfigurirajo aplikacijo, kot smo razpravljali.
URL -ji, ki so vzorci, ki jim sledi uporabnik, da dobi dostop do določenih delov spletne aplikacije.
Obrazci, ki opredeljujejo, kako se informacije, ki jih pošljejo strežniku, obravnavajo in posnamejo tudi v bazo podatkov in uporabniku. To so temelj obdelave informacij na strani strežnika in lahko sprejmejo katero koli vrsto informacij, ki jih računalnik shrani, predvsem besedilne nize, številke in resnične/lažne boole (običajno potrditvena polja).
Predloge, ki so koda HTML in jezik predloge in premostijo vrzel med Python in HTML, kar pomeni, da lahko informacije o pythonu služijo kot koda HTML, do katerih lahko vsakdo dostopa in lahko zavaruje spletno mesto z omejenim dostopom, hkrati pa je Python kodo dostopno dostopni spletu in uporabne za različne namene na oddaljeni napravi, ki ne potrebuje blizu strežnika, ki ne potrebuje blizu strežnika.
Statične datoteke, ki so običajno JavaScript in so knjižnice, ki jih strežnik streže in so povezane s predlogo.
Medijske datoteke, ki jih strežnik služi ali so zunanje gostitelje, ali samo zapisane na strežniku, preden jih obdelajo in objavijo na drugem strežniku (vedro) za gostovanje.
Vmesna programska oprema, ki je koš kode, ki se izvajajo hkrati z vsakim pogledom in se štejejo za "vključene" v pogled.
Kontekstni procesorji, ki obdelujejo kontekst vsakega pogleda in se uporabljajo za dodajanje dodatnega konteksta.
Testi, ki potrjujejo, da uporabnik ali zahteva prenese določene zahteve, preden se prikaže pogled.
Potrošniki, ki narekujejo, kako WebSockets ravna in se odzivajo na komunikacijo.
Admin, ki se uporablja za registracijo modelov, tako da jih je mogoče podrobno manipulirati na strani Django Admin, kjer je mogoče bazo podatkov dajati prek grafičnega vmesnika.
Zelena, ki definira asinhrone naloge, deli kode Django se lahko začnejo izvajati, preden takoj nadaljujejo do naslednje naloge ali vrstice kode.
Django ima lahko veliko drugih komponent, o katerih bomo podrobno razpravljali tukaj. Obstaja veliko načinov, kako narediti Django bolj funkcionalen, dodajanje webcockets, ki so hitri, racionalizirani komunikacijski kanali, zelena, ki izvaja asinhrone naloge, in množico drugih kosov programske opreme za razširitev Django, zlasti v oglednih funkcijah, kjer se izvaja večina kode. Funkcije ogledov so ključne, ker ponavadi razglasijo vsak del kode, ki je značilen za določen vzorec URL -ja, ali odsek strežnika.
Najprej raziščite funkcije pogleda. Funkcije ogledov se začnejo z uvozom, ki označuje kodo, ki bo uporabljena v pogledu, in so definirani z uporabo običajnih definicij funkcij ali razredov. Najpreprostejši pogledi so definirani z definicijo funkcije Def in vrnete httpresponse z osnovno predlogo. Začnimo z definiranjem osnovnega pogleda, da vrnemo besedilo "Hello World". Ne pozabite, da vsakič, ko dodate kodo po izjavi, kot je def, če, če, za itd., Boste morali dodati 4 prostore za vsako od predhodnih definicij, ki jih želite uporabiti za svojo funkcijo. Kmalu se bomo vključili v to, kar pomeni vsako od teh.
Iz imenika našega spletnega mesta uredite datoteko Feed/Views.py z Nano in dodajte naslednje vrstice na konec datoteke.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
Djangov HttPresponse se odzove z besedilnim nizom, označenim z odpiranjem in zapiranjem. " Vsakič, ko informacije posredujete funkciji ali razredu, na primer zahtevo ali niz, boste morali uporabiti oklepaje (, odpiranje in zapiranje).
To še ni vse, kar moramo videti naš pogled. Seveda strežniku nismo povedali, kje je točno pogled, še vedno moramo določiti pot, po kateri bi moral biti pogled. Začnimo z definiranjem osnovne poti v aplikaciji/urls.py in pozneje bomo vstopili v skupine poti.
V APP/URLS.PY dodajte vrstico po uvozu izjav po začetku uvoza pogleda, ki smo ga pravkar ustvarili.
from feed import views as feed_views
Zdaj pa določimo vzorec pogleda. Vzorci pogleda imajo tri komponente, komponento poti, ki prikazuje strežniku, kjer obstaja pogled znotraj strežnika (pot URL -ja, ki jo uporabnik vnese v navigacijsko vrstico za vstop na spletno stran), komponento pogleda, kjer je pogled navedeno, in prijazno ime za pogled, tako da je enostavno pridobiti svoj vzorec, če je potrebno, da se lahko spreminja, če je mogoče spremeniti, da se lahko spremenite. Smiselno je početi stvari tako in biti prilagodljivo, saj bo vaša kodna baza vedno spreminjajoče se okolje, ki potrebuje prožnost in improvizacijo, da bi bilo dragoceno in enostavno delati. Takole bo videti vaš pogled, to lahko dodate v URLPATTERNS = [ODDELEK APP/URLS.PY. Vzorec pogleda je opredeljen z zgoraj opisanimi tremi komponentami, in funkcijo, imenovano pot. Vaši vzorci URL -ja so seznam, zato se prepričajte, da vedno končate vsak element v njih z vejico, ker ta loči vsako. Vsak element bi moral iti tudi v novo vrstico, še enkrat s štirimi presledki pred njo, tako kot aplikacija v nastavitvah.py. Določili bomo prvo komponento pogleda s prazno funkcijo niza, da bomo ustvarili pogled, ki deluje v korenskem imeniku spletnega strežnika. Vaš URLS.PY bi moral biti zdaj videti tako:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
To je osnova za ustvarjanje spletnega mesta z Django, ki je popolnoma statičen. Da bi naredili bolj dinamično spletno mesto, kjer lahko začnemo s predpomnjenjem informacij, kot so slike, videoposnetki, zvok in še več, bomo morali uporabiti modele, ki jih bomo nadaljevali. Za zdaj preverimo našo kodo in zaženemo strežnik. Če želite preveriti kodo za napake, zaženite:
python manage.py check
Če obstajajo kakšna sporočila o napakah, morate natančno pregledati spremembe, ki ste jih naredili v svoji aplikaciji, in preverite, ali je treba kaj popraviti, na primer zunanji ali manjkajoči prostor, dodaten znak, neobrezan niz, kakršno koli tipko, kakršen koli slučajno izbrisani znak ali kaj drugega. Če preberete sporočilo o napaki (če ga imate), bi morali videti pot do datoteke, ki ste jo ustvarili ali uredili skupaj s številko vrstice, zato poglejte v to datoteko in vrstico in preverite, ali lahko popravite karkoli, kar je tam. Če ste težavo odpravili, znova zaženite zgornji ukaz. Ko je vaša programska oprema pripravljena za zagon in deluje, boste videli, da je izhod "System Check ugotovil, da ni težav." Zdaj ste pripravljeni na odhod. Zaženite strežnik z:
python manage.py runserver 0.0.0.0:8000
Zdaj odprite spletni brskalnik in se pomaknite do http: // localhost: 8000. V vašem pogledu bi morali videti besedilo, vrnjeno v oklepaju in citati funkcije HttPresponse. To je le osnovni primer, toda če ste ga dosegli tako daleč, razumete osnove, kako delujejo Linux, Bash, Python in Django. Pojdimo globlje v neko modeliranje baz podatkov in raziščemo moč razreda Python pri shranjevanju informacij. Nato se bomo začeli oprijemati na HTML in CSS, preden bomo naše spletno mesto v celoti predstavili, prilagodljivo in varno z uporabo JavaScript in strojnega učenja.
Razredi so shranjeni v modelih.Py vaše aplikacije. Z Nano, uredite aplikacijo/modele.py in dodajte nov razred. Razred je opredeljen z definicijo razreda in je v tem primeru v tem primeru modeli, ki ga podeduje. Ime razreda prihaja po definiciji razreda in po uporabi definicije razreda A: (črevesa), preden so atributi in definicije funkcij, vezane na razred, označene spodaj. Naš razred potrebuje ID, ki ga lahko uporabimo, da ga pridobimo in ohranimo edinstven, za shranjevanje nekaterih informacij pa potrebuje tudi besedilno polje. Kasneje lahko dodamo časovni žig, datoteke, booleje (resnične ali napačne definicije, ki lahko pomagajo naši kodi pri odločanju o tem, kaj storiti z modelom, in jo lahko uporabimo za razvrščanje), primer, da model veže na uporabnika, ki je prijavljen v strežnik in še več. Razpakiramo spodnjo kodo:
from django.db import models # Uvoz, ki se uporablja za opredelitev našega razreda in je atributi
class Post(models.Model): # Opredelitev samega našega razreda
id = models.AutoField(primary_key=True) # ID našega modela, samodejno ustvarjen ključ, ki nam bo omogočil poizvedovanje modela, ga ohraniti edinstven in je uporaben, ko moramo, ko je ustvarjen, interakcijo z modelom.
text = models.TextField(default='') # Atribut našega razreda hrani, v tem primeru nekaj besedila, ki je privzeto na prazen niz.
Zaprite in shranite datoteko, kot smo že prej, da končamo.
Obstaja veliko drugih polj in možnosti, ki jih bomo raziskali, ko bomo posodobili ta razred, ko se naša aplikacija razvija, vendar so to osnovne potrebe ustvarjanja aplikacije za objavo nekaj besedila. Vendar ta model ne bo deloval sam. Kot je opisano prej, bomo za to model potrebovali pogled po meri in URL po meri, za to model pa bomo potrebovali tudi obrazec skupaj s predlogo. Najprej raziščemo obrazec.
Če želite določiti obrazec, uredite aplikacijo/obrazce.py z nano in dodajte naslednje vrstice. Potrebovali bomo dva uvoza, naš razred obrazcev, pa tudi model, ki smo ga ustvarili (feed.models.post), definicijo razreda, podobno modelu, in polje, skupaj s podrazredom, imenovanim Meta, ki bo opredelil model, s katerim deluje oblika. Obrazec ima lahko tudi funkcijo inicializacije, ki jo nastavi na podlagi informacij v zahtevi, modelu ali kako drugače, to bomo pozneje raziskali.
Obrazci modela so tako koristni, ker lahko ustvarijo model ali tudi urejajo model, zato jih bomo uporabili za oba. Spodaj določimo enega v obrazcih.
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',)
To so osnove, kako izgledata oblika in model. Ta obrazec modela lahko uporabite za instituriranje ali urejanje objave, spreminjanje besedila, ki ga vsebuje. Ogledali si bomo vključitev tega obrazca v pogled naprej. Najprej naredimo migracije in migriramo bazo podatkov, tako da lahko naša koda komunicira z modelom, ko deluje. Če želite to narediti, zaženite naslednje ukaze:
python manage.py makemigrations
python manage.py migrate
To bo trajalo minuto za izvedbo, a ko bo, vam bo omogočil dostop do modela v pogledih, vmesni programski opremi ali kjer koli drugje v programski opremi. Nadaljujmo si tako, da si ogledamo, kje lahko vidimo naš model. Uredi her/views.py in dodajte naslednjo kodo, kot je navedeno. Po znaku # vam ne bo treba dodati ničesar, ta koda so komentarji, ki se uporabljajo za označevanje informacij o kodi. Začeli bomo z uvozom našega modela v pogledih in ga dodali v kontekst, kjer ga lahko upodabljamo v predlogi kot seznamu za prikaz. Nato bomo dodali predlogo, kjer lahko z gumbom upodabljamo obrazec in model, da ustvarimo nov predmet na podlagi modela in ga objavimo na strežniku. To se sliši zapleteno, zato to stopimo korak za korakom. Preden zaključimo pogled, ustvarimo predlogo, ki samo upodobi model in poskrbi, da ga bomo videli tako, da v lupini ustvarimo novo objavo. Evo, kako naj izgleda ta pogled:
posts = Post.objects.all() # Do zdaj poizvedite vse objave v bazi podatkov
Vse to izgleda precej preprosto, dokler ne pridemo do dna. Izvedba, vrednost, ki jo je funkcija vrnila namesto v HTTP odgovoru, kot je prejšnji primer, vedno prevzame zahtevo kot prvi vhod, sprejme kontekst (v tem primeru objave v bazi podatkov), ki jo je zdaj mogoče predstaviti v predlogi, in vrne predlogo, določeno v funkciji. Predloga bo dokument HTML z malo jezika, imenovanega Jinja2, zaradi česar so informacije Python v HTML.
Če želite začeti ustvarjati predloge, naredite dva imenike v Feedu.
mkdir feed/templates
mkdir feed/templates/feed
Nato uredite predlogo v zgornjem imeniku, podajanje/predloge/podajanje in dodajte kodo za ta primer. Poglejmo predlogo za ta primer.
To je zelo preprosta predloga. Določi odpiranje in zapiranje oznak HTML, oznako vrste dokumenta, oznako telesa z naslovom legende, prelomno oznako, ki doda majhno vrstico čez zaslon, in za zanko, ki vsako objavo postavi na seznam objav kot odstavek v predlogi. To je vse, kar je potrebno za prikaz objav, vendar v bazi podatkov še ni. Ustvarimo nekaj z lupino. Shell lahko zaženemo z upravljanjem.py
python manage.py shell
Zdaj pa uvozimo naš model objave
from feed.models import Post
Nato bomo z vrvico ustvarili preprosto objavo in izstopili iz lupine. Niz je lahko karkoli, dokler je veljavno besedilo.
Post.objects.create(text='hello world')
exit()
Nazadnje bomo morali v svoj vir dodati vzorec URL -ja. Ker bo naša aplikacija za podajanje uporabljala več URL -jev in želimo ohraniti velikosti datotek majhne, v naši aplikaciji Feed ustvarimo lokalne URLS.PY, ki je videti tako:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
Prav tako bomo morali urediti URLS.PY v osnovni aplikaciji, karkoli smo se odločili, da jo pokličemo, to je bil prvi imenik, ki smo ga ustvarili. Uredi aplikacijo/app.py in v vzorce URL dodajte naslednje
from django.urls import include # na vrhu
# ... Prejšnja koda tukaj
Zdaj, ko strežnik zaženemo s Python Manage.Py RunServer, bomo videli stran, ki smo jo ustvarili, ker imamo model, pogled in predlogo ter vzorec URL, skupaj z elementi v bazi podatkov. Nato izvedite obrazec, ki smo ga ustvarili, in začnimo ustvarjati lastne objave. Toda preden napišemo preveč kode, naredimo varnostno kopijo s skriptom, ki smo ga napisali prej, varnostno kopiranje. Zaženite ta scenarij v lupini, počakajte nekaj trenutkov in vsa koda bo podprta do našega Git skladišča.
backup
Izvajanje obrazca je razmeroma preprosto. Uvozili bomo svoj obrazec, dodali obdelovalca zahteve po objavi in pred preusmeritvijo v isti pogled shranili objavo v bazo podatkov. Lahko uporabimo funkcijo preusmeritve, ki smo jo že uvozili, in drugo funkcijo, imenovano Reverse, da dobimo URL za vzorec pogleda. To bomo poizvedovali s nizom "vira: vir", ker je imenski prostor vključenega vzorca krmljenje, pogled pa se imenuje tudi vir.
posts = Post.objects.all() # Do zdaj poizvedite vse objave v bazi podatkov
if request.method == 'POST': # Obravnavajte zahtevo za objavo
form = PostForm(request.POST) # Ustvarite primerek obrazca in shranite podatke vanj
if form.is_valid(): # Preverite obrazec
form.save() # Shranite nov predmet
return redirect(reverse('feed:feed')) # Preusmerite na isti URL z zahtevo
'form': PostForm(), # Prepričajte se, da obrazec prenesete v kontekst, da ga bomo lahko upodobili.
Zdaj bomo morali posodobiti predlogo, da bomo upoštevali nov obrazec. To lahko storimo z uporabo
Razčlenimo to. Obstajajo nov obraz obrazca, žeton, sam obrazec in gumb za oddajo. Precej preprosto, toda ko si ga ogledamo, bi morda želeli, da bi bilo videti bolje. Deluje, lahko objavimo nove objave z obrazcem in zdaj so shranjene v bazi podatkov. Tu se dogaja nekaj stvari. Uporabljamo oznake HTML za izjavo, da je dokument dokument HTML, uporabljamo oznako predloge ({ %… %}) za upodabljanje žetona za obrazec in drugega, {{…}} za upodabljanje obrazca. Imamo tudi zanko, s katero lahko besedilo upodabljamo z oznakami blokov in oznako predloge. Blok oznake so res pomembne, saj lahko določimo, kako se z njimi upodabljajo odseki predloge, in oznake predloge so osnova, kako spremenljivke vstavimo v svojo kodo.
Zdaj moramo narediti našo aplikacijo videti boljše, saj je za zdaj videti res osnovno. To lahko storimo z uporabo CSS bodisi v inline bodisi v razredih, vezanih na vsak predmet v dokumentu. CSS je res prijeten, ker na strani pove vse, kako naj izgleda, in lahko naredi resnično dobro. Obstaja nekaj knjižnic, ki to lahko storijo, toda moja osebna je Bootstrap.
Bootstrap je mogoče prenesti s njihovega spletnega mesta,getbootstrap.com/. Ko ste tam, pritisnite gumb, da preberete namestitvene dokumente in kodo kopirate iz razdelka CDN Vključite. To kodo boste potrebovali na vrhu svojega dokumenta HTML, v oznaki, imenovani Head. Pojdimo tudi naprej in ustvarimo osnovno predlogo, da nam teh povezav v vsaki predlogi ni treba ponovno ustvariti.
Naredite nov imenik, imenovan predloge z mkdir predloge, nato pa uredite predloge/base.html.
Bi moralo videti tako:
Prepričajte se, da kopirate datoteke CSS in JavaScript, .CSS in .JS, ker bomo potrebovali JavaScript, da bo naše spletno mesto v prihodnosti bolj funkcionalno.
Zdaj pa se vrnimo v bash lupino in zaženemo hiter ukaz. Ne pozabite, da če boste kdaj morali dostopati do virtualnega okolja, vnesite vir Venv/bin/Active. To vam bo omogočilo, da pakete Python namestite lokalno na način, ki Django omogoča dostop do njih. Da bi dali naše obrazce, ki jih ustvarijo razredi Django Bootstrap, bomo uporabili paket Python, imenovan Crispy Forms. To lahko prenesemo z naslednjim ukazom
pip install django-crispy-forms
Ko je to nameščeno, ga dodajte v nastavitve.py
# … Prejšnja koda tukaj
Zdaj pa lahko v naši predlogi za dovajanje odstranimo nekatere stvari. Odstranimo začetek in konec dokumenta in ga nadomestimo z dedovanjem iz naše osnovne predloge z uporabo razširitve in definicije bloka. Prav tako bomo v obrazcu dodali uvoz filtra predloge z obremenitvijo in filtrom predloge. Nazadnje, na gumb na obrazcu dodajmo razred zagona, da bo videti bolj kot gumb. To bi moralo videti tako:
Lepo! To je že kar nekaj kode. Nato bi ga morali preizkusiti in poskrbeti, da bomo lahko videli, da je vse videti lepo, in tudi prepričani, da vse deluje pravilno. Zaženite strežnik po prejšnjih navodilih in se prepričajte, da je spletno mesto videti in deluje v redu. Odlično delo! Pripravljeni ste na naslednji korak, v katerem bomo dodali funkcionalnost za prijavo uporabnika s podobnimi URL -ji, obrazci, pogledi in predloge. Osnovna predloga je pomembna, zato jo bomo še naprej spreminjali in spreminjali, po potrebi, vendar se za zdaj osredotočimo na to, da bo naše spletno mesto bolj varno, tako da bodo uporabnikom omogočili prijavo z uporabniškim imenom in geslom ter sčasoma še pomembnejših informacij, ki bodo pomagale ohraniti varovalno aplikacijo in vaš lastni račun samo vi.
Za to bomo morali uporabiti uporabniški model, vgrajen v Django. Uporabniški model je model baze podatkov, kot je naša objava, ki ga je mogoče uporabiti za prijavo uporabnika na spletno mesto. V prihodnosti, preden bomo spletno mesto postavili na internet, bomo ta model razširili z drugimi modeli, ki so mu ga pripisali, in zgradili dodatne varnostne ukrepe za prijavo, ki so odporni na lažno predstavljanje. Začeli bomo z uporabo nekaterih vgrajenih obrazcev za prijavo, ki jih ponuja Django. Najprej ustvarimo novo aplikacijo, ki jo bomo uporabili za upodabljanje predlogov in pogledov za osnovno prijavno stran. Ustvarili bomo tudi druge aplikacije, ki bodo predstavljale nadaljnje prijavne izzive, da bi zagotovili aplikacijo, vključno s pincodo, prepoznavanjem obraza, komunikacijo v bližini polja, zunanjih naprav, večnamensko preverjanjem pristnosti in prepoznavanjem prstnih odtisov.
Že smo govorili o ustanovitvi aplikacije. Iz našega imenika znotraj virtualnega okolja Pass Manage.py te argumente
python manage.py startapp users
Zdaj bi morali imeti imenik za novo aplikacijo. Začnimo z ustvarjanjem pogleda v tem imeniku, ki ustreza prijavi uporabnika. Django je vgradil poglede za prijave uporabnikov, vendar te ne bodo primerne za nas, ker potrebujemo pogled po meri, ki je prednostno narejen z definicijo.
V tem pogledu bomo začeli s preverjanjem zahteve za objavo, prenesti Request.post na prijavo, uvoženo iz Djanga, preverite uporabniški račun in se prijavite v uporabniku, preden jih preusmerimo v našo aplikacijo za podajanje.
V uporabnike/views.py dodajte naslednjo kodo
username = request.POST['username'] # Pridobite uporabniško ime in geslo iz zahteve po objavi
password = request.POST['password'] # Preverite uporabnika
To je vse, kar potrebujete za osnovni pogled za prijavo. Zdaj pa ustvarimo obrazec za pogled s podaljšanjem osnovne predloge. Začeli bomo z ustvarjanjem novega imenika za predloge v mapi uporabnikov.
mkdir users/templates
mkdir users/templates/users
Zdaj bi morali urejati uporabnike/predloge/uporabnike/login.html. Medtem ko smo že pri tem, bomo ustvarili predlogo, ki bo omogočila, da se tudi uporabnik prijavi.
nano users/templates/users/login.html
Zdaj v predlogi
To so osnove predloge za prijavo. Res je tako kot druga predloga v strukturi, vendar je videti nekoliko drugače, ko je upodobljena. To kodo lahko kopiramo tako, da sestavimo še eno zelo podobno predlogo, imenovano register.html, kjer bomo spremenili besedilo in uporabili nov obrazec, ki ga gradimo. Najprej naredite predlogo. Uredite uporabnike/predloge/uporabniki/register.html in dodajte naslednjo kodo:
Zdaj pa sestavimo obrazec za registracijo našega uporabnika in se obrnimo nazaj na poglede, preden nadgradimo svoje uporabniške prijave z modelom. Ta obrazec bomo naredili osnovno za začetek, vendar bomo v prihodnosti vključili več podrobnosti in varnostne funkcije, kot so sporazumi in captcha. Uredite obrazce z Nano uporabniki/obrazci.py in dodajte naslednjo kodo.
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']
Torej imamo tukaj še en obrazec, ki deluje dokaj preprosto. To je obrazec za uporabniški register z uporabniškim imenom, e -pošto in geslom ter potrditvenim poljem gesla. Upoštevajte, da ta obrazec ne razširja običajnih obrazcev. Eno polje je opredeljeno enako, in meta razreda določa model, ki ga obrazec ustreza preostalim informacijam, ki bodo zapisane v obrazcu. Večina tega že obstaja v Djangovi vgrajeni v uporabniku, zato bomo to uporabili kot osnovo za razred (sprejeto v oklepaju).
Nato bomo preučili pogled, da registriramo uporabnika, zdaj, ko imamo obrazec in predlogo. To je oblika modela, tako kot tista v novem pogledu. Uredi uporabnike/views.py in dodajte naslednjo kodo:
# … Uvoz
To je vse, kar potrebujemo za registracijo uporabnika, vendar bi morali imeti več informacij. Želimo vedeti čas, ko se je uporabnik registriral, kdaj so bili zadnji na spletnem mestu, nekaj informacij o njih, kot je biografija, časovni pas itd. Prav tako bomo morali posodobiti naš podajalni model, objavo, da bomo lahko upoštevali uporabniški model in pripisovali objave vsakemu uporabniku. Da bi to naredili, bomo posodobili modele.py v obeh aplikacijah. Začnimo z urejanjem modela krme. Zdaj bi moralo videti tako:
from django.db import models # … Uvoz
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Dodaj v to vrstico
Bodite pozorni na drugo vrstico, ki je bila dodana v datoteko. To je tuji ključ, ki bo vsako objavo pripisal enemu uporabniku na objavo, tako da lahko poskrbimo, da objave shranimo na osnovi uporabnika-PER in ni mogoče objaviti, ne da bi ga pripisali uporabniku. Ta tuji ključ definiramo z razredom, ki ga predstavlja, izbrisni argument, da zagotovimo, da se objave izbrišejo z uporabniki, ničelnimi in praznimi argumenti, da se prepričamo, da bomo lahko po potrebi odstranili uporabnika, in da bomo prilagodili pomanjkanje uporabnika na objavah, ki smo jih že ustvarili, in s tem povezanim imenom, ki ga lahko uporabimo za objekte, ki jih uporabi uporabnik. To povezano ime, za razliko od Post.author, avtor objave, nam daje uporabniku, ki je objavil objavo. Zdaj lahko dobimo objave, ki jih je uporabnik objavil z zagonom uporabnika.posts.all () ali avtor.posts.all ().
Zdaj pa naj bo naše prijave bolj odporno. Naše spletno mesto lahko že naredimo veliko manj ranljivo za lažno predstavljanje, če preprosto omejimo, kolikokrat bomo dovolili prijavo na spletno mesto, to je povsem enostavno. Začnimo tudi shranjevati nekaj informacij o vsakem uporabniku, ko še naprej razvijamo svojo aplikacijo. Urejanje uporabnikov/modelov.py, dodajte naslednjo kodo.
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='')
Upoštevajte, da je ta model dokaj podoben modelu Post. Imamo dodaten uvoz, TimeZone, ki nam bo omogočil nastavitev privzetih nastavitev na polja DateTime, poleg tega pa imamo tudi značaj in besedilno polje, kot je objava. Uporaba vseh teh časovnih žigov nam pomaga zagotoviti spletno mesto in razumeti njegovo uporabo, besedilna polja pa nam omogočajo, da na spletnem mestu prikažemo informacije o vsakem uporabniku ali avtorju. Onetoonefield bi moral biti edini manjši premislek, obnaša se popolnoma enako kot predhodnik, vendar z le eno na naslednjem modelu. Tako ima uporabnik samo en profil, medtem ko ima morda veliko objav.
Zdaj pa izboljšamo naša prijava in registrirajte poglede na račun profila. Najprej uredite uporabnike/poglede.py in se osredotočite na pogled registra:
# … Uvoz
Profile.objects.create(user=user) # Dodajte to vrstico, da ustvarite profil za uporabnika
To preprosto ustvari profil za uporabnika, ne da bi izpolnil katero koli od informacij. Zdaj želimo zagotoviti, da uporabniškega računa ni mogoče prepogosto prijaviti ali vsaj gesla ni mogoče preizkusiti prepogosto, zato posodobimo pogled za prijavo.
# … Uvoz
if user and user.profile.can_login < timezone.now(): # Upoštevajte, da zdaj preverimo, ali se lahko uporabnik prijavi
else: # Če prijava ni bila uspešna,
user = User.objects.filter(username=username).first() # To je del, kjer posodobimo profil uporabnikov
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Zato se ne morejo več prijaviti nekaj sekund
To je osnovni temelj varnosti. Prepričajte se, da spletno mesto ni ranljivo za nekoga, ki preprosto preizkuša vsako možno kombinacijo gesla ali celo nekaj hkrati. To ne bo frustrirajoče za navadnega uporabnika, ki pozna njihovo geslo in se samo prijavi na nekaj naprav, vendar bo iz aplikacije preprečil številne lažne robote. Upoštevajte, da smo dodali izjavo IF s spremenljivko, Can_login, ki bi moral biti čas v preteklosti, in ga posodobiti z vsako neuspešno prijavo z istim uporabniškim imenom. Tako zlonamerni uporabnik ne bo mogel uganiti gesla nikjer tako hitro. Število sekund v DateTime.Timedelta () je mogoče posodobiti tudi, spletno mesto pa bo z več sekundami bolj odporno, a nekoliko manj uporabno. Priporočam 15 za začetek.
Ne pozabite, da smo zgradili rezervni scenarij, da bomo rešili svoje delo, zato pojdimo naprej in varnostno kopiramo tisto, kar imamo do zdaj, da se prepričamo, da bomo vse rešili. Zaženite ukaz:
sudo backup
Še enkrat, to vam bo prihranilo do zdaj. Priporočam, da za shranjevanje svojega dela pripravite pogoste varnostne kopije, in morda boste celo samodejno želeli zagnati varnostno kopijo. To lahko storite s pomočjo Unix pripomočka, imenovanega Cron. Če želite aktivirati ta pripomoček, zaženite naslednji ukaz in vnesite geslo:
sudo crontab -e
Če še niste izbrali možnosti 1 za Nano, urejevalnik besedil, ki bi ga morali že poznati, in pomaknite se na dno datoteke s tipkami puščice. Dodajte naslednjo vrstico:
0 * * * * sudo backup
Cron uporablja format minuto, uro, dan v mesecu, mesec, dan v tednu, kjer * ali številka predstavlja, kdaj zagnati ukaz. Z uporabo 0 za minuto in * Za preostale možnosti lahko na začetku minute zaženemo ukaz v prvi minuti vsake ure. To nam omogoča samodejno varnostno kopiranje kode. Vsa Cronova opravila, ko jih izvajajo s Sudo Run kot Root, zato nam ne bo treba vsako uro vtipkati gesla.
Da bi olajšali varnostno kopiranje naše kode, ne da bi uporabili geslo, onemogočimo geslo za naš ukaz za varnostno kopiranje. To bomo storili tako, da bomo izvedli naslednji ukaz in vnesli geslo:
sudo visudo
Zdaj pa se pomaknimo na dno datoteke in dodajmo drugo vrstico:
ALL ALL=NOPASSWD: /bin/backup
To nam omogoča, da kot vsak uporabnik zaženete ukaz "varnostno kopiranje", brez gesla. Oblika za to je enostavna, samo predpono vrstico z "vse = nopasswd:/bin/" in konča z ukazom, na primer/bin/varnostno kopijo, ki obstaja v/usr/bin/.
Zdaj pa začnimo sodelovati z e -pošto. E -pošta je zelo pomembna za spletna mesta, saj je način, da spletno mesto ohranjate bolj varno, preverite, ali so uporabniki resnični ljudje in celo tržijo izdelke ali storitve strankam. Mnogi ljudje, ki pogostijo internet, vsak dan preverjajo svojo e -pošto in prejemajo vse vrste marketinške e -pošte o izdelkih in storitvah, ki jih zanimajo. Obstaja nekaj možnosti, ko gre za omogočanje e -pošte na spletnem mestu Django, in dobrodošli, da izberete, kar vam najbolj ustreza.
Najprej lahko plačate za e -poštno storitev, ki vam bo omogočila pošiljanje e -pošte iz vaše domene in zahteva minimalno kodo. Obstaja veliko storitev, ki to ponujajo, kot so Google Workpace, SendInBlue, Mailgun in še več.
V nasprotnem primeru dobro ne gradite lastne e -poštne storitve znotraj strežnika iz nič. Priporočam to možnost, čeprav gre za več kode in morda zahteva posebno gostovanje. Najverjetneje ne boste mogli zagnati poštnega strežnika iz domačega računalnika, zato pojdimo naprej in pregledamo konfiguracijo in kodo, da pošljemo e -pošto, preden začnemo strežnik v oblaku in ustvarimo svoj poštni strežnik.
Najprej uredite nastavitve.py z naslednjim ukazom:
nano app/settings.py
Kjer je aplikacija ime aplikacije, ki ste jo ustvarili z zagonom.
Dodajte naslednje vrstice:
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)
Prepričajte se, da jih spremenite, ko boste pripravljeni namestiti svojo aplikacijo, to bomo pozneje ponovno pregledali. Nastavitev email_address bi morala biti e -pošta, ki jo želite poslati, geslo (email_host_password) pa mora biti nastavljeno na geslo, ki ga ustvarite za strežnik. Geslo naložim iz konfiguracijske datoteke, da ga ne izstopim iz kode z naslednjo logiko, nad temi vrsticami v nastavitvah.py:
import os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
Nato sem s konfiguracijo v /etc/config.json s pomočjo nano nastavil datoteko JSON.
Za urejanje datoteke:
sudo nano /etc/config.json
Dodajte naslednje vrstice:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
Še naprej bomo urejali konfiguracijsko datoteko in dodali vsa gesla in ključe, ki jih bomo uporabili v aplikaciji. Za zdaj hitro preučimo, kako poslati e -pošto s pomočjo Pythona. Najprej ustvarimo predlogo za preverjanje e -poštnega sporočila, ki ga lahko pošljemo uporabnikom, in jo damo v imenik uporabniških predlogov. Ta predloga bo napisana v HTML.
nano users/templates/users/verification_email.html
To e -poštno sporočilo je dokaj preprosto. Potreben je kontekst uporabnika, osnovni URL za spletno mesto ter uporabniški ID in žeton, ki se uporabljata za preverjanje e -poštnega sporočila uporabnika. Preden napišemo nekaj pythonovega kode, za prikaz predloge določite osnovni URL v nastavitvah.py. Pojdite naprej in dodajte naslednje vrstice v App/Settings.py, blizu začetka.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
Sčasoma, ko je vaše spletno mesto pripravljeno na internet in ga namestite, boste želeli določiti svojo domeno kot ime domene, ki ga kupite, da zastopate spletno mesto. To je ime, ki ga boste vtipkali v Navbar za dostop do vašega spletnega mesta. Za zdaj lahko domeno pustite prazno ali uporabite rezervoar. Prav tako boste želeli spremeniti spletno mesto v ime, ki ga želite dati svoje spletno mesto, po svoji izbiri.
Preden pošljemo e -pošto, ustvarimo generator žetona, da bomo lahko imeli žeton za aktiviranje računa, ki nikoli ne poteče. To lahko storimo z gradnjo in uvozom žetona za aktiviranje računa, ki je videti kot naslednje. Uredi datoteko:
nano users/tokens.py
Dodajte naslednjo kodo:
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()
Ta osnovni generator žetona ustvari žeton, ki ga lahko pošljemo v URL in uporabnik lahko uporabi za preverjanje e -pošte in aktiviranje njihovega računa.
Nato poglejmo, kako poslati e -pošto. Z Nano, uredite uporabnike/e -pošto.py.
nano users/email.py
Pošiljanje preverjanja HTML e -poštnega sporočila bo videti tako:
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)
To je dokaj preprosto. Uvozimo funkcije, ki jih moramo poslati po e -pošti, po e -pošti z predlogami in našimi nastavitvami, nato pa e -poštno sporočilo določimo po imenu predloge in ga pošljemo uporabniku s funkcijo. Opazili boste, da funkcije nismo opredelili za pošiljanje pošte, send_html_email, zato to napišite pod kodo, ki smo jo že dodali uporabnikom/e -pošto.py
def send_html_email(user, mail_subject, html_message):
to_email = user.email
username = user.username
if to_email == '':
return None
unsub_link = settings.BASE_URL + user.profile.create_unsubscribe_link()
html_message = html_message + "<p><a href=\"" + unsub_link + "\" + title=\"Unsubscribe from " + settings.SITE_NAME + " emails\">Unsubscribe</a></p></body></html>"
msg = EmailMultiAlternatives(mail_subject, strip_tags(html_message), settings.DEFAULT_FROM_EMAIL, [to_email], headers={'List-Unsubscribe' : '<' + unsub_link + '>'},)
msg.attach_alternative(html_message, "text/html")
profile = user.profile
try:
msg.send(fail_silently=False)
if not profile.email_valid:
profile.email_valid=True
profile.save()
except:
profile.email_valid=False
profile.save()
To je nekoliko bolj zapleteno in še nismo pripravljeni zagnati vse te kode. Opazite, da definiramo unUb_link, povezavo, ki jo lahko uporabnik uporabi za odjavo iz naših e -poštnih sporočil. To je pomembno, saj se bodo uporabniki morali kadar koli odpovedati naša e -poštna sporočila, razen če jih želijo videti. V naše sporočilo dodamo tudi besedilno alternativo, ki je HTML sporočilo, odvzeto z oznakami HTML. Nazadnje preverimo, ali je e -poštno sporočilo poslano, in če ne, v uporabnikovem profilu označimo, da njihov e -poštni naslov ni veljaven.
Pojdimo nazaj na uporabniške modele, da bomo lahko vse to delovali. Določiti moramo funkcijo, da ustvarimo povezavo do odjave in določimo logično polje, da označimo, da uporabnikovo e -poštno sporočilo ni veljavno.
Najprej dodajte naslednji uvoz na vrh uporabnikov/modelov.py
nano users/models.py
# ...
Nato dodamo funkcije uporabniškemu modelu, da izdelamo žeton, in preverimo žeton, ki se uporablja za aktiviranje e -poštnega sporočila, ter polje, da shranimo, ali uporabnik uspešno prejema svojo pošto. V uporabnikih/modelih.py znova dodajte naslednjo kodo na konec modela (vpisana koda)
# ...
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Velja za 30 dni
To je dokaj preprosto, uporabljamo časovni žig, ki je osnovno orodje za kriptografijo, da ustvarimo žeton, ki bo potekel po določenem času, poleg tega pa uporabimo tudi drugo funkcijo, da preverimo, ali je veljavna. Te žetone uporabljamo dvakrat, enkrat za preverjanje e -pošte in enkrat za povezavo odjava.
Zdaj, ko jih imamo, je zadnje delo, ki ga bomo morali opraviti, v pogledih. Znotraj uporabnikov/pogledov.py, dodajmo poglede, da preverimo e -poštni naslov in se odjavimo.
nano users/views.py
Najprej dodajte naslednji uvoz. Vrgel sem nekaj dodatkov, da nam pozneje ne bo treba več uvoziti več predmetov.
from .email import send_verification_email # Prepričajte se, da uvozite funkcijo pošiljanja e -pošte za preverjanje
Morda že imate nekaj teh uvoza, vendar jih ne boli, če bi jih ponavljali. Morali boste uvoziti funkcijo pošiljanja e -pošte za preverjanje in med drugim uvozom Account_activation_Token od uporabnikov.tokens.
Zdaj na dnu datoteke dodajte naslednjo kodo:
# odjavite jih
# V nasprotnem primeru preusmerite na stran za prijavo
# SendwelcomeEmail (zahteva, uporabnik)
To je veliko kode. Razčlenimo. Prva funkcija, čista in preprosta, odjavi uporabnika s poštnega seznama. Druga funkcija aktivira njihovo e -pošto in opazili boste, da sem dodal komentirano funkcijo SendwelcomeEmail. Za pošiljanje e -pošte za dobrodošlico in definicijo funkcije lahko uporabite e -poštno predlogo in definicijo funkcij, preprosto še nisem. Zadnja funkcija, ki sem jo vrgel, je pomembna, ker se potujejo e -poštna sporočila. Zato bomo morali nekaj časa ponoviti e -pošto z aktivacijo. Za to lahko uporabimo osnovni obrazec in pokličemo funkcijo za pošiljanje e -poštnega sporočila. Preden to storimo, poskrbimo, da ga bomo poslali na prvo mesto, tako da dodamo funkcijski klic v pogled registra. Dodajte to vrstico tik pred preusmeritvijo v pogled registra, def register, v uporabnikih/pogledih.py.
nano users/views.py
# … (Po) register def (zahteva):
# … (Prej) preusmeritev (
Ni vam treba dodati prve in zadnje vrstice v tem odlomku za kodo, le prepričajte se, da pogled registra uporabniku pošlje e -poštno sporočilo za preverjanje. Bi moralo videti tako:
# … Uvoz
send_verification_email(user) # Ne pozabite dodati to vrstico!
Zdaj bomo morali dodati obrazec, da bomo ponovili e -poštno sporočilo aktivacije. V uporabnike/obrazci.py dodajte naslednji obrazec:
# … (Uvoz)
Potrebovali bomo tudi predlogo, ki ustreza temu obrazcu za aktiviranje e -pošte. Dodajmo to predlogo v. Uredi datoteko:
nano users/templates/users/resend_activation.html
Nato v datoteko dodajte naslednjo kodo.
Whew, to je veliko! Zdaj, ko bomo kodo namestili na naš strežnik, bomo lahko poslali HTML e -pošto in aktivirali uporabniške račune s klikom v e -pošti. Morda bi radi poslali tudi preprosto dobrodošlico, zato poglejmo, kako to storiti. Nazaj v uporabnike/email.py, dodajte naslednjo kodo:
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)
Prav tako bomo potrebovali predlogo, da bomo vse te podatke predstavili. Na mojem spletnem mestu je predloga videti spodaj, vendar jo lahko formatirate, kakor želite.
Upoštevajte, da nimamo zapiralnih telesnih ali HTML oznak, ker jih dodamo, ko dodamo povezavo HTML Unmubscribe. Te so pomembne, vendar jih ne želimo dvakrat opredeliti.
Torej, kaj je naslednje? Dolgo smo prišli. Res bi morali biti pripravljeni, da spletno mesto namestimo na strežnik. Dodamo lahko dekorater @Login_required in naredimo naša poglede, se lotimo prijav uporabnikov, pošljemo skladno e -pošto in predpomnilnike, kar je osnova tega, kar mora spletna stran storiti, da ostane ustrezno. Dodali bomo še nekaj uporabnih funkcij in nato sestavili osnovo za uvajanje naše kode na oddaljeni strežnik, nastavili poštni strežnik, konfiguracijo domene in filtre, da bo naše spletno mesto varno in primerno.
Potrebovali bomo tudi pogled za ponastavitev gesla, zato to dodajmo v resnici hitro. Django vgrajen pogled na ponastavitev gesla je pokvarjen v nekaterih funkcijah, vendar si bomo ogledali, kako napisati svoj pogled, predloge po e -pošti, obrazci in vzorce URL -jev. Evo, kako izgleda pogled, v uporabnikih/pogledih.py
# ... uvoz
Ta obrazec je vgrajen v Django, vendar bomo potrebovali predlogo za potrditev ponastavitve gesla, uporabnikov/predloge/uporabnikov/password_reset_confirm.html
Imamo tudi predlogo za pošiljanje e -pošte za ponastavitev gesla s preprostim obrazcem v uporabnikih/predlogih/uporabnikih/password_reset.html
Predloga za samo e -poštno sporočilo je preprosta, je osnovna datoteka HTML, ki prikazuje povezavo za ponastavitev gesla, v uporabnikih/predloge/uporabniki/password_reset_email.html. Django bo samodejno razlagal to datoteko.
Potrebovali bomo tudi še dve predlogi. Prva je potrditi, da je bilo poslano e -poštno sporočilo. Pogledi za to so že v Djangu, zato jih moramo le nasloviti na URLS.PY. Ta predloga se nahaja pri uporabnikih/predlogih/uporabnikih/password_reset_done.html
In nazadnje, da potrdite, da je ponastavitev gesla končana, uporabniki/predloge/uporabniki/password_reset_complete.html
Zdaj potrebujemo vzorce URL za te poglede. V uporabnike/urls.py dodajte naslednje vzorce URL:
# ... Prejšnji URL -ji tukaj
Štiri predloge, to je veliko! Zdaj pa smo lahko prepričani, da bomo lahko ponastavili uporabnikovo geslo kadar koli, kar moramo, vse iz spletnega brskalnika.
Razumem, da je to veliko kode. Če se vam zdi malo nad glavo, je to v redu. Izboljšali se boste, vaše razumevanje se bo izboljšalo in zelo kmalu boste postali veliko bolj kompetentni s kodo. Če ste popolnoma izgubljeni, priporočam, da se pozneje vrnete na to programsko opremo, potem ko delate na samostojnem tečaju, naučite se kodirati na spletu. Običajno lahko začnete in vas bodo vodili skozi vse, kar potrebujete za uspeh, ko se vrnete na ta projekt. Če se vam zdi, da ste pripravljeni za nadaljevanje, preberite naprej, bomo pokrili kodo na oddaljeni strežnik in nastavili poštni strežnik, pa tudi samodejno uvajanje z uporabo Bash -a, tako da lahko vedno nastavite nov projekt z nekaj preprostimi ukazi.
Zadnja stvar, ki jo moramo storiti pred namestitvijo na oddaljeni strežnik, je, da je naše spletno mesto nekoliko bolj varno. Opazili boste, da pogled za prijavo vzame samo uporabniško ime in geslo, in ni več faktorjev ali ene časovne kode. To je enostaven popravek in z isto kodo lahko naše spletno mesto pošljemo besedilna sporočila in se celo odzivamo na besedilna sporočila, poslana strežniku. Za začetek se bomo vrnili v uporabniške modele in dodali podpisnika časovne žige, ki bo predstavljal vsako prijavo. Uporabniškemu modelu bomo dodali tudi edinstven, vrtljivi identifikator, ki bo uporabljen za dodajanje dodatne varnosti v našo prijavo. Urejanje uporabniških modelov, uporabnikov/modelov.py, dodajte naslednjo kodo:
# Prepričajte se, da uvozite podpisnike UUID, časovni žig in generator URL -jev (obratno)
# Tukaj dodajte to kodo
# In dodaj to funkcijo
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Velja 3 minute
Prepričajte se, da vaši uporabniki/modeli.py poleg komentarjev izgledajo takole (koda v vrsticah z #). Razčlenitev tega je preprosto. Imamo nekaj uvoza, časovni žig, ki je kriptografski pripomoček, ki lahko ustvari varno kodo in jo preveri, da se prepriča, da je veljavna, bila uporabljena le enkrat in ne starejša od določenega števila sekund. Uporabljamo tudi UUID, ki je edinstven identifikator, ki identificira našega uporabnika pri podpisu žetona, in v URL -ju, kjer se žeton pošlje uporabniku. To osnovno kriptografijo bomo uporabili za izdelavo pogleda dveh faktorjev. Preden naredimo kaj drugega, zaženemo migracije, tako da se naši uporabniški modeli posodabljajo. V imeniku z upravljanjem.py zaženite naslednje ukaze, da naredite in dokončate migracije.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
To je pomembno, ker bomo vsakič, ko bomo spremenili modele, morali ustvariti tabele in posodobiti bazo podatkov s privzetimi nastavitvami, preden bomo lahko dejansko uporabili modele.
Nato improviziramo naš pogled za prijavo, da preusmerimo na pogled sekundarne pristnosti. V uporabnikih/pogledih.py odstranite funkcijo za prijavo in preusmerite na URL, ki smo ga pravkar ustvarili v uporabniških modelih.
# … Uvoz
if user and user.profile.can_login < timezone.now(): # Upoštevajte, da zdaj preverimo, ali se lahko uporabnik prijavi
# Odstranite funkcijo auth_login, ki je bila tukaj
return redirect(user.profile.create_auth_url()) # Opomba Tukaj preusmerimo na nov URL
else: # Če uporabnik ne uporablja večfaktorske overjenosti, jih preprosto prijavite.
else: # Če prijava ni bila uspešna,
user = User.objects.filter(username=username).first() # To je del, kjer posodobimo profil uporabnikov
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Zato se ne morejo več prijaviti nekaj sekund
Torej, to je precej preprosto, zdaj imamo način, da preusmerimo na dva faktorska overjanje, ko ga ustvarimo. Prav tako imamo na voljo, če uporabnik ni dodal telefonske številke. Dodali bomo osnovni pogled, da bomo kmalu dodali telefonsko številko in se kmalu prijavili z besedilnim sporočilom.
Najprej potrebujemo enostaven način za pošiljanje besedilnega sporočila iz naše kode. Če želite to narediti, lahko izbiramo med številnimi API -ji, vendar je po mojem mnenju najlažji Twilio. Ponujajo tudi dobre cene za manjše projekte, pa tudi v velikem obsegu. Ustvarite račun na twilio.com, izpolnite nekaj podrobnosti o svojem projektu, kupite telefonsko številko in kopirajte ključe API -ja na vaše nastavitve.py. Nato dodajte to kodo pod novo datoteko, uporabniki/sms.py.
nano users/sms.py
# Uvozite vse potrebne pakete
# Ta koda pošlje besedilo s twilio
# Pomoč pri pridobivanju številke s toliko števkami
# Pošljite besedilo, da preverite uporabnika
# Uporabniku pošljite katero koli besedilo s to funkcijo
# Preverjanje kode s to funkcijo
# Potrdite čas
Bodite prepričani, da ustrezno spremenite svoje nastavitve in dodajte te vrstice s tipkami:
# Prepričajte se, da jih kopirate s svoje armaturne plošče Twilio
AUTH_VALID_MINUTES = 3 # Število minut strani TFA je aktivna, ko je sprožena
Najprej bomo potrebovali obrazce za naša dva dejavnika overjanja. Urejanje uporabnikov/obrazcev.py, dodajte naslednjo kodo.
# … Uvoz
# Obrazec za vnos naše telefonske številke
# Obrazec za overjanje
Nato ustvarimo poglede v uporabnikih/pogledih.py
# … Uvoz
Za oba stališča bomo potrebovali tudi predloge. Najprej dodamo predlogo MFA.
nano users/templates/users/mfa.html
V predlogo dodajte to kodo HTML
To je precej samoumevno. Obrazec pošlje bodisi kodo ali prazno kodo in v pogledu boste opazili kodo, če prejmemo prazno kodo. Potem imamo samo dva gumba za oddajo in tako lahko kodo pošljemo z katerega koli gumba. Nato bomo dodali preprost obrazec za dodajanje telefonske številke.
nano users/templates/users/mfa_onboarding.html
Dodajte naslednji HTML:
Ta obrazec je veliko enostavnejši, samo izdela obrazec telefonske številke, ki smo ga ustvarili, in uporabniku omogoča, da doda telefonsko številko.
To izgleda res dobro! Dokler je vse pravilno nastavljeno, bi morali imeti možnost, da pošljemo sporočila in uporabniku prijavite s svojo telefonsko številko, takoj ko dodamo vzorce URL -ja. Zadnja stvar, ki jo moramo nastaviti, je pogled na profil, tako da lahko poskrbimo, da lahko uporabnik spremeni svojo telefonsko številko, ne da bi bil prijavljen. Prav tako bomo sčasoma želeli dodati možnost "STOP TO HIT", tako da lahko uporabnik pošlje "STOP", da se izklopi prihodnjih besedilnih sporočil.
Uporabnikom/pogledom.py dodajmo pogled profila. Ta pogled bo posodobil uporabnikovo življenje, e -pošto, uporabniško ime in telefonsko številko ter nam omogočil, da omogočimo preverjanje pristnosti več faktorjev. Najprej bomo potrebovali še dva obrazca v uporabnikih/obrazcih.Py
# ... uvoz
Nato lahko ustvarimo pogled za uporabo obeh teh obrazcev. Uredite uporabnike/views.py in dodajte pogled.
# Dodajte ta uvoz
Za ta pogled bomo potrebovali tudi predlogo.
nano users/templates/users/profile.html
Opazili boste, da gre za dokaj preprost obrazec, vendar ima v njem nekaj JavaScripta, ki samodejno objavi vsebino obrazca, ko so posodobljeni. To je koristno imeti, zato lahko urejate, ne da bi morali vsakič pritisniti.
Nato potrebujemo URL, ki predstavljajo vse te poglede v uporabniških URL -jih. Uredite uporabnike/urls.py in dodajte to kodo:
# … Prejšnja koda, uvozi
# … URL vzorci, ki smo jih prej vnesli, dodajte naslednje tri vrstice
Zdaj je pravi čas, da preizkusimo naš projekt. Najprej pa zaženemo še eno varnostno kopijo.
backup
In zaženite strežnik. Preden se napotimo na strežnik Linux, je dobro, da na računu omogočite dve faktorski overjenost. To bomo storili na našem URL -ju profila,/uporabniki/profil/in preverili polje, da omogočite overjanje po vnosu naše telefonske številke in nato oddajo obrazec.
python manage.py runserver localhost:8000
Obiščite spletno stran, tako da obiščete vaš spletni brskalnik, v tem primeru uporabljam Google Chrome in vpišem URL https: // localhost: 8000/računi/profil/profil/profil/
Po potrebi se boste lahko prijavili in omogočili dve faktorski overjenost.
Ta projekt potrebuje strežnik za zagon, da lahko resnično pošlje pošto. Najprej pa potrebujemo način, kako videti napake. Opazili boste, da če strežnik zaženete v načinu za odpravljanje napak, z nastavitvami.debug, ki je enako TRUE, strežnik samodejno prikazuje napake. Če želite prikazati napake brez uporabe načinov za odpravljanje napak, ki je nevaren na proizvodnem strežniku, bi morali zanj dodati pogled. Najpomembnejše napake, ki jih moramo rešiti, so:
Napaka 500 - težava z našo kodo Napaka 404 - stran, ki ni bila najdena (pokvarjen URL) Napaka 403 - Dovoljenje zavrnjena napaka
Dodajmo novo aplikacijo za reševanje teh napak, imenovane napake.
python manage.py startapp errors
To dodajte v nastavitve.py, kot smo to storili prej, v nastavitvi nameščenih_apps in začnite z dodajanjem referenc v nekatere poglede v aplikaciji/urls.py, kjer je aplikacija ime vašega projekta Django.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
To je vse, kar potrebujemo, poleg pogledov napak, predloge in malo vmesne programske opreme. Določimo jih tako:
# Ustvarite svoje poglede tukaj.
Nato določimo vmesno programsko opremo za reševanje teh napak. To bomo storili tako, da bomo v Settings.py najprej dodali v Middleware_Classes z imenom naše vmesne programske opreme.
# ... prejšnja vmesna programska oprema
Nato dodajmo vmesno programsko opremo.
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.')
Dodamo funkcijo, da dobimo trenutno izjemo z uporabo lokalnega navoja, ki nam pomaga izslediti morebitne napake v naši kodi. Glede na predloge potrebujemo le enega, ker dinamično definiramo naslov v pogledu. Predloga mora samo izstaviti naslov in "sled", naše napake iz konteksta.
nano errors/templates/errors/error.html
To je naša najpreprostejša predloga doslej, toda tako enostavno je videti napake v našem projektu. Nato onemogočimo odpravljanje napak v nastavitvah.
nano app/settings.py
Poiščite to vrstico, kjer je nastavljena na resnično, in jo spremenite v napačno
DEBUG = False
Pojdi naprej in zdaj varnostno kopirajte aplikacijo. Pripravljeni smo namestiti na oddaljeni strežnik Linux in od tam še naprej dodajamo funkcije.
sudo backup
Preden to kodo objavimo na strežniku, bi morali upoštevati, da lahko s kodo obstaja nekaj težav. Glede na primer bodo spletna mesta, ki sprejemajo informacije, objavljena z neželeno pošto in težave z odstranjevanjem neželene pošte. To se ne bi smelo zgoditi takoj, toda če se dogaja, bomo pozneje preučili, kako samodejno moderirati neželeno pošto na spletnem mestu in za robote otežilo dostop do spletnega mesta, skupaj s tem, kako deaktivirati uporabniške račune in preveriti identiteto uporabnika s skeniranjem njihovega ID -ja ali biometričnega skeniranja, kot je prepoznavanje prsta ali obraza.
Če pogledamo primer pristnosti več faktorjev, ki smo ga pregledali v proizvodnji, so stvari lahko drugačne. Opazite, kako omejujemo prijave, in potečemo žetone. Če roboti dostopajo do spletnega mesta, je lahko dve faktorski overjenosti težje, saj lahko vpišeta kode hkrati, ko je uporabnik. Za boj proti temu uporabimo model v uporabniških modelih in razglasimo, kako komuniciramo s spletnim mestom, ko pristnosti z uporabo večnamenske overjanja s telefonsko številko. Dodali bomo tudi možnost za preverjanje pristnosti z e -pošto. Začnite z urejanjem uporabniških modelov z nano.
nano users/models.py
To bi moral izgledati model, ki ga dodajamo. Ne potrebujemo nobenih metod, samo spremenljivke za shranjevanje ID -ja, uporabnika, časovne žige, izteka, dolžine in poskusov kakršne koli več faktorje (koda, kot je 123456, poslana na telefon ali e -pošto).
# Osnovni žeton, ki se uporablja za prijavo na spletno mesto
Dodajmo tudi privilegij našemu uporabniku in za zdaj ga bomo nastavili ročno, preden se bomo na koncu selili v samodejno prijavo privilegiranih uporabnikov. V uporabniške modele dodajte to vrstico v profil:
vendor = models.BooleanField(default=False)
Kot pri vseh spremembah baze podatkov moramo tudi migracije in migrirati bazo podatkov kadarkoli urejamo datoteko modelov.py v djangu. Ne pozabite, da najprej uporabimo vir (če je bil že odprt, ko je bil terminal odprt), nato pa Python Manage.py za migracije in selitev.
cd project-directory-you-named # (po potrebi)
Za zdaj lahko s pomočjo lupine prijavite vse račune, ki ste jih ustvarili kot prodajalce.
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Zdaj pa razvijamo naš več faktorjev pogled za uporabo tega žetona. Najprej moramo spremeniti svoje pripomočke za pomoč MFA. Uporaba nano,
nano users/mfa.py
from django.utils import timezone
import random
import datetime
from django.conf import settings
from feed.middleware import get_current_request
from django.contrib import messages
from .email import send_html_email
import traceback
from .models import MFAToken
account_sid = settings.TWILIO_ACCOUNT_SID
auth_token = settings.TWILIO_AUTH_TOKEN
source_phone = settings.PHONE_NUMBER
def send_text(target_phone, text):
from twilio.rest import Client
try:
client = Client(account_sid, auth_token)
if len(target_phone) >= 11:
message = client.messages.create(
to=target_phone,
from_=source_phone,
body=text + ' Text STOP to cancel.')
except:
messages.warning(get_current_request(), 'There was an error sending the message.')
print(traceback.format_exc())
def get_num_length(num, length):
n = ''
for x in range(length):
n = n + str(num)
return int(n)
def send_verification_text(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_user_text(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)))
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
def send_user_text(user, text):
send_text(user.profile.phone_number, text)
def check_verification_code(user, token, code):
token.attempts = token.attempts + 1
profile = user.profile
result = (token != None and code != '' and token.token == code and (token.expires > timezone.now()) and token.attempts <= settings.MFA_TOKEN_ATTEMPTS)
if token.attempts < 3 and result:
profile.verification_code_length = 6
elif token.attempts > 1 and not result:
profile.verification_code_length = profile.verification_code_length + 2
if profile.verification_code_length > settings.MFA_TOKEN_LENGTH: profile.verification_code_length = settings.MFA_TOKEN_LENGTH
token.save()
profile.save()
return result
# Uporabnik preverite s svojo e -poštno ali telefonsko številko
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Žeton filtrirajte z vrednostjo, ki je bila prenesena v URL (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)) # Če ta seja ni bila ustvarjena, jo ustvarite
user = User.objects.filter(id=token.user.id).first() # Pridobite uporabnika iz žetona
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Če so že overjeni, jih prijavite
if not user: raise PermissionDenied() # Zanikajo, če uporabnika ni bilo mogoče najti
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Preverite žeton auth
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Prijavite se uporabnika, če še niso prijavljeni
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Nastavite iztek na njihovo preverjanje pristnosti več faktorjev
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Preusmerite uporabnika na naslednjo stran
if not user.profile.mfa_enabled: # Preverite, ali je MFA omogočena
if not check_verification_time(user, token): # Preverite čas
user.profile.mfa_enabled = False # Očistite telefonsko številko
user.profile.enable_two_factor_authentication = True # Omogoči MFA
user.profile.phone_number = '+1' # Onemogoči telefonsko številko
user.profile.save() # Shranite profil
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Uporabnik prijavite, če njihov MFA ni omogočena
if request.method == 'POST' and not fraud_detect(request, True): # Če je zahteva zahteva
form = TfaForm(request.POST) # Instancite obrazec
code = str(form.data.get('code', None)) # Pridobite kodo
if code and code != '' and code != None: # Prepričajte se, da ni prazen
token_validated = user.profile.check_auth_token(usertoken) # Preverite žeton auth
is_verified = check_verification_code(user, token, code) # Preverite kodo
if token_validated: # Če vse
if is_verified: # Je v redu
user.profile.mfa_enabled = True # Omogoči MFA (če še ni omogočena)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Prijavite se v uporabnika
for key, value in request.GET.items(): # Zgradite poizvedbo za naslednji parameter (če obstaja)
return HttpResponseRedirect(next) # Preusmeritev
elif not token_validated: # Če je bil žeton neveljaven
if p.mfa_attempts > 3: # Če bi bilo preveč poskusov
if form.data.get('send_email', False): # Pošljite e -pošto (ali besedilo)
# Izpostavite obrazec (za pridobivanje zahtev)
Ko dodajamo to kodo, se prepričajte, da uvozite funkcijo za pošiljanje e -pošte. Na vrhu datoteke uporabniški pogled (z drugimi uvozi) dodaj
from .mfa import send_verification_email as send_mfa_verification_email
Zdaj moramo to funkcijo napisati, preden bo katero koli od tega delovalo. Morala bi razširiti našo funkcijo pošiljanja e -pošte in preprosto poslati e -poštno sporočilo uporabniku s kodo za preverjanje.
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))
Torej to vse deluje odlično, zdaj imamo sistem za preverjanje pristnosti z več faktorji, ki je odvisen od telefonske številke ali e -pošte, da se prijavite. Vendar pa potrebujemo tudi način, kako odstraniti ali vsaj skrivati uporabnike, ki ne sodelujejo z našimi pogoji. To bi lahko bili neželeni pošti, roboti ali vsi, ki za naše delo ne pomenijo dobro. Oglejte si pogled, ki ga imam za spremljanje uporabnikov na mojem spletnem mestu:
# uvoz
from .tests import is_superuser_or_vendor # Ta test bomo morali ustvariti
# Pridobite seznam uporabnikov
return render(request, 'users/users.html', { # Vrnite uporabnike v predlogo
Upoštevajte, da ta koda uporablja test, ta test bomo morali razglasiti v datoteki testov.py in ga uvoziti. Urejanje uporabnikov/testov.py, ustvarimo test.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
To je v povezavi s predlogo za uporabnike/uporabnike.html, ki je videti takole:
Upoštevajte, da predloga vključuje drugo predlogo, uporabniki/User.html. Pri uporabi predloge, ki ima podtemno ploščo in ne uporablja razširitve, je dobra ideja, da dodate podčrtano () pred imenom datoteke, da se razširi, da se loči predloge.
Upoštevajte, da je to veliko Jinja, morda ne boste definirani vseh teh spremenljivk. Toda tako izgleda moja koda.
<small># {{user.id}} </small>
Potrebujemo tudi drugo podtem, toggle_active.html. Ta predloga mora biti obrazec, ki nam omogoča, da preklopimo, ali je uporabnik aktiven.
Prav tako bomo morali dodati pogled na preklop uporabniške aktivnosti in ustrezne vzorce URL -jev. Medtem ko smo že pri tem, dodajmo pogled, da izbrišemo uporabnika, če to potrebujemo.
# Uvoz
success_url = '/' # Preusmeritev URL uspeha
def test_func(self): # Test, če je uporabnik superiser in ima dovoljenje za brisanje
Čeprav je to praktično, kadar je to potrebno, brisanje uporabnika ne bi smelo biti potrebno večino časa, lahko preprosto preklopimo prepoznavnost uporabnikov, ki obiščejo spletno mesto, če jih moramo zavrniti.
Vzorci URL, ki smo jih dodali, izgledajo tako. Z Nano uredite uporabnike/urls.py in dodajte te vrstice:
nano users/urls.py
Vrstice bi morale biti na seznamu poti v pogledih uporabnika, pred koncem "]", vendar po začetku "[".
# ...
# ...
Zdaj se prepričajte, da varnostno kopirate spletno mesto, da ga boste lahko prenesli na spletni strežnik, na katerem bomo še naprej delali. Iz ukazne vrstice,
sudo backup
Zdaj je naše spletno mesto varnostno kopirano.
Zdaj imamo še nekaj uporabnih funkcij. Kaj pa velika slika tukaj? Ta koda še vedno ni dostopna iz interneta, še nimamo poštnega strežnika in razširiti moramo našo aplikacijo, da vključimo celovit postopek preverjanja in gladke postavitve, ki nam bodo pomagale raziskati spletno mesto, skupaj z varnimi protokoli za preverjanje pristnosti privilegiranih uporabnikov.
Prišli bomo do vsega tega. Za zdaj bo najpomembnejše samo to kodo na spletu, kar lahko naredimo s samo nekaj vrsticami basha na strežniku Ubuntu. Za to boste morali najeti strežnik, razen če imate doma strežnik in naročnino na poslovni internet, ki vam omogoča odpiranje vrat. Osebno vodim svoje spletno mesto na HP Z440, ki je nameščen v mojem stanovanju, vendar je običajno veliko ceneje za osnovne potrebe za najem virtualnega zasebnega strežnika (VPS).
Upoštevajte, da je koda, ki jo zdaj izvajamo, razmeroma tanka, jo bo treba vzdrževati in izboljšati, preden bomo pripravljeni uporabiti tisto, kar moramo izdelati izdelek. Prepričajte se, da bodite previdni, kaj počnete z internetom, se prepričajte, če to spletno mesto javno namestite v splet na Linux strežniku, imate načrt, da s svojim spletnim mestom blokirate neželene interakcije. To verjetno sprva ne bo problem, vendar bomo preučili različne rešitve za boj proti temu, vključno s strojnim učenjem, umetno inteligenco in računalniškim vidom. Ko to postane težava, poglejte v tem besedilu za rešitev.
Glede najemanje VPS je veliko krajev, ki jih lahko obiščete. Google Cloud ima VPS strežnike, ione, Kamatera, Amazon AWS, več ponudnikov pa ponuja rešitve strežnika v oblaku, ki bodo ustrezale našim potrebam.
Klikteli boste morali skozi njihove obrazce in izbrati načrt za začetek. Lahko se odpravite z osnovnim načrtom s katerim koli ponudnikom, vendar se prepričajte, da vam ponudnik omogoča odpiranje vrat strežnikov Port Mail za pošiljanje e -pošte (to bi moralo biti vrata 587 in vrata 25), nekateri ponudniki blokirajo ta vrata. Do zdaj sem imel najboljše izkušnje z Ionosom in Kamatera, oba mi bosta omogočila, da pošljem neomejeno e -pošto in njihove cene so precej poceni.
Povezali se boste z novim strežnikom prek protokola, imenovanega SSH ali Secure Shell, ki vam omogoča, da iz osebnega računalnika na daljavo povezujete s strežnikom, kot je vaš osebni računalnik. Ko nastavite strežnik, vas bo ponudnik gostovanja verjetno prosil, da dodate ključ SSH, ali pa vam bo dal uporabniško ime in geslo. Ključ SSH je, kako se boste prijavili v strežnik iz ukazne vrstice za urejanje kode. Uporabite spodnje možnosti SSH-KeyGen, da ustvarite tipko SSH.
ssh-keygen
Če želite, shranite datoteko in jo prepisujte, dobro je, da zavrtite ključe SSH, če še niste. Zdaj lahko uporabite naslednji ukaz za ogled ključa SSH. Želeli ga boste kopirati na svoj oddaljeni strežnik, da ga lahko uporabite za preverjanje pristnosti.
cat ~/.ssh/id_rsa.pub
Če niste mogli videti ključa SSH, ko vtipkate ta ukaz (dolg niz števk in črk, ki se začne z "SSH-RSA AAA"), poskusite ustvarjati ključ RSA (so bolj varni, zato svetujem, da jih uporabite.) Naslednja koda bo ustvarila 4096-bitni RSA ključ RSA SSH.
ssh-keygen -t rsa -b 4096
Ustvarite VPS, ki vodi Ubuntu, vendar nameravate to storiti. Ko ustvarite VPS s klikom na obrazce na spletnem mestu ponudnikov (kamatera.com, ionos.com ali podobno), se boste želeli prijaviti. Če želite to storiti, uporabite ukaz SSH z naslovom IP (naslov, ki je videti kot xx.xx.xx.xx). Prav tako boste morali biti občutljivi na privzeto uporabniško ime na strežniku, ki smo ga ustvarili, na primer Ubuntu.
ssh ubuntu@XX.XX.XX.XX
Morda vas prosijo za geslo, če vas prosite za geslo, ga vnesite. Ne bomo uporabili privzetega uporabniškega imena, zato začnimo z ustvarjanjem novega uporabnika in dodajanjem ključa SSH v njihov račun.
Začnimo z dodajanjem nove datoteke sshd_config, ki strežniku pove, kako uporabljati SSH.
nano sshd_config
# To je konfiguracijska datoteka SSHD Server. Glej
# za več informacij sshd_config (5).
# Ta SSHD je bil sestavljen s Path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/igre
# Strategija, ki se uporablja za možnosti v privzeti sshd_config
# OpenSSH naj bi določil možnosti s svojo privzeto vrednostjo, kjer
# mogoče, vendar jih pustite komentirane. Nepoškodovane možnosti preglasijo
# privzeta vrednost.
# Pristanišče 22
# AddressFamily kateri koli
# Poslušaj 0,0,0,0
# Poslušaj ::
# HostKey/etc/ssh/ssh_host_rsa_key
# HostKey/etc/ssh/ssh_host_ecdsa_key
# HostKey/etc/ssh/ssh_host_ed25519_key
# Šifre in tipko
# Rekeylimit privzeto ni
# Sečnja
# Syslogfacility Auth
# Informacije o loglevel
# Overjanje:
# Logingracetime 2m
# AtbecrootLogin prepoved-pod-besedo
# StrictModes Da
# Maxauthtries 6
# MaxSessions 10
# Pričakujte, da .Ssh/pooblaščeni_keys2 v prihodnosti privzeto zanemarimo.
# Pooblaščeni čestincipalsFile None
# PooblaščenikesCommand None
# PooblaščenikAysCommandUser nihče
# Če želite to delovati
# Št
# Spremenite v da, če ne zaupate ~/.Ssh/znani_hosts za
# HostBasetauthentication
# Ignoreuser Znanderhosts št
# Ne preberite datotek uporabnika ~/.rhosts in ~/.SHOSTS
# InonerHosts Da
# Če želite onemogočiti tunelirane jasne besedilne gesla, se tukaj ne spremenite v ne!
# Dovoljenja, ki jih je treba zapisovati št
# Spremenite Da, da omogočite gesla za odzivanje na izziv (bodite pozorni na težave
# nekaj modulov in niti PAM)
# Možnosti Kerberosa
# Kerberosauthentication št
# KerberosorlocalPasswd Da
# KerberosticketCleanup da
# Kerberosgetafstoken št
# Možnosti GSSAPI
# GSSapiauthentication št
# GSSAPICLEANUPCREDENCIJA DA
# GssapistrictAcceptorcheck da
# Gssapikeyexchange št
# Nastavite to na 'da', da omogočite overjanje PAM, obdelava računa,
# in obdelava sej. Če je to omogočeno, bo overjanje PAM
# dovoliti prek kbdinteractiveAuthentication in
# Geslavtikacija. Odvisno od vaše konfiguracije PAM,
# Preverjanje pristnosti PAM prek kbdinteractiveAuthentication lahko zaobide
# Nastavitev "Dovoljenja brez prepisovanja".
# Če želite, da se račun PAM in čeki seje izvajajo brez
# PAM preverjanje pristnosti, nato pa omogočite to, vendar nastavite geslo
# in kbdinteractiveAuthentication na 'ne'.
# Dovoli za nadaljevanje da
# Dovolitcpforwarding da
# GatewayPorts št
# X11displayoffset 10
# X11uselocalHost Da
# Dovoljeno da
# Printlastlog da
# TCPEEPEALIVE DA
# Dovoljeno okolje št
# Stiskanje zamuja
# ClientaliveInterval 0
# ClientaliveCountMax 3
# Rabljeni št
# Pidfile /run/ssshd.pid
# MaxStartUps 10: 30: 100
# Permitunnel št
# ChrootDirectory None
# VersionAddendum None
# Brez privzete pasične poti
# Dovoli odjemalcu, da prenese spremenljivke okolja v kraju
# Preveri neplačilo brez podsistemov
# Primer prevladujočih nastavitev na podlagi uporabnika
# Ujemajo se z uporabniki anoncvs
# X11Prearding št
# Dovolitcpforwarding št
# Dovoljenja št
# Forcecommand CVS Server
Ne pozabite, Ctrl+X in Y, da shranite datoteko. Nato napišite osnovni skript, imenovan inicialize (vse v privzetem domačem imeniku našega uporabnika).
nano initialize
Dodajte te vrstice v datoteko in zamenjajte
# !/bin/bash
Da vas popeljemo skozi to datoteko, začnimo linijo po vrsti. Prva vrstica sporoča prevajalniku, da je to bash skript. Nato namestimo odvisnosti, kopiramo sshd_config v pravilen imenik, znova zaženemo SSH, ustvarimo SSH tipke za Root, dodamo uporabniško 'ekipo' (za to lahko izberete ime, ki vam je všeč, uporabite ukaz Adduser z njihovim imenom in onemogočenim geslom za zdaj). V skupino Sudo dodamo tudi ekipo, ustvarimo svoj ključ SSH, dodamo naš ključ tudi pooblaščenim ključem in njihovim in natisnemo njihov ključ. Ta novi uporabnik bo tako, kot se prijavimo na spletno mesto.
V novem terminalu pojdite naprej in znova odprite strežnik.
ssh team@XX.XX.XX.XX
Tokrat ne bi smeli potrebovati gesla, saj imate ključ SSH. Prav tako imamo onemogočeno prijavo z geslom, da bo spletno mesto bolj varno.
Zdaj se ta strežnik zažene popolnoma prazen, brez informacij o njem. Začnimo s kloniranjem našega projekta iz Git -a, da ga lahko prenesemo in zaženemo na oddaljenem stroju. Na oddaljenem strežniku, povezanem s SSH, najprej natisnite ključ SSH:
cat ~/.ssh/id_rsa.pub
Nato prilepite ta ključ v nastavitve GIT, kot smo ga že prej, da nastavimo naše GIT skladišče. Zdaj lahko svoj projekt kloniramo neposredno na strežnik. Prepričajte se, da ste najprej varnostno kopirali projekt, tako da je na strežniku GIT za prenos.
git clone git://github.com/you/yourproject.git
Popoln. Zdaj so vse datoteke tukaj. Lahko jih vidimo z ls
ls
Zdaj pa začnimo nastaviti strežnik. Najprej kopirajte svoj imenik projekta v preprosto, nepozabno ime, ki ga bomo uporabili za projekt.
cp -r yourproject whatyoucalledit
Kjer je "WhatToyoucalledit" novo ime vašega projekta. Nato bomo za nastavitev strežnika morali zgraditi osnovni pripomoček. Ta pripomoček bomo shranili in jo uporabili v prihodnosti. Za izdelavo tega pripomočka ustvarimo uporabniškega binarnega, da določimo, kako urejamo skript. Uporaba bash, uredi/usr/bin/ascript
sudo nano /usr/bin/ascript
Prepričajte se, da tam uporabite Sudo, tako da imate dovoljenja za urejanje datoteke. V datoteko dodajte te vrstice:
# !/bin/bash
echo "# !/bin/bash ">>/usr/bin/$ 1
Ne pozabite, da je ta skript argument, ime skripta, kot 1 dolar. Najprej preveri, ali datoteka obstaja ali kako drugače ustvari, doda prvo vrstico, da razglasi, da je skript Bash, spremeni svoje dovoljenja, ga ureja in doda njegovo ime v /etc /ascripts, ki nam omogoča, da shranimo imena skript, ki jih ustvarjamo. Če datoteka že obstaja, preprosto spremenite dovoljenja in jo uredite. Shranite datoteko in nato bomo spremenili dovoljenja. Dokler uporabljamo ta skript, nam tega ne bo treba več storiti.
sudo chmod a+x /usr/bin/ascript
Popoln. Zdaj pa ustvarimo skript z imenom Setup. Najprej, da vas ne preplavimo, ampak si oglejte, kako izgleda moj skript za nastavitev. Sprehodili se bomo skozi, kako naj bo ta scenarij videti v vašem projektu, v mojem scenariju ne boste potrebovali vsega, s katerim bi se začeli.
# !/bin/bash
# sudo chmod a+x skripte/uporabnike
# ./scripts/userTetup
# ssh-keygen
# Imenik projekta
# Ukazi dnevnika
# Konfiguracija nano
# Konfiguracija git
# Posodobite in namestite
# Omogoči Clamav antivirus
# Nastavi ime gostitelja
# Nastavitev postgres
# Nastavitvena varnostna kopija baze podatkov
# Onemogoči iptables
# Namestite bitdefender
# Nastavitev postfix
# Ustvari umazanije
# Nastavitev Virtuallenv
# Pridobite in gradite odvisnosti
# Nastavite pravila požarnega zidu
# Namestite odvisnosti PYPI
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP Namestitev OpenCV-Python == 4.5.5.64
# PIP Namestitev OpenCV-Contrib-Python == 4.5.5.64
# Namestite CertBot
# Run Certbot
# Ponovno naloži poštni strežnik
# Kopiraj cert
# sudo cp /etc/letSencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsEncrypt/live/femmebabe.com/cert.pem cert.pem
# Patch Venv
# Nastavite uporabniške nastavitve
# Nastavite dovoljenja
# Sudo chown -r ekipa: uporabniki/var/run/
# sudo chown root: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: uporabniki db.sqlite3
# Kopirajte konfiguracijo in nastavite dovoljenja
# Nastavitev baze podatkov
# Vbrizgajte PAM Config in odstranite napako SSH Config
# sudo sed -i '' -e '$ d' /etc/pam.d/ssshd
# sudo sed -i '' -e '$ d' /etc /profil
# Kopirajte skripte za smeti in nastavite dovoljenja
# Ponovno naloži in omogočite storitve
# Omogoči module Apache
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Onemogoči privzeto spletno mesto
# Omogoči naše spletno mesto
# Ponovno naloži demon in znova zaženite Apache, Postfix in Opendkim
# Nastavite dovoljenja
# Zamenjava konfiguracija
# Init napis
# Nastavitev git
# Pokaži IPv6 in Opendkim za konfiguracijo domene
# Nastavitev končana
To je veliko nastavitve! In short, this code logs commands, configures nano and git, copies over files, downloads and installs ubuntu apt packages, python dependencies, configures postfix, configures postgresql (the database server) and loads the database, configures ufw (an uncomplicated firewall), disables iptables, downloads an antivirus, makes directories, clones dependencies, Namesti potrdila in nastavi strežnik, namesti konfiguracijo, se zažene in omogoča Sever, dodeli zamenjavo, nastavi dovoljenja in natisne tipko IP, IPv6 in tipko Opendkim. Dokaj preprosto, vendar je videti kot veliko kode. Tega ne bomo potrebovali veliko, ker nimamo odvisnosti, ne uporabljamo zelene, Celerybeat ali Daphne, vendar jih bomo vseeno namestili, da začnemo. Opazite, da ima ta koda večkrat razglašeno domeno.
Kupiti bomo tudi ime domene (ki je majhna letna pristojbina). Priporočam Squarespace za nakup domene, njihova postavitev je intuitivna in enostavna za uporabo. Lahko kupite katero koli domeno po svoji izbiri, vendar v tem primeru uporabljam domeno femmebabe.com. Ko kupite domeno, pojdite na konfiguracijsko ploščo Squarespace DNS in dodajte zapis, ki bo domeno pokazal na strežnik po IP naslovu. Bi moralo videti tako:
@ A xx.xx.xx.xx
Z operaterjem @ kot gostitelja, kar pomeni, da se bodo vsi poddomene v tej domeni in koreninska domena preusmerili na strežnik. Razglasiti je treba še več zapisov, vendar lahko nadaljujemo s tem, ko bomo pripravljeni poslati pošto. Upoštevajte, da lahko traja nekaj dni, preden boste lahko uspešno pošiljali pošto s strežnika. Zapisi DNS, ki jih postavljamo, bodo potrebovali čas za širjenje.
Kakorkoli že, edini zapis, ki ga moramo začeti, je zapis. Zdaj lahko v skladu z našim projektom izpolnimo spodnji skript in ga zaženemo.
Začnimo z manjšim skriptom za nastavitev, da namestite tisto, kar potrebujemo za osnovni napredek. Še ne bomo uporabili toliko odvisnosti ali postgresql, samo zagnali bomo osnovni strežnik HTTP in skrbeli, da ga potrdimo, ko bo to končano. Ne pozabite, da bomo dobili certifikat HTTPS in varno zagnali strežnik, bomo morali kupiti domeno skupaj z najemnino strežnika. Zaenkrat zamenjajte "Team" v tej datoteki z imenom vašega uporabnika, "Dir" z imenikom vašega projekta in v oznake <> domeno dostavite svoj e -poštni naslov in domeno.
Poleg tega moramo, preden zaženemo to kodo, spremeniti nastavitve v požarni zid, ki ga ponudnik gostovanja podpira, če obstaja. Običajno je to na zavihku "Networks" vašega ponudnika gostovanja ali če se samostojno gostite, je v razdelku "Posredovanje vrat" vašega usmerjevalnika. Če uporabljate samostojno gostovanje, boste želeli nastaviti statični IP prek usmerjevalnika z naslovom strežniškega stroja. Za dostop do branja/pisanja boste morali odpreti naslednja vrata.
22 (SSH) 25 (pošta) 587 (pošta) 110 (po pošti) 80 (http) 443 (https)
# !/bin/bash
# Ukazi dnevnika
# Konfiguracija nano
# Konfiguracija git
# Posodobite in namestite
# Omogoči Clamav antivirus
# Nastavi ime gostitelja
# Nastavitvena varnostna kopija baze podatkov
# Onemogoči iptables
# Nastavitev Virtuallenv
# Namestite CertBot
# Run Certbot
# Nastavite uporabniške nastavitve
# Nastavite dovoljenja
# Sudo chown -r ekipa: uporabniki/var/run/
# sudo chown root: root/run/sudo/ts -r
# Ponovno naloži in omogočite storitve
# Omogoči module Apache
# Ponovno naloži demon in znova zaženite Apache, Postfix in Opendkim
# Pokaži IPv6 in Opendkim za konfiguracijo domene
Preden zaženete to kodo, se prepričajte, da je domena, ki ste jo kupili, povezana s strežnikom. Če želite to narediti, odprite terminal na svojem lokalnem stroju in ta ukaz zaženite s svojo domeno:
ping femmebabe.com # Po Pingu vstavite svojo domeno
Če je vse videti dobro in strežnik pošilja odgovore, smo pripravljeni za zagon skripta in namestitve paketov ter zagon, omogočiti in potrditi naš strežnik Apache.
To ni vse, ki je potrebna za konfiguracijo Postfix, na to bomo pogledali več pozneje. Za zdaj zaženite to nastavitveno kodo in traja nekaj minut, da namestite in potrdite strežnik. Ponovno v skriptu v skladu z imenom, ki ste ga kupili, nadomestite ime, e -pošto in domensko ime.
Zdaj, ko je strežnik zagotovljen, lahko v katerem koli spletnem brskalniku obiščete URL in preverite, ali strežnik deluje HTTPS. Če ni, poskusite nekaj časa čakati, da se zapisi DNS dohinejo, in nato zaženite naslednji ukaz, da ponovno poskusite s certifikatom CertBot:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Dokler vse pravilno konfigurirate, bi morali imeti možnost dostopa do privzete strani Apacheja samo zato, da veste, da vaša koda deluje in prikazuje spletno stran v živo. Nato uredimo nastavitve.py, da spremenimo naš privzeti način odpravljanja napak v produkcijo. Prav tako bomo konfigurirali domeno v nastavitvah, pa tudi v notranjih IPS.
nano yourproject/settings.py
V nastavitvah spremenite/dodajte te vrstice.
# Konfiguracija spletnega mesta
Zdaj bomo morali konfigurirati Apache2. Uredimo konfiguracijsko datoteko, ki jo bomo uporabili s to vrstico:
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Ta konfiguracijska datoteka bi morala imeti v njej naše ime domene in ime uporabnika in projekta. Uporabljam ime domene femmebabe.com, uporabniško ime in ime projekta 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>
Pri konfiguraciji strežnika ne pozabite nadomestiti imena projekta, imenikov in domene v tej kodi. Zdaj bomo morali onemogočiti privzeto spletno mesto. To je mogoče storiti s pomočjo basha.
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Nato lahko omogočimo privzeto spletno mesto in ponovno naložimo Apache2, tudi z uporabo basha. Ne pozabite nadomestiti Femmebabe z imenom datoteke, ki ste jo razglasili pri urejanju in/etc/apache2/spletna mesta, ki jih je mogoče na voljo/.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Vrnite se na svojo domeno v Navbarju. Morali bi videti spletno mesto, ki ste ga konfigurirali v svojem spletnem brskalniku. Čestitke! Če ga ne vidite, boste morda morali spremeniti nekaj sprememb. Previdno preglejte nastavitve v svojem projektu, konfiguracijo Apache in se prepričajte, da nimate napak, in zaženite naslednje ukaze, da preverite projekt za napake.
cd projectname
source venv/bin/activate
python manage.py check
Če imate napake v svojem projektu Python, jih izsledite tja, kjer so, in jih popravite. Morda ne boste mogli videti vseh vaših napak, odvisno od tega, kje so, zato če imate napako, ki preprosto pravi, da "Populate ni reentrant", uredite naslednjo datoteko v virtualnem okolju, register.py, da boste razkrili napako.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Pomaknite se do vrstice 83, kjer je ta napaka v času izvajanja (dvignite RuntimeReRr ("Populate () ni reentrant")) in pred to vrstico dodajte komentar, nato pa z isto vdolbino dodajte, self.app_configs = {}. To je videti tako:
# Preprečite klice reentranta, da se izognete zagonu AppConfig.ready ()
# metode dvakrat.
# dvig RuntimeError ("Populate () ni reentrant")
Nato lahko ponovno preverite projekt in razkrijete napako.
python manage.py check
Nato lahko vidite napako in jo popravite. Ko ga popravite in se koda zbira brez napak, se prepričajte, da spremenite datoteko nazaj, tako da je videti tako:
# Preprečite klice reentranta, da se izognete zagonu AppConfig.ready ()
# metode dvakrat.
# self.app_configs = {}
Pod pogojem, da je strežnik na spletu, ko ga bomo še dodatno spremenili, moramo za ponovno naložitev strežnika uporabiti naslednji ukaz:
sudo systemctl reload apache2
Super! Kaj pa pošiljanje pošte? Za začetek pošiljanja e -pošte bomo najprej morali posodobiti konfiguracijo domene. To bi moralo biti na vaši plošči DNS v Squarespaceu ali kakršnem koli registrarju imena domene. Prav tako bomo morali namestiti in dodati konfiguracijo ter zagnati nekaj ukazov.
Najprej dobimo naslov IPv6 strežnika. Nato bomo odprli vaš DNS in dodali zapise.
Če želite dobiti naslov IPv6 strežnika, uporabite ta ukaz:
ip -6 addr
Zdaj lahko v nastavitve DNS dodamo naslednje zapise. Moji zapisi so videti tako. Vendar pa za svoje zapise zamenjajte IP naslov z IP (ne 75.147.182.214, to je moje). Dodajte tudi svojo domeno namesto Femmebabe.com, pa tudi naslov IPv6, ki ga najdete s prejšnjim ukazom (ne morete uporabljati mojega, Fe80 :: 725A: FFF: FE49: 3E02). Za zdaj ne skrbite za Domainkey, to je ustvarjeno, ko nastavimo Postfix, poštni strežnik, z OpendKimom in natisnemo ključ. To bomo konfigurirali zadnji.
@ A N/a 75.147.182.214
@ Mx 10 femmebabe.com
@ Ptr N/a femmebabe.com
@ Txt N/a Txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: fff: fe49: 3e02 ~ vse
privzeto._bimi Txt N/a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_dmarc Txt N/a v = dMARC1; p = noben
SENDONLY._Domainkey
Txt
N/a
Zdaj bomo morali dodati nekaj vztrajne konfiguracije za Postfix. Vse, kar moramo storiti, je, da se prepričajte, da bomo zamenjali ime domene Femmebabe.com z imenom domene, ki ga uporabljate. Oglejmo si vse datoteke konfiguracije ena za drugo in jih namestimo v imenik, imenovan Config v našem projektu, za namestitev v OS.
nano config/etc_postfix_main.cf
Dodajte to besedilo v datoteko
# Glej /usr/share/postfix/main.cf.dist za komentirano, popolnejšo različico
# Debian Specific: Če določite ime datoteke
# vrstica te datoteke, ki se uporablja kot ime. Debian privzeto
# je /etc /mailName.
# Myorigin = /etc /ime mail
# Dodajanje. Domain je MUA -jeva naloga.
# Odkrijte naslednjo vrstico za ustvarjanje opozorila o "zakasnitvi po pošti"
# zamuda_warning_time = 4h
# Glej http://www.postfix.org/compatibility_readme.html - privzeto na 3.6
# sveže namestitve.
# TLS parametri
# Konfiguracija milterja
Naslednja konfiguracija!
nano config/etc_postfix_master.cf
Dodajte te vrstice:
#
# Postfix glavna konfiguracijska datoteka. Za podrobnosti o obliki
# datoteke glejte Master (5) Priročno stran (ukaz: "človek 5 mojster" ali
# na spletu: http://www.postfix.org/master.5.html).
#
# Po urejanju te datoteke ne pozabite izvesti "Postfix Reload".
#
# ======================================================================
# Vrsta storitve Private Unpriv Chroot Wakeup Maxproc Command + Args
# (da) (da) (ne) (nikoli) (100)
# ======================================================================
# SMTP INET N - Y - 1 po zaslonu
# SMTPD Pass - - Y - - SMTPD
# DNSBLOG UNIX - - Y - 0 DNSBOG
# TLSProxy Unix - - - y - 0 TLSProxy
# Izberite eno: Omogočite predložitev samo za odjemalce za zanko ali za katero koli stranko.
# 127.0.0.1:Submission Inet N - Y - - SMTPD
# -o syslog_name = postfix/oddajo
# -O SMTPD_TLS_SECURITY_LEVEL = ENCRIPT
# -O SMTPD_SASL_AUTH_ENABLE = DA
# -O SMTPD_TLS_AUTH_ONLY = DA
# -O SMTPD_REject_Unlisted_recipient = št
# -O SMTPD_CLIENT_RESTRICTIONS = $ MUA_CLIENT_RESTRICTIONS
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTRICTIONS
# -O SMTPD_SENDER_RESTRICTIONS = $ MUA_SENDER_RESTRICTIONS
# -O SMTPD_RECIPIENT_RESTRICTIONS =
# -O SMTPD_RELAY_RESTRICTIONS = dovoli_sasl_authentictine, zavrne
# -o milter_macro_daemon_name = izvir
# Izberite eno: Omogočite SMTPS samo za stranke za zanko ali za katero koli stranko.
# 127.0.0.1:SMTPS INET N - Y - - SMTPD
# SMTPS INET N - Y - - SMTPD
# -o syslog_name = postfix/SMTPS
# -O SMTPD_TLS_WRAPPERMODE = DA
# -O SMTPD_SASL_AUTH_ENABLE = DA
# -O SMTPD_REject_Unlisted_recipient = št
# -O SMTPD_CLIENT_RESTRICTIONS = $ MUA_CLIENT_RESTRICTIONS
# -O SMTPD_HELO_RESTRICTIONS = $ MUA_HELO_RESTRICTIONS
# -O SMTPD_SENDER_RESTRICTIONS = $ MUA_SENDER_RESTRICTIONS
# -O SMTPD_RECIPIENT_RESTRICTIONS =
# -O SMTPD_RELAY_RESTRICTIONS = dovoli_sasl_authentictine, zavrne
# -o milter_macro_daemon_name = izvir
# 628 INET N - Y - - QMQPD
# QMGR UNIX N - N 300 1 OQMGR
# -O SMTP_HELO_TIMEOUT = 5 -O SMTP_CONNECT_TIMEOUT = 5
#
# =============================================================================
# Vmesniki za programsko opremo, ki ni postfix. Ne pozabite preučiti priročnika
# Strani programske opreme Non-PostFix, da ugotovite, kakšne možnosti želi.
#
# Številne naslednje storitve uporabljajo dostavo Postfix (8)
# agent. Za informacije o $ {prejemnik} glejte stran cevi (8)
# in druge možnosti za ovojnico sporočil.
# =============================================================================
#
# Maildrop. Za podrobnosti glejte datoteko Postfix Maildrop_readme.
# Določite tudi v main.cf: maildrop_destination_recipient_limit = 1
#
#
# =============================================================================
#
# Nedavne različice Cyrus lahko uporabljajo obstoječi vnos "LMTP" Master.cf.
#
# Navedite v cyrus.conf:
# lmtp cmd = "lmtpd -a" posluša = "localhost: lmtp" proto = tcp4
#
# Navedite v main.cf eno ali več naslednjih:
# mailbox_transport = lmtp: inet: localhost
# Virtual_transport = lmtp: inet: localhost
#
# =============================================================================
#
# Cyrus 2.1.5 (Amos GOUAUX)
# Določite tudi v main.cf: cyrus_destination_recipient_limit = 1
#
# Cyrus Unix - n n - - cev
# FLAGS = DRX User = Cyrus argv =/cyrus/bin/dostava -e -r $ {Sender} -m $ {razširitev} $ {uporabnik}
#
# =============================================================================
# Stari primer dostave prek Cyrusa.
#
# Old -Cyrus Unix - N N - - cev
# FLAGS = R User = Cyrus argv =/cyrus/bin/dostava -e -m $ {razširitev} $ {uporabnik}
#
# =============================================================================
#
# Za podrobnosti o konfiguraciji glejte datoteko Postfix UUCP_ReadMe.
#
#
# Druge načine zunanje dostave.
#
In OpenDKIM konfiguracija. OpenDKIM identificira e -poštne strežnike z domenskimi tipkami, da bi bili bolj varni. Brez njega pošta ni podpisana in morda ne bo prišla v nabiralnik.
nano config/etc_default_opendkim
Dodajte te vrstice:
# Opomba: To je zapuščena konfiguracijska datoteka. OpenDKIM ga ne uporablja
# SystemD Service. Prosimo, uporabite ustrezne konfiguracijske parametre v
# /etc/opendkim.conf namesto tega.
#
# Prej bi tukaj uredili privzete nastavitve in nato izvedli
# /Lib/opendkim/opendkim.service.generate za ustvarjanje datotek preglasitve sistema.
# /etc/systemd/system/opendkim.service.d/override.conf in
# /etc/tmpfiles.d/opendkim.conf. Čeprav je to še mogoče, je zdaj
# Priporočljivo za nastavitev nastavitev neposredno v /etc/opendkim.conf.
#
# Daemon_opts = ""
# Preklopite v/var/spool/postfix/run/opendkim, da uporabite vtičnico Unix z
# Postfix v chrootu:
# Rundir =/var/spol/postfix/run/opendkim
#
# Odklon, da določite nadomestno vtičnico
# Upoštevajte, da bo nastavitev preglasila katero koli vrednost vtičnice v OpenDKIM.CONF
# privzeto:
# Poslušajte na vseh vmesnikih na vratih 54321:
# Socket = inet: 54321
# Poslušajte na zanki na pristanišču 12345:
# Socket = inet: 12345@localhost
# Poslušajte 192.0.2.1 na pristanišču 12345:
# Socket = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
Dodajte te vrstice:
# Default_process_limit = 100
# Default_client_limit = 1000
# Privzeta omejitev VSZ (velikost virtualnega pomnilnika) za storitvene procese. To je predvsem
# nameraval ujeti in ubiti procese, ki puščajo spomin, preden pojedo
# vse.
# Default_vsz_limit = 256m
# Uporabnik prijave se notranje uporablja s postopki prijave. To je najbolj nezaupljivo
# Uporabnik v sistemu Dovecot. Sploh ne bi smel imeti dostopa do ničesar.
# Default_login_user = dovenull
# Notranji uporabnik uporabljajo neprivilegirani procesi. Mora biti ločen od
# Uporabnik prijave, tako da postopki prijave ne morejo motiti drugih procesov.
# Default_internal_user = Dovecot
# pristanišče = 143
# pristanišče = 993
# ssl = da
# Število povezav, ki jih je treba obravnavati pred začetkom novega postopka. Običajno
# Edine uporabne vrednosti so 0 (neomejene) ali 1. 1 je bolj varno, vendar 0
# je hitrejši. <doc/wiki/loginprocess.txt>
# service_count = 1
# Število procesov, da vedno čakajo na več povezav.
# Process_min_avail = 0
# Če nastavite service_count = 0, morate to verjetno razviti.
# VSZ_LIMIT = $ DEFAULT_VSZ_LIMIT
# pristanišče = 110
# pristanišče = 995
# ssl = da
# pristanišče = 587
# Ustvarite inet poslušalca samo, če ne morete uporabiti zgornje vtičnice Unix
# inet_listener lmtp {
# Izogibajte se, da bi bil LMTP viden za celoten internet
# naslov =
# pristanišče =
# }
# Večina pomnilnika gre v datoteke MMAP () ing. To boste morda morali povečati
# Omejite, če imate ogromne nabiralnike.
# VSZ_LIMIT = $ DEFAULT_VSZ_LIMIT
# Max. Število procesov IMAP (povezave)
# Process_limit = 1024
# Max. Število procesov POP3 (povezave)
# Process_limit = 1024
# Max. Število postopkov oddaje SMTP (povezave)
# Process_limit = 1024
# auth_socket_path privzeto kaže na to vtičnico UserDB. Običajno je
# Uporabljajo jih Dovecot-LDA, Doveadm, morda IMAP postopek itd.
# Popolna dovoljenja za to vtičnico lahko dobijo seznam vseh uporabniških imen in
# Pridobite rezultate iskanja uporabnikov.
#
# Privzeti način 0666 omogoča vsakogar, da se poveže z vtičnico, vendar
# Preiskave UserDB bodo uspele le, če UserDB vrne polje "UID", ki
# Ujema se s klicateljskim postopkom UID. Tudi če se klicatelj uid ali gid ujema z
# Vtični uid ali GID, ki jo išče. Vse drugo povzroči neuspeh.
#
# Če želite klicatelju dati popolna dovoljenja za iskanje vseh uporabnikov, nastavite način na
# nekaj drugega kot 0666 in Dovecot omogoča, da jedro uveljavlja
# dovoljenja (npr. 0777 omogočajo vsem popolnim dovoljenjem).
# Auth Delavski postopek se privzeto izvaja kot korenina, tako da lahko dostopa
# /etc/senca. Če to ni potrebno, je treba uporabnika spremeniti v
# $ default_internal_user.
# uporabnik = root
# Če se uporablja Dict Proxy, bi morali imeti poštne procese dostop do svoje vtičnice.
# Na primer: način = 0660, Group = VMail in Global Mail_access_groups = VMAIL
# način = 0600
# uporabnik =
# skupina =
Ponovno se prepričajte, da domeno zamenjate v vseh teh datotekah, femmebabe.com, z domeno, ki ste jo izbrali. Uredi naslednjo datoteko, Dovecotova konfiguracija,
nano config/etc_dovecot_dovecot
In dodajte te vrstice
## Konfiguracijska datoteka DoveCot
# Če se vam mudi, si oglejte http://wiki2.Dovecot.org/quickconfiguration
# ukaz "doveConf -n" daje čist izhod spremenjenih nastavitev. Uporabite
# Namesto kopiranja in lepljenja datotek pri objavi na poštnem seznamu Dovecot.
# '# 'lik in vse, ko se obravnava kot komentarji. Dodatni prostori
# in zavihki se prezrejo. Če želite uporabiti katero koli od teh izrecno, postavite
# value inside quotes, eg.: key = "# char in sled whitespace "
# Večino (vendar ne vseh) nastavitev lahko preglasijo različni protokoli in/ali
# Izvorni/ciljni IPS z namestitvijo nastavitev znotraj razdelkov, na primer:
# Protokol IMAP {}, lokalni 127.0.0.1 {}, oddaljeni 10.0.0.0/8 {}
# Privzete vrednosti so prikazane za vsako nastavitev, ni treba odpraviti
# te. To so izjeme od tega: brez razdelkov (npr. ImeSpace {})
# ali nastavitve vtičnikov so privzeto dodane, navedeni so le kot primeri.
# Pot so tudi samo primeri, pri čemer resnični privzeti nastavijo na konfiguraciji
# možnosti. Tu so navedene poti za konfiguracijo --prefix =/usr
# --sysconfdir =/etc--localstateDir =/var
# Omogoči nameščene protokole
# Seznam IP -jev ali gostiteljev, ločen vejice, kje poslušati povezave.
# "*" posluša v vseh vmesnikih IPv4, "::" posluša v vseh vmesnikih IPv6.
# Če želite določiti vrata, ki niso razlog ali kaj bolj zapletenega,
# Uredi konf.d/master.conf.
# poslušaj = *, ::
# Osnovni imenik, kje shraniti podatke o izvajanju.
# base_dir =/var/run/dovecot/
# Ime tega primerka. V več-instanci nastavitve Doveadm in drugih ukazov
# lahko uporabite -i <instance_name>, da izberete, kateri primerek se uporablja (alternativa
# do -c <config_path>). Ime primera je dodano tudi v procese Dovecot
# v PS izhodu.
# instance_name = dovecot
# Pozdrav za stranke.
# login_greeting = Dovecot pripravljen.
# Space ločen seznam zaupanja vrednih omrežnih razponov. Povezave iz teh
# IP -ji lahko preglasijo svoje IP naslove in vrata (za beleženje in
# za preverjanje pristnosti). Disable_plainText_auth je tudi zanemarjen
# ta omrežja. Običajno tukaj določite svoje proxy strežnike IMAP.
# login_trusted_networks =
# Space ločen seznam prijavnih vtičnic za preverjanje prijave (npr. TCPWRAP)
# login_access_sockets =
# S proxy_maybe = da, če se proxy cilj ujema s katerim koli od teh IP -jev, ne delaj
# Proxying. To ni potrebno običajno, vendar je lahko koristno, če cilj
# IP je npr. IP uravnoteženja obremenitve.
# auth_proxy_self =
# Pokažite več naslovov dobesednih procesov (v PS). Trenutno prikazuje uporabniško ime in
# IP naslov. Koristno za ogled, kdo dejansko uporablja procese IMAP
# (npr. Skupna nabiralnika ali če se uporablja isti UID za več računov).
# Verbose_proctitle = ne
# Če se vsi procesi ubijejo, ko se Dovecot glavni postopek izklopi.
# Nastavitev tega na "ne" pomeni, da je mogoče Dovecot nadgraditi brez
# prisili obstoječe povezave odjemalcev, da se zaprejo (čeprav bi to lahko bilo tudi
# Težava, če je nadgradnja npr. Zaradi varnosti).
# shutdown_clients = da
# Če brez ničle zaženite ukaze za pošto prek številnih povezav do strežnika Doveadm,
# Namesto da bi jih vodil neposredno v istem procesu.
# doveadm_worker_count = 0
# Unix vtičnica ali gostitelj: vrata, ki se uporabljajo za povezovanje s strežnikom Doveadm
# doveadm_socket_path = doveadm-server
# Space ločen seznam spremenljivk okolja, ki so ohranjene na Dovecotu
# zagon in prenesel vse svoje otroške procese. Lahko tudi daste
# KLJUČ = vrednostni pari, da vedno nastavite določene nastavitve.
# Import_environment = tz
##
## Nastavitve slovarja
##
# Slovar se lahko uporablja za shranjevanje seznamov ključa = vrednosti. To uporablja več
# vtičniki. Do slovar lahko dostopate neposredno ali čeprav
# Slovar strežnik. Naslednji Dict Block preslikajo slovarske imena URIS
# Ko se strežnik uporablja. Temu se lahko nato sklicujejo z uporabo URIS v obliki
# "Proxy :: <ime>".
# kvota = mysql: /etc/dovecot/Dovecot-dict-sql.conf.ext
# Večina dejanske konfiguracije je vključena spodaj. Imena datotek so
# najprej razvrščeni po svoji vrednosti ASCII in razčlenjeni v tem vrstnem redu. 00-Prefixs
# V imenih datotek naj bi olajšali razumevanje naročila.
# Konfiguracijska datoteka se lahko tudi poskusi vključiti, ne da bi pri tem dali napako, če
# ni mogoče najti:
# Dovecot omogoča poslušanje vseh vhodnih povezav (IPv4 / IPv6)
Dodajte geslo za uporabnika Dovecota:
nano config/etc_dovecot_passwd
Prvi del datoteke je pred debelo črevo uporabniško ime. Zadnji del, "YourPassword", označuje geslo, ki ga želite dati svojemu poštnemu strežniku.
team:{plain}yourpassword
Nato konfiguracija OpenDKIM
nano config/etc_opendkim.conf
In dodajte te vrstice:
# To je osnovna konfiguracija za podpis in preverjanje. Lahko je enostavno
# Prilagojeno tako, da ustreza osnovni namestitvi. Glej OpenDKIM.CONF (5) in
# /usr/share/doc/opendkim/examples/opendkim.conf.sample za popolno
# Dokumentacija razpoložljivih konfiguracijskih parametrov.
# Dnevnik, ne
# Skupni parametri za podpisovanje in preverjanje. V Debianu je "From" Header
# pretirano, ker je pogosto identitetni ključ, ki ga uporabljajo ugledni sistemi
# in tako nekoliko občutljivo varnost.
# Podpisovanje domene, selektorja in ključa (potrebno). Na primer, izvedite podpisovanje
# za domeno "example.com" s selektorjem "2020" (2020._Domainkey.example.com),
# Uporaba zasebnega ključa, shranjena v /etc/dkimkeys/example.private. Bolj zrnata
# Možnosti nastavitve najdete v /usr/share/doc/opendkim/readme.opendkim.
# Domain Example.com
# Selektor 2020
# KeyFile /etc/dkimkeys/example.private
# V Debianu OpenDKIM deluje kot uporabnik "OpenDKIM". Umask 007 je potreben, ko
# Uporaba lokalne vtičnice z MTA, ki dostopajo do vtičnice kot ne privilegirani
# uporabnik (na primer postfix). Morda boste morali v skupino dodati uporabnika "postfix"
# "Opendkim" v tem primeru.
# Vtičnica za povezavo MTA (zahtevana). Če je MTA v zaporu Chroot,
# Zagotoviti je treba, da je vtičnica dostopna. V Debianu postfix teče
# chroot in/var/pul/postfix, zato bi morala biti vtičnica Unix
# Konfigurirano, kot je prikazano v zadnji vrstici spodaj.
# Socket Local: /run/opendkim/opendkim.sock
# Vtičnica Inet: 8891@localhost
# Vtičnica Inet: 8891
# Gostitelji, za katere se lahko podpišejo in ne preverjajo, je privzeta 127.0.0.1. Glej
# Oddelek za delovanje OpenDKIM (8) za več informacij.
# Notranji hosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Sidro zaupanja omogoča DNSSEC. V Debianu je na voljo datoteka sidra Trust
# s paketom DNS-Root-Data.
# Imeseserji 127.0.0.1
# Preslikave domene od naslovov do tipk, ki se uporabljajo za podpisovanje sporočil
# Nabor notranjih gostiteljev, katerih pošto je treba podpisati
nano config/etc_default_opendkim
In dodajte te vrstice
# Opomba: To je zapuščena konfiguracijska datoteka. OpenDKIM ga ne uporablja
# SystemD Service. Prosimo, uporabite ustrezne konfiguracijske parametre v
# /etc/opendkim.conf namesto tega.
#
# Prej bi tukaj uredili privzete nastavitve in nato izvedli
# /Lib/opendkim/opendkim.service.generate za ustvarjanje datotek preglasitve sistema.
# /etc/systemd/system/opendkim.service.d/override.conf in
# /etc/tmpfiles.d/opendkim.conf. Čeprav je to še mogoče, je zdaj
# Priporočljivo za nastavitev nastavitev neposredno v /etc/opendkim.conf.
#
# Daemon_opts = ""
# Preklopite v/var/spool/postfix/run/opendkim, da uporabite vtičnico Unix z
# Postfix v chrootu:
# Rundir =/var/spol/postfix/run/opendkim
#
# Odklon, da določite nadomestno vtičnico
# Upoštevajte, da bo nastavitev preglasila katero koli vrednost vtičnice v OpenDKIM.CONF
# privzeto:
# Poslušajte na vseh vmesnikih na vratih 54321:
# Socket = inet: 54321
# Poslušajte na zanki na pristanišču 12345:
# Socket = inet: 12345@localhost
# Poslušajte 192.0.2.1 na pristanišču 12345:
# Socket = inet: 12345@192.0.2.1
Ko smo pripravljeni nastaviti svoj strežnik Postfix, bomo zagnali spodnjo kodo z ustreznim imenom domene. Začnite z ustvarjanjem scenarija
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Zdaj v Nano, urejevalnik besedil, uredite to datoteko, tako da vključuje ime vaše domene namesto femmebabe.com.
# !/bin/bash
# Nastavitev postfix
Zdaj zaženite dokončani skript, da konfigurirate Postfix, OpenDKIM in DOVECOT.
./scripts/postfixsetup
Ko se ta skript zažene, kopirajte zadnjo vrstico, ki jo natisne in prilepite v svojo konfiguracijo DNS kot vrednost za Sendonly._Domainkey. To je ključ OpenDKIM, ki se uporablja za prepoznavanje vaše domene pri pošiljanju varne pošte.
Super! V nekaj dneh bi morali poslati pošto s strežnika, če je vse pravilno konfigurirano.
Če ste samo konfigurirali DNS za svoj poštni strežnik, bi moralo biti potrebno manj kot 72 ur, da se zapisi posodobijo. Običajno je veliko hitrejši. Lahko preverite, ali vaš strežnik deluje s tem ukazom, vam je dostavil e -pošto:
echo "test" | mail -s "Test Email" youremail@gmail.com
Če se zdi, da vse deluje pravilno, bi morali s strežnikom poslati e -pošto. Če ne deluje, poskusite pogledati dnevnike, da vidite, kakšna je napaka.
tail –lines 150 /var/log/mail.log
To bo ponudilo dobesedne podatke o pošti, ki jih strežnik pošilja in ali deluje pravilno. E -pošta bi morali videti tudi v mapi »Prejeto«, če je ni tam, preverite svojo mapo z neželeno pošto.
Prav tako boste morali konfigurirati svoje nastavitve v nastavitvah.py, da se bo vaš e -poštni strežnik lahko pogovoril s svojo aplikacijo Django, projektom. Dodajte ali zamenjajte te vrstice v nastavitvah
EMAIL_HOST_USER = 'team' # 'Love@mamasheen.com'
Opazite, da za geslo uporabljamo konfiguracijsko datoteko. Naložimo to datoteko v nastavitve tako, na samem začetku datoteke.:
# Odprite in nalagajte konfiguracijo
Ustvarimo to datoteko in ji dodajte skrivni ključ, pa tudi geslo za pošto. Če želite ustvariti skrivni ključ, uporabite ta ukaz, s katero koli dolžino vam je všeč na koncu:
openssl rand -base64 64
Zdaj kopirajte besedilo, ki se odpre ustvarjeno in uredi /etc/config.json
sudo nano /etc/config.json
V datoteko dodajte naslednje vrstice s ključem, ki se odpre kot tajni ključ.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
JSON Format je preprost in enostaven za uporabo, lahko razglasimo druge ključe, ki jih želimo uporabiti tudi v našem projektu, in jih ohranjamo ločeno od našega imenika projekta, da jim drugi uporabniki ne morejo pisati, zato jih ne morejo brati samo iz našega imenika projekta. To je priporočljiva praksa za tipke API, od katerih bomo tukaj uporabili več kot nekaj.
Prav tako boste želeli varnostno kopirati svoj projekt, da se prepričate, da je vse shranjeno in boste lahko pozneje obnovili svoje delo, tudi če ne želite več najeti strežnika.
sudo backup
Zdaj poskusite poslati HTML e -poštno sporočilo s spletnega strežnika, pod pogojem, da pošiljanje iz ukazne vrstice deluje. Poizvedite o svojem uporabniškem primerku v lupini in pošljite e -poštno sporočilo HTML temu uporabniku prek Djanga. Spremenite moje ime v kodi, Charlotte, v svoje uporabniško ime.
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()
Če prvi ukaz ne deluje, se prepričajte
source venv/bin/activate
Pod pogojem, da je vse pravilno nastavljeno, zdaj boste v nabiralniku dobili dobrodošlico, ki ga pošlje vaša spletna aplikacija. Dobro delo! Dolgo si prišel.
Želel sem dodati, če se kdaj spopadate s kakršnimi koli napakami, ko delate na takšnem projektu, ne oklevajte in poiščite odgovore in prosite za pomoč. Google so med drugimi iskalniki odlična sredstva za iskanje pomoči za programiranje. Preprosto poiščite napako, ki jo dobite, in lahko boste videli, kako drugi ljudje rešijo težavo. Prav tako ste dobrodošli, da se obrnete na mene, svoje vzgojitelje (učitelji, profesorji, mentorji), vse vrstnike na internetu, ki so na voljo za programsko pomoč, ali se ponovno posvetujete s to knjigo ali z drugimi viri, da bi našli rešitve za vprašanja, ki jih doživljate. Razumem, da to ni enostavno, toda tudi če ste prebrali tako daleč in ne pišete nobene kode, se veliko naučite o gradnji spletne aplikacije iz nič. Položite se po hrbtu, odlično delate.
Hvala, ker ste si vzeli čas za branje tega vodnika za razvoj tretje izdaje. V prihodnjih izdajah bom vključil več pomembnih primerov, o katerih smo govorili na začetku dokumenta, in se bomo mnogo globlje potopili v svet programske in strojne opreme. Spremljajte, kaj bo prišlo, in veselim se, da vas bom naučil, kako zgraditi neverjetno programsko opremo. Se vidimo v naslednji izdaji!
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
.por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
.por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
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.
por Daisy / Vista | Comprar | Comprar con criptomoneda
https://glamgirlx.com
https://glamgirlx.com -
Déjame un consejo en Bitcoin usando esta dirección: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE