Praktično web -temeljeno duboko učenje i sigurnost primjerom

Po Daisy
Praktično web -temeljeno duboko učenje i sigurnost primjerom Treće izdanje Charlotte Harper 3. srpnja 2024 Ažurirano/pretvoreno 3. lipnja 2025
Predgovor:
Sigurnosna razmatranja u izgradnji softvera za web važan su dio plana i izvršenja bilo kojeg web programera, dok inženjering prototip koji je pouzdan, stabilan i koristan u praktične svrhe. The DOM (Document Object Markup), with it's implementation of HTML, JavaScript, and CSS as well as backend software implementing Python, C/C++, Java and bash, give web developers the freedom and power to create a wide variety of projects that express creativity, provide ease of use and functionality, portray humility and character, and provide ease of use as well as convenience and important services that are all attractive to the average Joe, the end user U potrazi za ubijanjem vremena ili nešto završiti na Internetu, obično na uređaju za pametne telefone osjetljive na dodir. Većina ljudi ne bi ni znala gdje treba započeti kada žele izgraditi web stranicu ispočetka, skloni bi započeti na web stranici druge osobe i izgraditi nešto ograničeno u funkcionalnosti, pouzdanosti, jednostavnosti upotrebe, a posebno kreativnosti kada su mogli imati sve najnovije moćne alate na raspolaganju kako bi izgradili nešto korisno bez gumba koji se mogu koristiti u upotrebi. Ako imate nekoliko minuta da pročitate ovu knjigu i naučite što vas želim naučiti ili čak razgovarati sa mnom osobno o vašim ciljevima i dobiti neke smjernice u pravom smjeru, i motivirani ste da naučite kodirati i napisati vlastiti softver, uzmite ovu knjigu kući i izdvojite neko vrijeme kako biste naučili izgraditi sljedeću utjecajnu, snažnu, pojednostavljenu i važnu internetsku prijavu koja je na kojoj se nalazite na web stranici.
O meni: Ja sam programer softvera sa širokim rasponom iskustva u C/C ++, Java, Python, HTML, CSS i JavaScript. Izrađujem web stranice koje ljudi žele koristiti, žele posjetiti, pa čak i biti ovisni o korištenju samo za učenje, ponovno stvaranje vremena i ubijanja, i što je najvažnije, prodajem softver. Ako ste imali ideju o tome kako ste željeli da web stranica izgleda i funkcionira, bili ste spremni podržati me kako bih mogao zadovoljiti svoje vlastite potrebe dok zadovoljavam vaše, a vi ste spremni sami pokriti troškove pokretanja web stranice, izgradio bih vam sljedeći YouTube, Tiktok, Twitter, Google, ili čak visokotehnološku sigurnost samo kojoj možete pristupiti. Umjesto da vam pokušam prodati svoje vrijeme, pokušavam kupiti vaše: želim vas nagovoriti u izgradnju aplikacije (web stranice) samim informacijama koje već postoje i naučiti vas što trebate biti neovisni programer softvera, poduzetnik, vodeći uspješnu karijeru u bilo kojem polju koje želite. I dopustite mi da budem jasan, obrazovanje koje vam pružam bit će neformalno. Mogli biste ići u školu i sve to naučiti sa formalnim obrazovanjem ili čak pročitati ovu knjigu u školi, dovršiti zadatke i oduzeti puno od svog obrazovanja, ali neću vas službeno staviti na vruće sjedalo i zamoliti vas da dovršite zadatke. Nisam tvoj profesor, možete se sjetiti mene kao na prijatelja koji vas želi voditi prema karijeri vođenoj vlastitim osobnim uspjehom. A ni ja vam ne prodajem uspjeh, morat ćete ga kupiti sa svojim vremenom. Učenje koda ima strmu krivulju učenja i nikad nije bilo lako, ili čak i trebalo biti. Morate raditi što naporno možete i nastaviti pokušavati i pokušati i pokušati ponovo, čak i kad ste frustrirani kako biste sami naučili i izgradili aplikacije. To je u prirodi samog koda. Kôd vodi prevoditelj koji je dizajniran tako da daje poruke o pogrešci programera, a oni će vas naučiti kako kodirati, čak i ako jednostavno kopirate pogrešku u svoju tražilicu i čitate primjere drugih ljudi. I moram reći da ne trebate biti izuzetno bogata, pametna, uspješna ili čak detaljna orijentirana ili organizirana za izgradnju aplikacije. Računalo se brine za tu organizaciju za vas. Trebate samo ustrajati kroz pokušaj i pogreške, održavati fokus i naporno raditi na onome što radite, a imat ćete vrlo uspješnu karijeru u cijelosti od onoga što radite.
Tko sam ja: Shvaćam da je posljednji odjeljak više bio u učenju i da vam je izveo načine iz ove knjige. Tko sam točno ja? To je složeno pitanje. Nejasno mi je to, jer patim od medicinskih stanja koja mi mogu otežati čak i kodirati ili pisati ovu knjigu, istovremeno predstavljajući izazove s socijalizacijom i problemima identiteta koji mi otežavaju život kada je u pitanju uvođenje sebe. Ukratko, ako čitate ovu knjigu, donijeli ste je kući jer ste je prebacili i pomislili da je korisna, ili čak i ako ste upravo čitali tako daleko, za vas sam sličan pojedinac koji želi vidjeti kako uspijevate u svemu što radite. Ja sam inženjer, sam, programer softvera i student, i pišem ovu knjigu za druge studente koji žele olakšati svoj život tako što im je priručnik softvera koji im treba olakšati život dajući primjere za kopiranje koji se uklapaju poput velike zagonetke u radnu, veliku, funkcionalnu, kohezivnu i angažiranu aplikaciju koja ne može biti uspješan. Uglavnom, to radim: Izrađujem aplikacije kako bih sebi i drugima uspio uspijevati. I ja sam autor, iako je ovo moja prva publikacija koju namjeravam dovršiti kako bih svoj portfelj sastavio u koristan dokument, a i ja sam umjetnik. Priznat ću vam ovo, nekako sam čudna osoba. Nisam savršen, vodio sam sa zakonom čak i doveo me do napuštanja fakulteta i sveučilišta i napustiti države kako bih pokušao napraviti ime za sebe s većim uspjehom. Ja sam žena po rođenju, nosim šminku, fotografiram sebe, nosim haljine i drugu žensku odjeću i po prirodi ostajem svjestan sebe kao ženke. U prošlosti sam imao problema s drugim ljudima koji dovode do borbe s pisanjem i izgradnjom WebApps -a, i ispričavam se što nisam uspio prije dobiti ovu knjigu u vaše ruke: to vam je trebalo. Htjet ćete čitati i pisati kôd koji izgleda kao moj i djeluje poput mog i čini isto, ali još bolje, jer ako si možete priuštiti da kupite ovu knjigu umjesto da maširate tipkovnicu kao što to radim samo da biste sami stvorili knjigu tražeći novac za nju, imate resurse koji vam trebaju biti uspješni u svom životu. Imao sam sve vrste problema s odrastanjem obitelji, zdravstvenih stanja, liječnika, medija i zakona, a moj kodeks duboko odražava borbu koja je feminizam i ženska priroda u podijeljenom i frustriranom svijetu. Međutim, ova knjiga je nešto što me duboko brine, moje dijete, moj portfelj i moj život, tako da cijenim vaše razmatranje kada odnesete tekst kući i pažljivo ga porajte kako biste naučili od mene. Imajte na umu da nisam savršena, ova će knjiga imati pogreške, revizije i nova izdanja, a morat ćete razmišljati sa svojim logičnim mozgom kao što je najbolje što možete kako biste imali uspješno iskustvo s mojim pisanjem. Također, shvatite da dobro mislim na vas čak i kad se suočite s izazovima pri pisanju. Razmislite o tome ovako: kada možete samo unajmiti računalni sustav da biste učinili sve što možete zamisliti u digitalnom prostoru, pohraniti sve informacije s kojima se susrećete, analizirati i organizirati, i shvatiti ih, neizbježno ćete naići na poteškoće s informacijama koje gutate, pa čak i objavite. To vam kažem jer nailazim na iste poteškoće. Upotrijebite ovu knjigu na vlastiti rizik, radite sa svojom zajednicom i zajednicama koje su vam dostupne za izgradnju softvera u sigurnom okruženju i ne uzimajte stvari osobno kad ne uspijete ili čak uspijete na pogrešan način: tako sam stigao tako daleko, i zašto vam mogu donijeti ovaj tekst i pomoći vam da uspijemo bez da se na putu ludila, a to je ugasila, a ugasila sam se na globalnoj razini, u skladu s ordinama, udružena u mreži, a ujednačena sam na globalnoj razini, a ujednačena je na globalnoj razini, a ujednačena me na globalnoj razini, u skladu Radit ćemo, Internet. Možda niste baš upoznati s onim tko sam sa samo nekoliko riječi, ali ohrabrujem vas da čitate, upoznat ćete me dok me i dalje čitate i razumijete dok gradite vlastite projekte kako biste dovršili svoj rad. S ovom knjigom neće biti domaćih zadataka, sve dok vam profesori ili učitelji ne dodijele, ali toplo vas ohrabrujem da sami izradite portfelj projekata dok čitate, kao i projekt Capstone koji pokazuje kako možete primijeniti ono što ste naučili. Moj projekt Capstone osnova je za većinu onoga što ćete pročitati u ovoj knjizi, jer on uključuje kôd iz mojih prethodnih projekata, kôd koji sam stvorio i naučio pisati metodički ručno, i širok spektar ideja i savjeta koji su mi pomogli da uspijem do točke gdje mogu u potpunosti prikazati aplikaciju koja je u potpunosti prikazana i izgled i ponaša se kao da će vam se prijaviti ili ugledno ugledno.
Što je ova knjiga: Ova je knjiga udžbenik prema primjeru. 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 Softver koji ugradite u apsolutno najboljem svjetlu da biste bili najprimjetnija za krajnje korisnike, posjetitelje vaše web stranice. U ovoj ću knjizi pokazati niz primjera softverskog dizajna s fokusom na webu kao platformi kao i sigurnosti. Iskustvo ćemo pokrenuti izradom osnovnog projekta pomoću Unix Shell -a, s značajkama sigurnosnih kopija i skriptiranja. Zatim ćemo ispitati osnovnu web stranicu bloga, nadograditi naš blog s foto i video značajkama, kao i koristiti ove značajke za upotrebu sigurnosnih rješenja pomoću besplatnog softvera i osigurati naš poslužitelj pomoću modula za provjeru autentičnosti (PAM). Zatim ćemo pregledati rukovanje i obradu datoteka, istraživanje uređivanja videozapisa, donacije glasa, skeniranja barkoda i optičkog prepoznavanja znakova, između ostalih koncepata. Uz put ćemo ispitati API -je koji će nam pomoći da svoj softver učinimo korisnijim i sigurnijim, s besplatnim i plaćenim opcijama. Uz put ćemo istražiti fizičku sigurnost i militantne alate poput dizajna i proizvodnje vatrenog oružja i municije, uključujući dizajn barela i repetitora, dizajn kupole i drona, te druge ravnatelje, integrirat ćemo se s našim softverom na postojećoj mreži kako bismo zaštitili naš softver i demonstrirali samoobranu i otpornost. Napravit ćemo pauze za izgradnju igara, 2D i 3D motora za prikazivanje i raditi s ugrađenim hardverom u primjerima softvera za prikazivanje osnovnog dimenzionalnog prikazivanja i elektroničkog masažera za vibriranje u silikonskoj gumi. Uz put ćemo također koristiti rješenja za strojno učenje koja su već dostupna kako bismo bolje osigurali naš softver. Također ćemo koristiti alate za dionice dostupne za web kako bismo pojednostavili i osigurali postupak. Ova je knjiga vodič za vaš uspjeh u izradi web aplikacije i integrirajući je s profesionalnom mrežom računala i ugrađenih mehaničkih sustava, te sveukupno vodič za izgradnju softvera i ugrađenog hardvera bez pozadinskog znanja ili prethodnog iskustva.
Što ova knjiga nije: Ako zaista želite imati web mjesto, mogli biste samo postaviti jednostavnu trgovinu i prodati ono što vam treba, objaviti blog, objaviti fotografije ili videozapise ili na neki drugi način bez ikakvog pisanja niti jednog retka koda. Ova knjiga nije to. Ova će vas knjiga naučiti kako izgraditi softver koji je korisniji, u potpunosti istaknut, funkcionalan i siguran od bilo kojeg softvera koji već možete pronaći, jer je implementirao najnoviji softver koji je i dalje prototipovi, možda bi bilo skupo voditi na ljestvici koje starije tvrtke djeluju i ne dopadnu nazad, savijene tvrtke koje su zarobljene za ljude koji zapravo ne rade novac. Ako pažljivo pratite ovu knjigu, morat ćete pisati kôd, istraživački kod, izgraditi vlastite aplikacije i zaraditi ćete novac od onoga što radite. Zaradit ću novac iz ove knjige, čak i u ranim fazama, jer sadrži informacije koje ljudi trebaju i žele čitati, a već kupuju kada kupuju ili koriste moje aplikacije. Ova knjiga neće izgraditi aplikaciju za vas, ali usmjerit će vas u pravom smjeru i naoružati vas alatima koji su vam potrebni i vještine i savjete koji će vam olakšati vlastiti uspjeh u izgradnji softvera za internet, uz svaki redak koda koji ćete morati napisati kao primjer, spreman da budete sastavljeni u softveru vas i vaše pristaše, goste, Clansele, Friends, Obitelj, ugovor o ugovorima, i narodni ugovor.
Što ćete naučiti: Ova će vas knjiga naučiti kako izgraditi i prodavati softver, stvarno funkcionalan, koristan softver, snimanje medija, sigurnosne značajke poput prepoznavanja lica, skeniranja barkoda za čitnju strojeva, web API -ja za provjeru autentičnosti, snimanja i prenošenja video i fotografija, te komunikacije Bluetooth i u blizini (NFC). This book will teach you how to use a networked computer, focusing on debian linux, how to build bash code to make installing and backing up your software a seamless, automated breeze, how to build python code as a backend to serve dynamic messages, style things nicely using CSS styles with Bootstrap, enable user logins and interactivity through networked devices, build interactive media and network with other websites to offer security features like text messages for verification or other svrhe, skeniranje ID -a, slika i video umjeranost, mikrotransakcije podataka kako bi vaš softver bio siguran, obrada plaćanja, trgovanje kripto -valutom, asinhroni zadaci i još mnogo toga. Naučit ćete kako izgraditi vlastite Bluetooth uređaje, s baterijama, punjačima, mikrokontrolerima, krugovima, motorima i senzorima, koristeći lemljenje, žicu i 3D ispisane, kao i lijevane materijale. Pokazat ću principi 3D dizajna primijenjene na izradu aditiva i izradu alata i matrice, tako da ste u mogućnosti izraditi vlastite ugrađene, hardverske uređaje s integriranim baterijama, punjačima, elektroničkim krugovima i funkcionalnim izlazima. i umrežite ih s Bluetoothom i webom. Konkretno, ispitat ćemo dvije studije slučaja, vibrirajući masažer i domaće vatreno oružje, oba programirano u OpenSCAD -u, koji je dostupan kao grafičko sučelje ili uslužni program naredbenog retka i može se integrirati u web za brže rezultate. Naučit ćete kako izgraditi i rasporediti web mjesto iz temelja bez prethodnog iskustva, učiniti je funkcionalnim, sigurnim, lijepim, korisnim i najvažnije praktičnim. Naučit ćete kako koristiti strojno učenje i računalni vid kako biste web mjesto učinili sigurnim i praktičnijim, zabilježiti video i zvuk s vaše web stranice, donirati svoj glas, stvarati glazbu i modulirati zvuk kako biste stvorili korisne uzorke i kako probiti buku koristeći druge web stranice za izgradnju najbolje moguće mreže web lokacija koje možete povezati izravno na vaše poslovanje i još važnije, a još je još važeći. Ova će se knjiga najviše usredotočiti na medije, sigurnosno i strojno učenje, koje su glavne tri komponente koje će vam pomoći u izgradnji korisnog softvera za internet uključivanjem pravih korisnika i isključivanjem pogrešnih na način koji je realan, praktičan, ruke i privlačan, a istovremeno i automatski i čvrst. Ova knjiga podučava UNIX, posebno Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript i brojne korisne softverske pakete za Python poput zahtjeva, kao i koristan bash softver poput Git i FFMPEG. Također ću vas naučiti kako automatski trgovati kriptovalutama i preuzeti plaćanja u kripto valutama ili s redovnih debitnih kartica, dok čak i plaćate posjetiteljima udio u prihodu ako to odlučite učiniti. Naučit ću vas kako zaraditi novac s vaše web stranice i putem oglašavanja, kako pripremiti svoju aplikaciju za tražilice i učiniti je brzo, rangirati u prvom rangu za ono što će vaši kupci potražiti i rangirati u što više uobičajenih pretraživanja. Naučit ću vas kako prodavati svoj softver, oglašavati ga, privlačiti klijente koji traže vaše usluge i napraviti ime za sebe na Internetu putem avenija koje već postoje, jeftine su i dobro funkcioniraju. Naučit ću vas kako spremiti vaše podatke na računalima u oblaku koji rade za vas i jeftino spremati vaše podatke, kako planirati i izgraditi web mjesto koje radi ono što vaši korisnici žele i što želite i kako zadržati svoje korisnike stavljanjem vaše web lokacije dodirivanjem svojih telefona s obavijestima, e -poštom, tekstualnim porukama i više avenija koji će vam se baviti samo vašom web stranicom. Ova će se knjiga usredotočiti na praktičnost objavljivanja i distribucije medija u velikim količinama, od teksta do fotografija do videozapisa do zvuka, stvaranja dobrog dojma na krajnje korisnike (vašu klijentelu) i prodaju se na bilo koji način koji radite kako biste stvorili web stranicu, aplikaciju koja je samo predstavnika i samo vas čini, a čini vas, vaš softver i vaše kompanije. Također ćete naučiti nekoliko savjeta i trikova od mene, od savjeta za kodiranje, praktične ispraznosti poput šminke i fotografije, modeliranja i glume, i više, što će biti važno za prikazivanje sebe i svoje tvrtke u najboljem mogućem svjetlu koristeći sve alate koji su vam dostupni dok vam je potreban više sadržaja, koliko je to potrebno u velikoj platformi, ili više nego što je riječ o novom naporu. Ova se knjiga naziva "praktičnaInternetsko duboko učenje i sigurnost prema primjeru "iz razloga: bavi se učenjem koda, konkretno za weba, konkretno s naglaskom na sigurnost, s praktičnog stajališta, s primjerima radnog koda koji služi praktičnim svrhama navedenim u tekstu. Komponenta učenja ovog teksta također će vam prikazati rezoluciju, a kodeks će vam se prikazati na mreži, a to će se prikazati na mreži, a to će prikazati videozapis, a kodeks će vam se prikazati računalno i kodeks. Poboljšanje, natpis i drugi zadaci poput metrika predviđanja dobiveni su iz slika, poput prirode slike kao autentične, računalno prenosene slike ili optičke kopije (fotografija slike ili tiskane fotografije). U svom licu. koristiti). Svatko tko gradi softver koji je besprijekorno siguran ima smisla što to podrazumijeva. Softver je inherentno nesiguran, jer uređaji i računi koje koristimo za njemu nisu uvijek na raspolaganju, oni bi mogli biti u rukama bilo koga tko ima loše namjere za softver i stoga mogu predstavljati rizik za sam softver. To je nešto od fokusa ove knjige. Mrežno računalo je prema zadanim postavkama pričvršćeno dugim tokenom ključeva, nazvanim i SSH ili Secure Shell tipkom, a inače je najbolje osigurano web poslužiteljem, jer web poslužitelj pruža otvoreni pristup kao i stanje u alatima za sigurnost umjetnina koji se pokreću na samom poslužitelju. Web poslužitelj ima pristup korisničkom web pregledniku, koji je vjerojatno najmoćniji dio korisničkog uređaja, jer je to mjesto na kojem korisnik može pristupiti mrežnom softveru. Ovaj alat može prikazati tekst, web stranice koje vidite, a također mogu zabilježiti slike, audio i video (poput fotografije lica ili državnog ID -a), mogu čitati i pisati na Bluetooth radio uređaje, a mogu čitati i pisati na blizu oznake transpondera polja, jeftine kartice ključeva, naljepnice, na web -odjeljcima i napisanim na web serijskim brojevima. Koristeći sve alate koji su vam na raspolaganju, uz ovu knjigu opremit ćete se znanjem za izgradnju sigurne web stranice i u cjelini sigurni umreženi računalni sustav koji radi za vas, radi vaše ponude i izgleda i osjeća se
Gdje započeti: Dobrodošli ste da preskočite odjeljak, započinjem ovu knjigu s bilo kojim odjeljkom na točan kôd koji vam je potreban, posebno ako imate iskustva s kodiranjem prije ili bilo kojim od gore spomenutih alata, detaljno ću opisati u ovoj knjizi, kao i dokumentirati slučajeve upotrebe i praktične primjere. Ako nemate iskustva u pisanom kodu, toplo vam preporučujem da pročitate svu ovu knjigu, a posebno vam preporučujem da pročitate prethodne odjeljke kako biste bili sigurni da je ova knjiga prikladna za vas. Ako ova knjiga nije prikladna za vas, razmislite o tome da je poklonite prijatelju ili rođaku koji bi mogao biti zainteresiran da same učenje o web razvoju, pa čak i razmislite o tome da ga posuđujemo i učite od njih kako biste popunili praznine na kojima sam vas uspio kao učitelj ili drugi učitelji prije mene. Započnite tamo gdje hoćete, svaki će dio ove knjige biti koristan ako namjeravate izgraditi korisnu aplikaciju i razmotrite da su najbolje aplikacije izgrađene s krajnjim korisnikom na umu: znajte svog kupca. Sada me znate, znate ovu knjigu i spremni ste za početak. Za početak zgrabite računalo (čak i najjeftinije laptop iz trgovine s kutijom, Amazon ili stare radne površine i postavite ga na način koji vam odgovara.
Kako pročitati ovu knjigu: Tekst istaknut, označava da tekst pripada naredbenom retku, gdje ćete napisati kôd koji pokrećete. Naredbeni redak snažno je fokusiran na tipkovnicu i zahtijeva malo klika, ubrzavajući tijek rada i olakšavajući vam stvari.
Početak: Zaronimo. Započet ćemo izgradnjom koda na lokalnom stroju i započeti bez izgradnje web stranice povezane s Internetom. Ovo je sigurnije za početak, ne košta ništa i lako vam je. Ovisno o vašem operativnom sustavu, ulazak u bash školjku bit će malo drugačiji. Za Mac OS, preporučujem instaliranje virtualnog stroja u ovom trenutku, jer ćete dobiti najviše kompatibilnosti s virtualnim strojem. Različiti pružatelji usluga kao što su VirtualBox i Paralells mogu za vas pokrenuti virtualni stroj, mada je također moguće instalirati Ubuntu izravno na stroj, ako radije koristite izvorno okruženje koje se preporučuje kako biste stvorili brzo, pojednostavljeno iskustvo. Ako koristite Linux ili Windows, što preporučujem, trebalo bi biti prilično lako stvoriti projekt. Otvorite svoj terminal, prilagodite veličinu kako smatrate prikladnim i započnite slijediti korak 2. Ako koristite Windows, slijedite korak 1.
Korak 1: - Samo korisnici sustava Windows U sustavu Windows otvoreni naredbeni redak kao administrator i vrsta WSL - Install
Korak 2: - Nastavite ovdje ili preskočite korak 1 do ovdje ako ne koristite Windows U otvorenom terminalu, (ovisno o vašem OS -u, nazvanom Ubuntu u Windows, terminalu u Mac ili Linuxu ili sličnom imenu), započinje stvaranjem projekta. To radimo s MKDIR naredbom koja stvara direktorij. Ako trebate stvoriti direktorij za pohranjivanje vašeg projekta, koji se preporučuje, upotrijebite naredbu CD -a za promjenu u direktorij i i
CD/PATH/TO/DIRECTORY - Put su mape (datoteke) koje prethode vašem odredišnom direktoriju, vaš zadani put je ~ ili/home/korisničko ime (gdje je korisničko ime vaše korisničko ime). Za promjenu u zadani direktorij, upišite CD ili CD ~ MKDIR Primjer - Zamijenite "primjer" s imenom direktorija
Sada imate radni direktorij za svoj projekt. Budući da je toliko važno da se ovaj direktorij spremi u slučaju da se trebate prebaciti na drugi stroj ili implementirati kôd koji napišete, tako da je spreman za web, izgradit ćemo skriptu za sigurnosnu kopiju vašeg direktorija u sljedećih nekoliko koraka. No, izgradnja skripte zahtijeva malo koda, a kôd se mora automatizirati kako bi bio što korisniji. Dakle, napravimo prvo skriptu za izradu skripta. Započnimo stvaranjem skripte i učinimo je izvršnim. Koristit ćemo sudo, chmod i touch za to, a skriptu nazivamo "ascript".
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Sada smo stvorili skriptu, učinili je izvršnom i spremni smo je urediti. Nano je uređivač teksta koji će vam omogućiti da uredite tekst bez klika, što je mnogo lakše od korištenja grafičkog korisničkog sučelja. Za uređivanje datoteke s Nano, koristite Nano, a zatim put do datoteke. Da biste napravili skriptu koja čini scenarij, prilično je slična izradi našeg scenarija. Koristit ćemo isti kôd kao gore, zamijenit ćemo naziv skripte, "AScript" parametrom argumentacije, 1 USD. To nam omogućuje da nazovemo skriptu tipizirajući jednostavno sudo ascript newript, u kojem trenutku možemo stvoriti bilo koji novi skriptu zamjenjujući "Newscript" imenom vašeg skripte. Kôd u Nanu trebao bi izgledati:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
A da zatvorimo Nano, možemo držati upravljačku tipku i pritisnuti X, a zatim Y da označimo da spremamo datoteku i pritisnete povratak. Sada, umjesto da upišete ove tri naredbe za uređivanje skripte, moći ćemo upisati sudo ascript ascript da bismo ponovo uredili skriptu. Ovo djeluje! I svaka nova skripta može se lako pokrenuti pozivajući je u školjku. Spremimo naš rad sada: Napišimo sigurnosnu kopiju skripte kako bismo spremili našu novu skriptu, a zatim je sigurnosno kopirali u našem direktoriju projekta, a istovremeno sigurnosno kopiranje sigurnosne kopije.
sudo ascript backup
Sada, u Nano:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Gdje/path/to/direktorij je put do projekta koji ste stvorili s mkdir. Kasnije ćemo naučiti kako kopirati ovakve ponovne staze s petljom i popisom, što je manje koda, ali za sada neka bude jednostavno i imaš nekoliko redaka. Da biste pokrenuli ovu skriptu i sigurnosno kopirajte svoj kôd, spremite datoteku u nano s kontrolom+x, y i vratite, a unesite dolje u svoju školjku
backup
Ako vam se uopće zatraži za lozinku dok čitate ovu knjigu i slijedite u školjku, molimo vas da pravilno unesete svoju korisničku lozinku, imat ćete tri pokušaja prije nego što trebate ponovno pokrenuti naredbu. Možete upotrijebiti strelice gore i dolje za ponavljanje naredbi i urediti ih, ako trebate bilo što pokrenuti dva puta. Jednostavno pritisnite gore i dolje povremeno da biste odabrali naredbu, prije uređivanja naredbe s desnom, lijevim strelicama i izbriši tipku, kao i tipkovnicu, te je pokretanje povratka.
Čestitamo! Uspjeli ste stvoriti fantastičnu sigurnosnu kopiju koja sigurnosno kopira dvije važne skripte školjke u vašem radnom direktoriju. Kasnije bismo mogli premjestiti stvari jer projekt postaje veći, ali to zasad djeluje. Krenimo na sigurnosnu kopiju u oblaku, za to ćemo koristiti GitHub (iako postoje brojna druga GIT rješenja za sigurnosnu kopiju, oni su otprilike isti.) Git je softver za kontrolu verision koji vam omogućuje sigurnosne kopije uređivanja softvera dok ih donosite na poslužitelj, a istovremeno vam omogućuje da preuzmete čitave kopije vašeg softvera iza lozinke. To je ključno u spremanju vašeg softvera, pogotovo kad migriramo u osigurane instance Linuxa koji se ponekad pokvare kada jedan redak koda ne uspije, ostavljajući vas zaključanim, dok vaš kôd možda neće biti sigurnosno kopiranje ako ne dobijete priliku automatski ga sigurnosno kopirati, što ćemo pokriti.
Ako u ovom trenutku već ne koristite virtualni stroj Ubuntu, u ovom trenutku preporučujem korištenje Ubuntu virtualnog stroja jer će vam olakšati život prilikom instaliranja svih paketa potrebnih za izgradnju radne web stranice i priprema operacija dubokog učenja na vašem računalu. Premjestit ćemo kôd na web poslužitelj u skoroj budućnosti, ali želimo biti sigurni da iza našeg web poslužitelja iza našeg web poslužitelja postoji najmanje nekoliko slojeva sigurnosti i upotrijebiti brojne Linux pakete kako bismo to učinili. Ako i dalje želite koristiti Mac OS, dobrodošli ste pretraživati i instalirati potrebne pakete na mreži, ali možda nema alternative za svaki paket ove knjige ili serije.
Dodajmo nekoliko naredbi da naši rad počinimo s sigurnosnim kopijama pokretanjem sigurnosne kopije naredbe sudo ascript.
# ...
Još jednom kontrolirajte x za spremanje.
Sada moramo napraviti neku jednokratnu konfiguraciju za ovaj projekt. Budući da će to uskoro biti GIT projekt, ne trebamo upisati svaku naredbu svaki put kad se rasporedimo iz Git spremišta, ali to ćemo dobiti kad napišemo svoje skripte za implementaciju. Za početak, pobrinimo se da se nalazimo u pravom direktoriju i inicijaliziramo Git spremište i generiramo SSH ključeve.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Nakon što upišemo SSH-Keygen, novi ključ treba biti spreman u mapu kućne mape ispod mape koja se zove .ssh. Zove se id_rsa.pub. Pronađite ovu ključ i kopiramo je. Da ga vidim,
cd ~
cat .ssh/id_rsa.pub
Kopirajte tekst koji vraća posljednja naredba i stvorite račun kod vašeg Git pružatelja usluga (idealno GitHub), prije nego što dodate SSH ključ na svoj račun. Nakon što imate račun, kliknite gornji desni izbornik i unesite postavke, prije nego što u izborniku dodate tipku SSH u SSH i GPG tipkama. Odaberite Dodaj SSH tipku i dodajte svoju zalijepljenjem i dajući mu naslov, prije nego što se spremite i vratite u GitHub kako biste stvorili novo spremište. To je slično za ostale Git pružatelje usluga, morat ćete pročitati njihovu dokumentaciju. U novoj konfiguraciji spremišta dajte svom spremištu opisno ime i odlučite želite li ga objaviti i obavezno konfigurirajte datoteke za uključivanje. Jednom kada se kreira spremište, kopirajte klon sa SSH URL -om i zalijepite ga u sljedeću naredbu.
git remote add git://… (your remote URL)
Sada se možete vratiti u svoje spremište s CD -om, bit ćete upoznati s tim. Isprobajte rezervnu skriptu sada s sigurnosnom kopijom
Sjajno! Sada stvarno možemo dobiti kodiranje. Instalirajmo Django sada kad se dobro shvatimo na bashu i gitu. Django će nam dopustiti da automatski sigurnosno kopiramo svoj softver, Bash to može učiniti, ali Django bi trebao imati jednostavniju sigurniju implementaciju (može se lakše onemogućiti i konfigurirati).
Da bismo instalirali softver u Ubuntu, koristit ćemo naredbu sudo apt-get. Prvo, ažurirajmo i nadogradimo softver koji smo već imali. To se može učiniti sa sudo apt-get ažuriranjem i sudo apt-get nadogradnjom -y. Zatim instaliramo Python i naše virtualno okruženje, dom našeg koda, sa sljedećom naredbom: sudo apt-get instalirati python-is-python3 python3-venv
Ovo je sve što vam je potrebno da biste krenuli s Djangoom u smislu instalacije softvera u instanci Ubuntu. Za Windows i Linux ovo bi trebalo biti prilično jednostavno, ali za Mac možda ćete htjeti instalirati virtualni stroj i Linux na njemu koristeći besplatno ili plaćeno virtualno okruženje poput VirtualBox ili Paralells Desktop i ponovno stvoriti gornje korake kako biste postavili Ubuntu okruženje. Ubuntu je u ovom slučaju presudan jer je to softver koji web stranice pokreću i omogućuje im da ugosti web stranice sa svim gore spomenutim softverom.
Kopajmo u Django.
U našem direktoriju, s CD -om:
python -m venv venv # Stvara virtualno okruženje u kojem se pohranjuje kod
source venv/bin/activate # Aktivira virtualno okruženje
django-admin startproject mysite . # Gdje je mysite projekt koji započinjem u svom trenutnom direktoriju.
Django nas tek započinje, jer Django hostira na web poslužitelju i radi sve što je potrebno kako bismo pokrenuli osnovnu lokalnu web stranicu. Sad kad smo instalirani Django, uredimo postavke malo kako bi uspjelo raditi kako nam treba. Prvo, stvorimo novu aplikaciju
python manage.py startapp feed
Primijetit ćete da se prva aplikacija naziva feed. Aplikaciju treba nazvati sve što želite, a mi ćemo stvoriti nove aplikacije, ali naziv svake aplikacije mora biti dosljedan svaki put kada se aplikacija referencira u kodu. Da bismo dodali novu aplikaciju, uvijek ćemo uređivati postavke.py u drugom direktoriju koju je aplikacija stvorila, nazvana u startProject, u daljnjem tekstu. Koristeći nano,
nano app/settings.py
U postavkama pronađite instalirani_apps i odvojite [] u 3 retka. Koristeći četiri prostora na praznoj središnjoj liniji, dodajte 'feed' ili naziv vaše aplikacije. Ovaj dio postavki.py trebao bi izgledati:
INSTALLED_APPS = [
'feed',
]
Prije nego što zaboravimo, testiramo da Django radi. Koristeći naredbu Python Manage.py RunServer 0,0.0.0:8000, možemo pokrenuti poslužitelj, a zatim se kretati u web -pregledniku na računalu koji pokreće kôd na http: // localhost: 8000 i pogledajte primjer web stranice (ona djeluje!) Nastavite poslužitelj s kontrolom C, isto kao i bilo koja druga naredba.
Sada, kopajmo u pisanju nekih python koda. Django ima tri glavne komponente, a sve ih je u potpunosti upravljalo kodom. Komponente se nazivaju Model, View i predložak, a svaka je na višoj i nižoj razini prije nego što se web stranica isporuči korisniku.
Model je kôd koji pohranjuje podatke u bazu podataka za pretraživanje, sortiranje i prikazivanje.
Pogled odlučuje kako je model prikazan, manipuliran i modificiran, gotovo svaki prikaz izravno će koristiti model.
Predložak je HTML kod s nekim dodatnim zvonima i zvižducima koji se nazivaju jezik predloška. Predložak je prikazan prikazom gdje je ispunjen python kodom i kontekstom kao što su modeli i informacije (usuall nizovi i cijeli brojevi) iz pogleda.
Django ima i druge komponente, uključujući, ali ne ograničavajući se na:
Postavke, koje konfiguriraju aplikaciju kao što smo razgovarali.
URL -ovi, koji su obrasci koje korisnik slijedi kako bi dobio pristup određenim dijelovima web aplikacije.
Obrasci, koji definiraju kako se s podacima i u bazu podataka šalje informacije koje se šalju na poslužitelj, kao i korisniku. To su temelj informacija o obradi na strani poslužitelja i može prihvatiti bilo koju vrstu informacija koje računalo pohranjuje, ponajviše tekstualne nizove, brojeve i true/lažne booleans (obično potvrdni okviri).
Predlošci, koji su HTML kôd i jezik predloška i premošćuju jaz između Pythona i HTML -a, što znači da se podaci o Pythonu mogu poslužiti kao HTML kôd kojem svatko može pristupiti i može osigurati web mjesto s ograničenim pristupom, a pritom će Python kôd biti dostupan na webu i korisno za različite svrhe na daljinskom uređaju koji ne treba biti u blizini.
Statičke datoteke, koje su obično JavaScript i njegove knjižnice koje poslužitelj služi i povezuju se s predloškom.
Medijske datoteke, koje poslužitelj služi ili su izvana hostirani ili su tek napisane na poslužitelj prije nego što se obrade i objave na drugom poslužitelju (kantu) za hosting.
Srednji softver, koji su dijelovi koda koji se izvode u isto vrijeme kao i svaki pogled i smatraju se "uključenim" u prikaz.
Kontekstni procesori, koji obrađuju kontekst svakog pogleda i koriste se za dodavanje dodatnog konteksta.
Testovi, koji potvrđuju da korisnik ili zahtjev prosljeđuje određene zahtjeve prije nego što se prikaže prikaz.
Potrošači, koji diktiraju kako se WebSockets bave i reagiraju na komunikaciju.
Administrator, koji se koristi za registraciju modela kako bi se mogli detaljno manipulirati na stranici Django administratora, gdje se baza podataka može upravljati grafičkim sučeljem.
Celer, koji definira asinhrone zadatke dijelove Django koda mogu se početi pokrenuti prije nego što odmah pređe na sljedeći zadatak ili redak koda.
Django može imati mnoge druge komponente o kojima ćemo ovdje detaljno raspravljati. Postoji puno načina da Django postane funkcionalniji, dodajući web -kut, koji su brzi, pojednostavljeni komunikacijski kanali, celer, koji izvršavaju asinhrone zadatke i mnoštvo drugih dijelova softvera za proširenje Djangoa, posebno u funkcijama prikaza, gdje se većina koda izvršava. Funkcije prikaza ključne su jer obično izjavljuju svaki dio koda koji je specifičan za određeni uzorak URL -a ili odjeljak poslužitelja.
Prvo, istražimo funkcije prikaza. Funkcije prikaza započinju s uvozom koji označava kôd koji će se koristiti u prikazu, a definirane su korištenjem redovnih definicija ili klasa. Najjednostavniji prikazi definirani su definicijom funkcije def, i vraćaju HTTPresponse s osnovnim predloškom. Započnimo s definiranjem osnovnog prikaza kako bismo vratili tekst "Hello World". Imajte na umu da svaki put kada dodate kôd nakon izjave poput def, ako, dok, za itd., Morat ćete dodati 4 prostora za svaku od prethodnih definicija koje želite primijeniti na svoju funkciju. Uskoro ćemo ući u ono što svaki od njih znači.
Iz direktorija naše web stranice uredite datoteku feed/views.py pomoću nano i dodajte sljedeće retke na kraj datoteke.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
Django's HttPresponse reagira tekstualnim nizom, označenim otvaranjem i zatvaranjem '. Svaki put kada informacije prenesete funkciji ili klasi, poput zahtjeva ili niza, morat ćete koristiti zagradu (, otvaranje i zatvaranje).
Ovo još nije sve što trebamo vidjeti svoje stajalište. Naravno, nismo rekli poslužitelju gdje je prikaz točno, još uvijek moramo definirati put kojim bi se pogled trebao prikazati. Započnimo definiranjem osnovnog puta u App/URLS.PY, a mi ćemo kasnije ući u grupe staza.
U APP/URLS.PY dodajte liniju nakon uvoznih izjava nakon početka uvoza prikaza koji smo upravo stvorili.
from feed import views as feed_views
Sada, definirajmo obrazac prikaza. Obrasci prikaza imaju tri komponente, komponentu puta, koji poslužitelju govori u kojem prikaz postoji unutar poslužitelja (put URL -a koji korisnik upisuje u navigacijsku traku za ulazak na web stranicu), komponenta prikaza navedena, i prijateljski naziv za prikaz, tako da je lako preuzeti obrazac kada je potrebno da se na drugi način navede i da se nađe na toku, posebno na to da se nađe na toku. Ima smisla raditi stvari na ovaj način i biti fleksibilan, jer će vaša baza kodova biti stalno mijenjanje okruženja za koje je potrebno fleksibilnost i improvizaciju kako bi bili vrijedni i jednostavni za rad. Evo kako će izgledati vaš pogled, to možete dodati u UrlPatterns = [Odjeljak App/Urls.py. Uzorak prikaza definiran je s tri gore opisane komponente i funkcijom koja se naziva put. Vaši URL obrasci su popis, pa se svaka predmet uvijek u sebi završite zarezom, jer to svaki odvaja. Svaka stavka također bi trebala ići na novu liniju, još jednom s četiri prostora prije nje, baš kao i aplikacija u Postavs.py. Prvu komponentu prikaza definirat ćemo s funkcijom praznog niza, kako bismo stvorili prikaz koji se pokreće na korijenskom direktoriju web poslužitelja. Vaš URLSPY bi sada trebao izgledati ovako:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
To je osnova za stvaranje web stranice s Djangom koja je potpuno statična. Da bismo napravili dinamičniju web stranicu na kojoj možemo započeti s predmemoriranjem informacija, poput slika, videozapisa, zvuka i još mnogo toga, morat ćemo koristiti modele, koje ćemo sljedeće istražiti. Za sada provjerimo naš kôd i pokrenemo poslužitelj. Da biste provjerili kôd za pogreške, pokrenite:
python manage.py check
Ako postoje neke poruke o pogrešci, trebali biste pažljivo pregledati promjene koje ste napravili u vašoj aplikaciji i provjeriti ima li nešto što treba popraviti, poput vanjskog ili nedostatka prostora, dodatnog znaka, nebrojenog niza, bilo kojeg pogrešaka, bilo kojeg slučajno izbrisanog znaka ili bilo čega drugog. Čitajući poruku o pogrešci (ako je imate), trebali biste biti u mogućnosti vidjeti put do datoteke koju ste stvorili ili uređivali zajedno s brojem retka, pa pogledajte tu datoteku i redak i pogledajte možete li popraviti sve što je tamo. Ako ste riješili problem, ponovo pokrenite gornju naredbu. Kad je vaš softver spreman za pokretanje i radi, vidjet ćete izlaz "Provjera sustava nije utvrđena problema". Sad ste spremni za odlazak. Pokrenite poslužitelj sa:
python manage.py runserver 0.0.0.0:8000
Sada otvorite web preglednik i idite na http: // localhost: 8000. Prema vašem mišljenju, trebali biste vidjeti tekst vraćen u zagradama i citate funkcije httpresponse. Ovo je samo osnovni primjer, ali ako ste ga napravili do sada, razumijete osnove načina rada Linuxa, Bash -a, Pythona i Djangoa. Kopajmo dublje u neko modeliranje baze podataka i istražimo snagu klase Python u pohranjivanju informacija. Zatim ćemo početi prianjati HTML i CSS prije nego što našu web stranicu napravimo u potpunosti istaknute, fleksibilne i sigurne koristeći JavaScript i strojno učenje.
Razredi su pohranjeni u modelima.py vaše aplikacije. Koristeći Nano, Uredite App/Models.py i dodajte novu klasu. Klasa je definirana s definicijom klase i prenosi se superklasom od kojeg se nasljeđuje, u ovom slučaju modeli.model. Naziv klase dolazi nakon definicije klase, a nakon definicije klase A: (debelo crijevo) koristi se, prije nego što su atributi i definicije funkcija vezane za klasu u nastavku. Naša klasa je potreban ID koji možemo upotrijebiti za preuzimanje i održavanje jedinstvenog, a potrebno mu je i tekstualno polje za pohranu nekih informacija. Kasnije možemo dodati vremensku oznaku, datoteke, booleans (istinite ili lažne definicije koje mogu pomoći našem kodu donositi odluke o tome što učiniti s modelom, a može se koristiti za sortiranje), instancu za vezanje modela s korisnikom zabilježenim na poslužitelj i još mnogo toga. Raspakirajmo kôd u nastavku:
from django.db import models # Uvoz koji se koristi za definiranje naše klase i njegovih atributa
class Post(models.Model): # Definicija same naše klase
id = models.AutoField(primary_key=True) # ID našeg modela, automatski generirani ključ koji će nam omogućiti da upitamo model, držimo ga jedinstvenim i koristan je kada moramo komunicirati s modelom nakon što je stvoren.
text = models.TextField(default='') # Atribut naša klasa pohranjuje, u ovom slučaju, neki tekst, koji ne ispunjava prazan niz.
Zatvorite i spremite datoteku kao što smo prije dovršili.
Postoje mnoga druga polja i opcije koje ćemo istražiti kada ažuriramo ovu klasu kako se naša aplikacija razvija, ali ovo je osnovne potrebe za stvaranjem aplikacije za objavu nekih teksta. Međutim, ovaj model neće raditi sam. Kao što je prethodno opisano, trebat će nam prilagođeni prikaz i prilagođeni URL uzorak kako bismo ovaj model funkcionirali, a trebat će nam i obrazac zajedno s predloškom. Prvo istražujemo obrazac.
Da biste definirali obrazac, uredite aplikaciju/forms.py s nano i dodajte sljedeće retke. Trebat će nam dva uvoza, klasu naših oblika, kao i model koji smo stvorili (feed.models.post), definicija klase slična modelu i polje zajedno s podraznom zvanom meta koja će definirati model s kojim obrazac djeluje. Obrazac može imati i funkciju inicijalizacije koja ga postavlja na temelju podataka u zahtjevu, modelu ili na neki drugi način, to ćemo istražiti kasnije.
Obrasci modela su toliko korisni jer mogu stvoriti model ili također urediti model, tako da ćemo ih koristiti za oba. Definirajmo jedan u form.py u nastavku.
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 je osnove kako izgleda oblik i model. Ovaj se obrazac modela može koristiti za instanciranje ili uređivanje posta, mijenjajući tekst koji sadrži. Razmotrit ćemo integriranje ovog obrasca u sljedeći prikaz. Prvo, napravimo migracije i migriramo bazu podataka kako bi naš kôd mogao komunicirati s modelom kada se pokrene. Da biste to učinili, pokrenite sljedeće naredbe:
python manage.py makemigrations
python manage.py migrate
Ovo će trebati minutu da se izvrši, ali jednom kad to učini, omogućit će vam pristup modelu u pogledu, srednjim softverima ili bilo gdje drugdje u softveru. Nastavimo tako da stavimo u obzir gdje možemo vidjeti naš model. Uredite feed/views.py i dodajte sljedeći kôd, kao što je napomenuto. Nećete trebati dodavati ništa nakon signala #, taj je kôd komentari koji se koriste za označavanje podataka o kodu. Započet ćemo uvozom našeg modela u prikaze i dodati ga u kontekst u kojem ga možemo prenijeti u predložak kao popis za prikaz. Zatim ćemo dodati predložak na kojem možemo oblikovati obrazac i model gumbom za stvaranje novog objekta na temelju modela i objaviti ga na poslužitelj. Ovo zvuči komplicirano, pa samo uzmemo korak po korak. Prije nego što dovršimo prikaz, stvorimo predložak koji samo daje model i provjerimo da ga možemo vidjeti stvaranjem novog posta u školjci. Evo kako bi taj pogled trebao izgledati:
posts = Post.objects.all() # Upitajte sve postove u dosadašnjoj bazi podataka
Sve ovo izgleda prilično jednostavno dok ne stignemo do dna. Rendera, vrijednost koju je funkcija vratila umjesto u HTTP odgovoru kao i prethodni primjer, uvijek uzima zahtjev kao svoj prvi unos, prihvaća kontekst (u ovom slučaju postovi u bazi podataka), koji se sada može prikazati u predlošku i vraća predložak definiran u funkciji. Predložak će biti HTML dokument s malo jezika zvanog Jinja2, koji Python informacije donosi u HTML.
Da biste započeli s stvaranjem predložaka, napravite dva direktorija u feedovima.
mkdir feed/templates
mkdir feed/templates/feed
Zatim uredite predložak u gornjem direktoriju, uhličite/predloške/feed i dodajte kôd za ovaj primjer. Pogledajmo predložak za ovaj primjer.
Ovo je vrlo jednostavan predložak. Definira otvaranje i zatvaranje HTML oznaka, oznaku tipa dokumenta, oznaku tijela s naslovom legende, oznaku prekida koja dodaje malu liniju preko zaslona i za petlju koja svaki post daje na popisu postova kao odlomak u predloškom. Ovo je sve što je potrebno za objavljivanje postova, ali još ih nema u bazi podataka. Napravimo neke s školjkom. Možemo pokrenuti školjku s manage.py
python manage.py shell
Sada, uvedemo naš model posta
from feed.models import Post
Zatim ćemo stvoriti jednostavan post s nizom i izaći iz školjke. Niz može biti bilo što, sve dok je to valjan tekst.
Post.objects.create(text='hello world')
exit()
I na kraju, morat ćemo dodati uzorak URL -a u naš feed. Budući da će naša aplikacija za feed koristiti više URL -ova i želimo održavati malim veličinama datoteka, stvorimo lokalne URLS.Py u našoj aplikaciji za feed koji izgleda ovako:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
Također ćemo morati urediti URLSPY u bazičkoj aplikaciji, kako god smo je odlučili nazvati, ovo je bio prvi direktorij koji smo stvorili. Uredite App/App.py i dodajte sljedeće uzorcima URL -a
from django.urls import include # na vrhu
# ... prethodni kod ovdje
Sada, kada pokrećemo poslužitelj s Python Manage.py RunServer, vidjet ćemo stranicu koju smo stvorili jer imamo model, prikaz i predložak kao i uzorak URL -a, zajedno s stavki u bazi podataka. Dalje, implementiramo obrazac koji smo stvorili i započnite s stvaranjem vlastitih postova. Ali prije nego što napišemo previše koda, napravimo sigurnosnu kopiju pomoću scenarija koji smo napisali ranije, sigurnosno kopiranje. Pokrenite ovu skriptu u školjci, pričekajte nekoliko trenutaka, a sav će kôd biti sigurnosno u našem Git spremištu.
backup
Provedba obrasca je relativno jednostavna. Uvest ćemo naš obrazac, dodati obračun zahtjeva za post u prikaz i spremiti post u bazu podataka prije preusmjeravanja na isti prikaz. Možemo koristiti funkciju preusmjeravanja koju smo već uveli, a druga funkcija nazvana obrnuto da bismo dobili URL za uzorak prikaza. To ćemo upitati nizom 'Feed: FEED' jer je prostor imena uključenog uzorka feed, a pogled se također naziva Feed.
posts = Post.objects.all() # Upitajte sve postove u dosadašnjoj bazi podataka
if request.method == 'POST': # Obraditi zahtjev za post
form = PostForm(request.POST) # Napravite instancu obrasca i spremite podatke na njega
if form.is_valid(): # Potvrditi obrazac
form.save() # Spremite novi objekt
return redirect(reverse('feed:feed')) # Preusmjerite na isti URL sa zahtjevom za get
'form': PostForm(), # Obavezno prenesite oblik u kontekst kako bismo ga mogli pružiti.
Sada ćemo morati ažurirati predložak da bismo objasnili novi obrazac. To možemo učiniti koristeći
Razdvojimo ovo. Postoji nova klasa obrasca, token, sam obrazac i gumb za slanje. Prilično jednostavno, ali kad ga pogledamo, možda bismo htjeli učiniti da izgleda bolje. Djeluje, možemo objaviti nove postove s obrascem, a oni su sada spremni u bazu podataka. Ovdje se događa nekoliko stvari. Koristimo HTML oznake za izjavljivanje da je dokument HTML dokument, koristimo oznaku predloška ({ %… %}) za izradu tokena za obrazac, a drugi, {{…}} za izradu obrasca. Također imamo petlju za prikazivanje teksta pomoću oznaka bloka i oznake predloška. Oznake blokova su zaista važne jer možemo definirati kako se s njima prikazuju dijelovi predloška, a oznake predloška su osnova načina na koji smo varijable stavljali u naš kôd.
Sada moramo učiniti da naša aplikacija izgleda bolje, jer za sada izgleda zaista osnovno. To možemo učiniti pomoću CSS -a, bilo inline ili u klasama vezanim za svaki objekt u dokumentu. CSS je stvarno lijep jer govori sve na stranici kako bi trebao izgledati i može učiniti da izgleda stvarno dobro. Postoji nekoliko knjižnica koje to mogu učiniti, ali moj osobni odlazak je Bootstrap.
Bootstrap se može preuzeti s njihove web stranice,getbootstrap.com/. Nakon što je tamo, pritisnite gumb za čitanje dokumenata za instalaciju i kopirajte kôd iz odjeljka CDN. Trebat će vam ovaj kôd na vrhu vašeg HTML dokumenta, u oznaci koja se zove Head. Također, idemo naprijed i stvorimo osnovni predložak kako ne bismo trebali rekreirati ove veze u svakom predlošku.
Napravite novi direktorij koji se naziva predloške s MKDIR predlošcima, a zatim uredite predloške/baze.html.
Trebao bi izgledati ovako:
Obavezno kopirajte CSS i JavaScript, datoteke .css i .js, jer će nam trebati JavaScript da bi našu web stranicu učinila funkcionalnijom u budućnosti.
Vratimo se u bash školjku i pokrenimo brzu naredbu. Zapamtite, ako ikada trebate pristupiti virtualnom okruženju, upišite izvor venv/bin/aktivirajte. To će vam omogućiti da instalirate Python pakete lokalno na način koji omogućuje Django da im pristupi. Da bismo dali naše oblike generirane klasama Django Bootstrap, koristit ćemo Python paket nazvan Crispy Forms. To možemo preuzeti sa sljedećom naredbom
pip install django-crispy-forms
Nakon što je ovo instalirano, dodajte ga u postavke.py
# … Prethodni kod ovdje
Sada, natrag u naš predložak feeda, možemo ukloniti neke stvari. Uklonimo početak i kraj dokumenta i zamijenimo ga nasljeđivanjem iz našeg osnovnog predloška, koristeći produžene i definiciju bloka. Također ćemo u obrazac dodati uvoz filtra s predloškama s opterećenjem i filter predloška. I na kraju, dodajmo klasu Bootstrap na gumb na obrascu kako bi izgledao više kao gumb. To bi trebalo izgledati ovako:
Prekrasno! To je već dosta koda. Zatim bismo ga trebali testirati i osigurati da vidimo da sve izgleda lijepo, a također budite sigurni da sve radi kako treba. Pokrenite poslužitelj prema prethodnim uputama i osigurajte da web mjesto izgleda i radi u redu. Sjajan posao! Spremni ste prijeći na sljedeći korak, u kojem ćemo dodati funkcionalnost prijave korisnika koristeći slične URL -ove, obrasce, prikaze i predloške. Osnovni predložak je važan, a mi ćemo ga nastaviti mijenjati i unositi promjene po potrebi, ali za sada se usredotočimo na sigurniju našu web lokaciju, omogućujući korisnicima da se prijave s korisničkim imenom i prolaznim kodom, a na kraju još važnije informacije koje će vam pomoći da vam aplikacija bude sigurna i vaš račun dostupna samo od vas.
Da bismo to učinili, morat ćemo koristiti korisnički model ugrađen u Django. Korisnički model je model baze podataka, poput našeg posta, koji se može prikazati za prijavu korisnika na web mjesto. U budućnosti, prije nego što web mjesto postavimo na Internet, proširit ćemo ovaj model s drugim modelima koji su mu pripisani i izgraditi dodatne sigurnosne mjere za prijavu koje su otporne na krađu identiteta. Započet ćemo pomoću nekih ugrađenih obrazaca za prijavu koje Django pruža. Prvo, stvorimo novu aplikaciju koju ćemo koristiti za prikazivanje predložaka i pregleda za osnovnu stranicu za prijavu. Također ćemo stvoriti druge aplikacije koje predstavljaju stalne izazove za prijavu kako bismo osigurali aplikaciju, uključujući Pincode, prepoznavanje lica, komunikaciju u blizini polja, vanjske uređaje, autentifikaciju s više faktora i prepoznavanje otiska prsta.
Već smo razgovarali o pokretanju aplikacije. Iz našeg direktorija, unutar virtualnog okruženja, proći upravljanje.py ti argumenti
python manage.py startapp users
Sada bismo trebali imati direktorij za novu aplikaciju. Započnimo stvaranjem prikaza u tom direktoriju koji odgovara prijavi korisnika. Django je ugradio prikaze za korisničke prijave, ali one neće biti prikladne za nas jer nam treba prilagođeni prikaz, što se po mogućnosti izveo s definicijom.
U ovom ćemo mišljenju započeti provjerom zahtjeva za post, proći zahtjev.Post na prijavu uvezen iz Djangoa, autentificirati korisnički račun i prijaviti se korisnika prije nego što ih preusmjerite u našu aplikaciju za feed.
U korisnike/views.py dodajte sljedeći kôd
username = request.POST['username'] # Nabavite korisničko ime i lozinku s zahtjeva za post
password = request.POST['password'] # Autentificirati korisnika
Ovo je sve što vam treba za osnovni prikaz prijave. Sada, stvorimo obrazac za prikaz proširivanjem osnovnog predloška. Započet ćemo stvaranjem novog direktorija za predloške u mapi korisnika.
mkdir users/templates
mkdir users/templates/users
Sada bismo trebali biti u mogućnosti uređivati korisnike/predloške/korisnike/prijava.html. Dok smo na tome, stvorit ćemo predložak kako bi se omogućilo korisniku da se prijavi.
nano users/templates/users/login.html
Sada, u predlošku,
Ovo je osnove predloška za prijavu. Zaista je baš kao i drugi predložak u strukturi, ali izgleda malo drugačije kada je prikazan. Ovaj kôd možemo kopirati za izgradnju drugog vrlo sličnog predloška pod nazivom Registar.html, gdje ćemo promijeniti formulaciju i koristiti novi obrazac koji gradimo. Napravimo prvo predložak. Uređivanje korisnika/predložaka/korisnici/registraciju.html i dodajte sljedeći kôd:
Sada, napravimo obrazac za registraciju našeg korisnika i zaokružimo na prikaze prije nego što nadogradimo naše korisnike s modelom. Počet ćemo ovaj obrazac, ali ubuduće ćemo uključiti više detalja i sigurnosnih značajki kao što su sporazumi i Captcha. Uredite obrasce s nano korisnicima/forms.py i dodajte sljedeći kôd.
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']
Dakle, ovdje imamo još jedan oblik, koji djeluje prilično jednostavno. To je obrazac za registraciju korisnika s korisničkim imenom, e -poštom i lozinkom, kao i poljem za potvrdu lozinke. Imajte na umu da ovaj obrazac ne proširuje redovne forme. Obrazac, to je obrazac modela koji znači da ima meta. Jedno je polje definirano isto, a klasa Meta definira model koji obrazac odgovara ostatku podataka koji će biti napisani u obrascu. Većina toga već postoji u Djangovom ugrađenom u UserCreationForm, pa ćemo to koristiti kao osnovu za klasu (prođenu u zagradama).
Zatim ćemo ispitati prikaz da registriramo korisnika, sada kada imamo obrazac i predložak. Ovo je modelform, baš kao i onaj u New Post Viewu. Uređivanje korisnika/views.py i dodajte sljedeći kôd:
# … Uvoz
Ovo je sve što trebamo da se korisniku registrira, ali trebali bismo imati više informacija. Želimo znati vrijeme koje je korisnik registrirao, u koje vrijeme je bilo posljednje na web mjestu, neke informacije o njima, poput biografije, vremenske zone itd. Također, morat ćemo ažurirati naš model feeda, objaviti kako bismo računali korisnički model i atributirali postove svakog korisnika. Da bismo to učinili, ažurirat ćemo model.py u obje aplikacije. Započnimo uređivanjem modela feeda. Sad bi trebao izgledati ovako:
from django.db import models # … Uvoz
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Dodajte u ovu liniju
Obratite pažnju na drugi redak koji je dodan u datoteku. Ovo je strani ključ, koji će svaki post pripisati jednom korisniku po postu, tako da možemo biti sigurni da spremimo postove na osnovi korisnika po korisniku i nijedan post se ne može obaviti bez pripisivanja korisniku. Ovaj strani ključ definiramo s klasom koju predstavlja, argument brisanja kako bi se osiguralo da se postovi brišu s korisnicima, null i praznim argumentima kako bismo bili sigurni da možemo ukloniti korisnika ako je potrebno i da se prilagodimo nedostatku korisnika na postovima koje smo već stvorili, te srodnim imenom, koje možemo koristiti za upućivanje na objekte koji korisnik stvara. Ovo povezano ime, za razliku od post.author, autora Post -a, daje nam korisnika koji je objavio sam post. Sada možemo dobiti postove koje je korisnik napravio pokretanjem user.posts.all () ili autor.posts.all ().
Sada, učinimo da naše prijave postanemo otpornija. Već možemo učiniti našu web lokaciju mnogo manje osjetljivom na krađu identiteta jednostavnim ograničavanjem brzine koliko ćemo puta dopustiti prijavu na web mjesto, ovo je prilično jednostavno. Počnimo također pohraniti neke podatke o svakom korisniku prije dok nastavljamo razvijati našu aplikaciju. Uređivanje korisnika/modela.py dodajte sljedeći kôd.
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='')
Imajte na umu da je ovaj model prilično sličan modelu post. Imamo dodatni uvoz, vremensku zonu, što će nam omogućiti da postavimo zadane postavke na DateTime poljima, a imamo i likfer i Textfield poput Posta. Korištenje svih ovih vremenskih oznaka pomaže nam da osiguramo web mjesto i razumijemo njegovu upotrebu, a tekstualna polja omogućuju nam da na web stranici dostavimo informacije o svakom korisniku ili autoru. Onetoonefield bi trebao biti jedini manji razmatranje, ponaša se potpuno isto kao i preopći, ali sa samo jednim po narednim modelu. Na taj način korisnik ima samo jedan profil, dok može imati mnogo postova.
Sada, poboljšamo našu prijavu i registrirajmo prikaze kako bismo objasnili profil. Prvo, uredite korisnike/views.py i usredotočite se na prikaz registra:
# … Uvoz
Profile.objects.create(user=user) # Obavezno dodajte ovu liniju kako biste stvorili profil za korisnika
To jednostavno stvara profil za korisnika, bez popunjavanja nijedne od informacija. Sada želimo osigurati da se korisnički račun ne može prečesto prijaviti ili se barem lozinke ne mogu isprobati prečesto, pa ažurirajmo prikaz prijave.
# … Uvoz
if user and user.profile.can_login < timezone.now(): # Imajte na umu da sada provjeravamo može li se korisnik prijaviti
else: # Ako prijava nije bila uspješna,
user = User.objects.filter(username=username).first() # Ovo je dio gdje ažuriramo profil korisnika
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Tako se ne mogu ponovno prijaviti na nekoliko sekundi
Ovo je osnovni temelj sigurnosti. Provjerite nije li web mjesto ranjivo na nekoga, jednostavno isprobava svaku moguću kombinaciju lozinke, ili čak i nekoliko njih istovremeno. To neće biti frustrirajuće za običnog korisnika koji poznaje svoj prolaz i samo se prijavljuje na nekoliko uređaja, ali to će zadržati brojne phishing robote izvan aplikacije. Imajte na umu da smo dodali IF izjavu s varijablom, Can_Login, to bi trebalo biti vrijeme u prošlosti i ažurirati ga sa svakom neuspješnom prijavom koristeći isto korisničko ime. Na ovaj način zlonamjerni korisnik neće moći brzo pogoditi lozinku blizu. Broj sekundi u DateTime.Midelta () također se može ažurirati, a web stranica će biti otpornija, ali malo manje upotrebljiva s više sekundi. Preporučujem 15 za početak.
Zapamtite, izgradili smo rezervnu skriptu kako bismo spasili svoj rad, pa idemo naprijed i sigurnosni kopija što imamo do sada kako bismo bili sigurni da smo sve spasili. Pokrenite naredbu:
sudo backup
Još jednom, ovo će vam spasiti posao do sada. Preporučujem da pokrenete česte sigurnosne kopije kako biste spremili svoj rad, a možda ćete čak i željeti automatski pokrenuti sigurnosni posao. To možete učiniti pomoću UNIX uslužnog programa zvanog Cron. Da biste aktivirali ovaj uslužni program, pokrenite sljedeću naredbu i unesite lozinku:
sudo crontab -e
Ako već niste odabrali opciju 1 za Nano, uređivač teksta koji biste već trebali biti upoznati i pomaknite se do dna datoteke pomoću tipki sa strelicama. Dodajte sljedeći redak:
0 * * * * sudo backup
Cron koristi format minute, sat, dan u mjesecu, mjesec, dan u tjednu, gdje A * ili broj predstavlja kada treba pokrenuti naredbu. Koristeći 0 za minutu i * za ostale opcije, možemo pokrenuti naredbu u prvoj minuti svakog sata na početku minute. To nam omogućuje automatski sigurnosno kopiranje kopija. Svi Cronovi poslovi kada su izvršeni sa Sudo Run kao Root, tako da nam neće trebati upisati lozinku svakih sat vremena.
Da bismo olakšali sigurnosnu kopiju našeg koda bez korištenja lozinke, onemogućimo lozinku za našu naredbu sigurnosne kopije. To ćemo učiniti izvršavanjem sljedeće naredbe i unosom lozinke:
sudo visudo
Sada, pomaknimo se do dna datoteke i dodajmo još jedan redak:
ALL ALL=NOPASSWD: /bin/backup
To nam omogućuje pokretanje naredbe "sigurnosno kopiranje" kao bilo koji korisnik, bez lozinke. Format za to je jednostavan, samo prefikcite liniju s "sve = nopasswd:/bin/" i završite s naredbom, na primjer/bin/backup, koji postoji u/usr/bin/.
Sada, počnimo raditi s e -poštom. E -pošta je zaista važna za web stranice, jer je to način da web mjesto održava sigurniju, provjerite da su korisnici stvarni ljudi, pa čak i tržišni proizvodi ili usluge kupcima. Mnogi ljudi koji svakodnevno provjeravaju internet provjeravaju svoju e -poštu i primaju sve vrste marketinške e -pošte o proizvodima i uslugama koje ih zanimaju. Postoji nekoliko opcija kada je u pitanju omogućavanje e -pošte na web stranici Django, a dobrodošli ste da odaberete ono što najbolje radi za vas.
Prvo možete platiti uslugu e -pošte koja će vam omogućiti slanje e -pošte s vaše domene i zahtijeva minimalni kôd. Mnogo je usluga koje to nude, kao što su Google Workspace, SendInBlue, Mailgun i još mnogo toga.
Inače ste dobro izgradili vlastitu uslugu e -pošte unutar vašeg poslužitelja od nule. Preporučujem ovu opciju, iako je više koda i možda će zahtijevati poseban hosting. Najvjerojatnije nećete moći pokrenuti poslužitelj pošte s kućnog računala, pa idemo naprijed i ispitamo konfiguraciju i kôd za slanje e -pošte prije nego što pokrenemo poslužitelj u oblaku i stvorimo vlastiti poslužitelj pošte unutar.
Prvo, uredite postavke.py sa sljedećom naredbom:
nano app/settings.py
Gdje je aplikacija naziv aplikacije koju ste stvorili pomoću STARTAPP -a.
Dodajte sljedeće retke:
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)
Obavezno ih promijenite kad budete spremni implementirati svoju aplikaciju, mi ćemo to kasnije ponovno posjetiti. Postavka email_address trebala bi biti e -pošta koju želite poslati, a lozinka (email_host_password) trebala bi biti postavljena na lozinku koju generirate za poslužitelj. Ulažem lozinku iz konfiguracijske datoteke kako bih je držao izvan koda pomoću sljedeće logike, iznad ovih redaka u Settings.py:
import os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
Zatim sam postavio JSON datoteku s konfiguracijom in /etc/config.json koristeći nano kako slijedi.
Za uređivanje datoteke:
sudo nano /etc/config.json
Dodajte sljedeće retke:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
Nastavit ćemo uređivati konfiguraciju i dodati sve lozinke i ključeve koje ćemo koristiti u aplikaciji. Za sada, brzo ispitajmo kako poslati e -poštu pomoću Pythona. Prvo, stvorimo predložak za e -poštu za provjeru koju možemo poslati našim korisnicima i staviti ga u direktorij korisničkih predložaka. Ovaj će predložak biti napisan u HTML -u.
nano users/templates/users/verification_email.html
Ova je e -pošta prilično jednostavna. Potreban je kontekst korisnika, osnovnog URL -a za web mjesto i korisničkog ID -a i tokena koji se koriste za provjeru korisničke e -pošte. Obavezno definirajte osnovni URL u Postavs.py prije nego što napišemo neki python kôd za izradu predloška. Nastavite i dodajte sljedeće retke u App/Settings.py, blizu početka.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
Na kraju, kada je vaša web lokacija spremna za Internet i implementirate je, svoju domenu morat ćete definirati kao naziv domene koje kupite da biste predstavili web mjesto. Ovo je ime koje ćete upisati u NAVBAR kako biste pristupili vašoj web lokaciji. Za sada možete ostaviti domenu praznu ili koristiti rezerviranu mjesta. Također ćete htjeti promijeniti ime web stranice u ime koje želite dati svojoj web stranici po vašem izboru.
Prije nego što pošaljemo e -poštu, stvorimo generator tokena kako bismo mogli imati token za aktivaciju računa koji nikad ne istječe. To možemo učiniti izgradnjom i uvozom tokena za aktivaciju računa koji izgleda kao sljedeće. Uredite datoteku:
nano users/tokens.py
Dodajte sljedeći kod:
from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six
class TokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (
six.text_type(user.pk) + six.text_type(timestamp)
)
account_activation_token = TokenGenerator()
unsubscribe_token = TokenGenerator()
Ovaj osnovni generator tokena generira token koji korisniku možemo poslati u URL -u, a korisnik može koristiti za provjeru njihove e -pošte i aktiviranje njihovog računa.
Dalje, da vidimo kako poslati e -poštu. Koristeći Nano, uredite korisnike/email.py.
nano users/email.py
Slanje provjere HTML e -pošte izgledat će ovako:
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)
Ovo je prilično jednostavno. Uvozimo funkcije koje trebamo poslati e -poštu, e -poštu predati predlošcima i našim postavkama, a zatim definiramo e -poštu prema nazivu predloška i šaljemo je korisniku pomoću funkcije. Primijetit ćete da nismo definirali funkciju za slanje pošte, send_html_email, pa napijmo ovo ispod koda koji smo već dodali korisnicima/email.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()
Ovo je malo složenije i još nismo spremni pokrenuti sav ovaj kôd. Primijetite da definiramo UNSUB_LINK, vezu koju korisnik može koristiti za odjavu s naših e -mailova. To je važno, jer će se korisnici morati isključiti iz naše e -pošte, osim ako ih u bilo kojem trenutku ne žele vidjeti. U našu poruku dodajemo i alternativu teksta, a to je HTML poruka lišena HTML oznaka. I na kraju, provjeravamo je li e -pošta poslana, a ako nije, u profilu korisnika označavamo da njihova e -pošta nije valjana.
Vratimo se na korisničke modele kako bismo sve to uspjeli. Moramo definirati funkciju za generiranje veze na odjavu i definirati boolean polje kako bismo označili da korisnikova e -pošta nije valjana.
Prvo dodajte sljedeći uvoz na vrh korisnika/modela.py
nano users/models.py
# ...
Zatim dodajmo funkcije korisničkom modelu kako bismo napravili token i provjerili token koji se koristi za aktiviranje e -pošte, kao i polje kako bismo spremili da li korisnik uspješno prima svoju poštu. U korisnici/model.py ponovo dodajte sljedeći kôd na kraj modela (razvedeni kôd)
# ...
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Vrijedi 30 dana
Ovo je prilično jednostavno, koristimo vremenski plovidbu, što je osnovni alat za kriptografiju, za stvaranje tokena koji će istjerati nakon određenog vremena, a također koristimo drugu funkciju za provjeru je li valjana. Koristimo ove tokene dva puta, jednom, za provjeru e -pošte i jednom za vezu odjava.
Sad kad ih imamo, posljednji od posla koji ćemo trebati je u pogledima. Unutar korisnika/views.py, dodajmo prikaze kako bismo provjerili adresu e -pošte i odjavili pretplatu.
nano users/views.py
Prvo dodajte sljedeći uvoz. Bacio sam nekoliko dodatnih, tako da kasnije više nećemo morati uvesti više predmeta.
from .email import send_verification_email # Obavezno uvozite funkciju slanja e -pošte za provjeru
Možda već imate neki od tih uvoza, ali ne boli ih ponoviti. Morat ćete uvesti funkciju slanja e -pošte za provjeru, kao i računa Account_activairation_Token iz korisnika.tokens, između ostalih uvoza.
Sada, na dnu datoteke, dodajte sljedeći kôd:
# Odjaviti ih
# Inače preusmjerite na stranicu za prijavu
# sendWELOMEEMail (zahtjev, korisnik)
Ovo je puno koda. Razdvojimo ga. Prva funkcija, čista i jednostavna, odjavljuje korisnika s popisa za slanje. Druga funkcija aktivira njihovu e -poštu, a primijetit ćete da sam dodala komentiranu funkciju, SendWelcomeEmail. Možete koristiti predložak e -pošte i definiciju funkcije za slanje e -pošte dobrodošlice, jednostavno još nisam. Posljednja funkcija koju sam bacio je važna, jer aktiviraju e -poštu ističu. Stoga ćemo morati ponovno preispitati e -poštu za aktivaciju. Za to možemo koristiti osnovni obrazac i pozvati funkciju za slanje e -pošte za provjeru. Prije nego što to učinimo, provjerimo da se na prvom mjestu šalje dodavanjem poziva funkcije u prikaz registra. Dodajte ovu liniju neposredno prije preusmjeravanja u registar prikaza, def registar, u korisnici/views.py.
nano users/views.py
# … (Nakon) def registar (zahtjev):
# … (Prije) preusmjeriti (
Ne morate dodati prve i posljednje retke u tom isječku koda, samo provjerite je li prikaz registra korisniku šalje e -poštu za provjeru. Trebao bi izgledati ovako:
# … Uvoz
send_verification_email(user) # Obavezno dodajte ovu liniju!
Sada ćemo morati dodati obrazac za ponovno postavljanje e -pošte za aktivaciju. U korisnike/forms.py dodajte sljedeći obrazac:
# … (Uvoz)
Trebat će nam i predložak koji odgovara ovom obrascu za aktivaciju e -pošte za ponovno postavljanje. Dodajmo ovaj predložak. Uredite datoteku:
nano users/templates/users/resend_activation.html
Zatim dodajte sljedeći kôd u datoteku.
Whew, to je puno! Sada, kada kodu postavljamo na naš poslužitelj, moći ćemo poslati HTML e -poštu i aktivirati korisničke račune klikom u e -poštu. Također bismo željeli poslati jednostavnu e -poštu dobrodošlice, pa da vidimo kako to učiniti. Povratak u korisnike/email.py, dodajte sljedeći kôd:
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)
Također, trebat će nam predložak za prikazivanje svih ovih podataka. Na mojoj web stranici predložak izgleda kao u nastavku, ali dobrodošli ste da ga formatirate koliko god želite.
Imajte na umu da nemamo zatvaranje tijela ili HTML oznake, jer ih dodamo kada dodamo vezu HTML odjava. To su važne, ali ne želimo ih definirati dva puta.
Pa što je sljedeće? Prešli smo dug put. Zaista, trebali bismo biti spremni rasporediti web mjesto na poslužitelj. Možemo dodati @Login_Required dekorator i učiniti naše stavove sigurnim, uzeti korisničke prijave, slati kompatibilnu e -poštu i podatke o predmemoriji, što je osnova onoga što web stranica treba učiniti kako bi ostala relevantna. Dodati ćemo još nekoliko korisnih značajki, a zatim izgraditi osnovu za raspoređivanje našeg koda na udaljeni poslužitelj, postavljanje poslužitelja pošte, konfiguracije domene i filtera kako bi našu web stranicu učinila sigurnom i prikladnom.
Također će nam trebati prikaz resetiranja lozinke, pa dodajmo to stvarno brzo. Django -ov ugrađeni prikaz resetiranja lozinki razbijen je u nekim funkcijama, ali pogledat ćemo kako napisati vlastiti prikaz, predložak e -pošte, obrasce i uzorke URL -a. Evo kako izgleda prikaz, u korisnicima/views.py
# ... uvoz
Ovaj je obrazac ugrađen u Django, ali trebat će nam predložak za potvrdu resetiranja lozinke, korisnici/predlošci/korisnici/passwort_reset_confirm.html
Imamo i predložak za slanje e -pošte za resetiranje lozinke, s jednostavnim obrascem, u korisnicima/predlošcima/korisnicima/password_reset.html
Predložak za samu e -poštu je jednostavan, to je osnovna HTML datoteka koja prikazuje vezu za resetiranje lozinke, u korisnicima/predlošcima/korisnicima/lozinkom_reset_email.html. Django će automatski tumačiti ovu datoteku.
Također će nam trebati još dvije predloške. Prvo je potvrditi da je e -pošta poslana. Pogledi za njih već su u Djangu, pa ih samo trebamo obratiti u URLS.PY. Ovaj se predložak nalazi kod korisnika/predložaka/korisnika/password_reset_done.html
I na kraju, da potvrdimo da je resetiranje lozinke dovršeno, korisnici/predlošci/korisnici/passwort_reset_complete.html
Sada nam trebaju uzorci URL -a za ove poglede. U korisnike/urls.py dodajte sljedeće uzorke URL -a:
# ... prethodni URL -ovi ovdje
Četiri predložaka, to je puno! Ali sada možemo biti sigurni da možemo resetirati lozinku korisnika u bilo kojem trenutku kada trebamo, sve iz web preglednika.
Razumijem da je ovo puno koda. Ako vam se čini malo preko glave, to je u redu. Poboljšat ćete se, vaše će se razumijevanje poboljšati i vrlo brzo ćete postati puno kompetentniji s kodom. Ako ste potpuno izgubljeni, preporučujem vam da se vratite na ovaj softver kasnije nakon što radite na samostalnom učenju za kodiranje tečaja na mreži. Obično su besplatni za početak i vodit će vas kroz sve što vam je potrebno da biste bili uspješni kad se vratite na ovaj projekt. Ako se osjećate kao da ste spremni nastaviti, čitati, da biste sljedeće, mi ćemo pokriti raspoređivanje vašeg koda na udaljeni poslužitelj i postavljati poslužitelj pošte, kao i automatizaciju vašeg implementacije pomoću BASH -a, tako da uvijek možete postaviti novi projekt s nekoliko jednostavnih naredbi.
Posljednje što trebamo učiniti prije nego što se rasporedimo na udaljeni poslužitelj je učiniti našu web stranicu malo sigurnijom. Primijetit ćete da prikaz prijave uzima samo korisničko ime i lozinku, a nema više faktora provjere autentičnosti ili jednog vremena. Ovo je lako popraviti, a s istim kodom možemo naša web lokacija poslati tekstualne poruke, pa čak i reagirati na tekstualne poruke poslane na poslužitelj. Za početak, vratit ćemo se u korisničke modele i dodati potpisnika vremenske oznake koji će predstavljati svaku prijavu. Također ćemo dodati jedinstveni, rotirajući identifikator korisničkom modelu koji će se koristiti za dodavanje dodatne sigurnosti u našu prijavu. Uređivanje korisničkih modela, Korisnici/Models.py, dodajte sljedeći kôd:
# Obavezno uvozite UUID, TIMESTAMP i generator URL -a (obrnuto)
# Dodajte ovaj kod ovdje
# I dodajte ovu funkciju
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Vrijedi za 3 minute
Provjerite da li vaši korisnici/modeli.py izgledaju ovako, osim komentara (kod na liniji s #). Razbijanje ovoga, jednostavno je. Imamo nekoliko uvoza, vremenskog udaraca koji je kriptografski uslužni program koji može generirati siguran kôd i provjeriti ga kako bi se uvjerio da je valjano, koristi se samo jednom, a ne stariji od određenog broja sekundi. Također koristimo UUID, koji je jedinstveni identifikator koji identificira našeg korisnika u potpisivanju tokena i u URL -u gdje se token šalje korisniku. Koristit ćemo ovu osnovnu kriptografiju za izgradnju prikaza provjere autentičnosti s dva faktora. Prije nego što učinimo bilo što drugo, pokrenimo migracije kako bi se ažurirali naši korisnički modeli. U direktoriju s manage.py pokrenite sljedeće naredbe kako biste napravili i dovršili migracije.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
To je važno jer svaki put kada napravimo promjene u modelima morat ćemo stvoriti tablice i ažurirati bazu podataka sa zadanim postavkama prije nego što zapravo možemo koristiti modele.
Dalje, improvizirajmo naš prikaz prijave kako bismo preusmjerili na sekundarni prikaz provjere autentičnosti. U korisnika/views.py uklonite funkciju prijave i preusmjerite na URL koji smo upravo generirali u korisničkim modelima.
# … Uvoz
if user and user.profile.can_login < timezone.now(): # Imajte na umu da sada provjeravamo može li se korisnik prijaviti
# Uklonite funkciju Auth_Login koja je bila ovdje
return redirect(user.profile.create_auth_url()) # Imajte na umu da ovdje preusmjerimo na novi URL
else: # Ako korisnik ne koristi višefaktorsku provjeru autentičnosti, samo ih prijavite.
else: # Ako prijava nije bila uspješna,
user = User.objects.filter(username=username).first() # Ovo je dio gdje ažuriramo profil korisnika
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Tako se ne mogu ponovno prijaviti na nekoliko sekundi
Dakle, ovo je prilično jednostavno, sada imamo način preusmjeravanja na prikaz provjere autentičnosti dva faktora kada ga stvorimo. Također imamo povratak u slučaju da korisnik nije dodao telefonski broj. Dodati ćemo osnovni prikaz kako bismo uskoro dodali telefonski broj i prijavili se s tekstualnom porukom.
Prvo, potreban nam je jednostavan način za slanje tekstualne poruke iz našeg koda. Da bismo to učinili, možemo birati između niza API -ja, ali po mom mišljenju najlakše je Twilio. Oni također nude dobre cijene za manje projekte, kao i skupne popuste. Napravite račun na twilio.com, ispunite neke detalje o svom projektu, kupite telefonski broj i kopirajte svoje API tipke u svoje postavke.py. Zatim dodajte ovaj kôd u novu datoteku, korisnici/sms.py.
nano users/sms.py
# Uvezite sve potrebne pakete
# Ovaj kôd šalje tekst s twilioom
# Pomoćna funkcija za dobivanje broja s toliko znamenki
# Pošaljite tekst da provjeri korisnika
# Pošaljite korisniku bilo koji tekst s ovom funkcijom
# Potvrdite kôd ovom funkcijom
# Potvrditi vrijeme
Obavezno promijenite svoje postavke na odgovarajući način, dodajući ove retke svojim ključevima:
# Obavezno ih kopirajte s Twilio nadzorne ploče
AUTH_VALID_MINUTES = 3 # Broj minuta TFA stranica je aktivna nakon instanciranja
Prvo, trebat će nam obrasci za naša dva pregleda autentičnosti faktora. Uređivanje korisnika/obrasca.py dodajte sljedeći kôd.
# … Uvoz
# Obrazac za unos našeg telefonskog broja
# Obrazac za provjeru autentičnosti
Dalje, stvorimo prikaze u korisnicima/views.py
# … Uvoz
Trebat će nam i predloške za oba ova stajališta. Dodajmo prvo MFA predložak.
nano users/templates/users/mfa.html
Dodajte ovaj HTML kôd u predložak
Ovo je prilično samoobjavano. Obrazac šalje ili kôd ili prazan kôd, a u prikazu ćete primijetiti da pošaljemo kôd ako primimo prazan kôd. Tada imamo samo dva gumba za slanje i na taj način možemo poslati kôd bilo kojim gumbom. Zatim ćemo dodati jednostavan obrazac za dodavanje telefonskog broja.
nano users/templates/users/mfa_onboarding.html
Dodajte sljedeći HTML:
Ovaj je obrazac puno jednostavniji, samo čini obrazac telefonskog broja koji smo stvorili i omogućuje korisniku da doda telefonski broj.
Ovo izgleda stvarno dobro! Sve dok je sve pravilno postavljeno, trebali bismo moći slati poruke i prijaviti korisnika s njihovim telefonskim brojem čim dodamo uzorke URL -a. Posljednje što trebamo postaviti je prikaz profila, tako da možemo osigurati da korisnik može promijeniti svoj telefonski broj bez prijave. Također, na kraju ćemo htjeti dodati opciju "Stop to Quit", tako da korisnik može poslati tekst "zaustavljanja" da se isključi iz budućih tekstualnih poruka.
Dodajmo prikaz profila korisnicima/views.py. Ovaj će prikaz ažurirati bio korisnik, e -poštu, korisničko ime i telefonski broj, kao i omogućiti nam da omogućimo provjeru autentičnosti s više faktora. Prvo, trebat će nam još dva obrasca u korisnicima/formima.py
# ... uvoz
Zatim možemo stvoriti prikaz da bismo koristili oba ova oblika. Uredite korisnike/views.py i dodajte u prikaz.
# Dodajte ove uvoz
Za ovaj prikaz trebat će nam i predložak.
nano users/templates/users/profile.html
Primijetit ćete da je ovo prilično jednostavan oblik, ali ima neki JavaScript u sebi koji automatski objavljuje sadržaj obrasca dok se ažuriraju. To je korisno imati, tako da ste u mogućnosti izvršavati uređivanje bez da se svaki put morate pritiskati.
Dalje, potrebni su nam URL -ovi koji predstavljaju sve ove prikaze u korisnicima URL -a. Uređivanje korisnika/urls.py i dodajte ovaj kôd:
# … Prethodni kod, uvoz
# … URL obrasci koje smo prethodno unijeli, dodajte sljedeće tri retka
Sada je pravo vrijeme za testiranje našeg projekta. Ali prvo, pokrenimo još jednu sigurnosnu kopiju.
backup
I pokrenite poslužitelj. Prije nego što se rasporedimo na Linux poslužitelj, dobra je ideja omogućiti dva faktora provjere autentičnosti na računu. Učinit ćemo to idući na naš URL profila,/korisnici/profil/i potvrditi okvir kako biste omogućili provjeru autentičnosti nakon unosa našeg telefonskog broja, a zatim slanje obrasca.
python manage.py runserver localhost:8000
Posjetite web stranicu tako što odlazite u svoj web preglednik, u ovom primjeru koristim Google Chrome i unosim URL https: // localhost: 8000/računi/profil/profil/
Moći ćete se prijaviti ako je potrebno i omogućiti provjeru autentičnosti s dva faktora.
Ovaj projekt treba poslužitelj koji će se pokrenuti kako bi zaista mogao poslati poštu. Ali prvo, potreban nam je način da vidimo pogreške. Primijetit ćete da ako pokrenete poslužitelj u načinu za uklanjanje pogrešaka, s postavkama.debug jednak istinito, poslužitelj automatski prikazuje pogreške. Da bismo pokazali pogreške bez korištenja načina za uklanjanje pogrešaka, koji je nesiguran na proizvodnom poslužitelju, trebali bismo dodati prikaz za to. Najvažnije pogreške s kojima se moramo nositi su:
Pogreška 500 - Problem s našim kodom Pogreška 404 - Stranica koja nije pronađena (slomljeni URL) Pogreška 403 - dopuštenje odbijena pogreška
Dodajmo novu aplikaciju za rješavanje ovih pogrešaka, nazvane pogreške.
python manage.py startapp errors
Dodajte ovo u Postavke.py kao što smo to učinili prije, u postavku Instalirano_apps i započnite dodavanjem referenci na neke prikaze u APP/URLS.PY, gdje je aplikacija naziv vašeg Django projekta.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Ovo je sve što trebamo osim prikaza pogrešaka, predložaka i malo srednjeg softvera. Definirajmo ih kao tako:
# Stvorite svoje prikaze ovdje.
Dalje, definirajmo srednji softver za rješavanje ovih pogrešaka. To ćemo učiniti tako što ćete prvo dodavati Middleware_Classes u Settings.py, s nazivom našeg srednjeg softvera.
# ... prethodni srednji softver
Dalje, dodajmo srednji softver.
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.')
Dodajemo funkciju kako bismo dobili trenutnu iznimku pomoću navoja koji nam pomažu u pronalaženju svih pogrešaka u našem kodu. U smislu predložaka, potreban nam je samo jedan, jer dinamički definiramo naslov u pogledu. Predložak samo treba prikazati naslov i "trag", naša pogreška u tragovini iz konteksta.
nano errors/templates/errors/error.html
Ovo je naš najjednostavniji predložak, ali tako je lako vidjeti pogreške u našem projektu. Dalje, onemogućimo uklanjanje pogrešaka u postavkama.
nano app/settings.py
Pronađite ovu liniju gdje je postavljen na istinu i promijenite ga u lažno
DEBUG = False
Samo naprijed i sigurnosno kopirajte aplikaciju sada. Spremni smo za raspoređivanje na udaljeni Linux poslužitelj i od tamo nastavljate dodavati značajke.
sudo backup
Prije nego što ovaj kôd objavimo na poslužitelj, trebali bismo razmotriti da mogu postojati neki problemi s kodom. Ovisno o slučaju, web lokacije koje prihvaćaju informacije koje su im objavljene imat će problema s objavljivanjem neželjene pošte i poteškoća s uklanjanjem neželjene pošte. To se ne bi trebalo dogoditi odmah, ali ako se to dogodi, kasnije ćemo ispitati kako automatski umjeriti neželjenu poštu na web mjestu i učiniti da robotima postane teže pristupiti web mjestu, zajedno s načinom deaktiviranja korisničkih računa, i provjeriti identitet korisnika s skeniranjem njihovog ID -a ili biometrijskog skeniranja, poput prepoznavanja prsta ili lica.
Gledajući primjer više faktora provjere autentičnosti koji smo, u proizvodnji, ispitali, stvari mogu biti drugačije. Primijetite kako smo ograničavajući stope prijave i isteče tokene. Ako roboti pristupaju web mjestu, dva faktora provjere autentičnosti mogu biti teže jer mogu unijeti kodove istovremeno i korisnik. Da bismo se borili protiv toga, koristimo model u korisničkim modelima, izjavljujući kako komuniciramo s web lokacijom kada provjeravamo autentifikaciju koristeći autentifikaciju s više faktora s telefonskim brojem. Također ćemo dodati opciju za provjeru autentičnosti s e -poštom. Započnite uređivanjem korisničkih modela s Nano.
nano users/models.py
Ovo bi trebao izgledati model koji dodajemo. Ne trebaju nam nikakve metode, samo varijable za pohranu ID -a, korisnika, vremenske oznake, isteka, duljine i pokušaja bilo koje više faktora provjere autentičnosti (kôd poput 123456 poslanog na telefon ili e -poštu).
# Osnovni token koristio se za prijavu na web mjesto
Dodajmo i privilegiju našem korisniku, a mi ćemo je za sada postaviti ručno, prije nego što na kraju pređemo na automatski privilegirane korisnike. U korisničkim modelima dodajte ovaj redak u profil:
vendor = models.BooleanField(default=False)
Kao i kod svih promjena u bazi podataka, moramo napraviti migracije i migrirati bazu podataka kad god uređujemo datoteku Models.py u Django. Zapamtite, da bismo to učinili, prvo koristimo izvor (ako se već nije upotrijebio otkad je terminal otvoren), a zatim Python Manage.py za migracije i migracije.
cd project-directory-you-named # (ako je potrebno)
Za sada možete upisati sve račune koje ste stvorili kao dobavljači pomoću školjke.
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Sada, razvijamo naš više faktorski prikaz provjere autentičnosti da bismo koristili ovaj token. Prvo, moramo izmijeniti naše MFA Helper Utilities. Koristeći 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
# Autentificirajte korisnika pomoću e -pošte ili telefonski broj
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filtrirajte token prema vrijednosti koja se prenosi u URL -u (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)) # Ako ova sesija nije stvorena, stvorite je
user = User.objects.filter(id=token.user.id).first() # Nabavite korisnika od tokena
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Ako su već ovjerene, prijavite ih
if not user: raise PermissionDenied() # Negirati ako nije pronađen nijedan korisnik
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Provjerite auth token
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Prijavite se korisnika ako već nisu prijavljeni
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Postavite istek na njihovu autentifikaciju s više faktora
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Preusmjerite korisnika na sljedeću stranicu
if not user.profile.mfa_enabled: # Provjerite je li MFA omogućen
if not check_verification_time(user, token): # Provjerite vrijeme
user.profile.mfa_enabled = False # Očistite telefonski broj
user.profile.enable_two_factor_authentication = True # Omogući MFA
user.profile.phone_number = '+1' # Onemogućite telefonski broj
user.profile.save() # Spremite profil
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Zabilježite korisnika ako njihov MFA nije omogućen
if request.method == 'POST' and not fraud_detect(request, True): # Ako je zahtjev zahtjev
form = TfaForm(request.POST) # Instancirajte obrazac
code = str(form.data.get('code', None)) # Dobiti kod
if code and code != '' and code != None: # Pazite da nije prazan
token_validated = user.profile.check_auth_token(usertoken) # Provjerite auth token
is_verified = check_verification_code(user, token, code) # Provjerite kôd
if token_validated: # Ako sve
if is_verified: # Je u redu
user.profile.mfa_enabled = True # Omogući MFA (ako već nije omogućeno)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Prijavite se korisnika
for key, value in request.GET.items(): # Izgradite upit za sljedeći parametar (ako postoji)
return HttpResponseRedirect(next) # Preusmjeriti
elif not token_validated: # Ako je token bio nevažeći
if p.mfa_attempts > 3: # Da je bilo previše pokušaja
if form.data.get('send_email', False): # Pošaljite e -poštu (ili tekst)
# Izvršite obrazac (za dobit zahtjeva)
Kad dodamo ovaj kôd, obavezno uvozite funkciju za slanje e -pošte. Na vrhu datoteke, korisnik pregledava (s drugim uvozom), dodajte
from .mfa import send_verification_email as send_mfa_verification_email
Sada moramo napisati tu funkciju prije nego što bilo što od toga funkcionira. To bi trebalo proširiti našu funkciju slanja e -pošte i jednostavno poslati e -poštu korisniku s kodom za provjeru.
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))
Dakle, ovo sve funkcionira sjajno, sada imamo sustav za provjeru autentičnosti s više faktora koji ovisi telefonski broj ili e -poštu za prijavu. Ali također nam je potreban način za uklanjanje ili barem sakriti korisnike koji ne surađuju s našim uvjetima. To bi mogli biti neželjene pošte, roboti ili svi koji ne misle dobro za naš rad. Pogledajte prikaz koji imam za nadgledanje korisnika na svojoj web stranici:
# uvoz
from .tests import is_superuser_or_vendor # Trebat ćemo stvoriti ovaj test
# Nabavite popis korisnika
return render(request, 'users/users.html', { # Vratite korisnike u predložak
Imajte na umu da ovaj kôd koristi test, morat ćemo proglasiti ovaj test u datoteci testova.py i uvesti ga. Uređivanje korisnika/testova.py, stvorimo test.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
To je u kombinaciji s predloškom korisnika/korisnika.html, koji izgleda ovako:
Imajte na umu da predložak uključuje još jedan predložak, korisnici/user.html. Kada koristite predložak koji ima podtem i ne koristi produžene, dobra je ideja dodati podcrtavanje () prije imena datoteke za proširenje, kako bi se razlikovale predloške.
Imajte na umu da je ovo puno jinja, možda nemate sve ove varijable. Ali ovako izgleda moj kod.
<small># {{user.id}} </sing>
Potrebna nam je i još jedna podtem, toggle_active.html. Ovaj bi predložak trebao biti obrazac koji nam omogućuje prebacivanje je li korisnik aktivan.
Također ćemo morati dodati prikaz za prebacivanje korisničke aktivnosti i odgovarajućih uzoraka URL -a. Dok smo na tome, dodajmo pogled da biste izbrisali korisnika u slučaju da nam to zatreba.
# Uvoz
success_url = '/' # Preusmjeravanje na URL uspjeha
def test_func(self): # Testirajte je li korisnik superUser i ima dozvolu za brisanje
Iako je ovo praktično kad je potrebno, brisanje korisnika ne bi trebalo biti potrebno većinu vremena, samo možemo prebaciti vidljivost korisnika koji posjećuju web mjesto ako ih trebamo odbaciti.
Obrasci URL -a koje smo dodali izgledaju ovako. S Nano -om, uredite korisnike/urls.py i dodajte ove linije:
nano users/urls.py
Linije bi trebale ići na popis staza u korisničkim prikazima, prije završetka "]", ali nakon početka "[".
# ...
# ...
Sada, svakako sigurnosno kopirajte web mjesto kako biste je mogli preuzeti na web poslužitelju na kojem ćemo nastaviti raditi. Iz naredbenog retka,
sudo backup
Sada je naša web stranica sigurnosna kopija.
Dakle, sada imamo još nekoliko korisnih značajki. Ali što je s velikom slikom ovdje? Ovaj kôd još uvijek nije dostupan s Interneta, još nemamo poslužitelj pošte i moramo proširiti našu aplikaciju kako bismo uključili sveobuhvatni postupak provjere, kao i glatke izglede kako bismo nam pomogli da istražimo web mjesto, zajedno sa sigurnim protokolima za autentifikaciju privilegiranih korisnika.
Do sve ovo ćemo doći. Najvažnija stvar za sada će biti samo dobivanje ovog koda na mreži, što možemo učiniti sa samo nekoliko redaka Bash -a na Ubuntu poslužitelju. Za to ćete morati unajmiti poslužitelj, osim ako nemate poslužitelj kod kuće i pretplatu na poslovnu internet koja vam omogućuje otvaranje portova. Osobno pokrećem svoju web stranicu na HP Z440 koji je instaliran u mom stanu, ali obično je mnogo jeftinije za osnovne potrebe za iznajmljivanje virtualnog privatnog poslužitelja (VPS).
Imajte na umu da je kod koji sada vodimo relativno tanak, morat će ga održavati i poboljšati prije nego što budemo spremni koristiti ono što moramo izgraditi proizvod. Obavezno budite oprezni što radite s Internetom, provjerite ako javno postavite ovu stranicu na webu na Linux poslužitelju, imate plan blokirati neželjene interakcije sa svojom web stranicom. To u početku neće biti problem, ali ćemo razmotriti razna rješenja za borbu protiv toga, uključujući strojno učenje, umjetnu inteligenciju i računalni vid. Kad to postane problem, potražite dalje u ovom tekstu za rješenje.
Što se tiče iznajmljivanja VPS -a, postoji puno mjesta koja možete ići. Google Cloud ima VPS poslužitelje, IONOS, Kamatera, Amazon AWS i više pružatelja usluga nude rješenja Cloud Server -a koja će odgovarati našim potrebama.
Morat ćete kliknuti kroz njihove obrasce i odabrati plan za početak. Možete ići s osnovnim planom s bilo kojim davateljem usluga, ali provjerite je li davatelj omogućuje otvaranje portova poslužitelja portova za slanje e -pošte (ovo bi trebao biti port 587 i port 25), neki davatelji blokiraju ove portove. Do sada sam imao najbolje iskustvo s Ionosom i Kamatera, obojica će mi omogućiti da pošaljem neograničenu e -poštu i njihove cijene su prilično jeftine.
Spojit ćete se na svoj novi poslužitelj preko protokola pod nazivom SSH ili Secure Shell, koji vam omogućuje daljinsko sučelje s poslužiteljem točno poput vašeg osobnog računala, s vašeg osobnog računala. Kada postavite poslužitelj, davatelj hostinga vjerojatno će vas tražiti da dodate SSH ključ ili će vam dati korisničko ime i lozinku. SSH ključ je kako ćete se prijaviti na poslužitelj iz naredbenog retka kako biste uredili kôd. Upotrijebite donje opcije SSH-Keygen za generiranje SSH ključa.
ssh-keygen
Spremite datoteku i prepišite je ako trebate, dobro je okretati SSH tipke ako već niste. Sada možete koristiti sljedeću naredbu da biste vidjeli SSH ključ. Morat ćete ga kopirati na svoj udaljeni poslužitelj kako biste ga mogli koristiti za provjeru autentičnosti.
cat ~/.ssh/id_rsa.pub
Ako niste mogli vidjeti SSH ključ prilikom upisivanja te naredbe (dugačak niz znamenki i slova počevši od "ssh-rsa aaa"), pokušajte generirati RSA ključ (sigurniji su, pa savjetujem da ih koristite.) Sljedeći kôd će generirati 4096-bitni RSA SSH ključ.
ssh-keygen -t rsa -b 4096
Stvorite VPS koji pokreće Ubuntu, međutim to planirate učiniti. Nakon što stvorite VPS klikom na obrasce na web stranici pružatelja usluga (kamatera.com, iOnos.com ili slično), htjeli ćete se prijaviti. Da biste to učinili, koristite naredbu SSH sa svojom IP adresom (adresu koja izgleda kao xx.xx.xx.xx). Također ćete morati biti osjetljivi na zadano korisničko ime na poslužitelju koji smo stvorili, na primjer, Ubuntu.
ssh ubuntu@XX.XX.XX.XX
Možda će od vas tražiti lozinku, ako od vas se traži lozinka, unesite je. Nećemo koristiti zadano korisničko ime, pa započnimo s stvaranjem novog korisnika i dodavanjem SSH ključa na njihov račun.
Započnimo dodavanjem nove SSHD_CONFIG datoteke koja poslužitelju govori kako koristiti SSH.
nano sshd_config
# Ovo je konfiguracijska datoteka SSHD poslužitelja na cijelom sustavu. Vidjeti
# sshd_config (5) za više informacija.
# Ovaj SSHD sastavljen je s Path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/igres
# Strategija koja se koristi za opcije u zadanom sshd_config isporučenom
# OpenSSH je odrediti opcije sa svojom zadanom vrijednošću gdje
# moguće, ali ostavite ih komentirati. Nekonsumirane opcije nadjačavaju
# zadana vrijednost.
# Luka 22
# Adresfamily bilo koji
# Slušaddress 0.0.0.0
# Slušaddress ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Šifra i ključ
# RekeyLiMit zadani nijedan
# Zapisivanje
# Syslogfacility auth
# Informacije
# Autentifikacija:
# LogingraceTime 2m
# Riječ za zabranu za zabranu
# STRICTMODES DA
# Maxauthtries 6
# Maxsessions 10
# Očekujte .SSH/AUFITED_KEYS2 u budućnosti zanemariti zadane.
# AutorsPrincipalsFile nijedan
# Ovlašteno KEYSCommand nijedan
# OvlašteniKeysCommanduser nitko
# Da biste to radili, trebat će vam i tipke domaćina u/etc/ssh/ssh_ poznati_hosts
# HostBaseSauthentication br
# Promijenite u Da, ako ne vjerujete ~/.SH/Know_hosts za
# Hostbasesauthentication
# IgnoreUser poznatiHosts br
# Ne čitajte korisničke datoteke ~/.rhosts i ~/.shosts
# IgnorerHosts Da
# Da biste onemogućili tunelirane jasne tekstualne lozinke, promijenite na NE!
# DopušteniPassyPasswords br
# Promijenite u Da kako biste omogućili lozinke za odgovor na izazov (pazite na probleme s
# Neki PAM moduli i niti)
# Kerberos opcije
# Kerberosauthentication br
# KerberoSorlocalPasswd Da
# KerberosticketCleanup Da
# Kerberosgetafstoken br
# GSSAPI opcije
# GSSAPIAuthentication br
# GSSAPICLEANUPCREDENCIS DA
# GSSAPISTRICTACCEPTORCHECK DA
# GSSAPIKEYEXCHANGE NE
# Postavite ovo na "Da" kako biste omogućili PAM provjeru autentičnosti, obradu računa,
# i obrada sesije. Ako je ovo omogućeno, PAM autentifikacija će
# biti dopušten putem KBDinteractiveAuthentication i
# PasswordAuthentication. Ovisno o vašoj PAM konfiguraciji,
# PAM provjera autentičnosti putem KBDinteractiveAuthentication može zaobići
# Postavka "PermiTrootLogin bez propuste".
# Ako samo želite da se provjere računa i sesije
# PAM provjeru autentičnosti, a zatim to omogućite, ali postavite lozinkuAuthentication
# i kbDinteractiveAuthentication to 'Ne'.
# DoplatchForwording Da
# Doplatatcpforworking da
# Gatewayports br
# X11DisplayOffset 10
# X11uselocalhost Da
# PUMPTTY DA
# Printlastlog da
# Tcpkeepalive da
# PUPIMUSERENVELONCIJE br
# Kompresija je odgođena
# ClanceliveInterval 0
# ClanceliveCountMax 3
# Rabljeni br.
# Pidfile /run/sshd.pid
# MaxStarTups 10: 30: 100
# PUMPITTUNLE NE
# ChrootDirectory
# Verzijaddendum nema
# Nema zadanih staza natpisa
# Dopustite klijentu da prođe lokalno varijable okoliša
# nadjačati zadani podsustavi
# Primjer prevladavanja postavki na osnovi korisnika
# Podudaraju se korisnički anoncvs
# X11FORWARDING NE
# DoplatlogtcpForwarding br
# PUMBITTY NE
# ForceCommand CVS poslužitelj
Zapamtite, Ctrl+X i Y da biste spremili datoteku. Zatim napišimo osnovnu skriptu pod nazivom Inicijalizirajte (sve u zadanom kućnom direktoriju našeg korisnika).
nano initialize
Dodajte ove retke u datoteku, zamjenjujući
# !/bin/bash
Da biste vas prošetali kroz ovu datoteku, krenimo liniju po liniji. Prvi redak kaže prevodilaču da je ovo bash skripta. Zatim instaliramo ovisnosti, kopiramo sshd_config u ispravni direktorij, ponovno pokretanje SSH -a, generirajući SSH tipke za korijen, dodajući korisnički tim '(možete odabrati ime koje vam se sviđa za to, za to koristite naredbu AddUser s njihovim imenom i onemogućenu lozinku). Također dodamo tim u sudo grupu, generiramo njihov SSH ključ, dodamo i naš ključ ovlaštenim ključevima i njihovim i njihovim i ispisuju njihov ključ. Ovaj će novi korisnik biti kako se prijavljujemo na web mjesto.
U novom terminalu nastavite i ponovo otvorite poslužitelj.
ssh team@XX.XX.XX.XX
Ovaj put vam ne bi trebala lozinka, jer imate SSH ključ. Također smo onemogućili prijavu s lozinkom kako bismo web mjesto održali sigurnijom.
Sada se ovaj poslužitelj pokreće potpuno prazno bez podataka o njemu. Započnimo kloniranjem našeg projekta s Gita kako bismo ga mogli preuzeti i pokrenuti na udaljenom stroju. Na udaljenom poslužitelju spojenom preko SSH -a, prvo ispišite svoj SSH ključ:
cat ~/.ssh/id_rsa.pub
Zatim zalijepite ovu ključ u postavke GIT -a kao što smo to učinili prije postavljanja našeg git spremišta. Sada možemo klonirati naš projekt izravno na poslužitelj. Provjerite da li ste sigurnosno kopirali projekt, tako da je na Git poslužitelju preuzeti.
git clone git://github.com/you/yourproject.git
Savršen. Sada su sve datoteke ovdje. Možemo ih vidjeti s LS -om
ls
Sada, počnimo postavljati poslužitelj. Prvo, kopirajte svoj direktorij projekta u jednostavno, nezaboravno ime koje ćemo koristiti za projekt.
cp -r yourproject whatyoucalledit
Gdje je "WhatyUtAlleDit" novo ime vašeg projekta. Zatim ćemo morati izgraditi osnovni uslužni program za postavljanje poslužitelja. Spremit ćemo ovaj uslužni program i koristiti ga u budućnosti. Da bismo izgradili ovaj uslužni program, stvorimo korisnički binarni kako bismo definirali kako uređujemo skriptu. Korištenje BASH, EDIT/USR/BIN/ASCRIPT
sudo nano /usr/bin/ascript
Obavezno koristite sudo tamo tako da imate dozvole za uređivanje datoteke. U datoteku dodajte ove retke:
# !/bin/bash
echo "# !/bin/bash ">>/usr/bin/$ $ 1
Imajte na umu da ova skripta uzima argument, naziv skripte, kao 1 USD. Prvo provjerava postoji li datoteka ili je na neki drugi način stvara, dodaje prvi redak za izjavu da je skripta BASH, mijenja svoja dozvola, uređuje je i dodaje svoje ime u /itd. /Ascripts koji nam omogućuje pohranjivanje imena skripta koje stvaramo. Ako datoteka već postoji, jednostavno promijenite dozvole i uredite je. Spremite datoteku, a zatim ćemo promijeniti dopuštenja. Sve dok koristimo ovu skriptu, to nećemo morati ponoviti.
sudo chmod a+x /usr/bin/ascript
Savršen. Sada stvorimo skriptu pod nazivom Postavljanje. Prvo, ne da vas nadvlada, ali pogledajte kako izgleda moj scenarij za postavljanje. Proći ćemo kako bi ova skripta trebala izgledati u vašem projektu, neće vam trebati sve u mojoj skripti za početak.
# !/bin/bash
# sudo chmod a+x skripte/userSetup
# ./scripts/userSeTup
# ssh-keygen
# Direktorij projekta
# Naredbe dnevnika
# Nano config
# Git config
# Ažurirajte i instalirajte
# Omogući antivirus Clamav
# Postavite ime domaćina
# Postavljanje Postgresa
# Postavljanje sigurnosne kopije baze podataka
# Onemogući iptables
# Instalirajte bitdefender
# Postavljanje postfiksa
# Stvorite dir
# Postavljanje virtualenv
# Dobiti i izgraditi ovisnosti
# Postavite pravila vatrozida
# Instalirajte ovisnosti o PPI
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP Install OpenCV-Python == 4.5.5.64
# PIP UGRADNJI OpenCV-COTRIB-PYTHON == 4.5.5.64
# Instalirajte certbot
# Pokrenite certbot
# Ponovno učitavajte poslužitelj pošte
# CERCS CEPE
# sudo cp /etc/lettecrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/lettecrypt/live/femmebabe.com/cert.pem cert.pem
# Zakrpa venv
# Postavite korisničke postavke
# Postavite dozvole
# Sudo Chown -r tim: Korisnici/var/trčanje/
# Sudo Chown Root: Root/Run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# Sudo Chown www-data: korisnici db.sqlite3
# Kopirajte konfiguraciju i postavite dozvole
# Postavljanje baze podataka
# Ubrizgavanje PAM Config i Uklonite neispravni SSH Config
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profil
# Kopirajte skripte kante i postavite dopuštenja
# Usluge ponovno učitavanje i omogućavanje
# Omogući Apache module
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Onemogući zadano mjesto
# Omogućite našu stranicu
# Ponovno učitavajte demon i ponovno pokrenite Apache, Postfix i Opendkim
# Postavite dozvole
# Zamjena konfiguracije
# Motor za init naslov
# Postavljanje gita
# Prikaži IPv6 i OpendKim za konfiguraciju domene
# Postavljanje dovršeno
To je puno postavki! Ukratko, ovaj kôd zapisuje naredbe, konfigurira Nano i Git, kopira datoteke, preuzima i instalira Ubuntu Apt pakete, ovisnosti o Pythonu, konfigurira postfiks, konfigurira postgresql (poslužitelj baze podataka) i učitava bazu podataka, instalacije UFW -a (nekompliciraju astantne, ISPTABLESS, OSPOSAVANJE, ISPLATNOST ISPPTSACTS, ONCUTSIVE, ISPRAVNICE, ISPRAVNICI ISPLATNOSTI, ONCUPLONSCIJE Postavlja poslužitelj, instalira konfiguraciju, pokreće i omogućuje Sever, dodjeljuje zamjenu, postavlja dozvole i ispisuje IP, IPv6 adresu i ključ OpendKim. Prilično jednostavno, ali izgleda kao puno koda. Neće nam trebati puno toga jer nemamo ovisnosti, ne koristimo celer, celerybeat ili daphne, ali ionako ćemo ih instalirati da bismo započeli. Primijetite da ovaj kôd ima domenu proglašenu nekoliko puta.
Također ćemo morati kupiti ime domene (što je mala godišnja naknada). Preporučujem Squarespace za kupnju domene, njihov je izgled intuitivan i jednostavan za upotrebu. U ovom primjeru možete kupiti bilo koju domenu po vašem izboru, ali u ovom primjeru koristim domenu femmebabe.com. Nakon što kupite domenu, krenite na konfiguracijsku ploču SquareSpace DNS i dodajte zapis koji usmjerava vašu domenu na poslužitelj putem IP adrese. Trebao bi izgledati ovako:
@ A xx.xx.xx.xx
S operatorom @ kao domaćin, što znači da će sve poddomene pod ovom domenom i korijensku domenu sve preusmjeriti na poslužitelj. Postoji više zapisa za izjavu, ali na njih možemo prijeći nakon što budemo spremni poslati poštu. Imajte na umu, možda će proći nekoliko dana prije nego što uspijete uspješno poslati poštu s poslužitelja. DNS zapisi koje postavljamo trebat će vremena za širenje.
U svakom slučaju, jedini zapis koji trebamo započeti je A zapis. Dakle, sada možemo ispuniti donju skriptu prema našem projektu i pokrenuti ga.
Započnimo s manjom skriptom za postavljanje kako bismo samo instalirali ono što nam je potrebno za osnovni napredak. Nećemo još koristiti toliko ovisnosti ili postgresql, samo ćemo pokrenuti osnovni HTTP poslužitelj i brinuti se da ćemo ga certificirati kad to učinite. Zapamtite, da bismo dobili HTTPS certifikat i sigurno pokrenuli poslužitelj, morat ćemo kupiti domenu zajedno s iznajmljivanjem poslužitelja. Za sada zamijenite "tim" u ovoj datoteci imenom vašeg korisnika "Dir" s direktorijom vašeg projekta i dostavite svoju e -poštu i domenu u <> oznake.
Uz to, prije nego što pokrenemo ovaj kôd, moramo promijeniti postavke na vatrozid koji pruža pružatelj usluga hostinga, ako ih ima. Obično je to na kartici "Mreža" vašeg pružatelja usluga hostinga ili ako se samostalno hostirate, u odjeljku "Port prosljeđivanje" vašeg usmjerivača. Također ćete htjeti postaviti statički IP putem usmjerivača s adresom vašeg poslužitelja, ako koristite samo -hosting. Morat ćete otvoriti sljedeće portove za pristup za čitanje/pisanje.
22 (ssh) 25 (pošta) 587 (pošta) 110 (klijent pošte) 80 (http) 443 (https)
# !/bin/bash
# Naredbe dnevnika
# Nano config
# Git config
# Ažurirajte i instalirajte
# Omogući antivirus Clamav
# Postavite ime domaćina
# Postavljanje sigurnosne kopije baze podataka
# Onemogući iptables
# Postavljanje virtualenv
# Instalirajte certbot
# Pokrenite certbot
# Postavite korisničke postavke
# Postavite dozvole
# Sudo Chown -r tim: Korisnici/var/trčanje/
# Sudo Chown Root: Root/Run/sudo/ts -r
# Usluge ponovno učitavanje i omogućavanje
# Omogući Apache module
# Ponovno učitavajte demon i ponovno pokrenite Apache, Postfix i Opendkim
# Prikaži IPv6 i OpendKim za konfiguraciju domene
Prije pokretanja ovog koda provjerite je li domena koju ste kupili povezana s poslužiteljem. Da biste to učinili, otvorite terminal na svom lokalnom stroju i pokrenite ovu naredbu sa svojom domenom:
ping femmebabe.com # Umetnite svoju domenu ovdje, nakon pinga
Ako sve izgleda dobro, a poslužitelj šalje odgovore, spremni smo pokrenuti skriptu i instalirati pakete, kao i pokrenuti, omogućiti i ovjeriti naš Apache poslužitelj.
Ovo nije sve postavke potrebno za konfiguriranje postfixa, a to ćemo kasnije pogledati kasnije. Za sada pokrenite ovaj postavljeni kôd i trebalo bi vam trebati nekoliko minuta da instalirate i ovjerite svoj poslužitelj. Još jednom, obavezno zamijenite ime, e -poštu i naziv domene u skriptu prema imenu koje ste kupili.
Sada kada je poslužitelj predviđen, možete otići na URL u bilo kojem web pregledniku i provjeriti je li poslužitelj pokreće HTTPS. Ako nije, pokušajte malo pričekati da DNS zapisi nadoknade, a zatim pokrenite sljedeću naredbu kako biste pokrenuli CertBot Certification:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Sve dok ste sve ispravno konfigurirali, trebali biste biti u mogućnosti pristupiti zadanoj stranici Apachea samo da biste znali da vaš kôd radi i prikazuje web stranicu uživo. Zatim uredimo postavke.py da promijenimo naš zadani način uklanjanja pogrešaka u proizvodnju. Također ćemo konfigurirati domenu u postavkama, kao i unutarnji IPS.
nano yourproject/settings.py
U postavkama promijenite/dodajte ove retke.
# Web mjesto konfigura
Sada ćemo morati konfigurirati apache2. Uredimo konfiguracijsku datoteku koju ćemo implementirati ovom linijom:
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Ova konfiguralna datoteka trebala bi imati naše ime domene u sebi i naziv korisnika i projekta. Koristim naziv domene femmebabe.com, tim za korisničko ime i naziv 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>
Obavezno zamijenite naziv projekta, direktorija i domene u ovom primjeru kod konfiguriranja vašeg poslužitelja. Sada ćemo morati onemogućiti zadano mjesto. To se može učiniti pomoću Bash -a.
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Zatim možemo omogućiti zadano mjesto i ponovno učitati apache2, također koristeći BASH. Ne zaboravite zamijeniti femmebabe s nazivom datoteke koju ste proglasili prilikom uređivanja u/etc/apache2/web lokacije-doveli/.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Vratite se na svoju domenu u Navbaru. Trebali biste vidjeti web mjesto koje ste konfigurirali u svom web pregledniku. Čestitamo! Ako ga ne vidite, možda ćete trebati napraviti neke promjene. Pažljivo pregledajte postavke u vašem projektu, Apache konfiguraciju i budite sigurni da nemate pogreške i pokrenite sljedeće naredbe kako biste provjerili projekt za pogreške.
cd projectname
source venv/bin/activate
python manage.py check
Ako imate pogreške u svom Python projektu, pratite ih tamo gdje su i popravite ih. Možda nećete moći vidjeti sve svoje pogreške, ovisno o tome gdje su, pa ako imate pogrešku koja jednostavno kaže da "popunite nije reentrant", uredite sljedeću datoteku u virtualnom okruženju, registar.py, kako biste izloželi pogrešku.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Pomaknite se na liniju 83, gdje se povećava ova pogreška izvođenja (Podigni runtimeerror ("populacija () nije reentrant")), i dodajte komentar prije ove retke, a zatim dodajte, s istim uvlačenjem, self.app_configs = {}. Ovo izgleda ovako:
# Spriječite reentrant pozive kako biste izbjegli pokretanje appconfig.ready ()
# metode dva puta.
# Povećajte runtimeerror ("Populate () nije reentrant")
Tada možete ponovo provjeriti projekt i izložiti pogrešku.
python manage.py check
Tada možete vidjeti pogrešku i popraviti je. Kad ga popravite i kôd sastavlja bez pogrešaka, obavezno promijenite datoteku tako da izgleda ovako:
# Spriječite reentrant pozive kako biste izbjegli pokretanje appconfig.ready ()
# metode dva puta.
# self.app_configs = {}
Pod uvjetom da je poslužitelj na mreži, kada u njega napravimo daljnje promjene, moramo koristiti sljedeću naredbu za ponovno učitavanje poslužitelja:
sudo systemctl reload apache2
Sjajno! Ali što je s slanjem pošte? Za početak slanja e -pošte prvo ćemo morati ažurirati konfiguraciju domene. Ovo bi trebalo biti na vašem DNS ploči u Squarespaceu ili bilo kojem registraru imena domena koji ste odabrali. Također ćemo morati instalirati i dodati konfiguraciju i pokrenuti nekoliko naredbi.
Prvo, nabavimo IPv6 adresu poslužitelja. Tada ćemo otvoriti vaš DNS i dodati zapise.
Da biste dobili IPv6 adresu poslužitelja, koristite ovu naredbu:
ip -6 addr
Sada možemo dodati sljedeće zapise u postavke DNS -a. Moji zapisi izgledaju ovako. Međutim, za svoje zapise trebali biste zamijeniti IP adresu svojim IP -om (ne 75.147.182.214, to je moje). Također dodajte svoju domenu umjesto FemmeBabe.com, kao i vašu IPv6 adresu pronađenu s prethodnom naredbom (ne možete koristiti Mine, FE80 :: 725A: FFF: FE49: 3E02). Za sada ne brinite DomainKey, to se stvara kada postavimo postfix, poslužitelj pošte, s Opendkimom i ispisujete ključ. Konfigurirat ćemo ovo posljednje.
@ 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 ~ svi
zadani._bimi Txt N/a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_dmarc Txt N/a v = dmarc1; P = Nema
sendonly._domainkey
Txt
N/a
Sada ćemo morati dodati neku trajnu konfiguraciju za postfix. Sve što trebamo učiniti je osigurati da zamijenimo naziv domene, femmebabe.com, nazivom domene koje koristite. Pogledajmo sve konfiguracije jedna po jedna i instaliramo ih u direktorij koji se zove Config u našem projektu, za instalaciju u OS.
nano config/etc_postfix_main.cf
Dodajte ovaj tekst u datoteku
# Vidi /usr/share/postfix/main.cf.dist za komentiranu, cjelovitiju verziju
# Debian Specifično: Navođenje imena datoteke uzrokovat će prvi
# redak te datoteke koja će se koristiti kao naziv. Debian zadani
# IS /etc /mailName.
# myorigin = /etc /mailName
# Dodavanje. Domain je posao MUA -e.
# Nepoznavanje Sljedeći redak za generiranje upozorenja "odgođene pošte"
# kašnjenje_warning_time = 4h
# Pogledajte http://www.postfix.org/compatibility_readme.html - zadano na 3.6
# Svježe instalacije.
# TLS parametri
# Milter konfiguracija
Sljedeća konfigura!
nano config/etc_postfix_master.cf
Dodajte ove linije:
#
# Datoteka konfiguracije matične procesne konfiguracije. Za detalje o formatu
# datoteke pogledajte stranicu Master (5) priručnika (naredba: "Man 5 Master" ili
# On-line: http://www.postfix.org/master.5.html).
#
# Ne zaboravite izvršiti "postfix reload" nakon uređivanja ove datoteke.
#
# ===========================================================================================================================================.
# Vrsta usluge privatna Univer chroot wakeup maxproc naredba + args
# (Da) (Da) (Ne) (nikad) (100)
# ===========================================================================================================================================.
# SMTP INET N - Y - 1 Post Excreen
# SMTPD PASS - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Odaberite jedno: Omogućite prijavu samo za klijente ili bilo kojeg klijenta.
# 127.0.0.1:SUBMISION INET N - Y - - SMTPD
# -o syslog_name = postfix/podnošenje
# -o smtpd_tls_security_level = šifrira
# -o smtpd_sasl_auth_enable = da
# -o smtpd_tls_auth_only = da
# -o smtpd_reject_unlisted_recipient = ne
# -o smtpd_client_restciontions = $ mua_client_resticions
# -o smtpd_helo_restciontions = $ mua_helo_resticions
# -o SMTPD_SENDER_RESTICTIONS = $ MUA_SENDER_RESTICIONS
# -o smtpd_recipient_resticions =
# -o smtpd_relay_restciontions = PUPIT_SASL_AUTHENTICICE, odbacivanje
# -o milter_macro_daemon_name = podrijetlo
# Odaberite jedan: Omogućite samo SMTPS samo za klijente ili bilo kojeg klijenta.
# 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 = ne
# -o smtpd_client_restciontions = $ mua_client_resticions
# -o smtpd_helo_restciontions = $ mua_helo_resticions
# -o SMTPD_SENDER_RESTICTIONS = $ MUA_SENDER_RESTICIONS
# -o smtpd_recipient_resticions =
# -o smtpd_relay_restciontions = PUPIT_SASL_AUTHENTICICE, odbacivanje
# -o milter_macro_daemon_name = podrijetlo
# 628 INET N - Y - - QMQPD
# QMGR UNIX N - N 300 1 OQMGR
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
#
# ==============================================================================================.
# Sučelja softvera koji nije posfiks. Obavezno pregledajte priručnik
# Stranice softvera koji nisu PostFix kako biste saznali koje opcije želi.
#
# Mnoge od sljedećih usluga koriste isporuku cijevi za postfix (8)
# agent. Pogledajte stranicu cijevi (8) za informacije o $ {primatelju}
# i druge opcije omotnice za poruke.
# ==============================================================================================.
#
# Maildrop. Pojedinosti potražite u datoteci postfix maildrop_readme.
# Također navedeni u main.cf: maildrop_destination_recipient_limit = 1
#
#
# ==============================================================================================.
#
# Nedavne verzije Cyrusa mogu koristiti postojeći unos "LMTP" Master.cf.
#
# Navedite u Cyrus.conf:
# LMTP CMD = "LMTPD -A" Slušaj = "Localhost: LMTP" Proto = TCP4
#
# Navedite u Main.cf jedno ili više sljedećeg:
# poštanski okvir_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
#
# ==============================================================================================.
#
# Cyrus 2.1.5 (Amos Gouaux)
# Također navedeni u Main.cf: Cyrus_Destination_recipient_limit = 1
#
# Cyrus Unix - N N - - cijev
# Flags = DRX User = Cyrus argv =/Cyrus/bin/isporuči -e -r $ {Sender} -M $ {Extension} $ {user}
#
# ==============================================================================================.
# Stari primjer isporuke putem Cyrusa.
#
# Old -Cyrus Unix - N N - - cijev
# Flags = r User = Cyrus argv =/Cyrus/bin/isporuči -e -m $ {Extension} $ {user}
#
# ==============================================================================================.
#
# Pojedinosti o konfiguraciji pogledajte datoteku PostFix UUCP_README.
#
#
# Ostali vanjski načini isporuke.
#
I konfiguracija OpendKim. Opendkim identificira poslužitelje e -pošte s ključevima domene kako bi ih učinili sigurnijim. Bez nje, pošta nije potpisana i možda neće stići u pristiglu poštu.
nano config/etc_default_opendkim
Dodajte ove linije:
# Napomena: Ovo je naslijeđena konfiguracijska datoteka. Ne koristi ga Opendkim
# SystemD usluga. Molimo koristite odgovarajuće konfiguracijske parametre u
# /etc/opendkim.conf umjesto toga.
#
# Ranije bi se ovdje uređivalo zadane postavke, a zatim izvršio
# /lib/opendkim/opendkim.service.generate za generiranje datoteka za prevladavanje sustava na
# /etc/systemd/system/opendkim.service.d/override.conf i
# /etc/tmpfiles.d/opendkim.conf. Iako je to još uvijek moguće, sada je
# Preporučuje se za podešavanje postavki izravno u /etc/opendkim.conf.
#
# Daemon_opts = ""
# Promijenite u/var/Spool/postfix/trčanje/OpendKim za korištenje UNIX utičnice s
# Postfix u chrootu:
# RunDir =/var/Spool/postfix/trčanje/OpendKim
#
# Nepoznavanje za određivanje alternativne utičnice
# Imajte na umu da će postavljanje ovoga nadjačati bilo koju vrijednost utičnice u OpendKim.conf
# zadano:
# Slušajte na svim sučeljima na priključku 54321:
# Utičnica = inet: 54321
# Slušajte Loopback na Port 12345:
# Utičnica = inet: 12345@localhost
# Slušajte na 192.0.2.1 na luci 12345:
# Socket = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
Dodajte ove linije:
# default_process_limit = 100
# default_client_limit = 1000
# Zadani VSZ (veličina virtualne memorije) Ograničenje servisnih procesa. Ovo je uglavnom
# namijenjen uhvatiti i ubiti procese koji propuštaju pamćenje prije nego što pojedu
# sve.
# default_vsz_limit = 256m
# Korisnik prijave interno se koristi procesima za prijavu. Ovo je najnevjerojatnije
# korisnik u dovecot sustavu. To uopće ne bi trebao imati pristup ničemu.
# Default_Login_User = dovenull
# Unutarnje korisnik koristi neprivilegirani procesi. Trebao bi biti odvojen od
# Prijavite korisnik, tako da procesi za prijavu ne mogu poremetiti druge procese.
# default_internal_user = dovecot
# luka = 143
# Port = 993
# ssl = da
# Broj veza za rukovanje prije početka novog postupka. Tipično
# Jedine korisne vrijednosti su 0 (neograničeno) ili 1. 1 su sigurniji, ali 0
# je brže. <doc/wiki/loginProcess.txt>
# service_count = 1
# Broj procesa koji će uvijek čekati više veza.
# proces_min_avail = 0
# Ako postavite Service_count = 0, vjerojatno to trebate rasti.
# vsz_limit = $ default_vsz_limit
# luka = 110
# Port = 995
# ssl = da
# Port = 587
# Stvorite inet slušatelj samo ako ne možete koristiti gornju Unix utičnicu
# inet_listener lmtp {
# Izbjegavajte učiniti LMTP vidljivim za cijeli internet
# adresa =
# luka =
# }
# Većina memorije ide na MMAP () ing datoteke. Možda ćete to trebati povećati
# Ograničite ako imate ogromne poštanske sandučiće.
# vsz_limit = $ default_vsz_limit
# Maksimum Broj procesa IMAP -a (veze)
# proces_limit = 1024
# Maksimum Broj procesa POP3 (veze)
# proces_limit = 1024
# Maksimum Broj SMTP postupka slanja (veze)
# proces_limit = 1024
# auth_socket_path upućuje na ovu utičnicu UserDB prema zadanim postavkama. To je obično
# koristi ga Dovecot-lda, doveadm, eventualno imap postupak itd. Korisnici koji imaju
# Potpuna dopuštenja ovoj utičnici mogu dobiti popis svih korisničkih imena i
# Nabavite rezultate svih korisničkih pretraživanja.
#
# Zadani način 0666 omogućuje bilo kome da se poveže s utičnicom, ali
# UserDB pretraživanja uspjet će samo ako UserDB vrati "UID" polje koje
# podudara se s UID -om procesa pozivatelja. Također ako se pozivatelj uid ili GID podudaraju s
# UID ili GID utičnica, pretraživanje uspijeva. Bilo što drugo uzrokuje neuspjeh.
#
# Da biste pozivu dali puna dopuštenja za pretraživanje svih korisnika, postavite način
# nešto drugo nego 0666, a Dovecot omogućuje kernelu da provede
# Dozvole (npr. 0777 omogućavaju svima pune dozvole).
# Auth radnički postupak se prema zadanim postavkama pokreće kao korijen, tako da može pristupiti
# /etc/sjena. Ako to nije potrebno, korisnik bi trebao biti promijenjen u
# $ default_internal_user.
# korisnik = root
# Ako se koristi proxy Dict, procesi pošte trebali bi imati pristup svojoj utičnici.
# Na primjer: Način = 0660, Group = vmail i Global mail_access_groups = vmail
# Način = 0600
# korisnik =
# grupa =
Još jednom, obavezno zamijenite domenu u svim tim datotekama, femmebabe.com, s domenom koju ste odabrali. Uredite sljedeću datoteku, dovecot's config,
nano config/etc_dovecot_dovecot
I dodajte ove linije
## Dovecot konfiguracijska datoteka
# Ako se žurite, pogledajte http://wiki2.dovecot.org/quickConfiguration
# Naredba "DoveConf -n" daje čist izlaz iz promijenjenih postavki. Koristiti ga
# Umjesto kopiranja i lijepljenja datoteka prilikom objavljivanja na dovecot popisu pošte.
# '# 'Lik i sve nakon što se tretira kao komentari. Dodatni prostori
# a kartice se zanemaruju. Ako želite koristiti bilo koji od ovih izričito, stavite
# value inside quotes, eg.: key = "# char i zaostajanje od bijelog prostora "
# Većinu (ali ne sve) postavke mogu se nadjačati različitim protokolima i/ili
# Izvor/odredište IPS postavljanjem postavki unutar odjeljaka, na primjer:
# Protokol IMAP {}, lokalni 127.0.0.1 {}, udaljeni 10.0.0.0/8 {}
# Za svaku postavku prikazane su zadane vrijednosti, nije potrebno za odvajanje
# oni. To su iznimke od ovoga: nema odjeljaka (npr. Propace imena {})
# Ili se postavke dodataka dodaju prema zadanim postavkama, navedene su samo kao primjeri.
# Staze su također samo primjeri s pravim zadanim vrijednostima koje se temelje na konfiguriranju
# Opcije. Staze navedene ovdje su za konfiguriranje --Prefix =/usr
# -SysconfDir =/etc--LocalStatedIr =/var
# Omogući instalirane protokole
# Popis IPS -a ili domaćina razdvojio je zarez gdje slušati za veze.
# "*" Sluša u svim IPv4 sučeljima, "::" Sluša u svim IPv6 sučeljima.
# Ako želite odrediti nepuštene portove ili bilo što složenije,
# Uredi conf.d/master.conf.
# Slušajte = *, ::
# Osnovni direktorij gdje pohraniti podatke o vremenu izvođenja.
# base_dir =/var/run/dovecot/
# Naziv ove instance. U višenamjenskom postavljanju Doveadm i drugim naredbama
# može upotrijebiti -i <inspekt_name> za odabir koji se koristi (alternativa
# do -c <config_path>). Naziv instance također je dodano u dovecot procese
# U PS izlazu.
# instance_name = dovecot
# Poruka pozdrava za klijente.
# login_greeting = dovecot spreman.
# Popis razdvojenih prostora pouzdanih mrežnih raspona. Veze s ovih
# IPS je dopušteno nadjačati svoje IP adrese i portove (za evidentiranje i
# Za provjere provjere autentičnosti). onesposobiti_plaintext_auth se također zanemaruje
# ove mreže. Obično biste ovdje odredili svoje iMap proxy poslužitelje.
# login_trusted_networks =
# Prostorni popis utičnica za provjeru pristupa prijavi (npr. TCPWrap)
# login_access_sockets =
# S proxy_maybe = da ako proxy destinacija odgovara bilo kojem od ovih IPS -a, nemojte raditi
# proxing. To obično nije potrebno, ali može biti korisno ako je odredište
# IP je npr. IP uravnoteženja opterećenja.
# auth_proxy_self =
# Pokažite više naslova o višestrukim postupcima (u PS). Trenutno prikazuje korisničko ime i
# IP adresa. Korisno za gledanje tko zapravo koristi IMAP procese
# (npr. Dijeljeni poštanski sandučići ili ako isti UID koristi se za više računa).
# Verbose_Proctitle = ne
# Ako se svi procesi ubije kada se Master proces Dovecot isključi.
# Postavljanje to na "ne" znači da se dovecot može nadograditi bez
# prisiljavanje postojećih veza klijenta na zatvaranje (iako bi to moglo biti
# Problem ako je nadogradnja npr. Zbog sigurnosnog popravka).
# Shutdown_clients = da
# Ako nije nula, pokrenite naredbe za poštu putem ovih mnogih veza na Doveadm Server,
# Umjesto da ih pokrenete izravno u istom procesu.
# doveadm_worker_count = 0
# Unix utičnica ili domaćin: priključak koji se koristi za povezivanje s poslužiteljem Doveadm
# doveadm_socket_path = doveadm-server
# Popis varijabli okoliša koji su sačuvani na dovecotu
# Pokretanje i prešao na sve svoje dječje procese. Također možete dati
# ključ = parovi vrijednosti za uvijek postavljanje određenih postavki.
# uvoz_envioronment = tz
##
## Postavke poslužitelja rječnika
##
# Rječnik se može koristiti za pohranjivanje tipki = popisi vrijednosti. Ovo koristi nekoliko
# dodaci. Rječniku se može pristupiti bilo izravno ili premda a
# Poslužitelj rječnika. Sljedeći blok bloka preslikava imena rječnika u URIS
# Kad se poslužitelj koristi. One se tada mogu uputiti pomoću URIS -a u formatu
# "Proxy :: <Me>".
# kvota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Većina stvarne konfiguracije uključuje se u nastavku. Imena datoteka su
# Prvo razvrstana po njihovoj ASCII vrijednosti i raščlanjena tim redoslijedom. 00-prefiksi
# U datotekama je namijenjena lakše razumijevanje narudžbe.
# Konfig datoteka se također može pokušati uključiti bez davanja pogreške ako
# Nije pronađeno:
# Omogućuje DoVecotu da sluša sve ulazne veze (IPv4 / IPv6)
Dodajte lozinku za korisnika DoveCot:
nano config/etc_dovecot_passwd
Prvi dio datoteke, prije debelog crijeva, je korisničko ime. Posljednji dio, "YourPassword", označava lozinku koju želite dati svom poslužitelju pošte.
team:{plain}yourpassword
Dalje, konfiguracija OpendKim
nano config/etc_opendkim.conf
I dodajte ove linije:
# Ovo je osnovna konfiguracija za potpisivanje i provjeru. Lako može biti
# Prilagođeno prema osnovnoj instalaciji. Vidi Opendkim.conf (5) i
# /usr/share/doc/opendkim/examples/opendkim.conf.Sample za komplet
# Dokumentacija dostupnih konfiguracijskih parametara.
# Log zašto ne
# Uobičajeni parametri potpisivanja i provjere. U Debianu je zaglavlje "od"
# Prepoznati, jer je to često ključ identiteta koji koriste sustavi ugleda
# I time donekle sigurnosno osjetljivo.
# Potpisivanje domene, selektora i ključa (potrebno). Na primjer, izvršite potpisivanje
# za domenu "example.com" sa selektorom "2020" (2020._domainkey.example.com),
# Korištenje privatnog ključa pohranjenog u /etc/dkimkeys/example.private. Zrnato
# Opcije postavljanja mogu se naći u /usr/share/doc/opendkim/readme.opendkim.
# Primjer domene.com
# Selektor 2020
# Keyfile /etc/dkimkeys/example.private
# U Debianu, Opendkim se pokreće kao korisnik "OpendKim". Umask od 007 potreban je kada
# Korištenje lokalne utičnice s MTA-ima koji pristupaju utičnici kao ne-privilegirani
# korisnik (na primjer, postfix). Možda ćete trebati dodati korisnika "postfix" u grupu
# "Opendkim" u tom slučaju.
# Utičnica za MTA vezu (potrebna). Ako je MTA u zatvoru Chroot,
# Mora se osigurati da je utičnica dostupna. U Debianu, postfix trči u
# chroot u/var/spool/postfix, stoga bi utičnica morala biti
# Konfigurirano kao što je prikazano u posljednjem retku ispod.
# Utičnica lokalno: /run/opendkim/opendkim.sock
# Utičnica inet: 8891@localhost
# Utičnica inet: 8891
# Domaćini za koje se mogu potpisati, a ne provjeriti, zadana je 127.0.0.1. Vidjeti
# Odjeljak operacije Opendkim (8) za više informacija.
# Internalhosts 192.168.0.0/16, 10.0.0/8, 172.16.0.0/12
# Sidro povjerenja omogućuje DNSSEC. U Debianu je dostavljena datoteka za sidrenje povjerenja
# po paketu dns-korot-data.
# Poslužitelji imena 127.0.0.1
# Map domene s adresa do tipki koje se koriste za potpisivanje poruka
# Skup unutarnjih domaćina čija bi pošta trebala biti potpisana
nano config/etc_default_opendkim
I dodajte ove linije
# Napomena: Ovo je naslijeđena konfiguracijska datoteka. Ne koristi ga Opendkim
# SystemD usluga. Molimo koristite odgovarajuće konfiguracijske parametre u
# /etc/opendkim.conf umjesto toga.
#
# Ranije bi se ovdje uređivalo zadane postavke, a zatim izvršio
# /lib/opendkim/opendkim.service.generate za generiranje datoteka za prevladavanje sustava na
# /etc/systemd/system/opendkim.service.d/override.conf i
# /etc/tmpfiles.d/opendkim.conf. Iako je to još uvijek moguće, sada je
# Preporučuje se za podešavanje postavki izravno u /etc/opendkim.conf.
#
# Daemon_opts = ""
# Promijenite u/var/Spool/postfix/trčanje/OpendKim za korištenje UNIX utičnice s
# Postfix u chrootu:
# RunDir =/var/Spool/postfix/trčanje/OpendKim
#
# Nepoznavanje za određivanje alternativne utičnice
# Imajte na umu da će postavljanje ovoga nadjačati bilo koju vrijednost utičnice u OpendKim.conf
# zadano:
# Slušajte na svim sučeljima na priključku 54321:
# Utičnica = inet: 54321
# Slušajte Loopback na Port 12345:
# Utičnica = inet: 12345@localhost
# Slušajte na 192.0.2.1 na luci 12345:
# Socket = inet: 12345@192.0.2.1
Kad smo spremni postaviti naš postfix poslužitelj, pokrenut ćemo donji kôd, s odgovarajućim nazivom domene. Započnite stvaranjem skripte
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Sada, u Nano, uređivač teksta, uredite ovu datoteku tako da uključuje naziv vaše domene umjesto femmebabe.com.
# !/bin/bash
# Postavljanje postfiksa
Sada pokrenite dovršenu skriptu da biste konfigurirali postfix, Opendkim i DoveCot.
./scripts/postfixsetup
Nakon što se ova skripta pokrenula, kopirajte posljednji redak koji ispisuje i zalijepite u vašu DNS konfiguraciju kao vrijednost za sendonly._domainKey. Ovo je ključ OpendKim koji se koristi za prepoznavanje vaše domene prilikom slanja sigurne pošte.
Sjajno! U roku od nekoliko dana trebali biste moći poslati poštu s poslužitelja pod uvjetom da je sve ispravno konfigurirano.
Ako ste upravo konfigurirali DNS za svoj poslužitelj pošte, trebalo bi manje od 72 sata da se zapisi ažuriraju. Obično je mnogo brže. Možete provjeriti radi li vaš poslužitelj pomoću ove naredbe, isporučio je svoju e -poštu:
echo "test" | mail -s "Test Email" youremail@gmail.com
Ako se čini da sve radi ispravno, trebali biste moći poslati e -poštu sa svojim poslužiteljem. Ako ne radi, pokušajte pogledati zapisnike da biste vidjeli kakva bi mogla biti pogreška.
tail –lines 150 /var/log/mail.log
To će ponuditi opsežne podatke o pošti koju je poslao poslužitelj i radi li ispravno. Trebali biste moći vidjeti i e -poštu u pristigloj pošti, ako je nema, provjerite mapu neželjene pošte.
Također ćete morati konfigurirati svoje postavke u svojim postavkama.py kako bi vaš poslužitelj e -pošte mogao razgovarati s vašom Django aplikacijom, projektom. Dodajte ili zamijenite ove retke u svoje postavke
EMAIL_HOST_USER = 'team' # 'Love@mamasheen.com'
Primijetite da koristimo konfiguraciju za dobivanje lozinke. Učitajmo ovu datoteku u postavke poput tako, na samom početku datoteke.:
# Otvoreno i učitavanje konfiguracije
Stvorimo ovu datoteku i dodajmo joj tajnu ključ, kao i lozinku za poštu. Da biste generirali tajni ključ, upotrijebite ovu naredbu, bez obzira na dužinu koja vam se sviđa na kraju:
openssl rand -base64 64
Sada kopirajte tekst koji je OpenSSL generirao i uređivao /etc/config.json
sudo nano /etc/config.json
Dodajte sljedeće retke u svoju datoteku, s ključem koji je OpenSSL generirao kao tajni ključ.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
JSON format je jednostavan i jednostavan za korištenje, možemo proglasiti i druge ključeve koje želimo koristiti u našem projektu na ovaj način i držati ih odvojenim od našeg projektnog direktorija kako bi im drugi korisnici ne mogli pisati, pa ih ne može čitati sam iz našeg imenika projekta. Ovo se preporučuje praksa za API ključeve, od kojih ćemo ovdje koristiti više od nekoliko.
Također ćete htjeti sigurnosno kopirati svoj projekt kako biste bili sigurni da je sve spremljeno i kasnije ćete moći oporaviti svoj rad, čak i ako više ne želite unajmiti poslužitelj.
sudo backup
Sada pokušajte poslati HTML e -poštu s web poslužitelja, pod uvjetom da slanje jedno iz naredbenog retka radi. Upitajte svoju korisničku instancu u školjci i pošaljite HTML e -poštu tom korisniku putem Djangoa. Promijenite moje ime u kodu, Charlotte, u svoje korisnič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()
Ako prva naredba ne radi, obavezno koristite
source venv/bin/activate
Pod uvjetom da je sve ispravno postavljeno, sada ćete dobiti e -poštu dobrodošlice u vašem poštanskom sandučiću koju je poslala vaša web aplikacija. Dobar posao! Došli ste dug put.
Htio sam dodati, ako se ikada borite s bilo kakvim pogreškama dok radite na ovakvom projektu, ne ustručavajte se potražiti odgovore i zatražiti pomoć. Google su, između ostalih tražilica, veliki resursi za traženje programijske pomoći. Jednostavno potražite pogrešku koju dobivate i moći ćete vidjeti kako drugi ljudi rješavaju problem. Također, dobrodošli ste da me kontaktirate, vaši odgajatelji (učitelji, profesori, nastavnici), svi vršnjaci na Internetu koji su dostupni za program za programiranje ili se ponovo savjetuju s ovom knjigom ili drugim resursima kako biste pronašli rješenja za pitanja koja doživljavate. Razumijem da ovo nije lako, ali čak i ako ste pročitali u ovom daleko i ne pišete nijedan kod, učite puno o izgradnji web aplikacije od nule. Pomonite se po leđima, radiš sjajan posao.
Hvala vam što ste odvojili vrijeme za pročitavanje ovog vodiča za razvoj trećeg izdanja. U budućim izdanjima uključit ću više važnih primjera o kojima je riječ na početku dokumenta i zaronit ćemo mnogo dublje u svijet razvoja softvera i hardvera. Pratite ono što slijedi i radujem se što ću vas naučiti kako izgraditi nevjerojatan softver. Vidimo se u sljedećem izdanju!
Kupiti | Kupite s kriptovalutom
https://glamgirlx.com/hr/practical-web-based-deep-learning-and
https://glamgirlx.com/hr/practical-web-based-deep-learning-and -
Ostavite mi savjet u bitcoinu pomoću ove adrese: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE