Praktiska tīmekļa balstīta dziļas mācības un drošība pēc piemēra Trešais izdevums Šarlote Harpera 2024. gada 3. jūlijs Atjaunināts/pārveidots 2025. gada 3. jūnijā
Priekšvārds:
Drošības apsvērumi programmatūras veidošanā tīmeklī ir svarīga jebkura tīmekļa izstrādātāja plāna un izpildes sastāvdaļa, vienlaikus inženierējot prototipu, kas ir uzticams, stabils un noderīgs praktiskiem mērķiem. The DOM (Document Object Markup), with it's implementation of HTML, JavaScript, and CSS as well as backend software implementing Python, C/C++, Java and bash, give web developers the freedom and power to create a wide variety of projects that express creativity, provide ease of use and functionality, portray humility and character, and provide ease of use as well as convenience and important services that are all attractive to the average Joe, the end user looking Lai nogalinātu laiku vai kaut ko izdarītu internetā, parasti skārienekrāna viedtālruņa ierīcē. Lielākā daļa cilvēku pat nezina, kur sākt, kad viņi vēlas izveidot vietni no nulles, viņi mēdz sākt citas personas vietni un izveidot kaut ko ierobežotu funkcionalitāti, uzticamību, ērtu lietošanu un it īpaši radošumu, kad viņiem varēja būt visi jaunākie jaudīgie rīki viņu rīcībā, lai izveidotu kaut ko noderīgu, netērējot laiku, lai tiktu izšķērdēts pogas un īpaši izšķērdēt naudu. Ja jums ir dažas minūtes, lai izlasītu šo grāmatu un uzzinātu, ko es jums vēlos iemācīt, vai pat personīgi runāt ar mani par jūsu mērķiem un iegūt dažus norādījumus pareizajā virzienā, un esat motivēts iemācīties kodēt un uzrakstīt savu programmatūru, ņemiet šo grāmatu mājās un atlieciet kādu laiku, lai iemācītos veidot nākamo ietekmīgu, spēcīgu, pilnveidotu un svarīgu tīmekļa lietojumprogrammu, kas ir visu, kas jums ir, un tas ir jūsu auditorijas, kas ir jūsu auditorija.
Par mani: Es esmu programmatūras izstrādātājs ar plašu pieredzi C/C ++, Java, Python, HTML, CSS un JavaScript. Es veidoju vietnes, kuras cilvēki vēlas izmantot, vēlas apmeklēt un pat esmu atkarīgs no tā, ka izmantojat tikai to, lai mācītos, atjaunotu un nogalinātu laiku, un pats galvenais - es pārdodu programmatūru. Ja jums bija ideja par to, kā tieši vēlaties, lai vietne izskatās un darbotos, jūs bijāt ar mieru mani atbalstīt, lai es varētu apmierināt savas vajadzības, kamēr es satieku jūsu, un jūs esat gatavs segt vietnes vadīšanas izmaksas, es jums izveidotu nākamo YouTube, tiktok, Twitter, Google vai pat augstas tehnoloģijas drošības lietotni, kuru varat piekļūt. Tā vietā, lai mēģinātu jums pārdot savu laiku, es cenšos iegādāties jūsu: Es vēlos jūs sarunāt, veidojot lietotni (vietni) sev ar jau pastāvošo informāciju, un iemācīt jums to, kas jums nepieciešams, lai būtu neatkarīgs programmatūras izstrādātājs, uzņēmējs, vadot veiksmīgu karjeru jebkurā jomā, kuru vēlaties. Un ļaujiet man skaidri pateikt, ka izglītība, ko es jums dodu, būs neformāla. Jūs varētu iet uz skolu un visu to iemācīties ar oficiālu izglītību vai pat izlasīt šo grāmatu skolā, aizpildīt savus uzdevumus un daudz atņemt no izglītības, bet es oficiāli neiekļūšu jūs karstajā vietā un lūgtu jūs izpildīt uzdevumus. Es neesmu jūsu profesors, jūs varat domāt par mani kā par draugu, kurš vēlas virzīt jūs uz karjeru, kuru virza jūsu personīgi panākumi. Un es arī nepārdodu jums panākumus, jums tas būs jāpērk ar savu laiku. Mācīšanās kodēt ir stāva mācīšanās līkne, un tā nekad nebija viegla vai pat vajadzīga. Jums jāstrādā tik smagi, cik vien iespējams, un turpināt mēģināt neizdoties, un mēģiniet vēlreiz, pat ja esat neapmierināts, lai pats mācītos un veidotu lietotnes. Tas ir paša koda raksturs. Kodu vada kompilators, kas ir paredzēts, lai sniegtu programmētāja kļūdu ziņojumus, un tie iemācīs jums, kā kodēt, pat ja jūs vienkārši kopējiet kļūdu meklētājprogrammā un lasāt citu cilvēku piemērus. Un man jāsaka, ka jums nav jābūt ārkārtīgi bagātam, gudram, veiksmīgam vai pat orientētam vai organizētam, lai izveidotu lietotni. Dators jums rūpējas par šo organizāciju. Jums vienkārši jāatkārto izmēģinājums un kļūda, jākoncentrējas un smagi jāstrādā pie tā, ko jūs darāt, un jums būs ļoti veiksmīga karjera visā to, ko darāt.
Kas es esmu: Es saprotu, ka pēdējā sadaļa vairāk bija par mācīšanos un jūsu izvēli no šīs grāmatas. Kas es esmu tieši? Tas ir sarežģīts jautājums. Es pats par to neesmu skaidrs, jo es ciešu no medicīniskiem apstākļiem, kas man var apgrūtināt pat kodēšanu vai rakstīšanu reizēm, vienlaikus iepazīstinot ar socializācijas un identitātes jautājumiem, kas manu dzīvi apgrūtina, kad runa ir par sevi. Īsāk sakot, ja jūs lasāt šo grāmatu, jūs to atnesāt mājās, jo jūs to pārlidojāt un domājāt, ka tā ir noderīga, vai pat ja jūs vienkārši lasāt tik tālu, jums es esmu līdzīgs domājošs indivīds, kurš vēlas redzēt, ka jums izdodas visu, ko darāt. Es pats esmu inženieris, programmatūras izstrādātājs un students, un es rakstu šo grāmatu citiem studentiem, kuri vēlas atvieglot savu dzīvi, ja viņiem ir vajadzīga programmatūras rokasgrāmata, kas atvieglo viņu dzīvi, sniedzot piemērus, lai kopētu, kas sader kopā kā liela mīkla, strādājot, noderīgi, lieli, funkcionāli, salīmējoši un iesaistot lietotni, kas var veikt panākumus bez biznesa līnijas. Lielākoties tas ir tas, ko es daru: es veidoju lietotnes, lai palīdzētu sev un citiem cilvēkiem gūt panākumus. Es esmu arī autors, lai gan šī ir mana pirmā publikācija, kuru es plānoju pabeigt, lai savu portfeli saliktu noderīgā dokumentā, un es esmu arī mākslinieks. Es jums to atzīšu, es esmu sava veida dīvains cilvēks. Es neesmu ideāls, es esmu vadījis INS ar likumu, kas pat lika man pamest koledžas un universitātes un pamest štatus, lai mēģinātu sevi iegūt ar lielākiem panākumiem. Pēc dzimšanas es esmu sieviete, valkāju grimu, fotografēju sevi, valkāju kleitas un citu sieviešu apģērbu un pēc savas dabas es apzinos sevi kā sievieti. Iepriekš man ir bijušas problēmas ar citiem cilvēkiem, kas noved pie cīņas ar WebApp rakstīšanu un veidošanu, un es atvainojos, ka man ātrāk nav izdevies iegūt šo grāmatu jūsu rokās: jums tas bija vajadzīgs. Jūs vēlēsities lasīt un rakstīt kodu, kas izskatās kā mans, un tas darbojas kā mans, un dariet to pašu, bet vēl labāk, jo, ja jūs varat atļauties iegādāties šo grāmatu, tā vietā, lai sajauktu tastatūru, tāpat kā es tikai tāpēc, lai pats izveidotu grāmatu, kas tai prasa naudu, jums ir nepieciešami resursi, kas jums jāveic veiksmīgi savā dzīvē. Man bija visdažādākās problēmas, kas saistītas ar ģimenes augšanu, veselības stāvokli, ārstiem, plašsaziņas līdzekļiem un likumu, un mans kods dziļi atspoguļo cīņu, kas ir feminisms un sieviešu daba sadalītā un neapmierinātā pasaulē. Tomēr šī grāmata ir kaut kas tāds, kas man ļoti rūp, mans mazulis, mans portfelis un iztika, tāpēc es novērtēju jūsu apsvērumu, kad jūs ņemat tekstu mājās un uzmanīgi pore to pār to, lai mācītos no manis. Lūdzu, paturiet prātā, ka es neesmu ideāls, šai grāmatai būs kļūdas, labojumi un jauni izdevumi, un jums būs jādomā ar savām loģiskajām smadzenēm pēc iespējas labāk, lai gūtu veiksmīgu pieredzi ar manu rakstīšanu. Izprotiet arī, ka es jums labi domāju pat tad, ja rakstot saskaras ar izaicinājumiem. Padomājiet par to šādi: kad jūs varat vienkārši noīrēt datorsistēmu, lai darītu visu, ko jūs, iespējams, iedomāties digitālajā telpā, saglabāt visu informāciju, ar kuru jūs sastopaties, analizēt un sakārtot, un to sapratīsit, jūs neizbēgami saskarsities ar grūtībām, kuru jūs uzņemat un pat publicējat. Es jums to saku, jo es sastopos ar tādām pašām grūtībām. Izmantojiet šo grāmatu uz savu risku, sadarbojieties ar jūsu kopienu un pieejamajām kopienām, lai izveidotu programmatūru drošā vidē, un neņemiet lietas personīgi, kad jums neizdodas vai pat gūt panākumus nepareizā veidā: tā es tiku tik tālu, un kāpēc es varu jums atnest šo tekstu un palīdzēt jums gūt panākumus, neatšķīroties no neprāta, kas man sagrauj globālu, lai pateicos paralistiskiem, kas saistīti ar to, ka mēs visi, kas saistīti ar to, ka mēs visi, kas ir saistīti ar to, ka visi, kas tiek parādīti, visi, kas tiek iegūti, visi, kas tiek iegūti, visi, kas tiek iegūti, lai iegūtu visu mērogu. strādās, internets. Jūs, iespējams, neesat ļoti pazīstams ar to, kas es esmu, tikai ar dažiem vārdiem, bet es aicinu jūs lasīt, jūs mani iepazīsit, turpinot lasīt un saprast mani, veidojot savus projektus, lai pabeigtu savu darbu. Ar šo grāmatu nebūs mājasdarbu, ja vien jūsu profesori vai skolotāji jums to nepiešķir, bet es ļoti aicinu jūs pats izveidot projektu portfeli, kā jūs lasāt, kā arī Capstone projektu, kas parāda, kā jūs varat izmantot iemācīto. Mans Capstone projekts ir pamats lielākajai daļai no tā, ko jūs lasīsit šajā grāmatā, jo tajā ir iekļauts kods no maniem iepriekšējiem projektiem, kodu, ko esmu izveidojis un iemācījies rakstīt metodiski ar rokām, un plašu ideju un padomu klāstu, kas man palīdzēja gūt panākumus līdz vietai, kur es varu griezt vienkāršu lietotni, kas pilnībā demonstrēta un izskatās un uzvedas, piemēram, jaunumus, kas ir jaunumi.
Kas ir šī grāmata: Šī grāmata ir apmācība pēc piemēra. You can find code here, instructions for how to learn to code, information on debugging code and fixing errors, troubleshooting steps, instructions on how to back up and save your code, re-deploy if anyone breaks your code, secure your code, deploy your code, build interactive websites that are entertaining, engaging, and addictive, and you will get a sense of who I am, why this is important, and how to portray yourself, your app and company image, as well as the software Jūs veidojat absolūti labāko gaismu, lai tā būtu vispievilcīgākā jūsu gala lietotājiem, jūsu vietnes apmeklētājiem. Šajā grāmatā es demonstrēšu vairākus programmatūras dizaina piemērus, koncentrējoties uz tīmekli kā platformu, kā arī drošību. Mēs ierosināsim mācību pieredzi, veidojot pamata projektu, izmantojot UNIX apvalku ar rezerves un skriptu iezīmēm. Pēc tam mēs pārbaudīsim pamata emuāra vietni, uzlabosim mūsu emuāru ar foto un video funkcijām, kā arī izmantosim šīs funkcijas, lai izmantotu drošības risinājumus, izmantojot bezmaksas programmatūru, un nostipriniet mūsu serveri, izmantojot spraudņu autentifikācijas moduli (PAM). Pēc tam mēs pārskatīsim failu apstrādi un apstrādi, starp citiem jēdzieniem izpētīt video rediģēšanu, balss ziedošanu, svītrkodu skenēšanu un optisko rakstzīmju atpazīšanu. Pa ceļam mēs pārbaudīsim API, kas mums palīdzēs padarīt mūsu programmatūru noderīgāku un drošāku, izmantojot bezmaksas un apmaksātas iespējas. Pa ceļam mēs izpētīsim fizisko drošību un kaujinieku rīkus, piemēram, šaujamieročus un munīcijas dizainu un ražošanu, ieskaitot mucu un atkārtotāju dizainu, tornīti un dronu dizainu, kā arī citus principus, kurus mēs integrēsim ar mūsu programmatūru esošajā tīklā, lai aizsargātu mūsu programmatūru un demonstrētu pašaizsardzības un izturēšanās izturēšanos. Mēs veiksim pārtraukumus, lai izveidotu spēles, 2D un 3D renderēšanas motorus un strādātu ar iegulto aparatūru, lai izpētītu pamata dimensiju renderēšanas programmatūras piemērus un elektronisku vibrējošu masieri, kas tiek izlaists attiecīgi silikona gumijā. Pa ceļam mēs izmantosim arī jau pieejamos mašīnmācības risinājumus, lai labāk nodrošinātu mūsu programmatūru. Mēs izmantosim arī tīmeklim pieejamos akciju rīkus, lai racionalizētu un nodrošinātu procesu. Šī grāmata ir jūsu panākumu ceļvedis tīmekļa lietojumprogrammas veidošanā un integrēšanā ar profesionālu datora un iegulto mehānisko sistēmu tīklu, kā arī kopumā rokasgrāmata programmatūras un iegultas aparatūras veidošanai bez fona zināšanām vai iepriekšējas pieredzes.
Kas nav šī grāmata: Ja jūs patiešām vēlaties vietni, jūs varētu vienkārši iestatīt vienkāršu veikalu un pārdot nepieciešamo, ievietot emuāru, ievietot fotoattēlus vai videoklipus vai kā citādi, nekad nerakstot vienu koda līniju. Šī grāmata nav tā. Šī grāmata iemācīs jums veidot programmatūru, kas ir noderīgāka, pilnībā demonstrēta, funkcionāla un droša nekā jebkura programmatūra, kuru jūs jau varat atrast, jo tā izvieto jaunāko programmatūru, kas joprojām ir prototipi, var būt dārgi darboties ar mērogu, kurā vecāki uzņēmumi darbojas, un tas neattiecas uz aizmuguri, izliekti uzņēmumi, kas izveidoti, lai nopelnītu naudu cilvēkiem, kuri patiešām neko nedara. Ja jūs uzmanīgi sekojat šai grāmatai, jūs vēlēsities rakstīt kodu, izpētīt kodu, izveidot savas lietotnes un nopelnīsit naudu no tā, ko darāt. Es nopelnīšu naudu no šīs grāmatas, pat agrīnā stadijā, jo tajā ir informācija, kas cilvēkiem ir nepieciešama un vēlas lasīt, un jau pērk, pērkot vai izmantojot manas lietotnes. Šī grāmata neveidos jums lietotni, bet tā norādīs jūs pareizajā virzienā un apbruņos ar nepieciešamajiem rīkiem, kā arī prasmēm un padomiem, kas atvieglos jūsu panākumus programmatūras veidošanā tīmeklim, ar katru koda līniju, kas jums būs jāraksta kā piemērs, gatavs būt kopā iesaiņotiem programmatūrā, kuru jūs un jūsu atbalstītāji, viesi, klienti, draugi, ģimenes locekļi, apmeklētāji, līgumorgāni un jūsu atbalstītāji, kuri ir izmantoti, un atbalsta.
Ko jūs iemācīsities: Šī grāmata iemācīs jums izveidot un pārdot programmatūru, patiešām funkcionālu, noderīgu programmatūru, multivides ierakstīšanu, tādas drošības funkcijas kā sejas atpazīšana, mašīnlasāmā zonas svītrkodu skenēšana, tīmekļa API, lai autentificētu, ierakstītu un atveidotu video un fotoattēlus, kā arī apmainīties ar ziņojumiem, piemēram, Bluetooth un tuvu lauka (NFC) saziņu. 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 Mērķi, ID skenēšana, attēla un video mērenība, datu mikrotransakcijas, lai jūsu programmatūra būtu droša, maksājumu apstrāde, kriptovalūtas tirdzniecība, asinhronie uzdevumi un daudz kas cits. Jūs uzzināsit, kā izveidot savas Bluetooth ierīces ar baterijām, lādētājiem, mikrokontrolleriem, ķēdēm, motoriem un sensoriem, izmantojot lodēšanu, stiepli un 3D izdrukātus, kā arī lietotu materiālus. Es demonstrēšu 3D dizaina direktorus, kas tiek piemēroti piedevu ražošanai un instrumentu un die veidošanai, tāpēc jūs varat ražot savas iegultās, aparatūras ierīces ar integrētām baterijām, lādētājiem, elektroniskām shēmām un funkcionālām izejām. un izveidojiet tos ar Bluetooth un tīmekli. Konkrēti, mēs pārbaudīsim divus gadījumu pētījumus - vibrējošu masētāju un mājās gatavotu šaujamieroci, kas ir abi ieprogrammēti OpenSCAD, kas ir pieejams kā grafisks interfeiss vai komandrindas lietderība un kuru var integrēt tīmeklī, lai iegūtu ātrāku rezultātu. Jūs uzzināsit, kā izveidot un izvietot vietni no paša sākuma bez iepriekšējas pieredzes, padarot to funkcionālu, drošu, skaistu, noderīgu un vissvarīgāk praktisku. Jūs uzzināsit, kā izmantot mašīnu apguvi un datora redzējumu, lai vietne būtu droša un praktiskāka, no savas vietnes ierakstītu video un audio, ziedotu balsi, veidotu mūziku un modulētu audio, lai izveidotu noderīgus paraugus, un kā izlauzt troksni, izmantojot citas vietnes, lai izveidotu vislabāko iespējamo vietņu tīklu, kuru jūs varat piesaistīt tieši jūsu programmatūrai un uzņēmējdarbībai. Šī grāmata visvairāk tiks koncentrēta uz plašsaziņas līdzekļiem, drošību un mašīnu apguvi, kas ir trīs galvenie komponenti, kas palīdzēs jums izveidot noderīgu programmatūru tīmeklim, iesaistot pareizos lietotājus un atvienojot nepareizos veidus reālistiskajā, praktiskā, praktiskā, rokās un iesaistot, vienlaikus arī automātiski un izturot. Šī grāmata māca Unix, īpaši Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript un vairākas noderīgas programmatūras paketes Python, piemēram, pieprasījumiem, kā arī noderīga bash programmatūra, piemēram, Git un FFMPEG. Es arī iemācīšu jums automātiski tirgot kriptovalūtu un veikt maksājumus kriptovalūtā vai no parastām debetkartēm, pat izmaksājot saviem apmeklētājiem daļu no jūsu ieņēmumiem, ja izvēlaties to darīt. Es iemācīšu jums, kā nopelnīt naudu no jūsu vietnes, izmantojot arī reklāmu, kā sagatavot savu lietotni meklētājprogrammām un padarīt to ātru, ierindota pirmajā ranžā, ko klienti meklēs, lai jūs atrastu, un ierindojoties pēc iespējas vairāk izplatīto meklējumu. Es iemācīšu jums, kā pārdot savu programmatūru, reklamēt to, pievilcīgu klientiem, kuri meklē jūsu pakalpojumus, un nosaukt sevi internetā, izmantojot jau pastāvošās iespējas, ir lēti un labi darbojas. Es iemācīšu jums, kā saglabāt jūsu datus mākoņa datoros, kas darbojas jūsu labā, un lēti saglabāt jūsu datus, kā plānot un izveidot vietni, kas dara to, ko vēlas jūsu lietotāji un ko vēlaties, un kā uzturēt lietotājus iesaistītus, liekot jūsu vietnei pieskarties viņu tālruņiem ar paziņojumiem, pa e -pastu, īsziņu ziņojumus, tālruņa zvanus un vairāk, lai jūsu lietotājiem atgrieztos jūsu vietnei, kas atrodas jūsu disposiskā pogas klikšķa pogā. Šajā grāmatā galvenā uzmanība tiks pievērsta plašsaziņas līdzekļu publicēšanas un izplatīšanas praktiskumam, sākot no teksta līdz fotoattēliem līdz videoklipiem un beidzot ar audio, radot labu iespaidu uz gala lietotājiem (jūsu klientiem) un pārdodot sevi jebkādā veidā, ko jūs darāt, lai izveidotu vietni, lietotni, kas ir reprezentatīva jums un tikai jūs, un jūs, jūsu programmatūra un jūsu uzņēmums izskatās labi, vislabākajā veidā ir iespējams. Jūs arī uzzināsit dažus padomus un trikus no manis, sākot ar kodēšanas padomiem, praktisku iedomību, piemēram, aplauzumu un fotogrāfiju, modelēšanu un darbību, kā arī daudz ko citu, kas būs svarīgi, lai attēlotu sevi un savu uzņēmumu vislabākajā iespējamajā gaismā, izmantojot visus jums pieejamos rīkus, vienlaikus izplatot tik daudz satura, cik jums nepieciešams veselīgs platformu līdzsvars, lai jūsu programmatūra tiktu izmantota ne vairāk kā darbs vai nauda, kas ir nepieciešama. Šī grāmata ir nosaukta par "praktiskuTīmeklī balstīta dziļa mācīšanās un drošība ar piemēru "iemesla dēļ: tas attiecas uz mācīšanos kodēt, it īpaši tīmeklim, īpaši ar koncentrēšanos uz drošību no praktiska viedokļa, ar darba koda piemēriem, kas kalpo praktiskiem mērķiem, kas izklāstīti tekstā. Uzlabošana, attēla parakstīšana un citi uzdevumi, piemēram, prognozēšanas metrika, kas iegūta no attēliem, piemēram, attēla raksturs, kā autentisks, datoru pārnestais attēls vai optisks eksemplārs (attēla foto vai drukāts foto) ir ļoti svarīgs, ja tas ir saistīts ar tīmekļa drošību, ja tas var būt saistīts ar jūsu datoru, ja tas var būt saistīts ar jūsu datoru. Jūsu seja var izveidot servera datoru, kas ir drošs, ka dators, kas parasti lūdz jums lietot lietotājvārdu un pieklājīgi, iespējams, ar apstiprinājuma marķieri katrai jaunai pieteikšanās vai jaunai IP adresei, bet, ja jūs veidojat lielu mērogu, viegli lietojama, kas ir droša, vai jebkura programmatūra, kas ir droša. izmantot). Ikvienam, kurš veido nevainojami drošu programmatūru, ir zināma izpratne par to, ko tas nozīmē. Programmatūra pēc būtības ir nedroša, jo ierīces un konti, kuriem mēs izmantojam, lai tai piekļūtu, ne vienmēr ir mūsu rīcībā, tās varētu būt ikviena rokās, kurām ir slikts nodoms programmatūrai, un tāpēc var radīt risku pašai programmatūrai. Tas ir kaut kas šīs grāmatas uzmanības centrā. Tīkla dators pēc noklusējuma ir nostiprināts ar garu atslēgas marķieri, ko sauc par SSH vai Secure apvalka atslēgu, un citādi tas ir vislabāk nodrošināts ar tīmekļa serveri, jo tīmekļa serveris nodrošina atvērto piekļuvi, kā arī modernākajiem mākslas drošības rīkiem, kas darbojas pašā serverī. Tīmekļa serverim ir piekļuve lietotāja tīmekļa pārlūkam, kas, domājams, ir visspēcīgākā lietotāja ierīces daļa, jo tā ir vieta, kur lietotājs var piekļūt tīkla programmatūrai. Šis rīku komplekts var padarīt tekstu, redzamās tīmekļa lapas, kā arī var ierakstīt attēlus, audio un video (piemēram, sejas vai stāvokļa ID fotoattēlu), var lasīt un rakstīt uz Bluetooth radio ierīcēm, kā arī var lasīt un rakstīt tuvu lauka retranslatoram, tagi, lēti taustiņu kartes, fob, nūjiņas, gredzenus un pat čipu implantu ar unikālu sērijas numuru, kas var būt nolasīts un rakstīts ar datiem, kas ģenerēti un ģenerēti un ir iegūti. Izmantojot visus jūsu rīcībā esošos rīkus, ar šo grāmatu jūs nodrošināsit sev zināšanas, lai izveidotu drošu vietni, un kopumā droša tīkla datorsistēma, kas jums darbojas, veic jūsu solīšanu, kā arī izskatās un jūtas
Kur sākt: Jūs esat laipni aicināti izlaist garām sadaļu Es sāku šo grāmatu ar nepieciešamo precīzo kodu vai jebkuru sadaļu, it īpaši, ja jums ir pieredze ar kodēšanu pirms vai kādu no iepriekšminētajiem rīkiem, kurus es sīkāk aprakstīšu šajā grāmatā, kā arī dokumentēt lietošanas gadījumus un to praktiskus piemērus. Ja jums nav pieredzes koda rakstīšanā, es ļoti iesaku jums izlasīt visu šo grāmatu un īpaši iesaku izlasīt iepriekšējās sadaļas, lai pārliecinātos, ka šī grāmata ir piemērota jums. Ja šī grāmata jums nav piemērota, apsveriet iespēju to apdāvināt draugam vai radiniekam, kurš varētu būt ieinteresēts pašiem uzzināt par tīmekļa attīstību, un pat apsveriet iespēju to aizņemt un mācīties no viņiem, lai aizpildītu nepilnības, kurās es jums neizdevos kā skolotājs, vai arī citi skolotāji to darīja man priekšā. Sāciet, kur jūs to darīsit, katra šīs grāmatas daļa būs noderīga, ja plānojat izveidot noderīgu lietotni, un uzskatāt, ka labākās lietotnes ir veidotas, ņemot vērā galalietotāju: zināt savu klientu. Tagad jūs mani pazīstat, jūs zināt šo grāmatu un esat gatavs sākt. Lai sāktu, satveriet datoru (pat lētākais klēpjdators no kastes veikala, Amazon vai vecais darbvirsma darbojas un iestatiet to jūsu labā.
Kā lasīt šo grāmatu: Iezīmētais teksts apzīmē, ka teksts pieder komandu uzvednei, kur jūs uzrakstīsit jūsu vadīto kodu. Komandu uzvedne ir ļoti vērsta uz klaviatūru un prasa maz vai nav noklikšķināt, paātrinot darbplūsmu un atvieglojot lietas jums.
Darba sākšana: Nēsāsim ienirt. Mēs sāksim ar būvkodu uz vietējo mašīnu un sāksim, neveidojot vietni, kas savienota ar internetu. To ir drošāk sākt, neko nemaksā un jums tas ir viegli. Atkarībā no operētājsistēmas, nokļūšana bash apvalkā būs nedaudz atšķirīga. Mac OS šajā brīdī iesaku instalēt virtuālo mašīnu, jo visvairāk savietojamības iegūsit ar virtuālo mašīnu. Dažādi pakalpojumu sniedzēji, piemēram, VirtualBox un Paralells, var palaist jums virtuālu mašīnu, lai gan ir iespējams arī instalēt Ubuntu tieši mašīnā, ja vēlaties izmantot vietējo vidi, kas ieteicama, lai izveidotu ātru, racionalizētu pieredzi. Ja jūs izmantojat Linux vai Windows, kurus es iesaku, projektu vajadzētu būt diezgan viegli. Atveriet termināli, pielāgojiet izmēru, kā redzat, un sāciet sekot 2. darbībai. Ja izmantojat Windows, lūdzu, izpildiet 1. darbību.
1. solis: - tikai Windows lietotāji Windows atveriet komandu uzvedni kā administratoru un ierakstiet WSL –instalēt
2. solis: - turpiniet šeit, vai izlaidiet 1. soli šeit, ja nelietojat Windows Atvērtā terminālī (atkarībā no jūsu OS, ko Windows saukts par Ubuntu, terminālis Mac vai Linux vai līdzīgu nosaukumu), sāciet ar projekta izveidi. Mēs to darām ar komandu MKDIR, kas izveido direktoriju. Ja jums ir jāizveido direktorijs, lai saglabātu savu projektu, kas ir ieteicams, izmantojiet CD komandu, lai mainītu uz direktoriju un un
CD/ceļš/uz/direktoriju - ceļš ir mapes (faili), kas ir pirms jūsu mērķa direktorija, jūsu noklusējuma ceļš ir ~ vai/mājas/lietotājvārds (kur lietotājvārds ir jūsu lietotājvārds). Lai mainītu uz noklusējuma direktoriju, ierakstiet CD vai CD ~ MKDIR piemērs - nomainiet "piemēru" ar direktorija nosaukumu
Tagad jums ir sava projekta darba direktorijs. Tā kā ir tik svarīgi, lai šis direktorijs tiktu saglabāts, ja jums jāpārslēdzas uz citu mašīnu vai jāizvieto rakstītais kods, lai tas būtu gatavs tīmeklim, mēs izveidosim skriptu, lai dublētu jūsu direktoriju nākamajās dažās darbībās. Bet skripta veidošana prasa mazliet koda, un kods ir jāuztver, lai tas būtu pēc iespējas noderīgāks. Tāpēc izveidosim skriptu, lai vispirms izveidotu skriptus. Sāksim ar skripta izveidi un padarot to izpildāmu. Mēs tam izmantosim sudo, chmod un pieskarties un sauksim skriptu par "ascript".
sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript
Tagad mēs esam izveidojuši skriptu, padarījuši to izpildāmu un esam gatavi to rediģēt. Nano ir teksta redaktors, kas ļaus rediģēt tekstu bez noklikšķināšanas, kas ir daudz vieglāk nekā grafiskā lietotāja interfeisa izmantošana. Lai rediģētu failu ar nano, izmantojiet nano un pēc tam ceļu uz failu. Lai izveidotu skriptu, kas veido skriptu, tas, pirmkārt, ir diezgan līdzīgs mūsu skripta veidošanai. Mēs izmantosim to pašu kodu kā iepriekš, aizstājot skripta nosaukumu "Ascript" ar argumenta parametru, 1 USD. Tas ļauj mums piezvanīt uz skriptu, ierakstot vienkārši Sudo Ascript Newscript, kurā mēs varam izveidot jebkuru jaunu skriptu, aizstājot "Newscript" ar jūsu skripta nosaukumu. Kodam Nano vajadzētu izskatīties kā:
sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1
Un, lai aizvērtu nano, mēs varam noturēt vadības taustiņu un nospiest X, pēc tam y, lai apzīmētu, ka mēs saglabājam failu, un nospiest atgriešanos. Tagad, tā vietā, lai ierakstītu šīs trīs komandas, lai rediģētu skriptu, mēs varēsim ierakstīt sudo ascript, lai vēlreiz rediģētu skriptu. Tas darbojas! Un jebkuru jaunu skriptu var viegli palaist, izsaucot to apvalkā. Saglabāsim mūsu darbu tūlīt: uzrakstīsim rezerves skriptu, lai saglabātu mūsu jauno skriptu, un pēc tam dublēsim to mūsu projekta direktorijā, vienlaikus dublējot arī rezerves skriptu.
sudo ascript backup
Tagad, nano:
sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/
Kur/ceļš/uz/direktoriju ir ceļš uz projektu, kuru izveidojāt ar MKDIR. Vēlāk mēs uzzināsim, kā kopēt šādus ceļus, izmantojot cilpu un sarakstu, kas ir mazāk kods, bet pagaidām saglabāsim to vienkāršu un būs dažas līnijas. Lai palaistu šo skriptu un dublējumu, saglabājiet failu Nano ar vadību+X, Y un atgriezieties un ierakstiet zemāk savā apvalkā
backup
Ja, lasot šo grāmatu, jums vispār tiek piedāvāta parole un sekojat līdzi apvalkā, lūdzu, pareizi ievadiet lietotāja paroli, jums būs trīs mēģinājumi, pirms jums būs jāpārveido komanda. Jūs varat izmantot bultas augšup un lejup, lai atkārtotu komandas un rediģētu tās, ja jums kaut kas ir nepieciešams divreiz. Vienkārši nospiediet uz augšu un uz leju ar pārtraukumiem, lai atlasītu komandu, pirms komandu rediģējiet ar labo, kreiso bultiņu un dzēst taustiņu, kā arī tastatūru un palaižot to ar atgriešanos.
Apsveicam! Jums izdevās izveidot satriecošu rezerves skriptu, kas jūsu darba direktorijā dublē divus svarīgus čaulas skriptus. Mēs varētu pārvietot lietas vēlāk, jo projekts kļūst lielāks, bet tas šobrīd darbojas. Pāriesim pie dublēšanas mākonī, mēs tam izmantosim GitHub (lai gan dublējumam ir daudz citu GIT risinājumu, tie ir apmēram vienādi.) Git ir Verision Control programmatūra, kas ļauj dublēt labojumus jūsu programmatūrai, kad jūs tos veidojat serverī, vienlaikus ļaujot jums arī lejupielādēt visas programmatūras kopijas aiz paroles vai atslēgas. Saglabājot programmatūru, ir būtiska nozīme, jo īpaši tāpēc, ka mēs migrējam uz drošiem Linux gadījumiem, kas dažreiz sabojājas, kad viena koda līnija neizdodas, atstājot jūs bloķētu, kamēr jūsu kods, iespējams, netiks dublēts, ja jums nav iespējas to dublēt automātiski, ko mēs apskatīsim.
Ja jūs šajā brīdī vēl neizmantojat Ubuntu virtuālo mašīnu, es šajā brīdī iesaku izmantot Ubuntu virtuālo mašīnu, jo tas atvieglos jūsu dzīvi, instalējot visas paketes, kas vajadzīgas, lai izveidotu darba vietni un sagatavotu dziļas mācīšanās operācijas datorā. Tuvākajā laikā mēs pārvietosim kodu uz tīmekļa serveri, taču mēs vēlamies pārliecināties, vai aiz mūsu tīmekļa servera ir vismaz daži drošības slāņi, kas ir izturīgi pret pikšķerēšanu, un, lai to izdarītu, izmantos vairākus Linux paketes. Ja jūs joprojām vēlaties izmantot Mac OS, jūs esat laipni aicināti meklēt un instalēt nepieciešamās paketes tiešsaistē, taču, iespējams, nav alternatīvu katrai pakotnei, kuru šī grāmata vai sērija aptvers.
Pievienosim dažas komandas, lai veiktu mūsu darbu ar rezerves skriptu, palaižot komandu sudo ascript dublējumu.
# …
Vēlreiz kontrolējiet X, lai saglabātu.
Tagad mums ir jāveic viena laika konfigurācija šim projektam. Tā kā tas drīz būs GIT projekts, mums katru reizi, kad mēs izvietojamies no GIT krātuves, mums nav jāievada katru komandu, bet mēs to saņemsim, kad rakstīsim savus izvietošanas skriptus. Lai sāktu, pārliecināsimies, ka mēs atrodamies pareizajā direktorijā un inicializējam GIT repozitoriju un ģenerējam SSH atslēgas.
cd /path/to/directory
git init
git branch -m master
ssh-keygen
Pēc tam, kad mēs ierakstīsim SSH-Keygen, jaunā atslēga jāsaglabā mājas mapē zem mapes, ko sauc .ssh. To sauc par ID_RSA.pub. Atrodim šo atslēgu un nokopēsim to. To redzēt,
cd ~
cat .ssh/id_rsa.pub
Pirms SSH atslēgas pievienošanas savam kontam, nokopējiet tekstu, kuru atdod pēdējā komanda, un izveidojiet kontu ar savu GIT pakalpojumu sniedzēju (ideālā gadījumā GitHub). Kad jums ir konts, noklikšķiniet uz izvēlnes Augšējā labajā pusē un ievadiet iestatījumus, pirms pievienojiet SSH atslēgu SSH un GPG taustiņos, kas atrodas piekļuvei izvēlnē. Atlasiet Pievienot SSH taustiņu un pievienojiet savu, ielīmējot to un piešķirot tai nosaukumu, pirms saglabājiet un atgriežoties Github, lai izveidotu jaunu krātuvi. Tas ir līdzīgs citiem GIT pakalpojumu sniedzējiem, jums būs jāizlasa to dokumentācija. Jaunajā repozitorija konfigurācijā piešķiriet savam repozitorijam aprakstošu vārdu un izlemiet, vai vēlaties to publicēt, un pārliecinieties, ka vēl nav konfigurējis failus iekļaušanai. Kad repozitorija ir izveidota, nokopējiet klonu ar SSH URL un ielīmējiet to šajā komandā.
git remote add git://… (your remote URL)
Tagad jūs varat pāriet atpakaļ uz savu repozitoriju ar kompaktdisku, jūs to pārzināsit. Izmēģiniet rezerves skriptu tūlīt ar dublējumu
Lieliski! Tagad mēs patiešām varam saņemt kodēšanu. Instalēsim Django tagad, kad mums ir laba izpratne par basu un git. Django ļaus mums automātiski dublēt mūsu programmatūru, Bash to var izdarīt arī, bet Django vajadzētu būt vienkāršākai īstenošanai (to var atspējot un vieglāk konfigurēt).
Lai instalētu programmatūru Ubuntu, mēs izmantosim komandu sudo apt-get. Vispirms atjaunināsim un jaunināsim programmatūru, kas mums jau bija. To var izdarīt ar sudo apt-get atjauninājumu un sudo apt-get jaunināšanu -y. Pēc tam instalēsim Python un mūsu virtuālo vidi, mūsu koda mājas ar šādu komandu: sudo apt-get instalēt python-is-python3 python3-venv
Tas ir viss, kas jums nepieciešams, lai sāktu ar Django programmatūras instalēšanas ziņā Ubuntu instancē. Windows un Linux tam vajadzētu būt diezgan vienkāršam, bet Mac, iespējams, vēlēsities instalēt virtuālo mašīnu un Linux, izmantojot bezmaksas vai apmaksātu virtuālo vidi, piemēram, VirtualBox vai Paralells darbvirsmu, un atjaunojiet iepriekšminētās darbības, lai iestatītu Ubuntu vidi. Ubuntu šajā gadījumā ir kritiska, jo tā ir programmatūra, kuru vietnes darbojas, un tā ļauj tām mitināt vietnes ar visu iepriekšminēto programmatūru.
Iekļautu django.
Atkal mūsu direktorijā ar CD:
python -m venv venv # Izveido virtuālo vidi, kurā kods tiek saglabāts
source venv/bin/activate # Aktivizē virtuālo vidi
django-admin startproject mysite . # Kur MySite ir projekts, kuru es sāku savā pašreizējā direktorijā.
Django tikai mūs sāk, jo Django mitina tīmekļa serveri un dara visu nepieciešamo, lai iegūtu pamata vietējo vietni. Tagad, kad mums ir instalēts Django, mazliet rediģēsim iestatījumus, lai tas darbotos tā, kā mums nepieciešams. Vispirms izveidosim jaunu lietotni
python manage.py startapp feed
Jūs pamanīsit, ka pirmā lietotne tiek saukta par plūsmu. Lietotnei vajadzētu saukt visu, kas jums patīk, un mēs izveidosim jaunas lietotnes, taču katras lietotnes nosaukumam jābūt konsekventam katru reizi, kad lietotne tiek atsaukta kodā. Lai pievienotu jaunu lietotni, mēs vienmēr rediģēsim iestatījumus.py citā direktorijā, kuru izveidoja lietotne, kas nosaukta startProject, turpmāk. Izmantojot nano,
nano app/settings.py
Iestatījumos atrodiet instalēto_aps un atdaliet [] 3 rindās. Izmantojot četras telpas tukšajā centra līnijā, pievienojiet "plūsmu" vai lietotnes nosaukumu. Šī iestatījumu sadaļa.Py vajadzētu izskatīties šādi:
INSTALLED_APPS = [
'feed',
]
Pirms mēs aizmirstam, pārbaudīsim, vai Django strādā. Izmantojot komandu python pārvaldīt.py RunServer 0.0.0.0:8000, mēs varam palaist serveri un pēc tam pārlūkot tīmekļa pārlūkprogrammā datorā, kas darbojas kodu uz http: // localhost: 8000 un skatiet tīmekļa lapas piemēru (tas darbojas!) Atbrīvojieties no servera ar vadību C, tāpat kā jebkura cita komanda.
Tagad runāsim par kādu Python koda rakstīšanu. Django ir trīs galvenās sastāvdaļas, kuras visas tās pilnībā pārvalda ar kodu. Komponentus sauc par modeli, skatu un veidni, un katrs no tiem ir attiecīgi augstākā un zemākā līmenī pirms tīmekļa lapas piegādes lietotājam.
Modelis ir kods, kas glabā informāciju datu bāzē izguves, šķirošanas un atveidošanas datu bāzē.
Skats nolemj, kā modelis tiek atveidots, manipulēts un modificēts, gandrīz katrā skatā tieši izmantos modeli.
Veidne ir HTML kods ar dažiem papildu zvaniem un svilpieniem, ko sauc par veidņu valodu. Veidni veido skatījums, kurā tā ir piepildīta ar Python kodu un kontekstu, piemēram, modeļiem un informāciju (usuall virknes un veseli skaitļi) no skata.
Django ir arī citas sastāvdaļas, ieskaitot, bet ne tikai:
Iestatījumi, kas konfigurē lietotni, kā mēs apspriedām.
URL, kas ir modeļi, kurus lietotājs ievēro, lai piekļūtu konkrētām tīmekļa lietojumprogrammas daļām.
Veidlapas, kas nosaka, kā tiek apstrādāta un sniegta informācija, kas tiek nosūtīta uz serveri, tiek apstrādāta un sniegta datu bāzē, kā arī lietotājam. Šie ir informācijas apstrādes pamats servera pusē un var pieņemt jebkura veida informāciju, ko datoru glabā, īpaši teksta virknes, ciparus un patiesas/viltus būla (parasti izvēles rūtiņas).
Veidnes, kas ir HTML kods un veidņu valoda, un novērš plaisu starp Python un HTML, kas nozīmē, ka Python informācija var tikt pasniegta kā HTML kods, kuram ikviens var piekļūt un var nodrošināt vietni ar ierobežotu piekļuvi, vienlaikus padarot Python kodu pieejamu tīmeklim un ir noderīga dažādiem mērķiem ar attālinātu ierīci, kurai nav jābūt tuvu serveram.
Statiskie faili, kas parasti ir JavaScript un tā bibliotēkas, kuras serveris kalpo un ir savienoti ar veidni.
Multivides faili, kurus serveris kalpo vai ir ārēji mitināts, vai vienkārši rakstīts serverī pirms apstrādes un ievietots citā serverī (spainī) mitināšanai.
Starpprogrammatūra, kas ir koda gabali, kas tiek palaisti vienlaikus ar katru skatu un tiek uzskatīti par "iekļautu" skatā.
Konteksta procesori, kas apstrādā katra skata kontekstu un tiek izmantoti, lai pievienotu papildu kontekstu.
Pārbaudes, kas apstiprina, ka lietotājs vai pieprasījums pārsniedz noteiktas prasības pirms skata sniegšanas.
Patērētāji, kas diktē, kā tīmekļa stackets rīkojas ar komunikāciju un reaģē uz to.
Administrators, ko izmanto, lai reģistrētu modeļus, lai ar tiem varētu detalizēti manipulēt Django administratora lapā, kur datu bāzi var ievadīt, izmantojot grafisku saskarni.
Selerija, kas definē asinhronās Django koda daļas, var sākt darboties, pirms nekavējoties pāriet uz nākamo uzdevumu vai koda rindu.
Django var būt daudz citu komponentu, par kuriem mēs šeit detalizēti apspriedīsim. Ir daudz veidu, kā padarīt django funkcionālāku, pievienojot tīmekļa saites, kas ir ātri, pilnveidoti sakaru kanāli, selerijas, kas izpilda asinhronus uzdevumus, un daudzu citu programmatūras gabalu Django paplašināšanai, it īpaši skatu funkcijās, kur tiek izpildīts lielākā daļa koda. Skatīt funkcijas ir galvenās, jo tās parasti deklarē katru koda gabalu, kas raksturīgs noteiktam URL modelim vai servera sadaļai.
Vispirms izpētīsim skatu funkcijas. Skatīt funkcijas sākas ar importēšanu, kas apzīmē kodu, kas tiks izmantots skatā, un tiek definēts, izmantojot regulāras funkciju definīcijas vai klases. Vienkāršākos skatus nosaka funkcijas definīcija def, un atgriež httpResponse ar pamata veidni. Sāksim ar pamata skata definēšanu, lai atgrieztu tekstu "Hello World". Atcerieties, ka katru reizi, kad pievienojat kodu pēc paziņojuma, piemēram, def, ja, kamēr, par utt., Jums būs jāpievieno 4 vietas katrai no iepriekšējām definīcijām, kuras vēlaties piemērot jūsu funkcijai. Drīz mēs nonāksim tajā, ko katrs no šiem nozīmē.
No mūsu vietnes direktorija rediģējiet Feed/Views.py failu, izmantojot Nano, un faila beigās pievienojiet šīs rindas.
from django.http import HttpResponse
def hello(request):
return HttpResponse('hello world')
Django HttPresponse atbild ar teksta virkni, kas apzīmēta ar atvēršanu un aizvēršanu ". Katru reizi, kad nododat informāciju funkcijai vai klasei, piemēram, pieprasījumam vai virknei, jums būs jāizmanto iekavās (, atvēršana un aizvēršana).
Tas vēl nav viss, kas mums vēl jāredz mūsu viedoklis. Protams, mēs neesam teikuši serverim, kur tieši ir skats, mums joprojām ir jādefinē ceļš, pa kuru skatam vajadzētu atveidot. Sāksim, definējot pamata ceļu lietotnē/urls.py, un mēs vēlāk nonāksim ceļa grupās.
App/urls.py pievienojiet līniju pēc importēšanas paziņojumiem pēc sākuma importēt mūsu tikko izveidoto skatu.
from feed import views as feed_views
Tagad definēsim skata modeli. Skata modeļiem ir trīs komponenti - ceļa komponents, kas norāda serverim, kur skats pastāv serverī (URL ceļš, kuru lietotājs ieraksta navigācijas joslā, lai ievadītu tīmekļa lapu), skata komponents, kurā tiek norādīts skats, un draudzīgs nosaukums skatu, lai būtu viegli iegūt, ja tas ir paredzēts citam, lai iegūtu citu skatu, it īpaši tā nosaukumu var mainīt un atjaunināt, ja tas ir nepieciešams, lai izveidotu citu, lai iegūtu citu, vai arī to var mainīt. Ir jēga rīkoties šādā veidā un būt elastīgam, jo jūsu kodu bāze būs vienmēr mainīga vide, kurai nepieciešama elastība un improvizācija, lai tā būtu vērtīga un viegli strādājama. Lūk, kā izskatīsies jūsu skats, jūs varat to pievienot vietnei urlPatterns = [App/urls.py sadaļa. Skata modelis tiek definēts ar trim iepriekš aprakstītajiem komponentiem un funkciju, ko sauc par ceļu. Jūsu URL modeļi ir saraksts, tāpēc pārliecinieties, ka vienmēr katru priekšmetu pārtraucat ar komatu, jo tas atdala katru no tiem. Katram priekšmetam vajadzētu iet arī pa jaunu līniju, vēlreiz ar četrām atstarpēm pirms tā, tāpat kā lietotne iestatījumos.py. Mēs definēsim pirmo skata komponentu ar tukšu virknes funkciju, lai izveidotu skatu, kas darbojas tīmekļa servera saknes direktorijā. Jūsu URLS.PY tagad vajadzētu izskatīties šādi:
from feed import views as feed_views
urlpatterns = [
path('', feed_views.hello, name='hello'),
]
Tas ir pamats vietnes izveidošanai ar Django, kas ir pilnīgi statisks. Lai izveidotu dinamiskāku vietni, kurā mēs varam sākt kešatmiņas saglabāšanu, piemēram, attēlus, videoklipus, audio un daudz ko citu, mums būs jāizmanto modeļi, kurus mēs izpētīsim tālāk. Pagaidām pārbaudīsim mūsu kodu un palaidīsim serveri. Lai pārbaudītu koda kļūdas, palaidiet:
python manage.py check
Ja ir kādi kļūdu ziņojumi, jums rūpīgi jāpārskata izmaiņas, ko veicat uz jūsu lietotni, un redzēt, vai ir kaut kas, kas jānosaka, piemēram, sveša vai trūkst vietas, papildu raksturs, neiekarota virkne, jebkura drukas kļūda, jebkura nejauši izdzēsta raksturs vai kaut kas cits. Izlasot kļūdas ziņojumu (ja jums tāda ir), jums vajadzētu būt iespējai redzēt ceļu uz jūsu izveidoto vai rediģēto failu kopā ar rindu numuru, tāpēc izpētiet šo failu un līniju un pārbaudiet, vai varat salabot visu, kas tur atrodas. Ja esat novērsis problēmu, palaidiet vēlreiz iepriekš minēto komandu. Kad jūsu programmatūra ir gatava palaišanai un darbojas, jūs redzēsit izvades "Sistēmas pārbaudi, kas nav identificēta." Tagad jūs esat gatavs doties. Palaidiet serveri ar:
python manage.py runserver 0.0.0.0:8000
Tagad atveriet tīmekļa pārlūku un dodieties uz http: // localhost: 8000. Jūsu skatījumā jums vajadzētu redzēt tekstu, kas atgriezts httpResponse funkcijas iekavās un citātus. Šis ir tikai pamata piemērs, bet, ja jūs to izveidojāt tik tālu, jūs saprotat pamatus, kā darbojas Linux, Bash, Python un Django. Iekāpsim dziļāk kādā datu bāzes modelēšanā un izpētīsiet python klases jaudu informācijas glabāšanā. Pēc tam mēs sāksim saķerties ar HTML un CSS, pirms mēs padarīsim mūsu vietni pilnībā demonstrētu, elastīgu un drošu, izmantojot JavaScript un mašīnu apguvi.
Nodarbības tiek glabātas jūsu lietotnes modeļos.py. Izmantojot nano, rediģējiet lietotni/modeļus.py un pievienojiet jaunu klasi. Klase tiek definēta ar klases definīciju un tiek nodota superklasei, no kuras tā manto, šajā gadījumā modelī.modelis. Klases nosaukums nāk pēc klases definīcijas, un pēc klases definīcijas A: (resnās zarnas) tiek izmantots, pirms atribūti un funkciju definīcijas, kas saistītas ar klasi, tiek apzīmēti zemāk. Mūsu klasei ir nepieciešams ID, kuru mēs varam izmantot, lai to izgūtu un saglabātu unikālu, un tai ir nepieciešams arī teksta lauks, lai saglabātu kādu informāciju. Vēlāk mēs varam pievienot laika zīmogu, failus, būli (patiesas vai nepatiesas definīcijas, kas var palīdzēt mūsu kodam pieņemt lēmumus par to, ko darīt ar modeli, un tos var izmantot, lai to sakārtotu), instanci, lai modeli piesaistītu lietotājam, kas reģistrēts serverī, un daudz ko citu. Izsaiņosim zemāk esošo kodu:
from django.db import models # Imports, ko izmanto, lai definētu mūsu klasi un tās atribūtus
class Post(models.Model): # Pašas klases definīcija
id = models.AutoField(primary_key=True) # Mūsu modeļa ID, automātiski ģenerēta atslēga, kas ļaus mums vaicāt modeli, saglabāt to unikālu un ir noderīga, ja mums ir jāinformē modelis, kad tas ir izveidots.
text = models.TextField(default='') # Atribūts mūsu klases veikalos šajā gadījumā ir daži teksts, kas noklusē tukšo virkni.
Aizveriet un saglabājiet failu, kā mēs to darījām iepriekš, lai pabeigtu.
Ir daudz citu lauku un iespēju, kuras mēs izpētīsim, atjauninot šo klasi, attīstoties mūsu lietotnei, taču šīs ir lietotnes izveidošanas pamatvajadzības, lai ievietotu kādu tekstu. Tomēr šis modelis nedarbosies viens pats. Kā aprakstīts iepriekš, mums būs nepieciešams pielāgots skats un pielāgots URL modelis, lai šis modelis darbotos, un mums būs nepieciešama arī forma kopā ar veidni. Vispirms izpētīsim veidlapu.
Lai definētu veidlapu, rediģējiet lietotni/Forms.py ar nano un pievienojiet šādas rindiņas. Mums būs nepieciešami divi imports, mūsu veidlapu klase, kā arī mūsu izveidotais modelis (Feed.models.Post), klases definīcija, kas līdzīga modelim, un lauks kopā ar apakšklasi, ko sauc par meta, kas definēs modeli, ar kuru forma mijiedarbojas. Veidlapai var būt arī inicializācijas funkcija, kas to nosaka, pamatojoties uz informāciju pieprasījumā, modelī vai citādi, mēs to izpētīsim vēlāk.
Modeļa formas ir tik noderīgas, jo tās var izveidot modeli vai arī rediģēt modeli, tāpēc mēs tās izmantosim abiem. Definēsim vienu formā.py zemāk.
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',)
Tas ir pamati tam, kā izskatās forma un modelis. Šo modeļa veidlapu var izmantot, lai atkārtotu vai rediģētu ziņu, mainot tajā esošo tekstu. Mēs aplūkosim šīs formas integrēšanu nākamajā skatā. Vispirms izveidosim migrāciju un migrēsim datu bāzē, lai mūsu kods varētu mijiedarboties ar modeli, kad tas darbojas. Lai to izdarītu, palaidiet šādas komandas:
python manage.py makemigrations
python manage.py migrate
Tas prasīs minūti, lai izpildītu, bet, kad tas notiks, tas ļaus jums piekļūt modelim skatos, starpprogrammatūrā vai jebkur citur programmatūrā. Turpināsim, veicot priekšstatu, kur mēs varam redzēt mūsu modeli. Rediģēt plūsmu/skatus.py un pievienojiet šo kodu, kā norādīts. Pēc zīmes # zīmes jums nekas nav jāpievieno, šis kods ir komentāri, kurus izmanto, lai apzīmētu informāciju par kodu. Mēs sāksim, importējot mūsu modeli skatos un pievienojot to kontekstam, kurā mēs to varam padarīt veidnē kā displeja sarakstu. Tālāk mēs pievienosim veidni, kurā mēs varam padarīt veidlapu un modeli ar pogu, lai izveidotu jaunu objektu, pamatojoties uz modeli, un ievietot to serverī. Tas izklausās sarežģīti, tāpēc ņemsim to vienkārši soli pa solim. Pirms mēs pabeidzam skatu, izveidosim veidni, kas tikai veido modeli un pārliecināsies, ka mēs to varam redzēt, izveidojot jaunu ierakstu apvalkā. Lūk, kā šim skatam vajadzētu izskatīties:
posts = Post.objects.all() # Vaicājiet visas līdzšinējās datu bāzes ziņas
Tas viss izskatās diezgan vienkārši, līdz nonākam apakšā. Renderēt, vērtība, ko atgriež funkcija, nevis HTTP reakcijā, piemēram, iepriekšējais piemērs, vienmēr pieņem pieprasījumu kā pirmo ievadi, pieņem kontekstu (šajā gadījumā datus datu bāzē), kuru tagad var atveidot veidnē un atgriež funkcijā definētu veidni. Veidne būs HTML dokuments ar nelielu valodu ar nosaukumu Jinja2, kas Python informāciju padara par HTML.
Lai sāktu veidot veidnes, izveidojiet divus direktorijus plūsmā.
mkdir feed/templates
mkdir feed/templates/feed
Pēc tam rediģējiet veidni iepriekš minētajā direktorijā, plūsmu/veidnes/plūsmu un pievienojiet kodu šim piemēram. Apskatīsim šī piemēra veidni.
Šī ir ļoti vienkārša veidne. Tas definē HTML tagu atvēršanu un aizvēršanu, dokumenta tipa tagu, korpusa tagu ar leģendas nosaukumu, pārtraukuma tagu, kas ekrānam pievieno nelielu līniju, un cilpai, kas katru ierakstu sarakstu atveido kā rindkopu veidnē. Tas ir viss, kas nepieciešams, lai atveidotu ziņojumus, bet datu bāzē vēl nav neviena. Izveidosim dažus ar apvalku. Mēs varam palaist apvalku ar pārvaldību.py
python manage.py shell
Tagad importēsim mūsu pasta modeli
from feed.models import Post
Tālāk mēs izveidosim vienkāršu ziņu ar virkni un izietu no apvalka. Virkne var būt jebkas, ja vien tas ir derīgs teksts.
Post.objects.create(text='hello world')
exit()
Visbeidzot, mums plūsmai būs jāpievieno URL modelis. Tā kā mūsu plūsmas lietotne izmantos vairākus URL un mēs vēlamies saglabāt faila izmērus mazus, izveidosim vietējos URLS.py mūsu plūsmas lietotnē, kas izskatās šādi:
from django.urls import path
from . import views
urlpatterns = [
path('', views.feed, name='feed'),
]
Mums būs arī jārediģē vietnei vietrāžus URLS.py bāzes lietotnē, lai ko mēs nolēmām to saukt, šī bija pirmā direktorija, kuru mēs izveidojām. Rediģēt lietotni/app.py un pievienojiet šādus URL modeļus
from django.urls import include # augšpusē
# ... iepriekšējais kods šeit
Tagad, kad mēs palaižam serveri ar Python Management.py RunServer, mēs redzēsim mūsu izveidoto lapu, jo mums ir modelis, skats un veidne, kā arī URL modelis, kā arī datu bāzē. Tālāk ieviesīsim mūsu izveidoto veidlapu un sāksim veidot savas ziņas. Bet, pirms mēs rakstām pārāk daudz koda, izveidosim rezerves kopiju, izmantojot iepriekš uzrakstīto skriptu, dublējumu. Palaidiet šo skriptu apvalkā, pagaidiet dažus mirkļus, un viss kods tiks dublēts mūsu GIT krātuvē.
backup
Veidlapas ieviešana ir samērā vienkārša. Mēs importēsim savu veidlapu, pievienosim skatu uz POST pieprasījuma apstrādātāju un pirms novirzīšanas uz to pašu skatu saglabāsiet ziņu datu bāzē. Mēs varam izmantot jau importēto novirzīšanas funkciju un vēl vienu funkciju, ko sauc par reversu, lai iegūtu URL skata modelim. Mēs to vaicāsim ar virkni "Padeve: barība", jo iekļautā modeļa nosaukumvieta ir barība, un skats tiek saukts arī par plūsmu.
posts = Post.objects.all() # Vaicājiet visas līdzšinējās datu bāzes ziņas
if request.method == 'POST': # Rīkojieties ar pasta pieprasījumu
form = PostForm(request.POST) # Izveidojiet veidlapas gadījumu un saglabājiet datus tajā
if form.is_valid(): # Apstiprināt veidlapu
form.save() # Saglabājiet jauno objektu
return redirect(reverse('feed:feed')) # Novirzīt uz to pašu URL ar pieprasījumu
'form': PostForm(), # Pārliecinieties, ka veidojat veidlapu kontekstā, lai mēs to varētu padarīt.
Tagad mums būs jāatjaunina veidne, lai ņemtu vērā jauno veidlapu. Mēs to varam izdarīt, izmantojot
Sadalīsim to. Ir jauna veidlapu klase, marķieris, pati veidlapa un iesniegšanas poga. Diezgan vienkārši, bet, kad mēs to apskatīsim, mēs varētu vēlēties, lai tas izskatās labāk. Tas darbojas, mēs varam ievietot jaunas ziņas ar veidlapu, un tagad tās tiek saglabātas datu bāzē. Šeit notiek dažas lietas. Mēs izmantojam HTML tagus, lai paziņotu, ka dokuments ir HTML dokuments, mēs izmantojam veidnes tagu ({ %… %}), lai padarītu to veidlapas marķieri, un citu, {{…}}, lai padarītu veidlapu. Mums ir arī cilpa teksta atveidošanai, izmantojot bloku tagus un veidnes tagu. Bloķēšanas tagi ir patiešām svarīgi, jo mēs varam definēt, kā ar tām tiek atveidotas veidnes sadaļas, un veidņu tagi ir pamats tam, kā mēs savā kodā ievietojam mainīgos lielumus.
Tagad mums ir jāpadara mūsu lietotne labāka, jo pagaidām tā izskatās patiešām vienkārša. Mēs to varam izdarīt, izmantojot CSS vai nu inline, vai klasēs, kas saistītas ar katru dokumenta objektu. CSS ir patiešām jauks, jo tas visam lapā stāsta, kā tai vajadzētu izskatīties, un tas var padarīt to izskatīgu patiešām labu. Ir dažas bibliotēkas, kas to var izdarīt, bet mans personīgais apmeklējums ir bootstrap.
Bootstrap var lejupielādēt no viņu vietnes,getbootstrap.com/Apvidū Atrodoties tur, nospiediet pogu, lai nolasītu instalācijas dokumentus, un nokopējiet kodu no sadaļas INCTIPLE, izmantojot CDN. Jums būs nepieciešams šis kods HTML dokumenta augšdaļā, tagā ar nosaukumu Head. Dosimies arī uz priekšu un izveidosim bāzes veidni, tāpēc mums nav jāatjauno šīs saites katrā veidnē.
Izveidojiet jaunu direktoriju ar nosaukumu veidnes ar MKDIR veidnēm un pēc tam rediģējiet veidnes/base.html.
Tam vajadzētu izskatīties šādi:
Pārliecinieties, ka nokopējat CSS un JavaScript, .css un .js failus, jo mums būs nepieciešams JavaScript, lai mūsu vietne nākotnē padarītu funkcionālāku.
Tagad atgriezīsimies pie bash apvalka un palaidīsim ātru komandu. Atcerieties, ja jums kādreiz ir nepieciešams piekļūt virtuālajai videi, ierakstiet avotu Venv/Bin/Active. Tas ļaus jums instalēt Python pakotnes uz vietas tādā veidā, kas ļauj Django tiem piekļūt. Lai iegūtu mūsu veidlapas, kuras ģenerē Django bootstrap klases, mēs izmantosim Python paketi ar nosaukumu Crispy Forms. Mēs to varam lejupielādēt ar šādu komandu
pip install django-crispy-forms
Kad tas ir instalēts, pievienojiet to iestatījumiem.py
# … Iepriekšējais kods šeit
Tagad, atpakaļ mūsu plūsmas veidnē, mēs varam noņemt dažas lietas. Noņemsim dokumenta sākumu un beigas un nomainīsim to ar mantojumu no mūsu bāzes veidnes, izmantojot paplašinājumus un bloka definīciju. Mēs arī pievienosim veidnes filtra importēšanu ar slodzi un veidnes filtru. Visbeidzot, pievienosim bootstrap klasi veidlapas pogai, lai tā izskatās vairāk kā poga. Tam vajadzētu izskatīties šādi:
Skaisti! Tas jau ir diezgan daudz koda. Tālāk mums tas jāpārbauda un jāpārliecinās, ka mēs redzam, ka viss izskatās jauki, un arī pārliecinieties, ka viss darbojas pareizi. Palaidiet serveri atbilstoši iepriekšējām instrukcijām un pārliecinieties, vai vietne izskatās un darbojas labi. Lielisks darbs! Jūs esat gatavs pāriet uz nākamo soli, kurā mēs pievienosim lietotāja pieteikšanās funkcionalitāti, izmantojot līdzīgus URL, veidlapas, skatus un veidnes. Pamata veidne ir svarīga, un mēs turpināsim to modificēt un veikt izmaiņas pēc vajadzības, bet pagaidām koncentrēsimies uz to, lai mūsu vietne būtu drošāka, ļaujot lietotājiem pieteikties ar lietotājvārdu un piekļuves kodu, un galu galā vēl svarīgāka informācija, kas palīdzēs jūsu lietotnei nodrošināt drošu un jūsu kontu pieejamu tikai jums.
Lai to izdarītu, mums būs jāizmanto Django iebūvētais lietotāja modelis. Lietotāja modelis ir datu bāzes modelis, tāpat kā mūsu ziņojums, kuru var padarīt lietotāju reģistrēt vietnē. Nākotnē, pirms mēs izvietosim vietni internetā, mēs paplašināsim šo modeli ar citiem attiecīgiem modeļiem un izveidosim papildu drošības pasākumus pieteikšanās, kas ir izturīgi pret pikšķerēšanu. Mēs sāksim, izmantojot dažas iebūvētas pieteikšanās formās, kuras nodrošina Django. Vispirms izveidosim jaunu lietotni, kuru mēs izmantosim, lai padarītu veidnes un skatus pamata pieteikšanās lapai. Mēs izveidosim arī citas lietotnes, lai attēlotu pastāvīgās pieteikšanās problēmas, lai nodrošinātu lietotni, ieskaitot pincode, sejas atpazīšanu, tuvu lauka komunikāciju, ārējās ierīces, vairāku faktoru autentifikāciju un pirkstu nospiedumu atpazīšanu.
Mēs jau runājām par lietotnes sākšanu. No mūsu direktorija, virtuālās vides iekšienē, nodot pārvaldīt.py šos argumentus
python manage.py startapp users
Tagad mums vajadzētu būt jaunās lietotnes direktorijai. Sāksim, izveidojot skatu šajā direktorijā, kas atbilst lietotāja pieteikšanās. Django ir izveidojis skatījumu uz lietotāju pieteikšanos, taču tie mums nebūs piemēroti, jo mums ir nepieciešams pielāgots skats, kas vēlams veikt ar definīciju.
Šajā skatījumā mēs sāksim, pārbaudot ziņojuma pieprasījumu, nokārtojiet pieprasījumu.
Lietotāju/skatos.py pievienojiet šo kodu
username = request.POST['username'] # Saņemiet lietotājvārdu un paroli no ziņas pieprasījuma
password = request.POST['password'] # Autentificēt lietotāju
Tas ir viss, kas jums nepieciešams pamata pieteikšanās skatam. Tagad izveidosim skata veidlapu, paplašinot bāzes veidni. Sākumā izveidosim jaunu direktoriju veidnēm mapē Lietotāju.
mkdir users/templates
mkdir users/templates/users
Tagad mums vajadzētu būt iespējai rediģēt lietotājus/veidnes/lietotājus/login.html. Kamēr mēs esam pie tā, mēs izveidosim veidni, kas ļautu lietotājam arī reģistrēties.
nano users/templates/users/login.html
Tagad, veidnē,
Tas ir pieteikšanās veidnes pamati. Tas tiešām ir tāpat kā otra veidne struktūrā, bet, kad tā tiek atveidota, tā izskatās mazliet savādāka. Mēs varam nokopēt šo kodu, lai izveidotu vēl vienu ļoti līdzīgu veidni ar nosaukumu Register.html, kur mēs mainīsim formulējumu un izmantosim jaunu veidlapu, kuru mēs veidojam. Vispirms izveidosim veidni. Rediģēt lietotājus/veidnes/lietotāji/reģistrs.html un pievienojiet šādu kodu:
Tagad izveidosim veidlapu mūsu lietotāja reģistrācijai un aplūkosim skatus, pirms mēs modernizējam mūsu lietotāju pieteikšanos ar modeli. Mēs padarīsim šo formu pamata, lai sāktu, bet nākotnē iekļausim sīkāku informāciju un drošības funkcijas, piemēram, līgumus un Captcha. Rediģējiet veidlapas ar nano lietotājiem/formas.py un pievienojiet šo kodu.
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']
Tātad mums šeit ir cita forma, kas darbojas diezgan vienkārši. Tā ir lietotāja reģistra veidlapa ar lietotājvārdu, e -pastu un paroli, kā arī lauks Apstipriniet paroli. Ņemiet vērā, ka šī veidlapa nepagarina parastās veidlapas.Form klasi, tā ir modeļa forma, kas nozīmē, ka tai ir meta. Viens lauks ir definēts tieši tāds pats, un klases meta definē modeli, kura forma atbilst pārējai informācijai, kas tiks uzrakstīta veidlapai. Lielākā daļa no tā jau pastāv Django iebūvētajā UserCreationForm, tāpēc mēs to izmantosim kā pamatu klasei (pieņemts iekavās).
Tālāk mēs pārbaudīsim skatu reģistrēt lietotāju tagad, kad mums ir veidlapa un veidne. Šī ir Modelform, tāpat kā jaunajā ziņojuma skatā. Rediģēt lietotājus/skatus.py un pievienojiet šo kodu:
# … Imports
Tas ir viss, kas mums nepieciešams, lai reģistrētu lietotāju, bet mums vajadzētu būt vairāk informācijas. Mēs vēlamies uzzināt, kādu laiku lietotājs reģistrēja, kurā laikā viņi bija pēdējie vietnē, kaut arī informācija par viņiem, piemēram, biogrāfija, laika josla utt. Arī mums būs jāatjaunina mūsu plūsmas modelis, jāizliek, lai ņemtu vērā lietotāja modeli un atribūtu ziņojumus katram lietotājam. Lai to izdarītu, mēs atjaunināsim modeļus.py abās lietotnēs. Sāksim ar barības modeļa rediģēšanu. Tam vajadzētu izskatīties šādi tagad:
from django.db import models # … Imports
author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Pievienojiet šajā rindā
Pievērsiet uzmanību otrajai līnijai, kas tika pievienota failam. Šī ir sveša atslēga, kas katru ziņu attiecinās uz vienu lietotāju uz vienu ziņu, tāpēc mēs varam pārliecināties, ka mēs saglabājam ziņas uz lietotāja lietotāja pamata, un nevienu ziņu nevar veikt, nepievienojot to lietotājam. Mēs definējam šo svešo atslēgu ar klasi, kuru tā pārstāv, izdzēst argumentu, lai nodrošinātu, ka ziņojumi tiek izdzēsti ar lietotājiem, nulle un tukši argumenti, lai pārliecinātos, ka mēs varam noņemt lietotāju, ja nepieciešams, un lai pielāgotos lietotāja trūkumam uz mūsu jau izveidotajiem ziņojumiem, un ar to saistīto vārdu, kuru mēs varam izmantot, lai atsauktu lietotāju izveidotos objektus. Šis saistītais nosaukums, atšķirībā no Post.Author, ziņas autors, dod mums lietotājam, kurš pats ievietojis ziņu. Tagad mēs varam saņemt ziņas, kuras lietotājs ir izveidojis, palaižot lietotāju.poSts.all () vai autor.poSts.all ().
Tagad padarīsim mūsu pieteikšanās izturīgākus. Mēs jau varam padarīt mūsu vietni daudz mazāk neaizsargātu pret pikšķerēšanu, vienkārši vērtējot, ierobežojot to reižu skaitu, kuras mēs ļausim pieteikties uz vietni, tas ir diezgan viegli. Sāksim arī iepriekš saglabāt informāciju par katru lietotāju, turpinot attīstīt savu lietotni. Lietotāju/modeļu.py rediģēšana, pievienojiet šo kodu.
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='')
Ņemiet vērā, ka šis modelis ir diezgan līdzīgs Post modelim. Mums ir papildu imports, TimeZone, kas ļaus mums iestatīt noklusējumus uz datuma laukiem, un mums ir arī raksturs un teksta lauks, piemēram, The Post. Visu šo laika zīmogu izmantošana palīdz mums nodrošināt vietni un izprast tās izmantošanu, un teksta lauki ļauj mums sniegt informāciju par katru lietotāju vai autoru vietnē. OneToonefield vajadzētu būt vienīgajam mazajam apsvērumam, tas uzvedas tieši tāpat kā iepriekšējs, bet tikai ar vienu par nākamo modeli. Tādā veidā lietotājam ir tikai viens profils, kamēr viņiem var būt daudz ziņu.
Tagad uzlabosim mūsu pieteikšanos un reģistrēsimies skatus, lai ņemtu vērā profilu. Vispirms rediģējiet lietotājus/skatus.py un koncentrējieties uz reģistra skatu:
# … Imports
Profile.objects.create(user=user) # Pārliecinieties, lai pievienotu šo rindu, lai izveidotu profilu lietotājam
Tas lietotājam vienkārši rada profilu, neaizpildot nevienu informāciju. Tagad mēs vēlamies pārliecināties, ka lietotāja kontu nevar pieteikties pārāk bieži, vai vismaz paroles nevar izmēģināt pārāk bieži, tāpēc atjaunināsim pieteikšanās skatu.
# … Imports
if user and user.profile.can_login < timezone.now(): # Ņemiet vērā, ka tagad mēs pārbaudām, vai lietotājs var pieteikties
else: # Ja pieteikšanās nebija veiksmīga,
user = User.objects.filter(username=username).first() # Šī ir daļa, kurā mēs atjauninām lietotāju profilu
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Tāpēc viņi vairs nevar pieteikties uz dažām sekundēm
Tas ir drošības pamatpalīdzība. Pārliecinieties, ka vietne nav neaizsargāta pret to, ka kāds vienkārši izmēģina katru iespējamo paroles kombināciju vai pat dažus no viņiem vienlaikus. Tas nebūs nomākts parastajam lietotājam, kurš zina viņu piekļuves kodu un tikai piesakās dažās ierīcēs, bet tas neskaitīs daudzus pikšķerēšanas robotus no lietotnes. Ņemiet vērā, ka mēs pievienojām IF paziņojumu ar mainīgo, can_login, tam vajadzētu būt laikam pagātnē, un atjaunināt to ar katru neveiksmīgo pieteikšanos, izmantojot to pašu lietotājvārdu. Tādā veidā ļaunprātīgs lietotājs nevar tik ātri uzminēt paroli nekur tuvu. Var atjaunināt arī sekunžu skaitu DateTime.timeDelta (), un vietne būs izturīgāka, bet nedaudz mazāk izmantojama ar vairāk sekundēm. Es iesaku 15 sākt.
Atcerieties, ka mēs izveidojām rezerves skriptu, lai saglabātu savu darbu, tāpēc ejam uz priekšu un dublēsim to, kas mums līdz šim ir, lai pārliecinātos, ka viss ir saglabāts. Palaist komandu:
sudo backup
Vēlreiz tas ietaupīs līdz šim jūsu darbu. Es iesaku darboties ar biežām dublējumiem, lai saglabātu savu darbu, un jūs, iespējams, pat vēlēsities automātiski palaist rezerves darbu. To var izdarīt, izmantojot UNIX utilītu ar nosaukumu Cron. Lai aktivizētu šo utilītu, palaidiet šo komandu un ievadiet savu paroli:
sudo crontab -e
Ja vēl neesat izvēlējies 1. opciju Nano, teksta redaktoram, kas jums jau vajadzētu būt pazīstams, un ritiniet līdz faila apakšai, izmantojot bulttaustiņus. Pievienojiet šādu līniju:
0 * * * * sudo backup
Krons izmanto formāta minūti, stundu, mēneša dienu, mēnesi, nedēļas dienu, kur * vai skaitlis apzīmē, kad vadīt komandu. Izmantojot 0 minūti un * pārējām opcijām, mēs varam palaist komandu katras stundas pirmajā minūtē minūtes sākumā. Tas ļauj mums automātiski dublēt kodu. Visi Krona darbi, kad tiek izpildīti ar Sudo Run kā sakni, tāpēc mums katru stundu nevajadzēs ievadīt paroli.
Lai atvieglotu mūsu koda dublēšanu, neizmantojot paroli, atspējosim mūsu dublējuma komandas paroli. Mēs to darīsim, izpildot šo komandu un ievadot paroli:
sudo visudo
Tagad ritināsim līdz faila apakšai un pievienosim citu rindu:
ALL ALL=NOPASSWD: /bin/backup
Tas ļauj mums palaist komandu "dublēt" kā jebkuru lietotāju, bez paroles. Formāts tam ir vienkāršs, vienkārši prefiksējiet līniju ar "All = Nopasswd:/bin/" un beidzas ar komandu, piemēram, bin/rezerves kopiju, kas pastāv/usr/bin/.
Tagad sāksim strādāt ar e -pastu. E -pasts ir patiešām svarīgs vietnēm, jo tas ir veids, kā saglabāt vietni drošāku, pārbaudīt, vai lietotāji ir reāli cilvēki un pat tirgus produkti vai pakalpojumi klientiem. Daudzi cilvēki, kuri bieži apmeklē internetu, katru dienu pārbauda savu e -pastu un saņem visa veida mārketinga e -pastu par produktiem un pakalpojumiem, kas viņus interesē. Django vietnē ir dažas iespējas, kad runa ir par e -pasta iespējošanu Django vietnē, un jūs esat laipni aicināti izvēlēties to, kurš jums vislabāk darbojas.
Pirmkārt, jūs varat samaksāt par e -pasta pakalpojumu, kas ļaus jums nosūtīt e -pastu no sava domēna un prasa minimālu kodu. Ir daudz pakalpojumu, kas to piedāvā, piemēram, Google Workspace, SendInblue, Mailgun un daudz ko citu.
Pretējā gadījumā jūs labi izveidojat savu e -pasta pakalpojumu savā serverī no nulles. Es iesaku šo iespēju, kaut arī tas ir vairāk kods, un tam var būt nepieciešama īpaša mitināšana. Jūs, visticamāk, nevarēsit sākt pasta serveri no sava mājas datora, tāpēc turpināsim un pārbaudīsim konfigurāciju un kodu, lai nosūtītu e -pastu, pirms mēs sākam serveri mākonī un izveidosim savu pasta serveri.
Vispirms rediģējiet iestatījumus.py ar šādu komandu:
nano app/settings.py
Kur lietotne ir lietotnes nosaukums, kuru izveidojāt ar StartApp.
Pievienojiet šādas līnijas:
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)
Pārliecinieties, ka mainīsit tos, kad būsit gatavs izvietot savu lietotni, mēs to pārskatīsim vēlāk. E -pasta_address iestatījumam vajadzētu būt e -pastam, no kura vēlaties nosūtīt, un parole (e -pasta_host_password) jāiestata uz paroli, kuru ģenerējat serverim. Es ielādēju paroli no konfigurācijas faila, lai to neizturētu, izmantojot šādu loģiku, virs šīm rindām iestatījumos.py:
import os
import json
with open('/etc/config.json') as config_file:
config = json.load(config_file)
Pēc tam es esmu iestatījis JSON failu ar konfigurāciju /etc/config.json, izmantojot nano šādi.
Lai rediģētu failu:
sudo nano /etc/config.json
Pievienojiet šādas līnijas:
{
"EMAIL_HOST_PASSWORD": "<some password here>"
}
Mēs turpināsim rediģēt konfigurācijas failu un pievienot visas paroles un atslēgas, kuras mēs izmantosim lietotnē. Pagaidām ātri pārbaudīsim, kā nosūtīt e -pastu, izmantojot Python. Vispirms izveidosim veidni verifikācijas e -pastam, kuru mēs varam nosūtīt saviem lietotājiem, un ievietot to lietotāju veidņu direktorijā. Šī veidne tiks uzrakstīta HTML.
nano users/templates/users/verification_email.html
Šis e -pasts ir diezgan vienkāršs. Tas ietilpst lietotāja, vietnes bāzes URL kontekstā, kā arī lietotāja ID un marķieri, kurus izmanto, lai pārbaudītu lietotāja e -pastu. Pirms mēs uzrakstām kādu Python kodu, lai izveidotu veidni, noteikti definējiet bāzes URL.py.py. Dodieties uz priekšu un pievienojiet šīs rindas lietotnei/iestatījumiem.py, tuvu sākumam.
SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'
BASE_URL = PROTOCOL + '://' + DOMAIN
Galu galā, kad jūsu vietne ir gatava internetam un jūs to izvietojat, jūs vēlēsities definēt savu domēnu kā domēna vārdu, kuru pērkat, lai attēlotu vietni. Šis ir nosaukums, kuru jūs ierakstīsit Navbar, lai piekļūtu savai vietnei. Pagaidām jūs varat atstāt domēnu tukšu vai izmantot vietturi. Jūs arī vēlēsities mainīt vietni_nosaukumu uz vārdu, kuru vēlaties dot savai vietnei, izvēli.
Pirms mēs nosūtīsim e -pastu, izveidosim marķiera ģeneratoru, lai mums būtu konta aktivizācijas marķieris, kura nekad nav beidzies. Mēs to varam izdarīt, veidojot un importējot konta aktivizācijas marķieri, kas izskatās šādi. Rediģēt failu:
nano users/tokens.py
Pievienojiet šādu kodu:
from django.contrib.auth.tokens import PasswordResetTokenGenerator
import six
class TokenGenerator(PasswordResetTokenGenerator):
def _make_hash_value(self, user, timestamp):
return (
six.text_type(user.pk) + six.text_type(timestamp)
)
account_activation_token = TokenGenerator()
unsubscribe_token = TokenGenerator()
Šis pamata marķiera ģenerators ģenerē marķieri, kuru mēs varam nosūtīt lietotājam URL, un lietotājs var izmantot, lai pārbaudītu viņu e -pastu un aktivizētu savu kontu.
Tālāk redzēsim, kā nosūtīt e -pastu. Nano izmantošana, rediģējiet lietotājus/e -pastu.py.
nano users/email.py
Verifikācijas nosūtīšana HTML e -pasts izskatīsies šādi:
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)
Tas ir diezgan vienkārši. Mēs importējam funkcijas, kas mums jānosūta e -pasts, jānosūta e -pasts ar veidnēm un mūsu iestatījumiem, un pēc tam mēs e -pastu definējam pēc veidnes nosaukuma un nosūtām to lietotājam, izmantojot funkciju. Jūs pamanīsit, ka mēs vēl neesam definējuši sūtīt pastu send_html_email, tāpēc uzrakstīsim šo zem kodu, kuru mēs jau pievienojām lietotājiem/e -pastu.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()
Tas ir nedaudz sarežģītāk, un mēs vēl neesam gatavi palaist visu šo kodu. Ievērojiet, ka mēs definējam Unub_link, saite, ko lietotājs var izmantot, lai abonētu no mūsu e -pastiem. Tas ir svarīgi, jo lietotājiem jebkurā laikā būs jāspēj atteikties no mūsu e -pastiem, ja vien viņi tos nevēlas redzēt. Mēs arī pievienojam teksta alternatīvu mūsu ziņojumam, kas ir HTML ziņojums, kas atņemts no HTML tagiem. Visbeidzot, mēs pārbaudām, vai nosūtīts e -pasts, un, ja tā nav, lietotāja profilā mēs atzīmējam, ka viņu e -pasts nav derīgs.
Pārcelsimies atpakaļ uz lietotāju modeļiem, lai mēs varētu visu darboties. Mums jādefinē funkcija, lai ģenerētu saiti uz abonēšanu, un jādefinē Būla lauks, lai atzīmētu, ka lietotāja e -pasts nav derīgs.
Vispirms pievienojiet šādus importus lietotājiem/modelim.py
nano users/models.py
# …
Tālāk pievienosim funkcijas lietotāja modelim, lai izveidotu marķieri un pārbaudītu e -pasta aktivizēšanu izmantoto marķieri, kā arī lauku, lai saglabātu, vai lietotājs veiksmīgi saņem savu pastu. Lietotājiem/modelim.py vēlreiz pievienojiet šo kodu modeļa beigām (ievilkts kods)
# …
TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Derīgs 30 dienas
Tas ir diezgan vienkārši, mēs izmantojam Timestampsigner, kas ir pamata kriptogrāfijas rīks, lai izveidotu marķieri, kura derīguma termiņš beidzas pēc noteikta laika, un mēs izmantojam arī citu funkciju, lai pārbaudītu, vai tā ir derīga. Mēs divreiz izmantojam šos žetonus, vienreiz, lai pārbaudītu e -pastu un vienu reizi, lai iegūtu abonēšanas saiti.
Tagad, kad mums tie ir, pēdējais no darba, kas mums būs jādara, ir uzskats. Vietnē lietotāji/skats.py, pievienosim skatus, lai pārbaudītu e -pasta adresi un abonētu.
nano users/views.py
Vispirms pievienojiet šādus importus. Es iemetu dažus papildus, tāpēc mums vēlāk vairs nevajadzēs importēt vairāk priekšmetu.
from .email import send_verification_email # Pārliecinieties, lai importētu verifikācijas e -pasta sūtīšanas funkciju
Jums, iespējams, jau ir daži no šiem importu, bet nav sāpīgi tos atkārtot. Starp citiem importiem būs jāimportē verifikācijas e -pasta sūtīšanas funkcija, kā arī konta_aktivācijas_token no lietotājiem.tokens.
Tagad faila apakšā pievienojiet šo kodu:
# Atteikt tos
# Citādi novirzīt uz pieteikšanās lapu
# sendwelcomeemail (pieprasījums, lietotājs)
Tas ir daudz koda. Sadalīsim to. Pirmā funkcija, tīra un vienkārša, abonē lietotāju no adresātu saraksta. Otrā funkcija aktivizē viņu e -pastu, un jūs pamanīsit, ka es pievienoju komentētu funkciju Sendwelcomeemail. Lai nosūtītu apsveikuma e -pastu, jūs esat laipni aicināti izmantot e -pasta veidni un funkciju definīciju, es to vienkārši vēl neesmu. Pēdējā funkcija, kuru es iemetu, ir svarīga, jo beidzas aktivizācijas e -pasti. Tāpēc mums kādu laiku būs jāpiešķir aktivizācijas e -pasts. Tam mēs varam izmantot pamata veidlapu un piezvanīt funkcijai, lai nosūtītu verifikācijas e -pastu. Pirms mēs to izdarīsim, pārliecināsimies, ka tas vispirms tiek nosūtīts, pievienojot funkcijas zvanu reģistra skatam. Pievienojiet šo līniju tieši pirms novirzīšanas reģistra skatā, Def Reģistrēties, lietotājiem/skatiem.py.
nano users/views.py
# … (Pēc) def reģistrs (pieprasījums):
# … (Pirms) novirzīt (
Šajā koda fragmentā nav jāpievieno pirmās un pēdējās rindiņas, vienkārši pārliecinieties, vai reģistra skats lietotājam nosūta verifikācijas e -pastu. Tam vajadzētu izskatīties šādi:
# … Imports
send_verification_email(user) # Pārliecinieties, ka pievienojat šo līniju!
Tagad mums būs jāpievieno veidlapa, lai nosūtītu aktivizācijas e -pastu. Lietotāju/formas.py pievienojiet šādu veidlapu:
# … (Imports)
Mums būs nepieciešama arī veidne, kas atbilst šai nosūtīšanas e -pasta aktivizācijas veidlapai. Pievienosim šo veidni. Rediģējiet failu:
nano users/templates/users/resend_activation.html
Pēc tam failam pievienojiet šo kodu.
Whew, tas ir daudz! Tagad, izvietojot kodu mūsu serverī, mēs varēsim nosūtīt HTML e -pastu un aktivizēt lietotāju kontus ar klikšķi e -pastā. Mēs arī varētu vēlēties nosūtīt vienkāršu uzņemšanas e -pastu, tāpēc redzēsim, kā to izdarīt. Atpakaļ lietotājiem/e -pastu.py, pievienojiet šo kodu:
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)
Mums arī būs nepieciešama veidne, lai sniegtu visu šo informāciju. Manā vietnē veidne izskatās kā zemāk, taču esat laipni aicināts to formatēt, cik vēlaties.
Ņemiet vērā, ka mums nav aizvēršanas korpusa vai HTML tagu, jo tos pievienojam, kad pievienojam HTML abonēšanas saiti. Tie ir svarīgi, bet mēs nevēlamies tos definēt divreiz.
Tātad, kas tālāk? Mēs esam nogājuši garu ceļu. Tiešām, mums vajadzētu būt gataviem izvietot vietni serverī. Mēs varam pievienot @login_required dekoratoru un padarīt mūsu skatījumu drošu, veikt lietotāju reģistrēšanos, nosūtīt atbilstošu e -pastu un informāciju par kešatmiņu, kas ir pamatā tam, kas vietnei jādara, lai saglabātu atbilstību. Mēs pievienosim vēl dažas noderīgas funkcijas un pēc tam izveidosim pamatu mūsu koda izvietošanai attālajā serverī, pasta servera iestatīšanu, domēna konfigurāciju un filtrus, lai mūsu vietne būtu droša un piemērota.
Mums būs nepieciešams arī paroles atiestatīšanas skats, tāpēc pievienosim to patiešām ātri. Django iebūvētais paroles atiestatīšanas skats ir salauzts dažās funkcijās, taču mēs apskatīsim, kā rakstīt savu skatu, e -pasta veidni, veidlapas un URL modeļus. Lūk, kā izskatās skats, lietotājiem/skatiem.py
# ... imports
Šī veidlapa ir iebūvēta Django, bet mums būs nepieciešama veidne, lai apstiprinātu paroles atiestatīšanu, lietotāji/veidnes/lietotāji/parole_reset_confirm.html
Mums ir arī veidne, lai nosūtītu paroles atiestatīšanas e -pastu ar vienkāršu veidlapu lietotājiem/veidnēm/lietotājiem/parole_reset.html
Pati e -pasta veidne ir vienkārša, tas ir pamata HTML fails, kas renšē saiti, lai atiestatītu paroli, lietotājiem/veidnēm/lietotājiem/parole_reset_email.html. Django automātiski interpretēs šo failu.
Mums būs vajadzīgas arī vēl divas veidnes. Pirmais ir apstiprināt, ka e -pasts ir nosūtīts. Skati uz tiem jau ir Django, tāpēc mums tie vienkārši jārisina vietnēs URLS.PY. Šī veidne atrodas lietotāju/veidņu/lietotāju/parole_reset_done.html
Un visbeidzot, lai apstiprinātu, ka paroles atiestatīšana ir pabeigta, lietotāji/veidnes/lietotāji/parole_reset_complete.html
Tagad mums ir nepieciešami URL modeļi šiem uzskatiem. Lietotāju/urls.py vietnē pievienojiet šādus URL modeļus:
# ... iepriekšējie URL šeit
Četras veidnes, tas ir daudz! Bet tagad mēs varam būt pārliecināti, ka varēsim atiestatīt lietotāja paroli jebkurā laikā, kas mums nepieciešams, visu no tīmekļa pārlūka.
Es saprotu, ka tas ir daudz koda. Ja tas šķiet mazliet virs galvas, tas ir labi. Jūs uzlabosities, jūsu izpratne uzlabosies, un jūs ļoti drīz kļūsit daudz kompetentāks ar kodu. Ja esat pilnībā apmaldījies, es iesaku atgriezties pie šīs programmatūras vēlāk pēc tam, kad strādājat pie pašpasākuma, iemācieties kodēt kursu tiešsaistē. Parasti tie ir bez maksas, un, atgriežoties pie šī projekta, palīdzēs jums visu nepieciešamo, lai gūtu panākumus. Ja jums šķiet, ka esat gatavs turpināt, lasīt, nākamreiz mēs apskatīsim jūsu koda izvietošanu attālā serverī un pasta servera iestatīšanai, kā arī izvietošanas automatizēšanu, izmantojot bash, lai jūs vienmēr varētu iestatīt jaunu projektu ar dažām vienkāršām komandām.
Pēdējā lieta, kas mums jādara pirms izvietošanas attālā serverī, ir mūsu vietne mazliet drošāku. Jūs pamanīsit, ka pieteikšanās skatā ir nepieciešams tikai lietotājvārds un parole, un nav daudzfaktoru autentifikācijas vai viena laika koda. Tas ir viegli salabojums, un ar to pašu kodu mēs varam likt mūsu vietnei nosūtīt īsziņas un pat būt reaģējošām uz serveri nosūtītām īsziņām. Lai sāktu, mēs atgriezīsimies lietotāju modeļos un pievienosim laika zīmoga parakstītāju, kas attēlos katru pieteikšanos. Mēs pievienosim arī unikālu, rotējošu identifikatoru lietotāja modelim, kas tiks izmantots, lai mūsu pieteikšanās pievienotu papildu drošību. Lietotāja modeļu rediģēšana, lietotāji/modeļi.py, pievienojiet šādu kodu:
# Pārliecinieties, ka importējat UUID, TIMESTSPAPT STRINFER un URL ģeneratoru (atpakaļgaitā)
# Pievienojiet šo kodu šeit
# Un pievienojiet šo funkciju
TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Derīgs 3 minūtes
Pārliecinieties, ka jūsu lietotāji/modeļi.py izskatās šādi, papildus komentāriem (kods rindās ar #). Sadalot to, tas ir vienkārši. Mums ir daži imports, laika zīmogs, kas ir kriptogrāfijas lietderība, kas var ģenerēt drošu kodu un pārbaudīt to, lai pārliecinātos, ka tas ir derīgs, tiek izmantots tikai vienu reizi, un ne vecāks par noteiktu sekunžu skaitu. Mēs izmantojam arī UUID, kas ir unikāls identifikators, kas identificē mūsu lietotāju marķiera parakstīšanā un URL, kur marķieris tiek nosūtīts lietotājam. Mēs izmantosim šo pamata kriptogrāfiju, lai izveidotu divu faktoru autentifikācijas skatu. Pirms mēs darām kaut ko citu, palaidīsim migrāciju, lai mūsu lietotāju modeļi tiktu atjaunināti. Direktorijā ar pārvaldību.py palaidiet šādas komandas, lai izveidotu un aizpildītu migrāciju.
source venv/bin/activate
python manage.py makemigrations && python manage.py migrate
Tas ir svarīgi, jo katru reizi, kad mēs veicam izmaiņas modeļos, mums būs jāizveido tabulas un jāatjaunina datu bāze ar noklusējumiem, pirms mēs faktiski varam izmantot modeļus.
Pēc tam improvizēsim mūsu pieteikšanās skatu, lai novirzītu uz sekundāro autentifikācijas skatu. Lietotājā/skatos.py noņemiet pieteikšanās funkciju un novirziet uz URL, ko mēs tikko ģenerējām lietotāju modeļos.
# … Imports
if user and user.profile.can_login < timezone.now(): # Ņemiet vērā, ka tagad mēs pārbaudām, vai lietotājs var pieteikties
# Noņemiet šeit esošo funkciju Auth_login
return redirect(user.profile.create_auth_url()) # Ņemiet vērā, ka mēs šeit novirzām uz jaunu URL
else: # Ja lietotājs neizmanto daudzfaktoru autentifikāciju, vienkārši piesakieties.
else: # Ja pieteikšanās nebija veiksmīga,
user = User.objects.filter(username=username).first() # Šī ir daļa, kurā mēs atjauninām lietotāju profilu
profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Tāpēc viņi vairs nevar pieteikties uz dažām sekundēm
Tātad tas ir diezgan vienkārši, tagad mums ir veids, kā novirzīt uz divu faktoru autentifikācijas skatu, kad to izveidojam. Mums ir arī rezerves gadījumā, ja lietotājs nav pievienojis tālruņa numuru. Mēs drīz pievienosim pamata skatu, lai pievienotu tālruņa numuru un drīz pieteiktos ar īsziņu.
Pirmkārt, mums ir nepieciešams vienkāršs veids, kā nosūtīt īsziņu no mūsu koda. Lai to izdarītu, mēs varam izvēlēties no vairākām API, bet, manuprāt, vienkāršākais ir twilio. Viņi arī piedāvā labu cenu noteikšanu mazākiem projektiem, kā arī lielapjoma atlaides. Izveidojiet kontu twilio.com, aizpildiet sīkāku informāciju par savu projektu, iegādājieties tālruņa numuru un nokopējiet API atslēgas uz jūsu iestatījumiem.py. Pēc tam pievienojiet šo kodu ar jaunu failu, lietotāji/sm.py.
nano users/sms.py
# Importēt visas nepieciešamās paketes
# Šis kods nosūta tekstu ar twilio
# Palīga funkcija, lai iegūtu numuru ar tik daudziem cipariem
# Nosūtiet tekstu, lai pārbaudītu lietotāju
# Nosūtiet lietotājam jebkuru tekstu ar šo funkciju
# Validējiet kodu ar šo funkciju
# Apstiprināt laiku
Noteikti atbilstoši mainiet iestatījumus, pievienojot šīs līnijas ar taustiņiem:
# Noteikti nokopējiet tos no sava Twilio informācijas paneļa
AUTH_VALID_MINUTES = 3 # Minūšu skaits, kurā TFA lapa ir aktīva, vienreiz tiek pakļauta
Pirmkārt, mums būs vajadzīgas veidlapas mūsu diviem faktoru autentifikācijas skatiem. Lietotāju/formas rediģēšana.py, pievienojiet šo kodu.
# … Imports
# Veidlapa mūsu tālruņa numura ievadīšanai
# Veidlapa autentifikācijai
Tālāk izveidosim skatus vietnē lietotāji/skati.py
# … Imports
Mums būs vajadzīgas arī veidnes abiem šiem uzskatiem. Vispirms pievienosim MFA veidni.
nano users/templates/users/mfa.html
Pievienojiet veidnei šo HTML kodu
Tas ir diezgan pašsaprotami. Veidlapa nosūta vai nu kodu, vai tukšu kodu, un jūs pamanīsit skatā, ja mēs nosūtām kodu, ja saņemam tukšu kodu. Tad mums vienkārši ir divas iesniegšanas pogas, un šādā veidā mēs varam nosūtīt kodu ar abām pogām. Tālāk mēs pievienosim vienkāršu veidlapu, lai pievienotu tālruņa numuru.
nano users/templates/users/mfa_onboarding.html
Pievienojiet šādu HTML:
Šī forma ir daudz vienkāršāka, tā vienkārši padara mūsu izveidoto tālruņa numura veidlapu un ļauj lietotājam pievienot tālruņa numuru.
Tas izskatās patiešām labi! Kamēr viss ir pareizi iestatīts, mums vajadzētu būt iespējai nosūtīt ziņojumus un reģistrēt lietotāju ar viņu tālruņa numuru, tiklīdz mēs pievienojam URL modeļus. Pēdējais, kas mums jāiestata, ir profila skats, lai mēs varētu pārliecināties, ka lietotājs var mainīt savu tālruņa numuru, nepiesakoties. Galu galā mēs vēlamies pievienot opciju "apstāties, lai atmestu", lai lietotājs varētu nosūtīt īsziņu "apstāties", lai atteiktos no turpmākajām īsziņām.
Pievienosim profila skatu lietotājiem/skatiem.py. Šis skats atjauninās lietotāja biogrāfiju, e -pastu, lietotājvārdu un tālruņa numuru, kā arī ļaus mums iespējot vairāku faktoru autentifikāciju. Pirmkārt, mums būs vajadzīgas vēl divas formas lietotājiem/formās.py
# ... imports
Tālāk mēs varam izveidot skatu, lai izmantotu abas šīs formas. Rediģēt lietotājus/skatus.py un pievienojiet skatu.
# Pievienojiet šos importus
Mums būs nepieciešama arī šai viedokļa veidnei.
nano users/templates/users/profile.html
Jūs pamanīsit, ka šī ir diezgan vienkārša forma, taču tajā ir kāds JavaScript, kas automātiski ievieto veidlapas saturu, kad tie tiek atjaunināti. Tas ir noderīgi, tāpēc jūs varat veikt labojumus, katru reizi neveicot nospiešanu.
Tālāk mums ir nepieciešami URL, kas attēlo visus šos viedokļus lietotāju URL modelī. Rediģēt lietotājus/urls.py un pievienojiet šo kodu:
# … Iepriekšējais kods, imports
# … URL modeļi, kurus mēs iepriekš ievadījām, pievienojiet nākamās trīs rindiņas
Tagad ir piemērots laiks, lai pārbaudītu mūsu projektu. Bet vispirms palaidīsim vēl vienu rezerves kopiju.
backup
Un palaist serveri. Pirms mēs izvietojam Linux serveri, tā ir laba ideja iespējot divu faktoru autentifikāciju kontā. Mēs to darīsim, nonākot mūsu profila URL/lietotājiem/profilam/, un pārbaudīs rūtiņu, lai iespējotu autentifikāciju pēc mūsu tālruņa numura ievadīšanas un pēc tam iesniegtu veidlapu.
python manage.py runserver localhost:8000
Apmeklējiet vietni, dodoties uz savu tīmekļa pārlūku, es šajā piemērā izmantoju Google Chrome un ievadu URL https: // localhost: 8000/konti/profils/
Ja nepieciešams, jūs varēsit pieteikties un iespējot divu koeficientu autentifikāciju.
Šim projektam ir nepieciešams serveris, lai palaistu, lai tas patiešām varētu nosūtīt pastu. Bet vispirms mums ir nepieciešams veids, kā redzēt kļūdas. Jūs pamanīsit, ka, ja serveri palaižat atkļūdošanas režīmā, ar iestatījumiem.debug, kas vienāds ar True, serveris automātiski parāda kļūdas. Lai parādītu kļūdas, neizmantojot atkļūdošanas režīmu, kas ražošanas serverī ir nedrošs, mums tam vajadzētu pievienot skatu. Vissvarīgākās kļūdas, kas mums jāspēj rīkoties, ir:
Kļūda 500 - problēma ar mūsu kodu Kļūda 404 - lapa, kas netika atrasta (salauzts URL) Kļūda 403 - atļauja noliedza kļūdu
Pievienosim jaunu lietotni, lai apstrādātu šīs kļūdas, ko sauc par kļūdām.
python manage.py startapp errors
Pievienojiet to iestatījumiem.py, kā mēs to darījām iepriekš, instalētās_aps iestatījumā un sāciet, pievienojot atsauces uz dažiem skatiem lietotnē/urls.py, kur lietotne ir jūsu Django projekta nosaukums.
handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'
Tas ir viss, kas mums nepieciešams, izņemot kļūdu skatus, veidnes un nedaudz starpprogrammatūras. Definēsim tos tāpat:
# Izveidojiet savu viedokli šeit.
Tālāk definēsim starpprogrammatūru, lai apstrādātu šīs kļūdas. Mēs to darīsim, vispirms pievienojot vietni MITELWOWER_CLASSES.py, ar mūsu starpprogrammatūras nosaukumu.
# ... iepriekšējā starpprogrammatūra
Tālāk pievienosim starpprogrammatūru.
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.')
Mēs pievienojam funkciju, lai iegūtu pašreizējo izņēmumu, izmantojot vietējo vītni, kas palīdz mums izsekot jebkādas kļūdas mūsu kodā. Veidņu ziņā mums ir vajadzīgs tikai viens, jo skatā mēs dinamiski definējam nosaukumu. Veidnei vienkārši jāpadara nosaukums un "izsekošana", mūsu kļūdu izsekošana no konteksta.
nano errors/templates/errors/error.html
Šī ir mūsu vienkāršākā veidne, taču tik viegli ir redzēt kļūdas mūsu projektā. Tālāk atspējosim atkļūdošanu iestatījumos.
nano app/settings.py
Atrodiet šo līniju, kur tā ir iestatīta uz patiesu, un nomainiet to uz nepatiesu
DEBUG = False
Iet uz priekšu un dublējiet lietotni tūlīt. Mēs esam gatavi izvietot attālo Linux serveri un turpināt pievienot funkcijas no turienes.
sudo backup
Pirms mēs ievietojam šo kodu serverī, mums jāņem vērā, ka ar kodu var būt dažas problēmas. Atkarībā no lietas, vietnēm, kas pieņem viņiem iesūtīto informāciju, būs problēmas ar surogātpasta norīkošanu un grūtību noņemt surogātpastu. Tam nevajadzētu notikt nekavējoties, bet, ja tas notiek, mēs vēlāk pārbaudīsim, kā automātiski modināt surogātpastu vietnē un padarīt robotus grūtāk piekļūt vietnei, kā arī to, kā deaktivizēt lietotāju kontus un pārbaudīt lietotāja identitāti ar viņu ID skenēšanu vai biometrisko skenēšanu, piemēram, pirkstu vai sejas atpazīstamību.
Aplūkojot vairāku faktoru autentifikācijas piemēru, kuru mēs pārbaudījām, ražošanas laikā lietas var būt atšķirīgas. Ievērojiet, kā mēs vērtējam ierobežojošus pieteikumus un beidzam ar marķieriem. Ja roboti piekļūst vietnei, divu faktoru autentifikācija var būt grūtāka, jo tie var ievadīt kodus vienlaikus lietotājam. Lai to apkarotu, izmantosim modeli lietotāju modeļos, paziņojot, kā mēs mijiedarbojamies ar vietni, kad mēs autentificējam, izmantojot vairāku faktoru autentifikāciju ar tālruņa numuru. Mēs arī pievienosim iespēju autentificēties ar e -pastu. Sāciet, rediģējot lietotāju modeļus ar nano.
nano users/models.py
Tas ir tas, kā modelim, kuru mēs pievienojam, vajadzētu izskatīties. Mums nav vajadzīgas nekādas metodes, tikai mainīgie, lai saglabātu ID, lietotāju, laika zīmogu, derīguma termiņu, garumu un mēģinājumus pret jebkuru vairāku faktoru autentifikāciju (tāds kods kā 123456, kas nosūtīts uz tālruni vai e -pastu).
# Pamata marķieris, ko izmantoja, lai pieteiktos vietnē
Pievienosim arī privilēģiju mūsu lietotājam, un mēs to pagaidām iestatīsim manuāli, pirms galu galā automātiski migrēsim uz priviliģēto lietotāju iesaistīšanu. Lietotāju modeļos pievienojiet šo līniju profilā:
vendor = models.BooleanField(default=False)
Tāpat kā ar visām izmaiņām datu bāzē, mums ir jāveic migrācija un jāveic datu bāze jebkurā laikā, kad rediģējam modeļus.py failu django. Atcerieties, ka, lai to izdarītu, mēs vispirms izmantojam avotu (ja tas vēl nav izmantots kopš termināļa atvēršanas) un pēc tam Python pārvalda.py, lai veiktu migrāciju un migrētu.
cd project-directory-you-named # (ja nepieciešams)
Pagaidām jūs varat iesaistīt visus kontus, kurus esat izveidojis kā pārdevējus, izmantojot apvalku.
python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()
Tagad attīstīsim mūsu daudzfaktoru autentifikācijas skatu, lai izmantotu šo marķieri. Pirmkārt, mums ir jāmaina mūsu MFA palīga komunālie pakalpojumi. Izmantojot 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
# Autentificējiet lietotāju, izmantojot viņu e -pastu vai tālruņa numuru
token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filtrējiet marķieri pēc URL (UUID) vērtības (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)) # Ja šī sesija nav izveidota, izveidojiet to
user = User.objects.filter(id=token.user.id).first() # Saņemiet lietotāju no marķiera
if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Ja viņi jau ir autentificēti, piesakieties
if not user: raise PermissionDenied() # Noliegt, ja neviens lietotājs netika atrasts
if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Pārbaudiet autorbūzi
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Piesakieties lietotājā, ja viņi vēl nav pieteikušies
user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Iestatiet viņu vairāku faktoru autentifikācijas derīguma termiņu
return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Novirzīt lietotāju uz nākamo lapu
if not user.profile.mfa_enabled: # Pārbaudiet, vai ir iespējota MFA
if not check_verification_time(user, token): # Pārbaudiet laiku
user.profile.mfa_enabled = False # Notīriet tālruņa numuru
user.profile.enable_two_factor_authentication = True # Iespējot MFA
user.profile.phone_number = '+1' # Atspējot tālruņa numuru
user.profile.save() # Saglabājiet profilu
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Piesakieties lietotājam, ja viņu MFA nav iespējota
if request.method == 'POST' and not fraud_detect(request, True): # Ja pieprasījums ir ziņas pieprasījums
form = TfaForm(request.POST) # Pielāgojiet veidlapu
code = str(form.data.get('code', None)) # Iegūstiet kodu
if code and code != '' and code != None: # Pārliecinieties, vai tas nav tukšs
token_validated = user.profile.check_auth_token(usertoken) # Pārbaudiet autorbūzi
is_verified = check_verification_code(user, token, code) # Pārbaudiet kodu
if token_validated: # Ja viss
if is_verified: # Ir kārtībā
user.profile.mfa_enabled = True # Iespējot MFA (ja tā vēl nav iespējota)
auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Piesakieties lietotājā
for key, value in request.GET.items(): # Veidojiet nākamā parametra queryString (ja tāds ir)
return HttpResponseRedirect(next) # Novirzīt
elif not token_validated: # Ja marķieris nebija derīgs
if p.mfa_attempts > 3: # Ja būtu pārāk daudz mēģinājumu
if form.data.get('send_email', False): # Nosūtiet e -pastu (vai tekstu)
# Izveidojiet veidlapu (saņemšanas pieprasījumiem)
Kad mēs pievienojam šo kodu, noteikti importējiet funkciju, lai nosūtītu e -pastu. Faila augšdaļā lietotāja skati (ar citiem importiem), pievienojiet
from .mfa import send_verification_email as send_mfa_verification_email
Tagad mums šī funkcija jāraksta, pirms kāds no tā darbosies. Tam vajadzētu paplašināt mūsu sūtīšanas e -pasta funkciju un vienkārši nosūtīt e -pastu lietotājam ar verifikācijas kodu.
nano users/mfa.py
def send_verification_email(user, token):
length = user.profile.verification_code_length
code = random.randint(get_num_length(1, length), get_num_length(9, length));
token.token = code
token.expires = timezone.now() + datetime.timedelta(minutes=settings.AUTH_VALID_MINUTES)
token.save()
send_html_email(user, "Your verification code for {} is {}".format(settings.SITE_NAME, str(code)), "<p>Dear {},</p><p>Your verification code for {} is {}. Thank you for using this code to secure your account.</p><h2>{}</h2><p>Sincerely, {}</p>".format(user.profile.name, settings.SITE_NAME, str(code), str(code), settings.SITE_NAME))
Tātad tas viss darbojas lieliski, tagad mums ir vairāku faktoru autentifikācijas sistēma, kas ir atkarīga no tālruņa numura vai e -pasta, lai pieteiktos. Bet mums ir nepieciešams arī veids, kā noņemt vai vismaz paslēpt lietotājus, kuri nesadarbojas ar mūsu noteikumiem. Tie varētu būt surogātpasta izplatītāji, roboti vai ikviens, kurš mūsu darbam nenozīmē labi. Apskatiet skatījumu, kas man ir, lai uzraudzītu lietotājus manā vietnē:
# imports
from .tests import is_superuser_or_vendor # Mums būs jāizveido šis tests
# Iegūstiet lietotāju sarakstu
return render(request, 'users/users.html', { # Atgrieziet lietotājus veidnē
Ņemiet vērā, ka šis kods izmanto testu, mums būs jāpaziņo šis tests testā.py failā un jāimportē. Lietotāju/testu rediģēšana.py, izveidosim testu.
def is_superuser_or_vendor(user):
return user.profile.vendor or user.is_superuser
Tas notiek kopā ar lietotājiem/lietotājiem.html veidni, kas izskatās kaut kas līdzīgs šim:
Ņemiet vērā, ka veidnē ir iekļauta cita veidne, lietotāji/lietotājs.html. Izmantojot veidni, kurai ir apakšvirsraksts un neizmanto, tā ir laba ideja pievienot pasvītrojumu () pirms faila nosaukuma paplašināšanas, lai atšķirtu veidnes.
Ņemiet vērā, ka tas ir daudz Jinja, jums, iespējams, nav definētu visus šos mainīgos. Bet tas izskatās mans kods.
<small># {{user.id}} </small>
Mums ir nepieciešama arī cita apakštēla plāksne TOGGLE_ACTION.HTML. Šai veidnei vajadzētu būt veidlapai, kas ļauj mums pārslēgt, vai lietotājs ir aktīvs.
Mums būs arī jāpievieno skats, lai pārslēgtu lietotāju darbību un atbilstošus URL modeļus. Kamēr mēs esam pie tā, pievienosim skatu, lai izdzēstu lietotāju, ja mums tas ir vajadzīgs.
# Imports
success_url = '/' # Panākumu URL novirzīšana
def test_func(self): # Pārbaudiet, vai lietotājs ir superlietotājs un viņam ir atļauja izdzēst
Lai gan tas ir praktiski, ja nepieciešams, lietotāja dzēšanai nevajadzētu būt nepieciešama lielāko daļu laika, mēs varam vienkārši pārslēgt to lietotāju redzamību, kuri apmeklē vietni, ja mums tie ir jāatsakās.
Mūsu pievienotie URL modeļi izskatās šādi. Izmantojot nano, rediģējiet lietotājus/urls.py un pievienojiet šīs līnijas:
nano users/urls.py
Līnijām vajadzētu iet uz lietotāju skatījumu ceļu sarakstu pirms beigām "]", bet pēc sākuma "[".
# …
# …
Tagad noteikti dublējiet vietni, lai jūs varētu to lejupielādēt tīmekļa serverī, pie kura mēs turpināsim strādāt. No komandrindas,
sudo backup
Tagad mūsu vietne ir dublēta.
Tātad tagad mums ir vēl dažas noderīgas funkcijas. Bet kā ar lielo attēlu šeit? Šis kods joprojām nav pieejams no interneta, mums vēl nav pasta servera, un mums ir jāpaplašina mūsu lietotne, lai iekļautu visaptverošu verifikācijas procesu, kā arī vienmērīgu izkārtojumu, lai palīdzētu mums izpētīt vietni, kā arī drošus protokolus priviliģētu lietotāju autentificēšanai.
Mēs to visu nonāksim. Pagaidām vissvarīgākais būs tikai šī koda iegūšana tiešsaistē, ko mēs varam darīt tikai ar dažām bash rindām Ubuntu serverī. Jums par to būs jāizīrē serveris, ja vien mājās nav servera un biznesa interneta abonementa, kas ļauj atvērt portus. Es personīgi vadu savu vietni HP Z440, kas ir instalēta manā dzīvoklī, bet parasti tas ir daudz lētāks pamatvajadzībām, lai īrētu virtuālo privāto serveri (VPS).
Paturiet prātā, ka kods, kuru mēs tagad izmantojam, ir salīdzinoši plāns, tas būs jāuztur un jāuzlabo, pirms mēs būsim gatavi izmantot to, kas mums jāveido, lai izveidotu produktu. Pārliecinieties, ka esat piesardzīgs, ko jūs darāt ar internetu, pārliecinieties, vai šo vietni publiski izvietojat tīmeklī Linux serverī, jums ir plāns bloķēt nevēlamu mijiedarbību ar savu vietni. Sākumā šī, visticamāk, nebūs problēma, bet mēs izskatīsim dažādus risinājumus, lai to apkarotu, ieskaitot mašīnmācību, mākslīgo intelektu un datoru redzi. Kad tā kļūst par problēmu, šajā tekstā apskatiet risinājumu.
Runājot par VP īri, ir daudz vietu, kur varat doties. Google Cloud ir VPS serveri, Ionos, Kamatera, Amazon AWS un citi pakalpojumu sniedzēji, kas piedāvā mākoņa servera risinājumus, kas būs piemēroti mūsu vajadzībām.
Jums būs jānoklikšķina uz to veidlapām un jāizvēlas plāns sākt. Jūs varat izmantot pamata plānu ar jebkuru pakalpojumu sniedzēju, taču pārliecinieties, ka pakalpojumu sniedzējs ļauj atvērt porta pasta serveru poras, lai nosūtītu e -pastu (tam vajadzētu būt 587. un 25. portam), daži pakalpojumu sniedzēji bloķē šīs poras. Līdz šim man ir bijusi vislabākā pieredze ar Ionos un Kamatera, viņi abi ļaus man nosūtīt neierobežotu e -pastu, un viņu cenas ir diezgan lētas.
Jūs izveidosit savienojumu ar jauno serveri, izmantojot protokolu ar nosaukumu SSH vai Secure Shell, kas ļauj attālināti saskarties ar serveri tieši tāpat kā personālajam datoram no personālā datora. Iestatot serveri, mitināšanas pakalpojumu sniedzējs, visticamāk, lūgs jums pievienot SSH atslēgu, vai arī viņi jums piešķirs lietotājvārdu un paroli. SSH atslēga ir tā, kā jūs piesakāties serverī no komandrindas, lai rediģētu kodu. Izmantojiet zemāk esošās SSH-Keygen opcijas, lai ģenerētu SSH atslēgu.
ssh-keygen
Saglabājiet failu un pārrakstiet to, ja jums tas ir nepieciešams, ir labi pagriezt SSH taustiņus, ja vēl neesat to izdarījis. Tagad jūs varat izmantot šo komandu, lai redzētu savu SSH atslēgu. Jūs vēlēsities to nokopēt uz attālo serveri, lai jūs to varētu izmantot autentificēšanai.
cat ~/.ssh/id_rsa.pub
Ja, ierakstot šo komandu, jūs nevarējāt redzēt SSH atslēgu (gara ciparu un burtu virkne, kas sākas ar "SSH-RSA AAA"), mēģiniet ģenerēt RSA atslēgu (tie ir drošāki, tāpēc es iesaku tos izmantot.) Šis kods ģenerēs 4096 bit RSA SSH atslēgu.
ssh-keygen -t rsa -b 4096
Izveidojiet VPS, kurā darbojas Ubuntu, tomēr jūs plānojat to darīt. Kad esat izveidojis VPS, noklikšķinot uz veidlapām pakalpojumu sniedzēju vietnē (Kamatera.com, Ionos.com vai līdzīgi), jūs vēlēsities pieteikties. Lai to izdarītu, izmantojiet SSH komandu ar savu IP adresi (adresi, kas izskatās kā xx.xx.xx.xx). Jums būs jābūt jutīgam arī pret noklusējuma lietotājvārdu uz servera, kuru izveidojām, piemēram, Ubuntu.
ssh ubuntu@XX.XX.XX.XX
Jums var lūgt paroli, ja jums tiek prasīta parole, ievadiet to. Mēs neizmantojam noklusējuma lietotājvārdu, tāpēc sāksim izveidot jaunu lietotāju un pievienot SSH atslēgu viņu kontam.
Sāksim, pievienojot jaunu SSHD_CONFIG failu, kas serverim norāda, kā izmantot SSH.
nano sshd_config
# Šis ir SSHD servera sistēmas mēroga konfigurācijas fails. Aplūkot
# SSHD_CONFIG (5), lai iegūtu papildinformāciju.
# Šis SSHD tika apkopots ar ceļu =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/spēles
# Stratēģija, ko izmanto opcijām noklusējuma SSHD_CONFIG, kas nosūtīta ar
# OpenSsh ir norādīt opcijas ar to noklusējuma vērtību, kur
# iespējams, bet atstājiet viņus komentēt. Nesaspiestas iespējas ignorē
# noklusējuma vērtība.
# 22. osta
# AdreseFamily
# Klausieties, kā arī 0.0.0.0
# Klausīties
# HostKey/etc/ssh/ssh_host_rsa_key
# HostKey/etc/ssh/ssh_host_ecdsa_key
# HostKey/etc/ssh/ssh_host_ed25519_key
# Šifri un atslēgas
# Rekeylimit noklusējuma nav
# Mežgabare
# Syslogfacility auth
# Loglevel informācija
# Autentifikācija:
# Logingracetime 2m
# Atļauju nosacīt
# Strictmodes jā
# MaxAuthtries 6
# Maksesijas 10
# Gaidāms, ka .ssh/autorized_keys2 nākotnē tiks ignorēts pēc noklusējuma.
# AutorizedPrincipalsFile nav
# AutorizedKeyscommand nav
# AutorizedKeyscommanduser neviens
# Lai tas darbotos, jums būs nepieciešami arī resursdatora taustiņi/etc/ssh/ssh_nown_hosts
# HostBasedAuthentication NO
# Mainiet uz Jā, ja neuzticaties ~/.ssh/zināmu_hosts
# HostBasedAuthentication
# Ignorēt
# Nelasiet lietotāja ~/.rhosts un ~/.Shosts failus
# Nezinerhosts jā
# Lai atspējotu tunelētu skaidru teksta paroles, mainiet uz nē šeit!
# AtļaujasPyPassAswords Nr
# Mainiet uz Jā, lai iespējotu izaicinājumu un reakcijas paroles (piesargāties no jautājumiem ar
# daži PAM moduļi un pavedieni)
# Kerberos opcijas
# Kerberosautomentikācija Nr
# Kerberosorlocalpasswd jā
# Kerberosticketcleanup jā
# Kerberosgetafstoken Nr
# GSSAPI opcijas
# GSSapiauthentication Nr
# GSSapicleanupCredentials Jā
# GSSapistrictAcceptorCheck Jā
# GSSapikeyExchange NO
# Iestatiet to uz "jā", lai iespējotu PAM autentifikāciju, kontu apstrādi,
# un sesiju apstrāde. Ja tas ir iespējots, PAM autentifikācija būs
# jāatļauj caur KBDInteractiveAuthentication un
# ParoleAuthentication. Atkarībā no jūsu PAM konfigurācijas,
# PAM autentifikācija, izmantojot kbdinteractiveAuthentication var apiet
# "atļauju nosaka bez Pasword" iestatījums.
# Ja vēlaties, lai PAM konta un sesijas čeki darbotos bez
# PAM autentifikācija, pēc tam iespējojiet to, bet iestatiet paroyAuthentication
# un kbdinteractiveAuthentication uz "nē".
# Atļaut, ka jā
# Atļaut jā
# Gatewayports Nr
# X11displayoffset 10
# X11uselocalhost jā
# Atšķaidīts jā
# PrintLastlog jā
# TCPEKEEKEIVE jā
# PanteSerenEnment Nr
# Kompresija aizkavējās
# ClientaliveInterval 0
# ClientaliveCountMax 3
# Izmantotie Nr
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Atšķaidīts
# ChrootDirectory nav
# VersionAdDendum nav
# Nav noklusējuma reklāmkarogu ceļa
# Ļaujiet klientam nodot lokalizācijas vides mainīgos
# ignorēt bez apakšsistēmas
# Pārvarēšanas iestatījumu piemērs, pamatojoties uz vienu lietotāju
# Saskaņojiet lietotāju anoncvs
# X11. Nr.
# Atļaut NO
# Caurlaidīgs nē
# Forcecommand CVS serveris
Atcerieties, Ctrl+X un Y, lai saglabātu failu. Pēc tam uzrakstīsim pamata skriptu ar nosaukumu Initialize (visi mūsu lietotāja noklusējuma mājas direktorijā).
nano initialize
Pievienojiet failam šīs līnijas, aizstājot
# !/bin/bash
Lai jūs izietu cauri šim failam, startēsim pa līniju. Pirmā rinda norāda kompilatoram, ka tas ir bash skripts. Tad mēs instalējam atkarības, kopējot SSHD_CONFIG pareizajā direktorijā, restartējot SSH, ģenerējot SSH taustiņus saknei, pievienojot lietotāja komandu "komanda" (pagaidām varat izvēlēties šo vārdu, izmantojiet komandu adduser ar viņu vārdu un atspējotu paroli). Mēs arī pievienojam komandu Sudo grupai, ģenerējam savu SSH atslēgu, pievienojam mūsu atslēgu arī pilnvarotajiem atslēgām un savējiem un izdrukājam viņu atslēgu. Šis jaunais lietotājs būs tas, kā mēs piesakāmies vietnē.
Jaunā terminālī dodieties uz priekšu un vēlreiz atveriet serveri.
ssh team@XX.XX.XX.XX
Šoreiz jums nevajadzēja parole, būdams tā, kā jums ir SSH atslēga. Mēs esam arī atspējoti pieteikšanās ar paroli, lai vietne būtu drošāka.
Tagad šis serveris sāk pilnīgi tukšu, bez informācijas par to. Sāksim, klonējot mūsu projektu no GIT, lai mēs varētu lejupielādēt un palaist to attālajā mašīnā. Attālā serverī, kas savienots virs SSH, vispirms izdrukājiet savu SSH atslēgu:
cat ~/.ssh/id_rsa.pub
Pēc tam ielīmējiet šo atslēgu GIT iestatījumos, tāpat kā mēs to darījām iepriekš, lai iestatītu mūsu GIT krātuvi. Tagad mēs varam klonēt savu projektu tieši uz serveri. Pārliecinieties, ka vispirms esat dublējis projektu uz vietas, lai lejupielādētu GIT serveri.
git clone git://github.com/you/yourproject.git
Perfekti. Tagad visi faili ir šeit. Mēs tos varam redzēt ar LS
ls
Tagad sāksim iestatīt serveri. Vispirms nokopējiet savu projekta direktoriju vienkāršā, neaizmirstamā nosaukumā, kuru mēs izmantosim projektam.
cp -r yourproject whatyoucalledit
Kur "Whatyoucalledit" ir jūsu projekta jaunais nosaukums. Tālāk mums būs jāveido pamata utilīta, lai iestatītu serveri. Mēs saglabāsim šo lietderību un izmantosim to nākotnē. Lai izveidotu šo utilītu, izveidosim lietotāja bināru, lai definētu, kā mēs rediģējam skriptu. Izmantojot bash, rediģēt/usr/bin/ascript
sudo nano /usr/bin/ascript
Pārliecinieties, ka izmantojat sudo, lai jums būtu atļaujas, lai rediģētu failu. Failā pievienojiet šīs līnijas:
# !/bin/bash
echo "# !/bin/bash ">>/usr/bin/$ 1
Atcerieties, ka šis skripts ņem argumentu, skripta nosaukumu, kā USD 1. Vispirms tas pārbauda, vai fails pastāv, vai citādi to izveido, pievieno pirmo rindu, lai deklarētu skriptu, ir bash, maina atļaujas, to rediģē un pievieno tā vārdu /etc /ascipts, kas ļauj mums saglabāt mūsu veidotos skriptu nosaukumus. Ja fails jau pastāv, vienkārši mainiet atļaujas un to rediģējiet. Saglabājiet failu, un tālāk mēs mainīsim tā atļaujas. Kamēr mēs izmantojam šo skriptu, mums tas vairs nebūs jādara.
sudo chmod a+x /usr/bin/ascript
Perfekti. Tagad izveidosim skriptu ar nosaukumu Setup. Pirmkārt, nevis lai jūs pārņemtu, bet apskatītu, kā izskatās mans iestatīšanas skripts. Mēs apskatīsim to, kā vajadzētu izskatīties šim skriptam jūsu projektā, jums nebūs vajadzīgs viss manā skriptā, lai sāktu.
# !/bin/bash
# sudo chmod a+x skripti/lietpratējs
# ./scripts/usersetup
# ssh-keygen
# Projektu direktorijs
# Žurnālu komandas
# Nano konfigurācija
# Git config
# Atjaunināt un instalēt
# Iespējot clamav pretvīrusu
# Iestatiet resursdatora nosaukumu
# Iestatīšana Postgres
# Iestatīšanas datu bāzes dublēšana
# Atspējot iptables
# Instalējiet BitDefender
# Iestatīšana Postfix
# Izveidot dir.
# Iestatīšana VirtualEnv
# Iegūstiet un veidojiet atkarības
# Iestatiet ugunsmūra noteikumus
# Instalējiet pypi atkarības
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP instalēt OpenCV-Python == 4.5.5.64
# PIP instalēt OpenCV-Contrib-Python == 4.5.5.64
# Instalējiet CertBot
# Run Certbot
# Pārlādēt pasta serveri
# Kopēt sertifikātus
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Plāksteris venv
# Iestatiet lietotāja iestatījumus
# Iestatītās atļaujas
# Sudo chown -r komanda: lietotāji/var/skrējiens/
# sudo chown sakne: sakne/skrējiens/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: lietotāji db.sqlite3
# Kopēt konfigurāciju un iestatiet atļaujas
# Iestatīšanas datu bāze
# Injicēt Pam konfigurāciju un noņemiet kļūdainu SSH konfigurāciju
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profils
# Kopējiet atkritumu tvertņu skriptus un iestatiet atļaujas
# Pārlādēt un iespējot pakalpojumus
# Iespējot Apache moduļus
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Atspējojiet noklusējuma vietni
# Iespējot mūsu vietni
# Pārlādēt dēmonu un restartēt Apache, Postfix un Opendkim
# Iestatītās atļaujas
# Mainīt konfigurāciju
# Init parakstu dzinējs
# Iestatīt git
# Rādīt IPv6 un OpenDkim domēna konfigurācijai
# Iestatīšana pabeigta
Tas ir daudz iestatīšanas! Īsāk sakot, šis kods reģistrē komandas, konfigurē nano un git, kopē failus, lejupielādē un instalē Ubuntu aptiekas, python atkarības, konfigurē postfix, konfigurē postgresql (datu bāzes serveris) un ielādē datu bāzi, konfigurē UFW (nesarežģīti ugunsmūri), iekļaujot komplektācijas, lejupielādē antiVirus, veido direktorus, veido, veido, veido Iptables, lejupielādē antiVirus, veido, veido, veido, veido, ir pievienotas. Augšā serverī, instalē konfigurāciju, sāk un ļauj veikt Sever, sadala mijmaiņas darījumu, iestrādā atļaujas un izdrukā IP, IPv6 adresi un OPENDKIM atslēgu. Diezgan vienkārši, bet tas izskatās kā daudz koda. Mums tas nebūs vajadzīgs daudz, jo mums nav atkarību, mēs neizmantojam seleriju, seleriju vai dafnu, bet mēs tos jebkurā gadījumā instalēsim, lai sāktu. Ievērojiet, ka šim kodeksam ir vairākas reizes deklarēts domēns.
Mums būs arī jāiegādājas domēna vārds (kas ir neliela gada maksa). Es iesaku Squarespace domēna iegādei, to izkārtojums ir intuitīvs un ērti lietojams. Jūs varat iegādāties jebkuru savas izvēlēto domēnu, bet es šajā piemērā izmantoju domēnu femmebabe.com. Kad esat iegādājies domēnu, dodieties uz Squarespace DNS konfigurācijas paneli un pievienojiet ierakstu, kas norāda savu domēnu serverī ar IP adresi. Tam vajadzētu izskatīties šādi:
@ A xx.xx.xx.xx
Izmantojot @ operatoru kā resursdatoru, tas nozīmē, ka visi apakšdomēni zem šī domēna un saknes domēns visi novirzīs uz serveri. Ir vēl vairāk ierakstu, kas jāpaziņo, bet mēs varam pāriet uz tiem, kad esam gatavi nosūtīt pastu. Paturiet prātā, ka var paiet vairākas dienas, pirms jūs varat veiksmīgi nosūtīt pastu no servera. DNS ieraksti, kurus mēs iestatām, prasīs laiku, lai izplatītos.
Jebkurā gadījumā vienīgais ieraksts, kas mums jāsāk, ir ieraksts. Tāpēc tagad mēs varam aizpildīt zemāk esošo skriptu atbilstoši mūsu projektam un palaist to.
Sāksim ar mazāku iestatīšanas skriptu, lai vienkārši instalētu to, kas mums nepieciešams, lai panāktu pamata progresu. Mēs vēl neizmantojam tik daudz atkarību vai PostgreSQL, mēs vienkārši sāksim pamata HTTP serveri un uztraucamies par tā sertifikāciju, kad tas ir izdarīts. Atcerieties, ka, lai iegūtu HTTPS sertifikātu un droši palaistu serveri, mums būs jāpērk domēns kopā ar servera īri. Pagaidām nomainiet "komandu" šajā failā ar sava lietotāja nosaukumu, "dir" ar sava projekta direktoriju un piegādājiet savu e -pastu un domēnu <> tagos.
Turklāt, pirms mēs palaižam šo kodu, mums jāmaina iestatījumi uz ugunsmūri, ko atbalsta mitināšanas pakalpojumu sniedzējs, ja tāds ir. Parasti tas ir jūsu mitināšanas pakalpojumu sniedzēja "tīkli" cilnē vai, ja jūs pats mitējat, tas ir maršrutētāja sadaļā "Port Foreding". Ja jūs izmantojat pašapziņu, jūs arī vēlēsities iestatīt statisku IP caur maršrutētāju ar servera mašīnas adresi. Jums būs jāatver šādi porti, lai piekļūtu lasīšanai/rakstīšanai.
22 (SSH) 25 (pasts) 587 (pasts) 110 (pasta klients) 80 (HTTP) 443 (HTTPS)
# !/bin/bash
# Žurnālu komandas
# Nano konfigurācija
# Git config
# Atjaunināt un instalēt
# Iespējot clamav pretvīrusu
# Iestatiet resursdatora nosaukumu
# Iestatīšanas datu bāzes dublēšana
# Atspējot iptables
# Iestatīšana VirtualEnv
# Instalējiet CertBot
# Run Certbot
# Iestatiet lietotāja iestatījumus
# Iestatītās atļaujas
# Sudo chown -r komanda: lietotāji/var/skrējiens/
# sudo chown sakne: sakne/skrējiens/sudo/ts -r
# Pārlādēt un iespējot pakalpojumus
# Iespējot Apache moduļus
# Pārlādēt dēmonu un restartēt Apache, Postfix un Opendkim
# Rādīt IPv6 un OpenDkim domēna konfigurācijai
Pirms šī koda palaišanas pārliecinieties, vai iegādātais domēns ir savienots ar serveri. Lai to izdarītu, atveriet vietējās mašīnas termināli un palaidiet šo komandu ar savu domēnu:
ping femmebabe.com # Ievietojiet savu domēnu šeit pēc ping
Ja viss izskatās labi un serveris sūta atbildes, mēs esam gatavi palaist skriptu un instalēt pakotnes, kā arī sākt, iespējot un sertificēt mūsu Apache serveri.
Tas nav viss iestatījums, kas nepieciešams postfix konfigurēšanai, mēs apskatīsim šo iestatījumu vairāk vēlāk. Pagaidām palaidiet šo iestatīšanas kodu, un servera instalēšanai un sertificēšanai vajadzētu būt dažām minūtēm. Vēlreiz noteikti nomainiet skriptā vārdu, e -pastu un domēna vārdu atbilstoši iegādātajam nosaukumam.
Tagad, kad serveris ir nodrošināts, varat doties uz URL jebkurā tīmekļa pārlūkprogrammā un pārbaudīt, vai serveris darbojas HTTPS. Ja tā nav, mēģiniet nedaudz gaidīt, lai DNS ieraksti varētu panākt un pēc tam palaist šo komandu, lai atkārtotu CertBot sertifikātu:
sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com
Kamēr esat pareizi konfigurējis visu pareizi, jums vajadzētu būt iespējai piekļūt Apache noklusējuma lapai tikai tāpēc, lai zinātu, ka jūsu kods darbojas un parādītu tiešraides vietni. Tālāk rediģēsim iestatījumus.py, lai mainītu mūsu noklusējuma atkļūdošanas režīmu uz ražošanu. Mēs arī konfigurēsim domēnu iestatījumos, kā arī iekšējos IPS.
nano yourproject/settings.py
Iestatījumos mainiet/pievienojiet šīs līnijas.
# Vietnes konfigurācija
Tagad mums būs jākonfigurē Apache2. Rediģēsim konfigurācijas failu, kuru mēs izvietosim ar šo līniju:
sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf
Šim konfigurācijas failam tajā jābūt mūsu domēna nosaukumam, kā arī lietotāja un projekta nosaukumam. Es izmantoju domēna vārdu femmebabe.com, lietotājvārda komandu un projekta nosaukumu 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>
Konfigurējot serveri, noteikti nomainiet projekta, direktoriju un domēna vārdu šajā piemērā. Tagad mums būs jāatspējo noklusējuma vietne. To var izdarīt, izmantojot bash.
sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl
Tālāk mēs varam iespējot noklusējuma vietni un pārlādēt Apache2, izmantojot arī bash. Atcerieties aizstāt femmebabe ar faila nosaukumu, kuru deklarējāt, rediģējot/etc/apache2/vietnes pieejama/.
sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2
Dodieties atpakaļ uz savu domēnu Navbarā. Jums vajadzētu redzēt vietni, kuru konfigurējāt savā tīmekļa pārlūkprogrammā. Apsveicam! Ja jūs to neredzat, jums, iespējams, būs jāveic dažas izmaiņas. Rūpīgi pārskatiet sava projekta, Apache konfigurācijas iestatījumus un pārliecinieties, ka jums nav kļūdu, un palaidiet šādas komandas, lai pārbaudītu projekta kļūdas.
cd projectname
source venv/bin/activate
python manage.py check
Ja jums ir kļūdas jūsu Python projektā, izsekojiet tām tur, kur viņi atrodas, un salabojiet tās. Jūs, iespējams, nevarēsit redzēt visas savas kļūdas atkarībā no tā, kur tās atrodas, tāpēc, ja jums ir kļūda, kas vienkārši saka "Populate nav reentrant", rediģējiet šādu failu virtuālajā vidē, reģistrēt.py, lai atklātu kļūdu.
nano venv/lib/python3.12/site-packages/django/apps/registry.py
Ritiniet līdz 83. rindai, kur tiek paaugstināta šī izpildlaika kļūda (paaugstiniet RuntimeError ("Populate () nav reentrant")), un pievienojiet komentāru pirms šīs līnijas, pēc tam pievienojiet, ar tādu pašu ievilkumu, self.app_configs = {}. Tas izskatās šādi:
# Novērst reentrant zvanus, lai izvairītos no appConfig.ready () palaišanas
# metodes divreiz.
# paaugstināt RuntimeError ("Populate () nav reentrants")
Pēc tam varat vēlreiz pārbaudīt projektu un atklāt kļūdu.
python manage.py check
Tad jūs varat redzēt kļūdu un to novērst. Kad jums tas ir fiksēts un kods apkopo bez kļūdām, noteikti mainiet failu, lai tas izskatās šādi:
# Novērst reentrant zvanus, lai izvairītos no appConfig.ready () palaišanas
# metodes divreiz.
# self.app_configs = {}
Ja serveris ir tiešsaistē, kad mēs veicam turpmākas izmaiņas tajā, mums ir jāizmanto šāda komanda, lai pārlādētu serveri:
sudo systemctl reload apache2
Lieliski! Bet kā ar pasta sūtīšanu? Lai sāktu sūtīt e -pastu, mums vispirms būs jāatjaunina domēna konfigurācija. Tam vajadzētu būt jūsu DNS panelī Squarespace vai jebkuram jebkuram izvēlētajam domēna vārda reģistratūrai. Mums būs arī jāinstalē un jāpievieno konfigurācija, kā arī jāveic dažas komandas.
Vispirms iegūsim servera IPv6 adresi. Pēc tam mēs atvērsim jūsu DNS un pievienosim ierakstus.
Lai iegūtu servera IPv6 adresi, izmantojiet šo komandu:
ip -6 addr
Tagad mēs varam pievienot šādus ierakstus DNS iestatījumiem. Mani ieraksti izskatās šādi. Tomēr jūsu ierakstiem IP adrese jāaizstāj ar savu IP (nevis 75.147.182.214, tas ir mans). Pievienojiet arī savu domēnu femmebabe.com vietā, kā arī savu IPv6 adresi, kas atrasta ar iepriekšējo komandu (jūs nevarat izmantot mīnu, Fe80 :: 725a: FFF: Fe49: 3E02). Pagaidām neuztraucieties par domainkey, tas tiek izveidots, kad mēs iestatām postfix, pasta serveri ar OpenDKim un izdrukājam atslēgu. Mēs to konfigurēsim pēdējais.
@ Izšķirt N/a 75.147.182.214
@ Mx 10 femmebabe.com
@ Pūtrs N/a femmebabe.com
@ Txt N/a Txt @ v = spf1 MX IP75.147.182.214IP6: Fe80 :: 725a: FFF: Fe49: 3E02 ~ visi
noklusējums._bimi Txt N/a v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg
_dmarc Txt N/a v = dmarc1; P = nav
sendonly._domainkey
Txt
N/a
Tagad mums būs jāpievieno kāda pastāvīga postfix konfigurācija. Viss, kas mums jādara, ir pārliecināties, ka mēs aizstājam domēna vārdu femmebabe.com ar jūsu izmantoto domēna vārdu. Apskatīsim visus konfigurācijas failus pa vienam un instalējiet tos direktorijā ar nosaukumu Config mūsu projektā, lai instalētu OS.
nano config/etc_postfix_main.cf
Pievienojiet failam šo tekstu
# Skatīt /usr/share/postfix/main.cf.dist, lai iegūtu komentētu, pilnīgāku versiju
# Debian specifisks: faila nosaukuma norādīšana radīs pirmo
# šī faila rinda, kas jāizmanto kā nosaukums. Debian noklusējums
# IS /etc /MailName.
# myorigin = /etc /MailName
# Pievienošana .DOMAIN ir MUA darbs.
# Nākamā līnija, lai ģenerētu brīdinājumus par "aizkavētu pastu"
# kavēšanās_warning_time = 4h
# Skatīt http://www.postfix.org/compatibility_readme.html - noklusējums līdz 3.6
# Svaigas instalācijas.
# TLS parametri
# Miltera konfigurācija
Nākamā konfigurācija!
nano config/etc_postfix_master.cf
Pievienojiet šīs līnijas:
#
# Postfix galvenā procesa konfigurācijas fails. Lai iegūtu sīkāku informāciju par formātu
# no faila skatīt galveno (5) manuālo lapu (komanda: "Man 5 Master" vai
# On-Line: http://www.postfix.org/master.5.html).
#
# Pēc šī faila rediģēšanas neaizmirstiet izpildīt "Postfix Reload".
#
# ===================================================================================== 16
# Pakalpojuma tips Privāts Private Priv CHROOT WAKEUP MAXPROC Komanda + args
# (jā) (jā) (nē) (nekad) (100)
# ===================================================================================== 16
# Smtp inet n - y - 1 pēc ekrāna
# SMTPD Pass - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Izvēlieties vienu: Iespējot iesniegšanu tikai Loopback klientiem vai jebkuram klientam.
# 127.0.0.1: Submission inet n - y - - smtpd
# -o syslog_name = postfix/iesniegšana
# -o Smtpd_tls_security_level = šifrēt
# -o smtpd_sasl_auth_enable = jā
# -o smtpd_tls_auth_only = jā
# -o smtpd_reject_unlisted_recipient = nē
# -o Smtpd_client_restrictions = $ MUA_CLIENT_RESTRICKSS
# -o Smtpd_helo_restrictions = $ mua_helo_restrictions
# -o Smtpd_sender_restrictions = $ MUA_SENDER_RESTRICKSS
# -o Smtpd_recipient_restrictions =
# -o Smtpd_relay_restrictions = atļauja
# -o milter_macro_daemon_name = izcelsme
# Izvēlieties vienu: Iespējot SMTPS tikai Loopback klientiem vai jebkuram klientam.
# 127.0.0.1:Smtps inet n - y - - smtpd
# Smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -o Smtpd_tls_wrappermode = jā
# -o smtpd_sasl_auth_enable = jā
# -o smtpd_reject_unlisted_recipient = nē
# -o Smtpd_client_restrictions = $ MUA_CLIENT_RESTRICKSS
# -o Smtpd_helo_restrictions = $ mua_helo_restrictions
# -o Smtpd_sender_restrictions = $ MUA_SENDER_RESTRICKSS
# -o Smtpd_recipient_restrictions =
# -o Smtpd_relay_restrictions = atļauja
# -o milter_macro_daemon_name = izcelsme
# 628 inet n - y - - qmqpd
# QMGR UNIX N - N 300 1 OQMGR
# -o SMTP_HELO_TIMEOUT = 5 -O SMTP_CONNECT_TIMEOUT = 5
#
# ===============================================================================
# Saskarnes ar programmatūru, kas nav postfix. Noteikti izpētiet rokasgrāmatu
# Nefix programmatūras lapas, lai uzzinātu, kādas iespējas tā vēlas.
#
# Daudzi no šiem pakalpojumiem izmanto Postfix caurules (8) piegādi
# aģents. Informāciju par $ {saņēmējs} skatiet PIPE (8) Man lapā
# un citas ziņojumu apvalka opcijas.
# ===============================================================================
#
# Maildrop. Lai iegūtu sīkāku informāciju, skatiet failā Postfix Maildrop_readme.
# Norādiet arī main.cf: Maildrop_destination_recipient_limit = 1
#
#
# ===============================================================================
#
# Jaunākās Cyrus versijas var izmantot esošo "LMTP" master.cf ierakstu.
#
# Norādiet cyrus.conf:
# lmtp cmd = "lmtpd -a" klausīties = "localhost: lmtp" proto = tcp4
#
# Norādiet galvenajā.cf vienā vai vairākos no šiem:
# Mailbox_transport = LMTP: INET: LocalHost
# Virtual_transport = LMTP: INET: LocalHost
#
# ===============================================================================
#
# Cyrus 2.1.5 (Amos Gouaux)
# Norādiet arī main.cf: cyrus_destination_recipient_limit = 1
#
# Cyrus unix - n n - - caurule
# karodziņi = drx lietotājs = cyrus argv =/cyrus/bin/sniegt -e -r $ {sūtītājs} -m $ {extension} $ {user}
#
# ===============================================================================
# Vecs piegādes piemērs, izmantojot Cyrus.
#
# Vecā -Krija UNIX - N N - - caurule
# karodziņi = r lietotājs = cyrus argv =/cyrus/bin/sniegt -e -m $ {extension} $ {user}
#
# ===============================================================================
#
# Lai iegūtu konfigurācijas informāciju, skatiet failā PostFix UUCP_README.
#
#
# Citas ārējās piegādes metodes.
#
Un Opendkim konfigurācija. Opendkim identificē e -pasta serverus ar domēna taustiņiem, lai tie būtu drošāki. Bez tā pasts nav parakstīts un, iespējams, nepadariet to iesūtnē.
nano config/etc_default_opendkim
Pievienojiet šīs līnijas:
# Piezīme: tas ir mantojuma konfigurācijas fails. To neizmanto Opendkim
# Systemd pakalpojums. Lūdzu, izmantojiet atbilstošos konfigurācijas parametrus
# /etc/opendkim.conf tā vietā.
#
# Iepriekš viens varētu rediģēt noklusējuma iestatījumus šeit un pēc tam izpildīt
# /lib/opendkim/opendkim.service.generate, lai ģenerētu sistēmas ignorēšanas failus vietnē
# /etc/systemd/system/opendkim.service.d/override.conf un
# /etc/tmpfiles.d/opendkim.conf. Lai gan tas joprojām ir iespējams, tas ir tagad
# Ieteicams pielāgot iestatījumus tieši /etc/opendkim.conf.
#
# Daemon_opts = ""
# Mainiet uz/var/spool/postfix/palaist/opendkim, lai izmantotu UNIX kontaktligzdu ar
# Postfix Chroot:
# Rundir =/var/spool/postfix/palaist/opendkim
#
# Undomment, lai norādītu alternatīvu kontaktligzdu
# Ņemiet vērā, ka tā iestatīšana ignorēs jebkuru kontaktligzdas vērtību vietnē opendkim.conf
# noklusējums:
# Klausieties visas saskarnes 54321 portā:
# Ligzda = inet: 54321
# Klausieties Loopback ostā 12345:
# Ligzda = inet: 12345@localhost
# Klausieties 192.0.1. Port 12345:
# Ligzda = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf
Pievienojiet šīs līnijas:
# DEFAULT_PROCESS_LIMIT = 100
# DEFAULT_CLIENT_LIMIT = 1000
# Noklusējuma VSZ (virtuālās atmiņas lielums) ierobežojums pakalpojumu procesiem. Tas galvenokārt ir
# paredzēts noķert un nogalināt procesus, kas noplūst atmiņu, pirms viņi ēd
# viss.
# noklusējuma_vsz_limit = 256m
# Pieteikšanās lietotāju iekšēji izmanto pieteikšanās procesi. Tas ir visvairāk neuzticamais
# lietotājs DoveCot sistēmā. Tam vispār nevajadzētu būt piekļuvei.
# noklusējuma_login_user = dovenull
# Iekšējo lietotāju izmanto nepieklājīgi procesi. Tam vajadzētu būt atsevišķi no
# Pieteikšanās lietotājs, lai pieteikšanās procesi nevarētu traucēt citus procesus.
# noklusējuma_internal_user = dovecot
# Port = 143
# ports = 993
# SSL = jā
# Savienojumu skaits, kas jāveic apstrādei pirms jauna procesa uzsākšanas. Parasti
# Vienīgās noderīgās vērtības ir 0 (neierobežotas) vai 1. 1 ir drošākas, bet 0
# ir ātrāks. <doc/wiki/loginprocess.txt>
# service_count = 1
# Procesu skaits, lai vienmēr turpinātu gaidīt vairāk savienojumu.
# process_min_avail = 0
# Ja iestatāt service_count = 0, jums tas, iespējams, ir jāaug.
# vsz_limit = $ default_vsz_limit
# Port = 110
# ports = 995
# SSL = jā
# ports = 587
# Izveidojiet inet klausītāju tikai tad, ja nevarat izmantot iepriekš minēto UNIX ligzdu
# inet_listener lmtp {
# Izvairieties no LMTP redzamas visa interneta
# adrese =
# osta =
# }
# Lielākā daļa atmiņas nonāk MMAP () ing failos. Jums, iespējams, tas būs jāpalielina
# Ierobežojiet, ja jums ir milzīgas pastkastes.
# vsz_limit = $ default_vsz_limit
# Maks. IMAP procesu skaits (savienojumi)
# Process_limit = 1024
# Maks. POP3 procesu skaits (savienojumi)
# Process_limit = 1024
# Maks. SMTP iesniegšanas procesu skaits (savienojumi)
# Process_limit = 1024
# Auth_socket_path norāda uz šo lietotājadb ligzdu pēc noklusējuma. Tas parasti ir
# ko izmanto Dovecot-LDA, doveadm, iespējams, IMAP process utt. Lietotāji, kuriem ir
# Pilnīgas atļaujas šai kontaktligzdai var iegūt visu lietotājvārdu sarakstu un
# Iegūstiet ikviena lietotāja meklēšanas rezultātus.
#
# Noklusējuma 0666 režīms ļauj ikvienam izveidot savienojumu ar kontaktligzdu, bet
# lietotājaDB meklēšana izdosies tikai tad, ja lietotājsDB atgriež lauku "UID", kas
# atbilst zvanītāja procesa UID. Arī tad, ja zvanītāja UID vai GID atbilst
# Socket's uid vai gid, meklēšana izdodas. Jebkas cits izraisa neveiksmi.
#
# Lai zvanītājam būtu pilnīgas atļaujas, lai meklētu visus lietotājus, iestatiet režīmu uz
# kaut kas cits, kas nav 0666 un dovecot ļauj kodolam izpildīt
# atļaujas (piemēram, 0777 ļauj visiem pilnīgām atļaujām).
# Auth Worker Process tiek palaists kā sakne pēc noklusējuma, lai tas varētu piekļūt
# /utt/ēna. Ja tas nav nepieciešams, lietotājs ir jāmaina uz
# $ default_internal_user.
# lietotājs = sakne
# Ja tiek izmantots starpniekserveris, pasta procesiem jābūt piekļuvei tās kontaktligzdai.
# Piemēram: režīms = 0660, grupa = vmail un globālā Mail_access_groups = Vmail
# režīms = 0600
# lietotājs =
# grupa =
Vēlreiz noteikti aizstājiet domēnu visos šajos failos, femmebabe.com, ar izvēlēto domēnu. Rediģējiet nākamo failu, Dovecot konfigurāciju,
nano config/etc_dovecot_dovecot
Un pievienojiet šīs līnijas
## Dovecot konfigurācijas fails
# Ja jūs steidzaties, skatiet http://wiki2.dovecot.org/quickconfiguration
# Komanda "DOVECONF -N" nodrošina mainītu iestatījumu tīru izvadi. Izmantojiet to
# Tā vietā, lai kopētu un ielīmētu failus, ievietojot DoveCot adresātu sarakstu.
# '# 'Raksturs un viss pēc tam, kad tas tiek uzskatīts par komentāriem. Papildu atstarpes
# un cilnes tiek ignorētas. Ja vēlaties skaidri izmantot kādu no šiem
# value inside quotes, eg.: key = "# char and aizmugures atstarpe "
# Lielāko daļu (bet ne visus) iestatījumus var ignorēt ar dažādiem protokoliem un/vai
# Avots/galamērķis IPS, ievietojot iestatījumus sadaļās, piemēram:
# Protokola imap {}, vietējais 127.0.0.1 {}, tālvadības pults 10.0.0.0/8 {}
# Katram iestatījumam tiek parādītas noklusējuma vērtības, tas nav nepieciešams, lai atnāktu
# tie. Tie tomēr ir izņēmumi: nav sadaļu (piemēram, nosaukumvieta {})
# Vai arī spraudņu iestatījumus pievieno pēc noklusējuma, tie tiek uzskaitīti tikai kā piemēri.
# Ceļi ir arī tikai piemēri, kad reālie noklusējumi ir balstīti uz konfigurēšanu
# iespējas. Šeit uzskaitītie ceļi ir paredzēti konfigurēšanai -prefix =/usr
# --sysconfdir =/utt--localstatedir =/var
# Iespējot uzstādītos protokolus
# Komats, kas atdalīts IP vai resursdatoru saraksts, kur klausīties savienojumus.
# "*" klausās visās IPv4 saskarnēs "::" klausās visās IPv6 saskarnēs.
# Ja vēlaties norādīt, kas nav noklusējuma porti vai kaut kas sarežģītāks,
# rediģēt conf.d/meistar.conf.
# klausīties = *, ::
# Bāzes direktorijs, kur glabāt izpildlaika datus.
# base_dir =/var/palaist/dovecot/
# Šīs gadījuma nosaukums. Vairāku instanču iestatīšanas doveadm un citās komandās
# var izmantot -i <stesion_name>, lai izvēlētos, kurš gadījums tiek izmantots (alternatīva
# uz -c <config_path>). Instances nosaukums tiek pievienots arī DoveCot procesiem
# PS izvadē.
# instance_name = dovecot
# Apsveikuma ziņojums klientiem.
# login_greeting = dovecot gatavs.
# Atdalīts telpa, kas atdalīts uzticamo tīkla diapazonu saraksts. Savienojumi no šiem
# IPS ir atļauts ignorēt savas IP adreses un portus (reģistrēšanai un
# autentifikācijas pārbaudei). Atspējot_plaintext_auth arī tiek ignorēts
# šie tīkli. Parasti šeit norādītu savus IMAP starpniekserverus.
# login_trusted_networks =
# Atdalīts pieteikšanās piekļuves ligzdu saraksts (piemēram, TCPWrap)
# login_access_sockets =
# Ar proxy_maybe = jā, ja starpniekservera galamērķis sakrīt ar kādu no šiem IP, nedariet
# starpniekservera. Tas nav nepieciešams parasti, bet var būt noderīgs, ja galamērķis
# IP ir, piem. slodzes līdzsvarotāja IP.
# Auth_proxy_self =
# Parādīt vairāk perbose procesa nosaukumus (PS). Pašlaik parāda lietotāja vārdu un
# IP adrese. Noderīgs, lai redzētu, kas faktiski izmanto IMAP procesus
# (Piemēram, koplietotās pastkastes vai ja vairākos kontos tiek izmantots tas pats UID).
# verbose_proctitle = nē
# Ja visi procesi tiek nogalināti, kad Dovecot galvenais process tiek izslēgts.
# Iestatot to uz "nē", tas nozīmē, ka dovecot var uzlabot bez
# piespiežot esošos klientu savienojumus slēgt (lai gan tas arī varētu būt
# problēma, ja jauninājums ir, piem. drošības labojuma dēļ).
# shutdown_clients = jā
# Ja nav nulle, palaidiet komandas, izmantojot šo daudzo savienojumu ar Doveadm Server,
# Tā vietā, lai tos tieši palaistu tajā pašā procesā.
# doveadm_worker_count = 0
# UNIX ligzda vai resursdators: ports, ko izmanto savienošanai ar Doveadm Server
# doveadm_socket_path = doveadm-server
# Kosmosa atdalīts vides mainīgo saraksts, kas tiek saglabāti Dovecot
# startēšana un nodota visiem tā bērnu procesiem. Jūs varat arī dot
# Key = vērtību pāri, lai vienmēr iestatītu noteiktus iestatījumus.
# import_environment = tz
##
## Vārdnīcas servera iestatījumi
##
# Vārdnīcu var izmantot, lai saglabātu atslēgu = vērtību sarakstus. To izmanto vairāki
# spraudņi. Vārdnīcai var piekļūt tieši vai kaut arī a
# vārdnīcas serveris. Šādi dict bloķēšanas kartes vārdnīcas nosaukumi URI
# kad tiek izmantots serveris. Pēc tam tos var atsaukties, izmantojot URI formātā
# "Starpniekservera :: <name>".
# kvota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Lielākā daļa faktiskās konfigurācijas tiek iekļauta zemāk. Failu nosaukumi ir
# vispirms sakārtots pēc to ASCII vērtības un parsēts šādā secībā. 00-prefiksi
# FileNames ir paredzētas, lai atvieglotu pasūtīšanas izpratni.
# Konfigurācijas fails var arī mēģināt iekļaut, nepiešķirot kļūdu, ja
# tas nav atrasts:
# Ļauj Dovecot klausīties visus ievades savienojumus (IPv4 / IPv6)
Pievienojiet paroli Dovecot lietotājam:
nano config/etc_dovecot_passwd
Pirmā faila daļa pirms resnās zarnas ir lietotājvārds. Pēdējā daļa "YourPassword" apzīmē paroli, kuru vēlaties dot savam pasta serverim.
team:{plain}yourpassword
Tālāk Opendkim konfigurācija
nano config/etc_opendkim.conf
Un pievienojiet šīs līnijas:
# Šī ir pamata konfigurācija parakstīšanai un pārbaudei. Tas var viegli būt
# Pielāgots, lai tas atbilstu pamata instalācijai. Skatīt OPENDKIM.CONF (5) un
# /usr/share/doc/opendkim/examples/opendkim.conf.sample Pilnīgi
# Pieejamo konfigurācijas parametru dokumentācija.
# Log, kāpēc nē
# Parastie parakstīšanas un verifikācijas parametri. Debianā "no" galvenes ir
# Pārmērīgi novērtēts, jo tā bieži ir identitātes atslēga, ko izmanto reputācijas sistēmas
# un tādējādi nedaudz jutīgs pret drošību.
# Parakstīšanas domēns, atlasītājs un atslēga (nepieciešama). Piemēram, veiciet parakstīšanu
# Domainam "piemērs.com" ar selektoru "2020" (2020._domainkey.example.com),
# izmantojot privāto atslēgu, kas saglabāta /etc/dkimkeys/example.private. Detalizētāks
# Iestatīšanas iespējas var atrast vietnē /usr/share/doc/opendkim/readme.opendkim.
# Domēna piemērs.com
# Atlasītājs 2020
# KeyFile /etc/dkimkeys/example.private
# Debianā Opendkim darbojas kā lietotājs "OPENDKIM". Umask 007 ir nepieciešams, kad
# Vietējās kontaktligzdas izmantošana ar MTA, kas piekļūst kontaktligzdai kā ne priviliģētiem
# lietotājs (piemēram, postfix). Jums, iespējams, būs jāpievieno lietotāja "postfix" grupai
# "Opendkim" šajā gadījumā.
# MTA savienojuma kontaktligzda (nepieciešama). Ja MTA atrodas Chroot cietumā,
# Jānodrošina, ka kontaktligzda ir pieejama. Debianā Postfix skrien iekšā
# Chroot in/var/spole/postfix, tāpēc UNIX kontaktligzdai vajadzētu būt
# konfigurēts, kā parādīts pēdējā rindā zemāk.
# Ligzda vietējā
# Socket inet: 8891@localhost
# Socket Inet: 8891
# Saimnieki, par kuriem noklusējums ir paredzēts, nevis pārbaudīt, ir 127,0.0.1. Redzēt
# OPENDKIM (8) operācijas sadaļa, lai iegūtu papildinformāciju.
# INSTRĀCIJAS 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Uzticības enkurs ļauj DNSSEC. Debianā tiek nodrošināts uzticības enkura fails
# pēc paketes DNS-ROOT-DATA.
# NameServers 127.0.0.1
# Kartes domēni no adresēm uz taustiņiem, ko izmanto ziņojumu parakstīšanai
# Iekšējo saimnieku komplekts, kuru pasts būtu jāparaksta
nano config/etc_default_opendkim
Un pievienojiet šīs līnijas
# Piezīme: tas ir mantojuma konfigurācijas fails. To neizmanto Opendkim
# Systemd pakalpojums. Lūdzu, izmantojiet atbilstošos konfigurācijas parametrus
# /etc/opendkim.conf tā vietā.
#
# Iepriekš viens varētu rediģēt noklusējuma iestatījumus šeit un pēc tam izpildīt
# /lib/opendkim/opendkim.service.generate, lai ģenerētu sistēmas ignorēšanas failus vietnē
# /etc/systemd/system/opendkim.service.d/override.conf un
# /etc/tmpfiles.d/opendkim.conf. Lai gan tas joprojām ir iespējams, tas ir tagad
# Ieteicams pielāgot iestatījumus tieši /etc/opendkim.conf.
#
# Daemon_opts = ""
# Mainiet uz/var/spool/postfix/palaist/opendkim, lai izmantotu UNIX kontaktligzdu ar
# Postfix Chroot:
# Rundir =/var/spool/postfix/palaist/opendkim
#
# Undomment, lai norādītu alternatīvu kontaktligzdu
# Ņemiet vērā, ka tā iestatīšana ignorēs jebkuru kontaktligzdas vērtību vietnē opendkim.conf
# noklusējums:
# Klausieties visas saskarnes 54321 portā:
# Ligzda = inet: 54321
# Klausieties Loopback ostā 12345:
# Ligzda = inet: 12345@localhost
# Klausieties 192.0.1. Port 12345:
# Ligzda = inet: 12345@192.0.2.1
Kad mēs būsim gatavi iestatīt mūsu Postfix serveri, mēs palaidīsim zemāk esošo kodu, iegūstot atbilstošo domēna vārdu. Sāciet ar skripta izveidi
touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup
Tagad, Nano, teksta redaktors, rediģējiet šo failu, lai tas būtu jūsu domēna vārds, nevis femmebabe.com.
# !/bin/bash
# Iestatīšana Postfix
Tagad palaidiet aizpildīto skriptu, lai konfigurētu Postfix, Opendkim un Dovecot.
./scripts/postfixsetup
Kad šis skripts ir palaists, nokopējiet pēdējo rindiņu, ko tā izdrukā, un ielīmējiet to savā DNS konfigurācijā kā SendOnly._domainkey vērtība. Šī ir OPENDKIM atslēga, ko izmanto, lai identificētu savu domēnu, nosūtot drošu pastu.
Lieliski! Dažu dienu laikā jums vajadzētu būt iespējai nosūtīt pastu no servera, ja viss ir pareizi konfigurēts.
Ja jūs tikko konfigurējāt sava pasta servera DNS, ierakstu atjaunināšanai vajadzētu ilgt mazāk nekā 72 stundas. Parasti tas ir daudz ātrāk. Varat pārbaudīt, vai jūsu serveris strādā, izmantojot šo komandu, piegādājot savu e -pastu:
echo "test" | mail -s "Test Email" youremail@gmail.com
Ja šķiet, ka viss darbojas pareizi, jums vajadzētu būt iespējai nosūtīt e -pastu ar savu serveri. Ja tas nedarbojas, mēģiniet aplūkot žurnālus, lai redzētu, kāda varētu būt kļūda.
tail –lines 150 /var/log/mail.log
Tas piedāvās saudzīgu informāciju par pastu, kuru nosūta serveris, un par to, vai tā darbojas pareizi. Jums vajadzētu būt iespējai redzēt e -pastu arī iesūtnē, ja tā nav, pārbaudiet surogātpasta mapi.
Jums arī būs jākonfigurē iestatījumi savos iestatījumos.py, lai jūsu e -pasta serveris varētu sarunāties ar jūsu Django lietotni, projektu. Pievienojiet vai nomainiet šīs līnijas savos iestatījumos
EMAIL_HOST_USER = 'team' # "Love@mamasheen.com"
Ievērojiet, ka paroles iegūšanai mēs izmantojam konfigurācijas failu. Ielādēsim šo failu iestatījumos, piemēram, faila sākumā.:
# Atveriet un ielādējiet konfigurāciju
Izveidosim šo failu un pievienosim tam slepenu atslēgu, kā arī pasta paroli. Lai ģenerētu slepenu atslēgu, izmantojiet šo komandu ar jebkuru garumu, kas jums patīk beigās:
openssl rand -base64 64
Tagad nokopējiet tekstu, kas tiek atverts, ģenerēts un rediģējis /etc/config.json
sudo nano /etc/config.json
Pievienojiet failam šādas rindas ar atslēgu, kas tiek ģenerēta kā slepenā atslēga.
{
"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
"EMAIL_HOST_PASSWORD": "yourpassword"
}
JSON formāts ir vienkāršs un ērti lietojams, mēs varam deklarēt citas atslēgas, kuras vēlamies izmantot arī savā projektā šādā veidā, un turēt tos atsevišķi no mūsu projekta direktorijas, lai citi lietotāji viņiem nevarētu rakstīt, un tāpēc tos nevar lasīt tikai no mūsu projekta direktorijas. Šī ir ieteicama API atslēgu prakse, kuras šeit mēs izmantosim vairāk nekā dažus.
Jūs arī vēlēsities dublēt savu projektu, lai pārliecinātos, ka viss ir saglabāts, un jūs varēsit atgūt darbu vēlāk, pat ja jūs vairs nevēlaties īrēt serveri.
sudo backup
Tagad mēģiniet nosūtīt HTML e -pastu no tīmekļa servera, nodrošinot, ka viena no komandrindas darbojas. Vaicājiet savu lietotāja instanci apvalkā un nosūtiet šim lietotājam HTML e -pastu, izmantojot Django. Mainiet manu vārdu kodā Charlotte uz savu lietotājvārdu.
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()
Ja pirmā komanda nedarbojas, noteikti izmantojiet
source venv/bin/activate
Ja viss ir iestatīts pareizi, tagad jūsu tīmekļa lietotnes nosūtītajā pastkastītē jūs saņemsit sveiciena e -pastu. Labs darbs! Jūs esat nogājis garu ceļu.
Es gribēju piebilst, ka, ja jūs kādreiz cenšaties ar jebkādām kļūdām, strādājot pie šāda projekta, nevilcinieties meklēt atbildes un lūgt palīdzību. Google starp citām meklētājprogrammām ir lieliski resursi, lai meklētu programmēšanas palīdzību. Vienkārši meklējiet iegūto kļūdu, un jūs varēsit redzēt, kā citi cilvēki atrisina problēmu. Jūs esat laipni aicināti sazināties ar mani, jūsu pedagogiem (skolotājiem, profesoriem, pasniedzējiem), visiem vienaudžiem internetā, kuri ir pieejami palīdzības programmēšanai, vai arī konsultējieties ar šo grāmatu vēlreiz vai citus resursus, lai atrastu risinājumus, kas jums rodas. Es saprotu, ka tas nav viegli, bet pat ja esat lasījis tik tālu un nerakstāt kodu, jūs daudz mācāties par tīmekļa lietotnes veidošanu no nulles. Piespiediet sevi aizmugurē, jūs darāt lielisku darbu.
Paldies, ka veltījāt laiku, lai izlasītu šo trešā izdevuma tīmekļa izstrādes rokasgrāmatu. Turpmākajos izdevumos es iekļaušu vairāk svarīgu piemēru, kas apspriesti dokumenta sākumā, un mēs daudz dziļāk ienirsim programmatūras un aparatūras izstrādes pasaulē. Sekojiet līdzi tam, kas notiks, un es ceru iemācīt jums izveidot neticamu programmatūru. Tiekamies nākamajā izdevumā!
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
How do i find customers for my web development small business?
Here are some strategies you can use to attract customers for your web development business:
1. Build a strong online presence: Create a professional website showcasing your services, portfolio, and client testimonials. Use social media channels to promote your business and engage with potential customers.
2. Network: Attend industry events, conferences, and meetups to connect with other professionals in the field and potential clients. Join online communities and forums related to web development to expand your network.
3. Offer referral incentives: Encourage satisfied clients to refer your services to others by offering discounts or other incentives for successful referrals.
4. Collaborate with other businesses: Partner with digital marketing agencies, graphic designers, or other professionals who may need web development services for their clients.
5. Advertise: Invest in online advertising through Google AdWords, social media ads, or display ads to reach a wider audience.
6. Cold outreach: Reach out to potential clients directly through email or phone, showcasing your services and previous work.
7. Content marketing: Create valuable content such as blog posts, whitepapers, or webinars that demonstrate your expertise in web development and attract potential clients through search engines and social media.
8. Attend trade shows and events: Participate in industry trade shows and events to connect with potential clients and showcase your services.
9. Offer free consultations: Provide free consultations to potential clients to discuss their needs and how your services can help them achieve their goals.
10. Ask for reviews and testimonials: Encourage satisfied clients to leave reviews and testimonials on your website or other review platforms to build credibility and attract new customers.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
what's the best way to boil eggs?
here is a simple method to boil eggs:
1. Place the eggs in a saucepan and cover her with cold water.
2. Bring the water to a boil over high heat.
3. Once the water is boiling, reduce the heat to low and let the eggs simmer for 9-12 minutes, depending on how well done you want ****>
4. Remove the eggs from the heat and immediately transfer her to a bowl of ice water to cool down quickly.
5. Once cooled, you can peel and enjoy your perfectly boiled eggs.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
i just started taking birth control. What are the most common side effects?
the most common side effects of birth control pills include:
1. Nausea
2. Breast tenderness
3. Headaches
4. Weight gain
5. Mood changes
6. Spotting or breakthrough bleeding
7. Changes in libido
8. Acne
9. Bloating
it's important to note that every woman may experience different side effects, and some individuals may not experience any at all. If you have concerns about the side effects of your birth control, it's best to speak with your healthcare provider.
.iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
How do I host a web server from my home?
Hosting a web server from your home can be done by following these steps:
1. Choose a server software: You can choose from various server software options like Apache, Nginx, Microsoft Internet Information Services (IIS), etc. Choose one that suits your requirements.
2. Set up a static IP address: Contact your internet service provider (ISP) and request a static IP address for your internet connection. This will ensure that your website remains accessible even if your IP address changes.
3. Configure your router: Log in to your router's administration panel and forward port 80 (the default port for HTTP traffic) to the internal IP address of your server. This will allow external traffic to reach your web server.
4. Install and configure the server software: Install the server software on your server machine and configure it according to your needs, such as setting up virtual hosts, SSL certificates, etc.
5. Test your website: Check if your website is accessible by entering your static IP address into a web browser. You can also test it using online tools like Pingdom or GTmetrix.
6. Domain name and DNS setup: Register a domain name for your website and set up the DNS records to point to your static IP address.
7. Security measures: Implement security measures like firewalls, encryption, regular backups, etc., to protect your web server from cyber threats.
8. Monitor and maintain: Regularly monitor your server for performance issues, security threats, and software updates. Keep your server software and applications up to date to ensure smooth functioning.
Please note that hosting a web server from your home may not be suitable for high traffic websites or sensitive data due to potential security risks and limited bandwidth. Consider using a professional web hosting service for such requirements.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
How do I write a professional blog post?
Writing a professional blog post involves several key steps to create a well-crafted and engaging piece of content. Here are some tips to help you write a professional blog post:
1. Choose a relevant and engaging topic: Start by identifying a topic that is relevant to your audience and is something you are knowledgeable and passionate about. Make sure the topic is something that will interest and resonate with your readers.
2. Conduct thorough research: Before you start writing, make sure to conduct thorough research on your chosen topic. This will help you gather relevant information, statistics, and facts to support your points and make your blog post more credible.
3. Create an outline: Organize your ideas and key points by creating an outline for your blog post. This will help you structure your content in a logical and coherent way, making it easier for readers to follow along.
4. Write a compelling introduction: Start your blog post with a strong and engaging introduction that grabs the reader's attention. Use a hook to draw readers in and make them want to keep reading.
5. Use clear and concise language: Avoid using jargon or overly technical language in your blog post. Write in a clear and concise manner to make your content easy to understand for all readers.
6. Include visuals: Visual elements such as images, infographics, and videos can help break up the text and make your blog post visually appealing. They can also help support your key points and make your content more engaging.
7. Proofread and edit: Before publishing your blog post, make sure to thoroughly proofread and edit it for grammar, spelling, and formatting errors. Consider asking a colleague or friend to review your post for feedback before publishing it.
8. Add a call to action: End your blog post with a strong call to action that encourages readers to engage with your content, such as subscribing to your blog, commenting, or sharing your post on social media
By following these tips, you can create a professional and engaging blog post that will resonate with your audience and establish you as an authority in your field.
How do I get publicity and organic traffic for a website?
1. Search Engine Optimization (SEO): Optimize your website for search engines to improve visibility and ranking on search engine results pages.
2. Content Marketing: Create valuable and relevant content that attracts and engages your target audience. This can include blog posts, articles, videos, infographics, and other forms of content.
3. Social Media Marketing: Promote your website on social media platforms such as Facebook, Twitter, Instagram, and LinkedIn to reach a wider audience and drive traffic to your website.
4. Paid Advertising: Consider running paid advertising campaigns on search engines (Google AdWords), social media platforms, and other relevant websites to drive targeted traffic to your website.
5. Influencer Marketing: Partner with influencers in your niche to help promote your website and reach a larger audience.
6. Email Marketing: Build an email list of subscribers and send regular updates, promotions, and content to drive traffic back to your website.
7. Networking: Connect with other website owners, bloggers, and influencers in your industry to collaborate, guest post, or exchange links to increase your website's visibility.
8. Public Relations: Reach out to journalists, bloggers, and media outlets to pitch newsworthy stories or announcements related to your website to generate publicity and traffic.
9. Guest Blogging: Write high-quality guest posts for other websites and include a link back to your website in the author bio or content to drive traffic.
10. Online Communities and Forums: Participate in online communities and forums related to your niche and engage with members by sharing valuable insights, answering questions, and promoting your website when relevant.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
What are the benefits to having a security camera?
1. Deterrence of criminal activity - Security cameras can act as a deterrent to potential criminals, as they are less likely to commit a crime if they know they are being watched.
2. Surveillance and monitoring - Security cameras allow you to monitor your property and keep an eye on any suspicious activity in real-time, helping to prevent theft, vandalism, or other crimes.
3. Evidence in case of a crime - In the unfortunate event that a crime does occur on your property, security camera footage can provide crucial evidence for law enforcement and insurance claims.
4. Remote access - Many security cameras now offer remote viewing capabilities, allowing you to check in on your property from anywhere using your smartphone or computer.
5. Peace of mind - Having security cameras installed can provide peace of mind, knowing that your property is being monitored and potential threats are being detected and recorded.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
why is it safer to wear a mask in public?
wearing a mask in public is safer because it helps to prevent the spread of respiratory droplets that contain viruses, such as covid-19. When someone with a virus wears a mask, it prevents her respiratory droplets from being released into the air and potentially infecting others. Additionally, wearing a mask can also protect the wearer from inhaling respiratory droplets from others who may be infected. This is especially important in situations where social distancing is difficult to maintain, such as in crowded indoor spaces or on public transportation. Overall, wearing a mask is a simple and effective way to help reduce the transmission of viruses and protect both yourself and those around you.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
is sugar really unhealthy?
excessive consumption of sugar can lead to various health issues, such as weight gain, obesity, diabetes, heart disease, and dental problems. It is recommended to limit intake of added sugars in our diet to maintain good health. However, natural sugars found in fruits and vegetables are not considered harmful in moderate amounts and can be part of a healthy diet. Moderation is key when it comes to sugar consumption.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
How do i build a full stack web app with django?
Building a full stack web app with Django involves several steps. Here is a general outline of the process:
1. Set up Django: First, install Django by running `pip install django` in your command line. Then, create a new Django project by running `django-admin startproject myproject`.
2. Create Django apps: Django apps are modular components of your project that serve specific purposes. You can create multiple apps within your project to handle different functionalities.
3. Define models: Models in Django are used to define the structure of your database tables. Create your models by defining classes in the models.py file of each app.
4. Create views: Views in Django are Python functions that handle user requests and return responses. Define views for your app by creating functions in the views.py file of each app.
5. Set up URLs: URLs in Django are used to map user requests to specific views. Define URL patterns for your app by creating a urls.py file in each app and including them in the main urls.py file of your project.
6. Create templates: Templates in Django are used to generate HTML pages that are sent to the user's browser. Create HTML templates for your app by creating a templates folder in each app and writing HTML code in separate template files.
7. Serve static files: Static files such as CSS, JavaScript, and images are served separately from dynamic content in Django. Configure the static files settings in your project's settings.py file to serve static files from the static folder in each app.
8. Configure the database: Set up your database settings in the settings.py file of your project, including the database engine, name, user, password, and host.
9. Migrate the database: Run `python manage.py makemigrations` followed by `python manage.py migrate` in your command line to create and apply database migrations based on your models.
10. Run the server: Start the Django development server by running `python manage.py runserver` in your command line. You should now be able to access your web app at `http://127.0.0.1:8000/` in your browser.
These are the basic steps to build a full stack web app with Django. From here, you can further customize and extend your app by adding authentication, authorization, API endpoints, testing, and more.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
How do I write a good book?
1. Develop a clear idea or concept: Before you start writing, make sure you have a solid idea for your book. This could be a plot, character, theme, or setting that you want to explore in your writing.
2. Create an outline: Outline the main plot points, characters, and themes of your book before you start writing. This will help you stay organized and focused as you write.
3. Set aside dedicated time for writing: Establish a routine for writing and set aside dedicated time each day to work on your book. This will help you stay motivated and make progress on your writing.
4. Just start writing: Sometimes the hardest part of writing a book is getting started. Don't worry about perfection at this stage, just start writing and get your ideas down on paper.
5. Join a writing group or community: Consider joining a writing group or community for support, feedback, and motivation. Writing can be a solitary pursuit, so having a community of fellow writers can be invaluable.
6. Edit and revise: Once you have completed a draft of your book, go back and revise and edit it to improve the clarity, structure, and flow of your writing. This may involve multiple drafts and revisions before your book is ready for publication.
7. Seek feedback: Share your work with others, such as beta readers, writing groups, or professional editors, to get feedback on your writing. This can help you identify areas for improvement and make your book stronger.
8. Keep writing: Writing a book is a marathon, not a sprint. Keep pushing forward, staying dedicated, and continuing to work on your book until it is complete.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
What causes migraine and how are they treated?
Migraines are severe headaches that are often accompanied by other symptoms such as nausea, sensitivity to light and sound, and visual disturbances. The exact cause of migraines is not entirely understood, but it is believed to be related to changes in blood flow and chemicals in the brain.
Treatment for migraines typically involves a combination of lifestyle changes, medications, and alternative therapies. Some common treatment options include:
1. Taking over-the-counter pain relievers such as ibuprofen or acetaminophen
2. Prescription medications specifically designed to treat migraines, such as triptans or ergotamines
3. Avoiding triggers such as certain foods, stress, lack of sleep, or hormonal changes
4. Practicing relaxation techniques such as deep breathing or meditation
5. Applying hot or cold packs to the head or neck
6. Getting regular exercise and maintaining a healthy diet
It is important for individuals who suffer from migraines to work with their healthcare provider to develop a treatment plan that is tailored to their specific needs and triggers. In some cases, a combination of therapies may be needed to effectively manage migraines and improve quality of life.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
How do I build a mail server with postfix?
To build a mail server with Postfix, follow these steps:
1. Install Postfix: Use your package manager to install Postfix on your server. For example, on Debian/Ubuntu, you can run `sudo apt-get install postfix`.
2. Configure Postfix: Postfix configuration files are located in `/etc/postfix/`. The main configuration file is `main.cf`. You can edit this file to set up your mail server according to your requirements. Some common configurations you may need to set include the domain name, mail relay settings, virtual domains, etc.
3. Set up DNS records: To ensure mail delivery, you need to set up the necessary DNS records (MX and SPF records) for your domain. Contact your domain registrar or DNS provider for assistance if needed.
4. Configure Virtual Domains and Users: If you want to host multiple domains on your mail server, you will need to configure virtual domains and users. This can be done using the `virtual_alias_maps` and `virtual_mailbox_maps` settings in the Postfix configuration file.
5. Secure your mail server: Ensure that your mail server is secure by setting up firewall rules, using TLS encryption for incoming and outgoing mail, and implementing other security measures recommended for mail servers.
6. Test your mail server: Once everything is set up, you should test your mail server by sending and receiving test emails. Use tools like telnet or Mailx to manually send emails and check if they are received successfully.
Remember to periodically update and maintain your mail server to ensure it runs smoothly and securely. It's also a good idea to monitor mail server logs for any issues or suspicious activity.
why should i use an apple l out at the l word?
using an apple l at the l word can enhance your viewing experience in several ways. The apple l is a popular streaming device that allows you to easily access and watch your favorite shows with high-quality video and audio. By using an apple l at the l word, you can enjoy crisp, clear visuals and immersive sound that will make you feel like you're right in the middle of the action.
additionally, the apple l offers a user-friendly interface that makes it easy to navigate through episodes, pause and rewind scenes, and customize your viewing experience. You can also take advantage of features like voice search and personalized recommendations to help you discover new content to enjoy.
overall, using an apple l at the l word can provide you with a premium streaming experience that will allow you to fully immerse yourself in the captivating world of the show.
.iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
How do i wear deadlock?
1. Start by growing your hair out to the desired length. Your hair should be at least 2-3 inches long for the best results.
2. Section your hair into small, even parts using a comb. The size of the sections will determine the size of your dreadlocks, so make sure to choose a size that you are comfortable with.
3. Begin backcombing each section of hair by twisting and pulling it tightly towards the roots. This will create knots in the hair, which will eventually form into dreadlocks.
4. Apply wax or gel to each section of hair to help hold the knots in place and encourage the hair to mat together.
5. Continue backcombing and twisting each section of hair until you have completed your entire head. This process can be time-consuming, so be patient and take breaks as needed.
6. Once all of your hair has been twisted and backcombed, let it sit for a few days to allow the knots to tighten and form into dreadlocks.
7. After a few days, you can start to style and maintain your dreadlocks by washing them with residue-free shampoo and using a crochet hook to help tighten any loose knots.
8. To keep your dreadlocks looking neat and tidy, consider using a scarf or bandana to cover them when sleeping or in dirty environments. Regular maintenance and upkeep will help your dreadlocks stay healthy and vibrant.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
How do I send email with a compliant email list and unsubscribe links?
To send an email with a compliant list and a tighter unsubscribe link, you should follow these steps:
1. Ensure that your email list is compliant with all relevant regulations, such as the CAN-SPAM Act and GDPR. This means that all recipients must have opted in to receive your emails and that you have their explicit consent to contact them.
2. Include a clear and prominent unsubscribe link in your email. Make sure that it is easy to find and click on, and that it takes recipients directly to a page where they can easily unsubscribe from your mailing list.
3. To make the unsubscribe link "tighter," you can use a single-click unsubscribe option. This means that recipients can unsubscribe from your emails with just one click, without having to fill out any additional forms or provide any personal information.
4. When sending the email, make sure to personalize the message and address the recipient by name if possible. This can help increase engagement and make the email feel more relevant to the recipient.
5. Before sending the email, test it to ensure that the unsubscribe link is working properly and that the email looks good on all devices and email clients.
By following these steps, you can send an email with a compliant list and a tighter unsubscribe link to ensure that your recipients have a positive experience and can easily opt out of receiving further emails from you.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
Why do people implant nfc implants in their hands?
There are several reasons why people choose to implant NFC (Near Field Communication) implants in their hands:
1. Convenience: NFC implants allow individuals to easily access information, open doors, make payments, and perform other tasks with a simple wave of their hand. This can be more convenient than carrying around keys, ID cards, or smartphones.
2. Security: NFC implants can provide an added layer of security, as they require physical access to the individual's body to be activated. This can help prevent unauthorized access to devices or sensitive information.
3. Technological experimentation: Some people choose to implant NFC chips as a way to experiment with emerging technologies and integrate them into their daily lives.
4. Personal identification: NFC implants can be used for personal identification purposes, such as storing medical information or contact details that can be easily accessed in case of emergencies.
5. Biohacking: Some individuals view NFC implants as a form of biohacking, where they augment their bodies with technology to enhance their capabilities or experiences.
Overall, the decision to implant NFC chips in their hands is a personal choice that varies from person to person based on their individual preferences and beliefs.
How is the crypto market growing so quickly?
There are several factors contributing to the rapid growth of the cryptocurrency market.
1. Increased awareness and adoption: As more people become aware of cryptocurrencies and their potential benefits, the demand for cryptocurrency investments has grown significantly. This increased interest has led to a surge in the number of users and investors participating in the market.
2. Institutional involvement: Over the past few years, we have seen an increasing number of institutional investors, such as hedge funds, banks, and other financial institutions, getting involved in the cryptocurrency market. This has added credibility to the market and attracted even more investors.
3. Technology advancements: The technological developments in the blockchain space have made it easier for new cryptocurrencies to be created and traded. Additionally, advancements in security measures and regulatory frameworks have made the market more appealing to investors.
4. Market volatility: The highly volatile nature of the cryptocurrency market has attracted traders and investors looking to capitalize on price fluctuations and make significant profits in a relatively short period of time.
5. Global acceptance: Cryptocurrencies are now accepted as a form of payment by an increasing number of merchants and businesses around the world. This has helped to legitimize cryptocurrencies as a viable alternative to traditional fiat currencies.
Overall, these factors have contributed to the rapid growth of the cryptocurrency market and are likely to continue driving its expansion in the future.
iki Daisy / Vaizdas | Pirkti | Pirkite su kriptovaliuta
https://glamgirlx.com
https://glamgirlx.com -
Palikite man patarimą „Bitcoin“ naudodami šį adresą: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE