Новости - Посетить сайт
Practical Web Based Deep Learning and Security by Example Third Edition Charlotte Harper July 3, 2024 Updated/Converted June 3, 2025 Foreword: Security considerations in building software for the web are an important part of any web developer's plan and execution while engineering a prototype that is dependable, stable, and useful for practical purposes. 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 to kill time or get something done on the internet, usually on a touchscreen smartphone device. Most people wouldn't even know where to start when they want to build a website from scratch, they would tend to start on another person's website and build something limited in functionality, dependability, ease of use and especially creativity when they could have had all the latest powerful tools at their disposal in order to build something useful without wasting time pressing buttons, and especially wasting money paying for expensive subscriptions to software few people wanted to use anyway given it's limitations in ease of use and flexibility. If you have a few minutes to read through this book and learn what I want to teach you, or even speak with me personally about your goals and get some guidance in the right direction, and are motivated to learn to code and write your own software, take this book home and set aside some time to learn to build the next influential, powerful, streamlined and important web application, a website that is all on you and does exactly what you want and meets the needs of your audience. About me: I am a software developer with a wide range of experience in C/C++, Java, Python, HTML, CSS and JavaScript. I build websites people want to use, want to visit, and even get addicted to using just to learn, recreate and kill time, and most importantly, I sell software. If you had an idea as to exactly how you wanted a website to look and function, you were willing to support me so I can meet my own needs while I meet yours, and you are willing to cover the costs of running a website yourself, I would build you the next YouTube, TikTok, Twitter, Google, or even a high-tech security app only you can access. Instead of trying to sell you my time, I'm trying to buy yours: I want to talk you into building an app (website) yourself with the information that already exists, and teach you what you need to be an independent software developer, entrepreneur, leading a successful career in whatever field you desire. And let me be clear, the education I give you will be informal. You could go to school and learn all of this with a formal education, or even read this book in school, complete your assignments, and take away a great deal from your education, but I won't formally put you in the hot seat and ask you to complete assignments. I'm not your professor, you can think of me like a friend who wants to guide you toward a career driven by your own personal success. And I'm not selling you success either, you will need to buy it with your time. Learning to code has a steep learning curve and was never easy, or even supposed to be. You need to work as hard as you possibly can and continue to try and fail and try again even when you are frustrated in order to learn and build apps yourself. That's in the nature of code itself. Code is run by a compiler that is designed to give the programmer error messages, and these will teach you how to code, even if you are simply copying the error into your search engine and reading other people's examples. And I must say, you don't need to be extremely rich, smart, successful, or even detail oriented or organized to build an app. The computer takes care of that organization for you. You just need to persevere through the trial and error, maintain focus and work hard at what you do, and you will have a very successful career in the entirety of what you do. Who I am: I realize that the last section was more about learning and your take a ways from this book. Who am I exactly? That's a complicated question. I am unclear on that myself, as I suffer from medical conditions that can make it difficult for me to even code or write this book at times, while presenting challenges with socialization and identity issues that make my life more difficult when it comes to introducing myself. In short, if you are reading this book, you brought it home because you flipped through it and thought it was useful, or even if you just read this far in, to you I am a like minded individual who wants to see you succeed in everything that you do. I am an engineer myself, a software developer, and a student, and I am writing this book for other students who want to make their lives easier by having a handbook of the software they need making their lives easier by giving examples to copy that fit together like a big puzzle into a working, useful, large, functional, cohesive, and engaging app that can drive success no matter the line of business. Largely, this is what I do: I build apps to help myself and other people succeed. I am an author as well, though this is my first publication that I intend to complete in order to put my portfolio together into a useful document, and I am an artist as well. I'll admit this to you, I'm sort of a strange person. I'm not perfect, I've had run ins with the law even leading me to leave colleges and universities and leave states in order to try to make a name for myself with more success. I am a woman by birth, I wear makeup, take photos of myself, wear dresses and other womens clothing, and I stay conscious of myself as a female by nature. I've had issues with other people in the past that lead to struggles with writing and building webapps, and I apologize that I haven't been able to get this book in your hands sooner: You needed this. You will want to read and write code that looks like mine and works like mine and does the same thing but even better, because if you can afford to buy this book instead of mashing your keyboard like I do just to create a book yourself asking money for it, you have the resources you need to be successful in your life. I had all sorts of issues with family growing up, health conditions, doctors, the media, and the law, and my code deeply reflects the struggle that is feminism and female nature in a divided and frustrated world. However, this book is something I deeply care about, my baby, my portfolio, and my livelihood, so I appreciate your consideration when you take the text home and carefully pore over it in order to learn from me. Please keep in mind I am not perfect, this book will have errors, revisions, and new editions, and you will need to think with your logical brain as best you can in order to have a successful experience with my writing. Also, understand that I mean well for you even when you face challenges when writing. Think about it like this: When you can just rent a computer system to do anything you can possibly imagine in the digital space, store all the information you encounter, analyze and organize it, and come to understand it, you will inevitably encounter difficulties with the information you are ingesting and even publishing. I tell you this because I encounter the same difficulties. Use this book at your own risk, work with your community and communities available to you to build software within a safe setting, and don't take things to personally when you fail or even succeed in the wrong way: That's how I got this far, and why I can bring you this text and help you succeed without diverging off on a path of madness that leaves me ruined, torn and frayed while I encounter the ordinary problems everyone does on a global scale thanks to the paralellistic global scale of the network on which we will work, the internet. You might not be very familiar with who I am with just a few words, but I encourage you to read on, you will get to know me as you continue to read and understand me while building your own projects to complete your work. There will be no homework with this book, as long as your professors or teachers don't assign you any, but I highly encourage you to build a portfolio of projects yourself as you read along, as well as a capstone project showcasing how you can apply what you have learned. My capstone project is the basis for most of what you will read in this book, as it incorporates code from my previous projects, code I have created and learned to write methodically by hand, and a wide range of ideas and tips that have helped me succeed to the point where I can spin up a simple app that is fully featured and looks and behaves like a popular app you might see your friend or family using, on the internet, advertised to you, or in the news. What this book is: This book is a tutorial by example. 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 you build in the absolute best light to be the most attractive as possible to your end users, your website's visitors. In this book, I will demonstrate a number of examples of software design with a focus on the web as a platform as well as security. We will initiate the learning experience ...
Învățare practică bazată pe web și securitate prin exemplu

Învățare practică bazată pe web și securitate prin exemplu A treia ediție Charlotte Harper 3 iulie 2024 Actualizat/convertit 3 iunie 2025

Cuvânt înainte:

Considerațiile de securitate în construirea de software pentru web sunt o parte importantă a planului și execuției oricărui dezvoltator web, în ​​timp ce inginerie un prototip care este de încredere, stabil și util în scopuri practice. 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 to kill Timp sau obțineți ceva pe internet, de obicei pe un dispozitiv de smartphone cu ecran tactil. Majoritatea oamenilor nici măcar nu ar ști de unde să înceapă atunci când vor să construiască un site web de la zero, ar avea tendința de a începe pe site -ul unei alte persoane și de a construi ceva limitat în funcționalitate, dependență, ușurință de utilizare și, în special, creativitate atunci când ar fi putut avea toate cele mai noi instrumente puternice la dispoziția lor, pentru a construi ceva util, fără a pierde timpul de apăsare a butoanelor, iar în special pierderea banilor care plătește pentru a pune în evidență abonamentele scumpe la software. Dacă aveți câteva minute pentru a citi această carte și pentru a afla ce vreau să vă învăț, sau chiar să vorbiți cu mine personal despre obiectivele dvs. și să obțineți câteva îndrumări în direcția corectă și sunteți motivați să înveți să codificați și să vă scrieți propriul software, luați această carte acasă și puneți deoparte ceva timp pentru a învăța să construiți următorul influent, puternic, eficient și important, o aplicație web, un site web care este pe voi și face exact ceea ce doriți și satisface nevoile de audiență.

Despre mine: Sunt un dezvoltator de software cu o gamă largă de experiență în C/C ++, Java, Python, HTML, CSS și JavaScript. Construiesc site -uri web pe care oamenii doresc să le folosească, vor să viziteze și chiar sunt dependenți de a folosi doar pentru a învăța, recrea și ucide timpul și, cel mai important, vând software. Dacă ai avut o idee despre exact cum dorești ca un site web să privească și să funcționeze, ai fost dispus să mă sprijini, astfel încât să-mi pot satisface propriile nevoi în timp ce îl întâlnesc pe al tău și ești dispus să acoperi costurile de rulare a unui site web singur, v-aș construi următorul YouTube, Tiktok, Twitter, Google sau chiar o aplicație de securitate de înaltă tehnologie pe care o puteți accesa. În loc să încerc să -ți vând timpul meu, încerc să -l cumpăr pe al tău: vreau să te vorbesc pentru a construi o aplicație (site -ul web) cu informațiile care există deja și să te învăț ce ai nevoie pentru a fi un dezvoltator de software independent, antreprenor, conducând o carieră de succes în orice domeniu îți dorești. Și permiteți -mi să fiu clar, educația pe care vi le ofer va fi informală. Ați putea merge la școală și puteți învăța toate acestea cu o educație formală sau chiar puteți citi această carte în școală, să vă completați misiunile și să vă scoateți foarte mult din educația dvs., dar nu vă voi pune în mod oficial pe scaunul fierbinte și vă voi cere să completați misiunile. Nu sunt profesorul tău, te poți gândi la mine ca la un prieten care vrea să te ghideze spre o carieră condusă de propriul succes personal. Și nici nu vă vând succes, va trebui să îl cumpărați cu timpul dvs. Învățarea codului are o curbă de învățare abruptă și nu a fost niciodată ușoară, sau chiar ar fi trebuit să fie. Trebuie să muncești cât mai mult poți și să continui să încerci să eșuezi și să încerci din nou chiar și atunci când ești frustrat pentru a învăța și a construi aplicații singuri. Aceasta este în natura codului în sine. Codul este rulat de un compilator care este conceput pentru a oferi mesaje de eroare ale programatorului, iar acestea vă vor învăța cum să codificați, chiar dacă copiați pur și simplu eroarea în motorul de căutare și citiți exemple ale altor persoane. Și trebuie să spun, nu trebuie să fii extrem de bogat, inteligent, de succes sau chiar orientat sau organizat în detaliu pentru a construi o aplicație. Calculatorul are grijă de acea organizație pentru tine. Trebuie doar să perseverați prin încercare și eroare, să mențineți concentrarea și să muncești din greu la ceea ce faci și vei avea o carieră de mare succes în întregul ceea ce faci.

Cine sunt: Îmi dau seama că ultima secțiune a fost mai mult despre învățare și luați o căi din această carte. Cine sunt eu exact? Aceasta este o întrebare complicată. Nu sunt clar pentru asta, deoarece sufer de afecțiuni medicale care îmi pot îngreuna chiar să codez sau să scriu această carte uneori, prezentând provocări cu probleme de socializare și identitate care îmi fac viața mai dificilă când vine vorba de introducerea mea. Pe scurt, dacă citești această carte, ai adus -o acasă pentru că ai trecut prin ea și ai crezut că este util, sau chiar dacă ai citit doar asta, pentru tine, sunt un individ asemănător care vrea să te vadă să reușești în tot ceea ce faci. Eu sunt inginer, un dezvoltator de software și un student și scriu această carte pentru alți studenți care doresc să -și ușureze viața, având un manual al software -ului de care au nevoie să -și faciliteze viața, oferind exemple pentru a copia care se potrivesc ca un puzzle mare într -o aplicație de lucru, utilă, mare, funcțională, coezivă și captivantă, care poate conduce cu succes, fără a face față de afaceri. În mare parte, asta fac: construiesc aplicații pentru a ajuta pe mine și pe ceilalți să reușească. De asemenea, sunt autor, deși aceasta este prima mea publicație pe care intenționez să o completez pentru a -mi pune portofoliul într -un document util și sunt și artist. Vă recunosc asta, sunt un fel de persoană ciudată. Nu sunt perfect, am condus cu legea, chiar și -a determinat să părăsesc colegii și universități și să părăsesc statele pentru a încerca să -mi fac un nume pentru mine cu mai mult succes. Sunt o femeie de la naștere, port machiaj, fac fotografii cu mine, port rochii și alte îmbrăcăminte pentru femei și rămân conștient de mine ca femeie prin natură. Am avut probleme cu alți oameni în trecut, care au dus la lupte cu scrierea și construirea de WebApps și îmi cer scuze că nu am reușit să obțin această carte în mâinile tale mai devreme: ai nevoie de asta. Veți dori să citiți și să scrieți un cod care arată ca al meu și funcționează ca al meu și să facă același lucru, dar și mai bine, pentru că dacă vă puteți permite să cumpărați această carte în loc să vă îmbrăcați tastatura, așa cum fac doar pentru a crea o carte care vă cereți bani pentru ea, aveți resursele de care aveți nevoie pentru a avea succes în viața voastră. Am avut tot felul de probleme cu creșterea familiei, condiții de sănătate, medici, mass -media și lege, iar codul meu reflectă profund lupta care este feminismul și natura feminină într -o lume împărțită și frustrată. Cu toate acestea, această carte este ceva de care îmi pasă profund, copilul meu, portofoliul meu și traiul meu, așa că apreciez considerația dvs. atunci când luați textul acasă și porniți cu atenție peste ea pentru a învăța de la mine. Vă rugăm să rețineți că nu sunt perfect, această carte va avea erori, revizii și ediții noi și va trebui să vă gândiți cu creierul dvs. logic cât de bine puteți avea o experiență de succes cu scrisul meu. De asemenea, înțelegeți că mă refer bine pentru dvs. chiar și atunci când vă confruntați cu provocări atunci când scrieți. Gândiți -vă așa: când puteți închiria doar un sistem informatic pentru a face orice vă puteți imagina în spațiul digital, stocați toate informațiile pe care le întâlniți, o analizați și o organizați și veți înțelege, veți întâmpina în mod inevitabil dificultăți cu informațiile pe care le ingerați și chiar veți publica. Vă spun asta pentru că întâmpin aceleași dificultăți. Folosiți această carte pe propriul risc, lucrați cu comunitatea și comunitățile dvs. disponibile pentru a construi software într -un cadru sigur și nu duceți lucrurile la personal atunci când eșuezi sau chiar reușești în mod greșit: așa am ajuns atât de departe și de ce îți pot aduce acest text și te va ajuta să reușești fără să mă îndepărtez pe o cale de nebunie care mă lasă ruinat, s -a întors și de a fi înrădăcinat în timp ce am întâlnit problemele obișnuite pe care noi o face pe o scară globală, mulțumită de paralellisti în timp ce am întâlnit cu problemele obișnuite pe care le -a făcut pe o scară globală, mulțumind și, în timp ce am întâlnit scara globală, pe care le -am făcut pe o scară globală, mulțumită de paralellisti, în timp ce am întâlnit cu problemele obișnuite pe care le -a făcut pe o scară globală, mulțumită și, în timp ce am făcut o scară globală, pe care le -am făcut pe o scară globală. va funcționa, internetul. S -ar putea să nu vă familiarizați cu cine sunt doar câteva cuvinte, dar vă încurajez să citiți mai departe, veți ajunge să mă cunoașteți în timp ce continuați să mă citiți și să mă înțelegeți în timp ce vă construiți propriile proiecte pentru a vă finaliza munca. Nu vor exista teme cu această carte, atâta timp cât profesorii sau profesorii dvs. nu vă atribuie niciunul, dar vă încurajez să construiți un portofoliu de proiecte pe care le citiți, precum și un proiect Capstone care să prezinte modul în care puteți aplica ceea ce ați învățat. Proiectul meu Capstone este baza pentru cea mai mare parte a ceea ce veți citi în această carte, deoarece încorporează codul din proiectele mele anterioare, codul pe care l -am creat și am învățat să scriu metodic de mână și o gamă largă de idei și sfaturi care m -au ajutat să reușesc până la punctul în care să vă pot învârti o aplicație simplă, care este pe deplin prezentată și arată și se comportă ca o aplicație populară, puteți vedea prietenului sau familiei dvs. folosind internetul, pe internet, publicitate la tine, sau în știri.

Ce este această carte: Această carte este un tutorial de exemplu. 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 Software -ul pe care îl construiți în cea mai bună lumină absolută pentru a fi cel mai atractiv posibil pentru utilizatorii finali, vizitatorii site -ului dvs. În această carte, voi demonstra o serie de exemple de proiectare software, cu accent pe web ca platformă, precum și securitate. Vom iniția experiența de învățare prin construirea unui proiect de bază folosind Shell UNIX, cu caracteristici de rezervă și scripturi. Apoi, vom examina un site web de bază al blogului, vom actualiza blogul nostru cu funcții foto și video, precum și vom folosi aceste funcții pentru a utiliza soluții de securitate folosind software gratuit și pentru a ne asigura serverul folosind un modul de autentificare conectabilă (PAM). Vom examina apoi gestionarea și procesarea fișierelor, explorarea editării video, donația vocală, scanarea codurilor de bare și recunoașterea personajelor optice, printre alte concepte. Pe parcurs vom examina API -urile care ne vor ajuta să facem software -ul nostru mai util și mai sigur, cu opțiuni gratuite și plătite. Pe parcurs, vom explora instrumente de securitate fizică și militantă, cum ar fi arme de foc și muniții, proiectare și fabricație, inclusiv proiectarea butoiului și a repetorului, proiectarea turele și dronei, precum și alte directori, ne vom integra cu software -ul nostru din rețeaua existentă pentru a ne proteja software -ul și pentru a demonstra autoapărare și resillience. Vom face pauze de -a lungul drumului pentru a construi jocuri, motoare de redare 2D și 3D și vom lucra cu hardware încorporat în cazuri de studiu de studiu de software de redare dimensională de bază și, respectiv, un masaj electronic vibrant în cauciuc siliconic. Pe parcurs, vom folosi și soluții de învățare automată deja disponibile pentru a ne asigura mai bine software -ul. De asemenea, vom folosi instrumente de stoc disponibile pentru web pentru a eficientiza și asigura procesul. Această carte este un ghid pentru succesul dvs. în construirea unei aplicații web și integrarea acesteia cu o rețea profesională de sisteme mecanice de calculator și încorporate și, în general, un ghid pentru construirea de software și hardware încorporat, fără cunoștințe de fond sau experiență anterioară.

Ce nu este această carte: Dacă doriți cu adevărat să aveți un site web, puteți doar să configurați un magazin simplu și să vindeți ceea ce aveți nevoie, să postați un blog, să postați fotografii sau videoclipuri sau altfel fără să scrieți vreodată o singură linie de cod. Această carte nu este asta. Această carte vă va învăța cum să construiți un software mai util, complet prezentat, funcțional și sigur decât orice software pe care îl puteți găsi deja, deoarece implementează cel mai recent software care este încă prototipuri, poate fi scump să funcționeze la o scară în care operează companii mai vechi și nu apelează la companii convolute, înființate pentru a câștiga bani pentru persoanele care nu fac cu adevărat nimic. Dacă urmați îndeaproape această carte, veți dori să scrieți cod, cod de cercetare, să vă construiți propriile aplicații și veți câștiga bani din ceea ce faceți. Voi câștiga bani din această carte, chiar și în etapele incipiente, deoarece conține informații pe care oamenii au nevoie și vor să le citească și deja cumpără atunci când cumpără sau folosesc aplicațiile mele. Această carte nu va construi o aplicație pentru dvs., dar vă va indica în direcția corectă și vă va înarma cu instrumentele de care aveți nevoie și cu abilitățile și sfaturile care vă vor facilita propriul succes în construirea de software pentru web, cu fiecare linie de cod pe care va trebui să le scrieți ca exemplu, gata să fie împărțiți împreună în software -ul dvs. și suporterii dvs., oaspeții, clientela, familia, vizitatorii, contractorii, iar oamenii de pe internet doresc să le utilizeze și să vă sprijine.

Ce veți învăța: Această carte vă va învăța cum să construiți și să vindeți software, cu adevărat funcțional, software util, înregistrare media, caracteristici de securitate, cum ar fi recunoașterea facială, scanarea codului de bare a zonei care pot fi citite ale mașinii, API -urile web pentru a autentifica, înregistra și reda video și fotografii și schimb de mesaje precum Bluetooth și Aproape Field (NFC). Această carte vă va învăța cum să utilizați un computer în rețea, concentrându -vă pe Debian Linux, cum să construiți codul bash pentru a face instalarea și copierea de rezervă a software -ului dvs. o briză automată, automatizată, cum să construiți codul Python ca un backend pentru a servi mesaje dinamice, stiluri de stil folosind bine stilurile CSS cu bootstrap, să permită jurnalizările utilizatorilor și să ofere interacțiuni prin intermediul dispozitivelor de rețea sau altele interactiv Scopuri, scanare ID, moderație de imagine și video, microtransacții de date pentru a vă menține software -ul securizat, procesarea plăților, tranzacționarea criptomonedelor, sarcinile asincrone și multe altele. Veți învăța cum să vă construiți propriile dispozitive Bluetooth, cu baterii, încărcătoare, microcontrolere, circuite, motoare și senzori, folosind lipit, sârmă și 3D tipărite, precum și materiale turnate. Voi demonstra principalele de proiectare 3D aplicate la fabricarea aditivilor și la fabricarea instrumentelor și a matriței, astfel încât să puteți fabrica propriile dispozitive hardware încorporate, cu baterii integrate, încărcătoare, circuite electronice și ieșiri funcționale. și să le redați cu Bluetooth și Web. Mai exact, vom examina două studii de caz, un masaj vibrant și o armă de foc de casă, ambele programate în OpenScad, care este disponibil ca o interfață grafică sau o utilitate a liniei de comandă și poate fi integrată într -un web pentru rezultate mai rapide. Veți învăța cum să construiți și să implementați un site web de la sol fără experiență anterioară, să îl faceți funcțional, sigur, frumos, util și cel mai important practic. Veți învăța cum să utilizați învățarea automată și viziunea computerului pentru a face un site securizat și mai practic, înregistrați video și audio de pe site -ul dvs. web, să vă donați vocea, să faceți muzică și să modulați audio pentru a crea eșantioane utile și cum să treceți prin zgomot, folosind alte site -uri web pentru a construi cea mai bună rețea posibilă de site -uri web pe care le puteți conecta direct la dvs. pentru a împărtăși toate informațiile utile pe care le oferiți și chiar mai important să aduceți oameni în domeniul dvs. și pentru a împărtăși toate informațiile utile pe care trebuie să le oferiți, și chiar mai important să vă aduceți persoanelor și pentru a împărtăși toate informațiile utile. Această carte se va concentra cel mai mult pe media, securitatea și învățarea automată, care sunt principalele trei componente care vă vor ajuta să construiți un software util pentru web, prin implicarea utilizatorilor potriviți și dezactivând cele greșite într -o manieră realistă, practică, de mână și antrenantă, în timp ce este, de asemenea, automată și robustă. Această carte învață UNIX, în special Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript și o serie de pachete software utile pentru solicitări precum Python, precum și software de bash utile precum Git și FFMPEG. De asemenea, vă voi învăța cum să tranzacționați automat criptocurrency și să efectuați plăți în criptocurrency sau din cardurile de debit obișnuite, în timp ce plătiți vizitatorilor dvs. o parte din veniturile dvs. dacă alegeți acest lucru. Vă voi învăța cum să câștigați bani de pe site -ul dvs. web prin publicitate, cum să vă pregătiți aplicația pentru motoarele de căutare și să o faceți rapid, clasată în primul clasament pentru ceea ce clienții dvs. vor căuta pentru a vă găsi și clasându -se în cât mai multe căutări comune. Vă voi învăța cum să vă vindeți software -ul, să -l faceți publicitate, să vă atrageți clienții care caută serviciile dvs. și să vă voi face un nume pe internet prin căi care există deja, sunt ieftine și funcționează bine. Vă voi învăța cum să vă salvați datele pe calculatoarele cloud care funcționează pentru dvs. și să vă salvați datele ieftin, cum să planificați și să construiți un site web care să facă ceea ce doresc utilizatorii dvs. și ce doriți și cum să vă mențineți utilizatorii angajați, punând site -ul dvs. o atingere pe telefoanele lor, cu notificări, e -mail, mesaje text, apeluri telefonice și mai multe astfel Această carte se va concentra pe practicitatea publicării și distribuției media în cantități mari, de la text la fotografii la videoclipuri la audio, făcând o impresie bună asupra utilizatorilor finali (clientela dvs.) și vă va vinde în orice mod pe care îl faceți pentru a crea un site web, o aplicație care este reprezentativă pentru dvs. și vă face, și vă face, software -ul dvs. și compania dvs. arată bine în cel mai bun mod posibil. Veți învăța, de asemenea, câteva sfaturi și trucuri de la mine, de la sfaturi de codare, vanitate practică, cum ar fi machiajul și fotografia, modelarea și actoria, și multe altele, ceea ce va fi important pentru a vă înfățișa pe voi și pentru compania dvs. într -o lumină cea mai bună, folosind toate instrumentele disponibile pentru dvs. în timp ce distribuiți cât mai mult conținut, cât aveți nevoie într -un echilibru sănătos al platformelor pentru a vă aduce software -ul la fruct, fără efort, nu mai mult, sau bani decât este necesar. Această carte se numește „PracticÎnvățarea profundă și securitatea profundă pe web, prin exemplu „Dintr -un motiv: se ocupă de învățarea de a codifica, în special pentru web, în ​​special cu accentul pe securitate, din punct de vedere practic, cu exemple de cod de lucru care servește scopurilor practice prezentate în text. Componenta de învățare a acestui text, de asemenea Subtitrare imagine și alte sarcini precum valorile de predicție provenite din imagini, cum ar fi natura imaginii ca o imagine autentică, transferată de computer sau o copie optică (o fotografie a unei imagini sau o fotografie tipărită) Poate face ca un computer de server să fie sigur, un computer care, în mod normal, ți -ar cere un nume de utilizator și un cod de acces și să te conectezi, poate cu un jeton de confirmare pentru fiecare nou autentificare sau o adresă IP nouă, dar dacă construiești la scară largă, ușor de utilizat, în mod fundamental sigur, iar software -ul puternic, acesta poate fi suficient. Oricine construiește un software care este impecabil sigur are o anumită sens despre ceea ce implică acest lucru. Software -ul este în mod inerent nesigur, deoarece dispozitivele și conturile pe care le folosim pentru a -l accesa nu sunt întotdeauna la dispoziția noastră, ele ar putea fi în mâinile oricui cu intenție necorespunzătoare pentru software și, prin urmare, pot reprezenta un risc pentru software -ul în sine. Aceasta este ceva din această carte. Un computer în rețea este în mod implicit securizat cu un token de cheie lung, numit și SSH sau securizare shell cheie și este altfel cel mai bine securizat cu un server web, deoarece serverul web oferă acces deschis, precum și instrumentele de securitate de artă care rulează pe serverul în sine. Serverul Web are acces la browserul web al utilizatorului, care este probabil cea mai puternică parte a dispozitivului utilizatorului, deoarece este locul în care utilizatorul poate accesa software -ul în rețea. Acest set de instrumente poate reda text, paginile web pe care le vedeți și poate înregistra, de asemenea, imagini, audio și video (cum ar fi o fotografie a unei fețe sau a unui ID de stat), poate citi și scrie pe dispozitive radio Bluetooth și poate citi și scrie la etichete de transponder de câmp, cu carduri cheie ieftine, fobs, stickere, inele și chiar implanturi de cip cu un server de serial unic, care pot fi citite și redactate cu date generate și validări de cip prin intermediul unui site de serial unic, care pot fi citite și redactate cu date generate și validări de chipuri, cu un site de serial unic, care pot fi citite și redactate cu date generate și validări de chipuri, care pot fi citite și redactate cu date generate și validări de chipuri. Folosind toate instrumentele la dispoziție, cu această carte vă veți echipa cu cunoștințele pentru a construi un site web sigur și, în general, un sistem de calcul securizat în rețea care funcționează pentru dvs., vă face licitația și arată și se simte

De unde să începi: Sunteți bineveniți să treceți pe lângă secțiunea în care încep această carte, sau orice secțiune, la codul exact de care aveți nevoie, mai ales dacă aveți experiență cu codificarea înainte sau oricare dintre instrumentele menționate anterior pe care le voi descrie în detaliu în această carte, precum și documentarea cazurilor de utilizare și a exemplelor practice ale acestora. Dacă nu aveți experiență în scrierea codului, vă recomand să citiți toată această carte și vă recomandăm mai ales să citiți secțiunile anterioare, pentru a vă asigura că această carte este potrivită pentru dvs. Dacă această carte nu este potrivită pentru dvs., luați în considerare să o acordați unui prieten sau rudă care ar putea fi interesat să învețe despre dezvoltarea web și chiar să luați în considerare împrumutarea ei înapoi și să învățați de la ei pentru a completa lacunele în care v -am eșuat ca profesor sau alți profesori au făcut -o înaintea mea. Începeți unde veți face, fiecare parte a acestei cărți va fi utilă dacă intenționați să construiți o aplicație utilă și luați în considerare că cele mai bune aplicații sunt construite având în vedere utilizatorul final: cunoașteți -vă clientul. Acum mă cunoști, știi această carte și ești gata să începi. Pentru a începe, apucați un computer (chiar și cel mai ieftin laptop dintr -un magazin de cutii, Amazon sau un desktop vechi și configurați -l într -un mod care funcționează pentru dvs.

Cum să citești această carte: Textul evidențiat, denotă faptul că textul aparține unui prompt de comandă, unde veți scrie codul pe care îl rulați. Promptul de comandă este puternic concentrat pe tastatură și necesită un pic de clic, fără a face clic, accelerarea fluxului de lucru și ușurarea lucrurilor pe tine.

Noțiuni de bază: Să ne scufundăm. Vom începe prin construirea codului pe o mașină locală și vom începe fără a construi un site web conectat la internet. Acest lucru este mai sigur pentru a începe, nu costă nimic și vă este ușor. În funcție de sistemul dvs. de operare, intrarea într -o coajă de bash va fi puțin diferită. Pentru Mac OS, vă recomand să instalați o mașină virtuală în acest moment, deoarece veți obține cea mai mare compatibilitate cu o mașină virtuală. Diversi furnizori, cum ar fi VirtualBox și Paralells, pot rula o mașină virtuală pentru dvs., deși este posibil să instalați Ubuntu direct pe mașină, dacă preferați să utilizați un mediu nativ, recomandat pentru a crea o experiență rapidă și simplificată. Dacă utilizați Linux sau Windows, pe care le recomand, ar trebui să fie destul de ușor să creați un proiect. Deschideți terminalul, reglați dimensiunea după cum considerați potrivit și începeți să urmați pasul 2. Dacă utilizați Windows, urmați pasul 1.

Pasul 1: - Numai utilizatorii Windows În Windows, deschideți promptul de comandă ca administrator și tip WSL - Instalați

Pasul 2: - Continuați aici sau săriți Pasul 1 până aici dacă nu utilizați Windows Într -un terminal deschis, (în funcție de sistemul de operare, numit Ubuntu în Windows, terminal în Mac sau Linux sau un nume similar), începe prin crearea unui proiect. Facem acest lucru cu comanda mkdir, care creează un director. Dacă aveți nevoie să creați un director pentru a stoca proiectul dvs., care este recomandat, utilizați comanda CD pentru a vă schimba în director și și

CD/Path/to/Directory - Calea este folderele (fișierele) care preced directorul dvs. de destinație, calea dvs. implicită este ~ sau/home/nume de utilizator (unde numele de utilizator este numele dvs. de utilizator). Pentru a schimba directorul implicit, tastați CD sau CD ~ Exemplu mkdir - Înlocuiți „Exemplu" cu numele directorului

Acum aveți un director de lucru pentru proiectul dvs. Fiind așa cum este atât de important ca acest director să fie salvat în cazul în care trebuie să treceți la o altă mașină sau să implementați codul pe care îl scrieți, astfel încât să fie gata pentru web, vom construi un script pentru a face backup pentru directorul dvs. în următorii câțiva pași. Dar construirea unui script necesită un pic de cod, iar codul trebuie automat să fie cât mai util posibil. Deci, să construim un script pentru a construi mai întâi scripturi. Să începem prin crearea scriptului și să -l facem executabil. Vom folosi sudo, chmod și atingem acest lucru și vom numi scriptul „ascript".

sudo touch /usr/bin/ascript
sudo chmod a+x /usr/bin/ascript
sudo nano /usr/bin/ascript

Acum am creat scriptul, l -am făcut executabil și suntem gata să -l edităm. Nano este un editor de text care vă va permite să editați text fără a face clic, ceea ce este mult mai ușor decât utilizarea unei interfețe grafice de utilizator. Pentru a edita un fișier cu Nano, folosiți Nano și apoi calea către fișier. Pentru a face un script care face un scenariu, este destul de asemănător cu realizarea scenariului nostru în primul rând. Vom folosi același cod ca mai sus, înlocuind numele scriptului, „ascript" cu un parametru de argument, 1 $. Acest lucru ne permite să apelăm scriptul tastând pur și simplu NewScript sudo ascript, moment în care putem crea orice script nou, înlocuind „NewScript" cu numele scriptului dvs. Codul din Nano ar trebui să arate:

sudo touch /usr/bin/$1
sudo chmod a+x /usr/bin/$1
sudo nano /usr/bin/$1

Și pentru a închide Nano, putem menține tasta de control și apăsăm X, apoi Y pentru a denumi că salvăm fișierul și vom apărea returnarea. Acum, în loc să tastăm aceste trei comenzi pentru a edita un script, vom putea tasta sudo ascript pentru a edita din nou scriptul. Asta funcționează! Și orice script nou poate fi rulat cu ușurință apelându -l în shell. Să ne salvăm lucrarea acum: să scriem un script de rezervă pentru a salva noul nostru script și apoi l -am rezervat în directorul nostru de proiecte, în timp ce face backup pentru scriptul de rezervă.

sudo ascript backup

Acum, în Nano:

sudo cp /usr/bin/backup /path/to/directory/
sudo cp /usr/bin/ascript /path/to/directory/

Unde/Path/to/Directory este calea către proiectul pe care l -ați creat cu mkdir. Mai târziu, vom învăța cum să copiezi căi repetate de genul acesta cu o buclă și o listă, care este mai puțin cod, dar deocamdată să -l păstrăm simplu și să avem câteva rânduri. Pentru a rula acest script și pentru a face backup codul, salvați fișierul în Nano cu Control+X, Y și returnați și introduceți mai jos în shell -ul dvs.

backup

Dacă vi se solicită deloc o parolă în timp ce citiți această carte și urmăriți în shell, vă rugăm să introduceți corect parola utilizatorului, veți avea trei încercări înainte de a fi nevoie să re-rulați comanda. Puteți utiliza săgețile sus și în jos pentru a relua comenzile și a le edita, dacă trebuie să rulați orice de două ori. Apăsați simplu în sus și în jos intermitent pentru a selecta o comandă, înainte de a edita comanda cu săgețile din dreapta, din stânga și ștergeți tasta, precum și tastatura și rularea acesteia cu retur.

Felicitări! Ați reușit să creați un script de rezervă minunat care să susțină două scripturi de shell importante în directorul dvs. de lucru. S -ar putea să mutăm lucrurile mai târziu pe măsură ce proiectul devine mai mare, dar acest lucru funcționează deocamdată. Haideți să trecem la o copie de rezervă în cloud, vom folosi GitHub pentru acest lucru (deși există numeroase alte soluții GIT pentru backup, toate sunt cam la fel.) Git este un software de control de ventrometri care vă permite să faceți backup pentru software -ul dvs. în timp ce le faceți pe un server, în timp ce vă permite să descărcați copii întregi ale software -ului dvs. în spatele unei parole sau cheie. Este esențial să vă salvați software -ul, mai ales că migrăm la instanțele Linux securizate care uneori se rup atunci când o singură linie de cod nu reușește, lăsându -vă blocat în timp ce codul dvs. s -ar putea să nu fie rezervat dacă nu aveți șansa de a -l sprijini automat, pe care îl vom acoperi.

Dacă nu utilizați deja o mașină virtuală Ubuntu în acest moment, recomand folosind o mașină virtuală Ubuntu în acest moment, deoarece vă va face viața mai ușoară atunci când instalați toate pachetele necesare pentru a construi un site web de lucru și pentru a preforma operațiunile de învățare profundă pe computer. Vom muta codul pe un server web în viitorul apropiat, dar vrem să ne asigurăm că există cel puțin câteva straturi de securitate în spatele serverului nostru web care sunt rezistente la phishing și vom folosi o serie de pachete Linux pentru a face acest lucru. Dacă mai doriți să utilizați Mac OS, sunteți bineveniți să căutați și să instalați pachetele necesare online, dar este posibil să nu existe alternative pentru fiecare pachet pe care această carte sau serii îl va acoperi.

Să adăugăm câteva comenzi pentru a ne angaja lucrarea cu scriptul de rezervă rulând comanda sudo ascript Backup.

# ...

Încă o dată, controlați X pentru a salva.

Acum trebuie să facem o configurație o singură dată pentru acest proiect. Deoarece în curând va fi un proiect GIT, nu trebuie să tastam fiecare comandă de fiecare dată când ne implementăm dintr -un depozit GIT, dar vom primi acest lucru atunci când vom scrie scripturile noastre de implementare. Pentru început, să ne asigurăm că suntem în directorul potrivit și inițializăm depozitul Git și generăm tastele SSH.

cd /path/to/directory
git init
git branch -m master
ssh-keygen

După ce tastam ssh-keygen, noua cheie ar trebui să fie salvată în folderul de acasă sub un folder numit .ssh. Se numește id_rsa.pub. Să găsim această cheie și să o copiem. Să -l văd,

cd ~
cat .ssh/id_rsa.pub

Copiați textul care este returnat de ultima comandă și creați un cont cu furnizorul dvs. GIT (ideal GitHub), înainte de a adăuga cheia SSH în contul dvs. După ce aveți un cont, faceți clic pe meniul din dreapta sus și introduceți setări, înainte de a adăuga tasta SSH în tastele SSH și GPG sub acces în meniu. Selectați Adăugați o cheie SSH și adăugați -o pe a voastră lipitându -l și oferindu -i un titlu, înainte de a salva și de a reveni la GitHub pentru a crea un nou depozit. Acest lucru este similar pentru alți furnizori de GIT, va trebui să citiți documentația lor. În noua configurație de depozit, oferiți depozitului dvs. un nume descriptiv și decideți dacă doriți să îl publicați și asigurați -vă că nu configurați încă fișiere pentru incluziune. Odată ce depozitul este creat, copiați clona cu url SSH și lipiți -l în următoarea comandă.

git remote add git://… (your remote URL)

Acum puteți muta înapoi la depozitul dvs. cu CD, veți fi familiarizați cu acest lucru. Încercați acum scriptul de rezervă cu rezervă

Mare! Acum putem obține cu adevărat codificarea. Să instalăm Django acum că avem o înțelegere bună pe Bash și Git. Django ne va permite să facem o copie de rezervă automată, Bash poate face acest lucru și Django ar trebui să aibă o implementare mai sigură mai simplă (poate fi dezactivată și configurată mai ușor).

Pentru a instala software în Ubuntu, vom folosi comanda sudo apt-get. În primul rând, să actualizăm și să actualizăm software -ul pe care îl aveam deja. Acest lucru se poate face cu actualizarea sudo apt-get și sodo apt-get upgrade -y. În continuare, să instalăm Python și mediul nostru virtual, casa codului nostru, cu următoarea comandă: sudo apt-get Instalați Python-Is-Python3 Python3-Venv

Acest lucru este tot ce trebuie să mergeți cu Django în ceea ce privește instalările de software în instanța Ubuntu. Pentru Windows și Linux, acest lucru ar trebui să fie destul de simplu, dar pentru Mac, poate doriți să instalați o mașină virtuală și Linux pe ea folosind un mediu virtual gratuit sau plătit, cum ar fi VirtualBox sau Paraalells Desktop și să recreezi pașii de mai sus pentru a configura un mediu Ubuntu. Ubuntu este esențial în acest caz, deoarece este software -ul pe care îl rulează site -urile web și le permite să găzduiască site -uri web cu tot software -ul menționat mai sus.

Să săpăm în Django.

În directorul nostru din nou, cu CD:

python -m venv venv # Creează mediul virtual în care este stocat codul
source venv/bin/activate # Activează mediul virtual
django-admin startproject mysite . # Unde Mysite este proiectul, încep în directorul meu actual.

Django tocmai ne începe, deoarece Django găzduiește serverul web și face tot ce avem nevoie pentru a pune în funcțiune un site local de bază. Acum că avem Django instalat, să edităm un pic setările pentru a -l face să funcționeze cum avem nevoie. În primul rând, să creăm o nouă aplicație

python manage.py startapp feed

Veți observa că prima aplicație se numește feed. Aplicația ar trebui să fie numită orice doriți și vom crea aplicații noi, dar numele fiecărei aplicații trebuie să fie consecvent de fiecare dată când aplicația este menționată în cod. Pentru a adăuga o nouă aplicație, vom edita întotdeauna setările.py în celălalt director pe care aplicația creat, numit în StartProject, aplicația de mai jos. Folosind nano,

nano app/settings.py

În setări, găsiți instalat_apps și separați [] în 3 linii. Folosind patru spații pe linia centrală goală, adăugați „feed" sau numele aplicației dvs. Această secțiune a setărilor.Py ar trebui să arate:

INSTALLED_APPS = [
    'feed',
]

Înainte de a uita, să testăm că Django lucrează. Folosind comanda Python Manage.py RunServer 0.0.0.0:8000, putem rula serverul și apoi să navigăm într -un browser web de pe computer care rulează codul către http: // localhost: 8000 și vedem un exemplu de pagină web (funcționează!) Renunță la server cu controlul c, la fel ca orice altă comandă.

Acum, să săpăm în scrierea unui cod Python. Django are trei componente principale, toate rulate prin cod în întregime. Componentele sunt numite model, vizualizare și șablon și fiecare este la un nivel mai înalt și, respectiv, mai scăzut înainte de livrarea paginii web către utilizator.

Modelul este codul care stochează informații în baza de date pentru regăsire, sortare și redare.

Vizualizarea decide modul în care modelul este redat, manipulat și modificat, aproape fiecare vizualizare va utiliza un model direct.

Șablonul este codul HTML cu câteva clopote și fluiere în plus numite limbaj de șablon. Șablonul este redat de viziunea în care este umplut cu cod Python și context, cum ar fi modele și informații (șiruri usuall și numere întregi) din vedere.

Django are și alte componente, inclusiv, dar fără a se limita la:

Setări, care configurează aplicația așa cum am discutat.

URL -uri, care sunt modele pe care utilizatorul le urmează pentru a avea acces la anumite părți ale aplicației web.

Formulare, care definesc modul în care informațiile care sunt trimise către server sunt gestionate și transmise la baza de date, precum și utilizatorului. Acestea sunt fundamentul de procesare a informațiilor din partea serverului și pot accepta orice tip de informații pe care computerul le stochează, în special șiruri de text, numere și booleane adevărate/false (de obicei casete de selectare).

Șabloane, care sunt codul HTML și limbajul șablonului și pun la punct decalajul dintre Python și HTML, ceea ce înseamnă că informațiile Python pot fi servite ca cod HTML pe care oricine îl poate accesa și poate asigura un site web cu acces restricționat, în timp ce face codul Python accesibil pe web și util pentru o varietate de scopuri pe un dispozitiv de la distanță care nu trebuie să fie aproape de server.

Fișiere statice, care sunt de obicei JavaScript și sunt bibliotecile pe care serverul le servește și sunt conectate cu șablonul.

Fișiere media, pe care serverul le servește sau sunt găzduite extern, sau doar scrise pe server înainte de a fi procesat și postat pe un alt server (o găleată) pentru găzduire.

Middleware, care sunt piese de cod care sunt rulate în același timp cu fiecare vizualizare și sunt considerate „incluse" în vedere.

Procesoarele de context, care prelucrează contextul fiecărei vizualizări și sunt utilizate pentru a adăuga un context suplimentar.

Teste, care validează faptul că utilizatorul sau cererea transmite anumite cerințe înainte de redare a vizualizării.

Consumatorii, care dictează modul în care WebSockets se ocupă și răspund la comunicare.

Admin, care este utilizat pentru a înregistra modele, astfel încât acestea să poată fi manipulate în detaliu în pagina de administrare Django, unde baza de date poate fi administrată printr -o interfață grafică.

Țelina, care definește sarcinile asincrone Părțile din codul Django pot începe să funcționeze înainte de a trece imediat la următoarea sarcină sau linie de cod.

Django poate avea multe alte componente, despre care vom discuta în detaliu aici. Există o mulțime de moduri de a face Django mai funcțional, adăugând WebSockets, care sunt canale de comunicare rapide, simplificate, țelină, care execută sarcini asincrone și o multitudine de alte piese de software pentru extinderea Django, în special în funcțiile de vizualizare, unde este executată cea mai mare parte a codului. Funcțiile de vizualizare sunt esențiale, deoarece de obicei declară fiecare bucată de cod specifică unui anumit model URL sau o secțiune a serverului.

În primul rând, să explorăm funcțiile de vizualizare. Funcțiile de vizualizare încep cu importuri care denotă cod care vor fi utilizate în vizualizare și sunt definite folosind definiții sau clase funcționale obișnuite. Cele mai simple vizualizări sunt definite de definiția funcției def și returnează un httpresponse cu un șablon de bază. Să începem prin definirea unei viziuni de bază pentru a returna textul „Hello World". Amintiți -vă că de fiecare dată adăugați cod după o declarație precum def, dacă, în timp ce, pentru, etc., va trebui să adăugați 4 spații pentru fiecare dintre definițiile precedente pe care doriți să le aplicați funcției. Vom intra în ceea ce fiecare dintre aceste mijloace în curând.

Din directorul site -ului nostru, editați fișierul Feed/Views.py folosind Nano și adăugați următoarele linii la sfârșitul fișierului.

from django.http import HttpResponse

def hello(request):
    return HttpResponse('hello world')

HttpResponse de la Django răspunde cu un șir de text, notat cu deschiderea și închiderea '. De fiecare dată când treceți informații unei funcții sau o clasă, cum ar fi o cerere sau un șir, va trebui să utilizați paranteză (, deschidere și închidere).

Nu este tot ce trebuie să vedem încă părerea noastră. Desigur, nu am spus serverului unde este exact viziunea, trebuie să definim totuși o cale prin care ar trebui să se redea viziunea. Să începem prin definirea unei căi de bază în aplicație/urls.py și vom intra în grupuri de cale mai târziu.

În aplicație/urls.py, adăugați o linie după declarațiile de import după începutul importului de vizualizare pe care tocmai l -am creat.

from feed import views as feed_views

Acum, să definim modelul de vizualizare. Modelele de vizualizare au trei componente, componenta de cale, care spune serverului unde există vizualizarea în cadrul serverului (calea URL pe care utilizatorul o introduce în bara de navigare pentru a intra în pagina web), componenta de vizualizare în care este specificată vizualizarea și un nume prietenos pentru vizualizare, astfel încât este ușor să preiați modelul său atunci când lucrați cu un alt template, în special, astfel încât numele să poată fi modificat și actualizat. Este logic să faci lucrurile în acest fel și să fii flexibil, deoarece baza dvs. de cod va fi un mediu în continuă schimbare, care are nevoie de flexibilitate și improvizație pentru a fi valoros și ușor de lucrat. Iată cum va arăta vederea dvs., puteți adăuga acest lucru la urlpatterns = [secțiunea aplicației/urls.py. Modelul de vedere este definit cu cele trei componente descrise mai sus și o funcție numită cale. Modelele URL sunt o listă, așa că asigurați -vă că încheiați întotdeauna fiecare articol din ele cu virgulă, deoarece acest lucru îi separă pe fiecare. Fiecare articol ar trebui să meargă și pe o nouă linie, din nou cu patru spații înaintea sa, la fel ca aplicația din Settings.py. Vom defini prima componentă a vizualizării cu o funcție de șir gol, pentru a crea o vizualizare care rulează pe directorul rădăcină al serverului web. URL -urile dvs. ar trebui să arate acum așa:

from feed import views as feed_views

urlpatterns = [
    path('', feed_views.hello, name='hello'),
]

Aceasta este baza pentru crearea unui site web cu Django care este complet static. Pentru a face un site web mai dinamic, unde putem începe informații în cache, cum ar fi imagini, videoclipuri, audio și multe altele, va trebui să folosim modele, pe care le vom explora în continuare. Deocamdată, să verificăm codul nostru și să rulăm serverul. Pentru a verifica erorile codului, rulați:

python manage.py check

Dacă există mesaje de eroare, ar trebui să examinați cu atenție modificările pe care le -ați făcut în aplicația dvs. și să vedeți dacă există ceva care trebuie să fie rezolvat, cum ar fi un spațiu străin sau lipsit de spațiu, un caracter suplimentar, un șir neclintit, orice tip de dactilografiat, orice caracter șters accidental sau orice altceva. Citind mesajul de eroare (dacă aveți unul), ar trebui să puteți vedea calea către un fișier pe care l -ați creat sau editat împreună cu un număr de linie, așa că priviți fișierul și linia și vedeți dacă puteți repara orice este acolo. Dacă ați rezolvat problema, rulați din nou comanda de mai sus. Când software -ul dvs. este gata de rulare și funcționează, veți vedea „verificarea sistemului de sistem identificat fără probleme". Acum ești gata să pleci. Rulați serverul cu:

python manage.py runserver 0.0.0.0:8000

Deschideți acum un browser web și navigați la http: // localhost: 8000. Ar trebui să vedeți textul returnat în paranteza și citatele funcției HttpResponse în viziunea dvs. Acesta este doar un exemplu de bază, dar dacă ați ajuns până acum, înțelegeți elementele de bază ale modului în care funcționează Linux, Bash, Python și Django. Să săpăm mai adânc într -o modelare a bazei de date și să explorăm puterea unei clase Python în stocarea informațiilor. Apoi, vom începe să obținem o strângere pe HTML și CSS înainte de a face site -ul nostru complet prezentat, flexibil și sigur folosind JavaScript și învățare automată.

Clasele sunt stocate în modelele.py din aplicația dvs. Folosind nano, editați aplicația/modele.py și adăugați o nouă clasă. O clasă este definită cu definiția clasei și este adoptată de o superclasă din care moștenește, în acest caz, modele.model. Numele clasei vine după definiția clasei și după ce se folosește definiția clasei: (colon), înainte ca atributele și definițiile funcției legate de clasă mai jos. Clasa noastră are nevoie de un ID pe care îl putem folosi pentru a -l prelua și a -l păstra unic și are nevoie și de un câmp de text pentru a stoca unele informații. Mai târziu, putem adăuga un timestamp, fișiere, booleane (definiții adevărate sau false care pot ajuta codul nostru să ia decizii cu privire la ce să facă cu modelul și pot fi folosite pentru a -l sorta), o instanță pentru a lega modelul la un utilizator conectat la server și multe altele. Să despachetăm codul de mai jos:

from django.db import models # Importul care este utilizat pentru a defini clasa noastră și este atributele
class Post(models.Model): # Definiția clasei noastre în sine
    id = models.AutoField(primary_key=True) # ID -ul modelului nostru, o cheie generată automat, care ne va permite să interogărilem modelul, să -l păstrăm unic și este util atunci când trebuie să interacționăm cu modelul odată ce a fost creat.
    text = models.TextField(default='') # Atributul magazinelor noastre de clasă, în acest caz, un text, care nu este implicit la un șir gol.

Închideți și salvați fișierul așa cum am făcut înainte pentru a termina.

Există multe alte câmpuri și opțiuni pe care le vom explora atunci când vom actualiza această clasă pe măsură ce aplicația noastră evoluează, dar aceasta este necesitățile de bază ale creării unei aplicații pentru a posta un text. Cu toate acestea, acest model nu va funcționa singur. Așa cum s -a descris anterior, vom avea nevoie de o vizualizare personalizată și un model URL personalizat pentru a face acest model să funcționeze și vom avea nevoie și de o formă împreună cu un șablon. Să explorăm mai întâi formularul.

Pentru a defini un formular, editați aplicația/formularele cu nano și adăugați următoarele linii. Vom avea nevoie de două importuri, clasa noastră de forme, precum și modelul pe care l -am creat (feed.models.post), o definiție de clasă similară cu modelul și un câmp împreună cu o subclasă numită Meta care va defini modelul cu care interacționează forma. Formularul poate avea, de asemenea, o funcție de inițializare care o stabilește pe baza informațiilor din solicitare, model sau altfel, vom explora acest lucru ulterior.

Formele de model sunt atât de utile, deoarece pot crea un model sau pot edita și un model, așa că le vom folosi pentru ambele. Să definim unul în formular.py de mai jos.

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',)

Aceasta este elementele de bază ale aspectului unei forme și model. Această formă de model poate fi utilizată pentru a instantaneu sau edita o postare, schimbând textul pe care îl conține. Vom analiza integrarea acestui formular într -o vizualizare în continuare. În primul rând, să facem migrațiile și să migrăm baza de date, astfel încât codul nostru să poată interacționa cu modelul atunci când va rula. Pentru a face acest lucru, rulați următoarele comenzi:

python manage.py makemigrations
python manage.py migrate

Acest lucru va dura un minut pentru a executa, dar, odată ce va face, vă va permite să accesați modelul în vizualizări, middleware sau oriunde altundeva în software. Să continuăm făcând o vedere unde ne putem vedea modelul. Editați fluxul/vizualizări.py și adăugați următorul cod, după cum s -a menționat. Nu va trebui să adăugați nimic după semnul #, acel cod este comentarii care sunt utilizate pentru a denota informații despre cod. Vom începe prin importul modelului nostru în vizualizări și îl vom adăuga într -un context în care îl putem reda într -un șablon ca o listă pentru afișare. În continuare, vom adăuga un șablon în care putem reda forma și modelul cu un buton pentru a crea un obiect nou bazat pe model și îl posta pe server. Sună complicat, așa că hai să -l luăm pas cu pas. Înainte de a termina vizualizarea, să creăm un șablon care să redacteze modelul și să ne asigurăm că îl putem vedea creând o nouă postare în shell. Iată cum ar trebui să arate acea vedere:

    posts = Post.objects.all() # Interogați toate postările din baza de date până acum

Toate acestea arată destul de simplu până ajungem în fund. Render, valoarea returnată de funcție în loc de un răspuns HTTP, cum ar fi exemplul anterior, ia întotdeauna o solicitare ca prima sa intrare, acceptă un context (în acest caz, postările din baza de date), care acum poate fi redată în șablon și returnează șablonul definit în funcție. Șablonul va fi un document HTML cu un pic de limbă numită Jinja2, care face informațiile Python în HTML.

Pentru a începe să creezi șabloane, fă două directoare în feed.

mkdir feed/templates
mkdir feed/templates/feed

În continuare, editați un șablon în directorul de mai sus, Feed/Șabloane/Feed și adăugați codul pentru acest exemplu. Să ne uităm la șablon pentru acest exemplu.

Acesta este un șablon foarte simplu. Definește deschiderea și închiderea etichetelor HTML, o etichetă de tip document, o etichetă de corp cu titlu de legendă, o etichetă de pauză care adaugă o linie mică pe ecran și o buclă pentru care face fiecare postare din lista de postări ca paragraf din șablon. Acest lucru este nevoie pentru a reda postările, dar nu există încă în baza de date. Să creăm unele cu shell -ul. Putem rula cochilie cu manage.py

python manage.py shell

Acum, să importăm modelul nostru de post

from feed.models import Post

În continuare, vom crea o postare simplă cu un șir și vom ieși din shell. Șirul poate fi orice, atât timp cât este textul valabil.

Post.objects.create(text='hello world')
exit()

În cele din urmă, va trebui să adăugăm un model URL la feed -ul nostru. Deoarece aplicația noastră de feed va folosi mai multe adrese URL și dorim să păstrăm dimensiunile fișierelor mici, să creăm o adresă URLS locală în aplicația noastră de feed care arată astfel:

from django.urls import path
from . import views

urlpatterns = [
    path('', views.feed, name='feed'),
]

De asemenea, va trebui să edităm urls.py în aplicația de bază, orice am decis să o numim, acesta a fost primul director pe care l -am creat. Editați aplicația/App.py și adăugați următoarele la modelele URL

from django.urls import include # în partea de sus
    # ... cod anterior aici

Acum, când rulăm serverul cu Python Manage.py RunServer, vom vedea pagina pe care am creat -o pentru că avem modelul, vizualizarea și șablonul, precum și modelul URL, împreună cu elementele din baza de date. În continuare, să implementăm formularul pe care l -am creat și să începem să ne creăm propriile postări. Dar înainte de a scrie prea mult cod, să facem o copie de rezervă folosind scriptul pe care l -am scris mai devreme, backup. Rulați acest script în shell, așteptați câteva momente și tot codul va fi rezervat la depozitul nostru GIT.

backup

Implementarea formularului este relativ simplă. Vom importa formularul nostru, vom adăuga un gestionar de solicitare a postării la vizualizare și vom salva postarea în baza de date înainte de a se redirecționa la aceeași vizualizare. Putem folosi funcția de redirecționare pe care am importat -o deja și o altă funcție numită invers pentru a obține URL -ul pentru modelul de vizualizare. Vom interoga acest lucru cu șirul „Feed: Feed", deoarece spațiul de nume al modelului inclus este Feed, iar vederea se mai numește feed.

    posts = Post.objects.all() # Interogați toate postările din baza de date până acum
    if request.method == 'POST': # Gestionați cererea de postare
        form = PostForm(request.POST) # Creați o instanță a formularului și salvați datele la acesta
        if form.is_valid(): # Validați formularul
            form.save() # Salvați noul obiect
        return redirect(reverse('feed:feed')) # Redirecționați către aceeași adresă URL cu o cerere GET
        'form': PostForm(), # Asigurați -vă că treceți forma în context, astfel încât să o putem reda.

Acum, va trebui să actualizăm șablonul pentru a ține cont de noul formular. Putem face acest lucru folosind

Etichetați în HTML și redarea formularului în șablonul HTML cu un buton de trimitere. De asemenea, vom avea nevoie de un jeton CSRF, un simbol care împiedică postarea site -urilor externe în formular fără a încărca mai întâi o pagină.

Să descompunem asta. Există o nouă clasă de formă, un jeton, formularul în sine și un buton de trimitere. Destul de simplu, dar atunci când aruncăm o privire, s -ar putea să vrem să -l facem să pară mai bine. Funcționează, putem posta postări noi cu formularul și acum sunt salvate în baza de date. Există câteva lucruri care se întâmplă aici. Folosim etichete HTML pentru a declara că documentul este un document HTML, folosim o etichetă de șablon ({ % ... %}) pentru a reda jetonul pentru formular, și altul, {{...}} pentru a reda forma. De asemenea, avem o buclă pentru a reda textul folosind etichete de bloc și o etichetă de șablon. Etichetele de bloc sunt cu adevărat importante, deoarece putem defini modul în care secțiunile șablonului sunt redate cu ele, iar etichetele șablonului stau la baza modului în care punem variabile în codul nostru.

Acum trebuie să facem aplicația noastră să arate mai bine, pentru că deocamdată pare cu adevărat de bază. Putem face acest lucru folosind CSS, fie în linie, fie în clase legate de fiecare obiect din document. CSS este foarte drăguț, deoarece spune totul pe pagină cum ar trebui să arate și îl poate face să pară foarte bine. Există câteva biblioteci care pot face acest lucru, dar pornirea mea personală este Bootstrap.

Bootstrap poate fi descărcat de pe site -ul lor,getbootstrap.com/. Odată ajuns acolo, apăsați butonul pentru a citi documentele de instalare și copiați codul din secțiunea Include prin intermediul CDN. Veți avea nevoie de acest cod în partea de sus a documentului dvs. HTML, într -o etichetă numită cap. De asemenea, să mergem mai departe și să creăm un șablon de bază, astfel încât nu trebuie să recreăm aceste legături în fiecare șablon.

Faceți un nou director numit șabloane cu șabloane mkdir, apoi editați șabloane/baze.html.

Ar trebui să arate astfel:

Asigurați -vă că copiați CSS și JavaScript, fișierele .css și .js, deoarece vom avea nevoie de JavaScript pentru a face site -ul nostru mai funcțional în viitor.

Acum, să ne întoarcem la coaja Bash și să rulăm o comandă rapidă. Amintiți -vă, dacă aveți nevoie vreodată de acces la mediul virtual, tastați sursa Venv/bin/activare. Acest lucru vă va permite să instalați pachete Python la nivel local într -un mod care să -l permită lui Django să le acceseze. Pentru a oferi formularele noastre generate de clasele Django Bootstrap, vom folosi un pachet Python numit Crispy Forms. Putem descărca acest lucru cu următoarea comandă

pip install django-crispy-forms

Odată instalat acest lucru, adăugați -l la setări.py

    # ... cod anterior aici

Acum, înapoi în șablonul nostru de feed, putem elimina unele lucruri. Să eliminăm începutul și sfârșitul documentului și îl înlocuim cu moștenire din șablonul nostru de bază, folosind extinderi și definiția blocului. De asemenea, vom adăuga un import de filtru de șablon cu încărcare și un filtru de șablon la formular. În cele din urmă, să adăugăm o clasă de bootstrap la butonul din formular pentru a face să pară mai mult ca un buton. Asta ar trebui să arate astfel:

Frumos! Acesta este deja un pic de cod. În continuare, ar trebui să -l testăm și să ne asigurăm că putem vedea că totul arată frumos și, de asemenea, să fim siguri că totul funcționează corect. Rulați serverul conform instrucțiunilor anterioare și asigurați -vă că site -ul arată și funcționează bine. O treabă grozavă! Sunteți gata să treceți la următorul pas, în care vom adăuga funcționalitate de conectare a utilizatorului folosind adrese URL, formulare, vizualizări și șabloane similare. Șablonul de bază este important și vom continua să -l modificăm și să facem modificări după cum este necesar, dar deocamdată să ne concentrăm pe faptul că site -ul nostru este mai sigur, permițând utilizatorilor să se conecteze cu un nume de utilizator și un parolă și, în cele din urmă, informații și mai importante, care vă vor ajuta să vă păstrați aplicația sigură și cu propriul dvs. cont accesibil numai de către dvs.

Pentru a face acest lucru, va trebui să utilizăm modelul de utilizator încorporat în Django. Modelul de utilizator este un model de baze de date, precum postarea noastră, care poate fi redat pentru a înregistra un utilizator pe site -ul web. În viitor, înainte de a implementa site -ul pe internet, vom extinde acest model cu alte modele atribuite acestuia și vom construi măsuri suplimentare de securitate pentru conectarea care sunt rezistente la phishing. Vom începe folosind unele formulare de conectare încorporate pe care Django le oferă. În primul rând, să creăm o nouă aplicație pe care o vom folosi pentru a reda șabloanele și vizualizările pentru pagina de conectare de bază. De asemenea, vom crea alte aplicații care să reprezinte provocările de conectare continue pentru a asigura aplicația, inclusiv o pincode, recunoaștere facială, comunicare aproape pe câmp, dispozitive externe, autentificare multi -factor și recunoaștere a amprentelor digitale.

Am vorbit deja despre începerea unei aplicații. Din directorul nostru, în interiorul mediului virtual, trece gestionarea acestor argumente

python manage.py startapp users

Acum, ar trebui să avem un director pentru noua aplicație. Să începem prin crearea unei vizualizări în acel director care corespunde conectării utilizatorului. Django a încorporat vizualizări pentru autentificările utilizatorilor, dar acestea nu vor fi potrivite pentru noi, deoarece avem nevoie de o vizualizare personalizată, care se face de preferință cu o definiție.

În această viziune, vom începe verificând o cerere de postare, o solicitare de trecere.POST către o autentificare importată de la Django, autentifică contul de utilizator și conectați -vă la utilizator înainte de a le redirecționa către aplicația noastră de feed.

În utilizatori/vizualizări.py, adăugați următorul cod

        username = request.POST['username'] # Obțineți numele de utilizator și parola din cererea de postare
        password = request.POST['password'] # Autentificați utilizatorul

Aceasta este tot ce ai nevoie pentru o vizualizare de bază de conectare. Acum, să creăm un formular pentru vedere prin extinderea șablonului de bază. Vom începe prin a crea un nou director pentru șabloane în folderul utilizatorilor.

mkdir users/templates
mkdir users/templates/users

Acum, ar trebui să putem edita utilizatori/șabloane/utilizatori/login.html. În timp ce suntem la el, vom crea un șablon care să permită utilizatorului să se înscrie și el.

nano users/templates/users/login.html

Acum, în șablon,

Acesta este elementele de bază ale unui șablon de conectare. Este într -adevăr la fel ca celălalt șablon din structură, dar pare puțin diferit atunci când este redat. Putem copia acest cod pentru a construi un alt șablon foarte similar numit Register.html, unde vom schimba formularea și vom folosi un nou formular pe care îl construim. Să facem șablonul mai întâi. Editați utilizatori/șabloane/utilizatori/registru.html și adăugați următorul cod:

Acum, haideți să construim un formular pentru înregistrarea utilizatorului nostru și să ne retragem la vizualizări înainte de a ne actualiza autentificările utilizatorului cu un model. Vom face ca acest formular să fie de bază pentru a începe, dar vom încorpora mai multe detalii și caracteristici de securitate, cum ar fi acorduri și CAPTCHA în viitor. Editați formularele cu Nano Users/Formss.Py și adăugați următorul cod.

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']

Deci avem o altă formă aici, care funcționează destul de simplu. Este un formular de înregistrare a utilizatorului cu un nume de utilizator, e -mail și parolă, precum și un câmp de parolă Confirm. Rețineți că acest formular nu extinde clasa de formă obișnuită. Este o formă model care înseamnă că are o meta. Un câmp este definit la fel, iar meta -ul de clasă definește modelul pe care forma corespunde restului informațiilor care vor fi scrise formularului. Cea mai mare parte a acestora există deja în Django încorporată în UserCreationForm, așa că o vom folosi ca bază pentru clasă (trecută în paranteză).

În continuare, vom examina punctul de vedere pentru a înregistra un utilizator, acum că avem un formular și un șablon. Aceasta este o modalitate de mod, la fel ca cea din noua vizualizare a postului. Editați utilizatorii/vizualizări.py și adăugați următorul cod:

# ... importuri

Acest lucru este tot ce avem nevoie pentru a înregistra un utilizator, dar ar trebui să avem mai multe informații. Vrem să știm momentul în care s -a înregistrat utilizatorul, la ce oră au fost ultima dată pe site, câteva informații despre ei, cum ar fi o biografie, fusul orar, etc. De asemenea, va trebui să actualizăm modelul nostru de feed, postare, pentru a ține cont de modelul utilizatorului și de postări de atribuire a fiecărui utilizator. Pentru a face acest lucru, vom actualiza modelele.py în ambele aplicații. Să începem prin editarea modelului de alimentare. Ar trebui să arate așa acum:

from django.db import models # ... importuri
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Adăugați în această linie

Acordați atenție la a doua linie care a fost adăugată în fișier. Aceasta este o cheie străină, care va atribui fiecare postare unui singur utilizator pe postare, astfel încât să ne putem asigura că salvăm postările de pe un utilizator pe utilizator și nici o postare nu poate fi făcută fără a o atribui unui utilizator. Definim această cheie străină cu clasa pe care o reprezintă, un argument de ștergere pentru a ne asigura că postările sunt șterse cu utilizatorii, argumente nule și goale pentru a ne asigura că putem elimina utilizatorul, dacă este necesar, și pentru a se adapta pentru lipsa unui utilizator pe postările pe care le -am creat deja și un nume înrudit, pe care îl putem folosi pentru a face referire la obiectele postări pe care le creează utilizatorul. Acest nume înrudit, spre deosebire de Post.Author, autorul The Post, ne oferă un utilizator care a postat postarea în sine. Acum putem obține postările pe care un utilizator le -a rulat user.posts.all () sau autor.posts.all ().

Acum, să facem conectările noastre mai rezistente. Putem deja să facem site -ul nostru mult mai puțin vulnerabil la phishing, prin simpla limitare a numărului de ori, vom permite o conectare la site, acest lucru este destul de ușor. Să începem, de asemenea, să stocăm câteva informații despre fiecare utilizator înainte, pe măsură ce continuăm să ne dezvoltăm aplicația. Editarea utilizatorilor/modelelor.py, adăugați următorul cod.

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='')

Rețineți că acest model este destul de asemănător cu modelul Post. Avem un import suplimentar, fus orar, care ne va permite să setăm valorile implicite pe câmpurile DateTime și avem, de asemenea, un caracterFeild și un textfield precum The Post. Utilizarea tuturor acestor Timestamps ne ajută să setăm site -ul și să înțelegem utilizarea acestuia, iar câmpurile de text ne permit să transmitem informații despre fiecare utilizator sau autor, pe site -ul web. Onetoonefield ar trebui să fie singura considerație minoră, se comportă exact la fel ca un anterior, dar cu doar unul pe model ulterior. În acest fel, utilizatorul are un singur profil, în timp ce poate avea multe postări.

Acum, să ne îmbunătățim conectarea și să înregistrăm vizualizările pentru a ține cont de profil. În primul rând, editați utilizatorii/vizualizări.py și concentrați -vă pe vizualizarea registrului:

# ... importuri
            Profile.objects.create(user=user) # Asigurați -vă că adăugați această linie, pentru a crea un profil pentru utilizator

Acest lucru creează pur și simplu un profil pentru utilizator, fără a completa niciuna dintre informații. Acum, vrem să ne asigurăm că contul de utilizator nu poate fi conectat prea des, sau cel puțin parolele nu pot fi încercate prea des, așa că haideți să actualizăm vizualizarea de conectare.

# ... importuri
        if user and user.profile.can_login < timezone.now(): # Rețineți că acum verificăm dacă utilizatorul se poate conecta
        else: # Dacă autentificarea nu a reușit,
            user = User.objects.filter(username=username).first() # Aceasta este partea în care actualizăm profilul utilizatorilor
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Deci nu se pot autentifica din nou pentru câteva secunde

Acesta este fundamentala de bază a securității. Asigurați -vă că site -ul nu este vulnerabil la cineva care încearcă pur și simplu fiecare combinație de parole posibile, sau chiar câteva dintre ele în același timp. Acest lucru nu va fi frustrant pentru utilizatorul obișnuit care își cunoaște parola și doar se conectează pe câteva dispozitive, dar va păstra numeroși roboți de phishing în afara aplicației. Rețineți că am adăugat o declarație if cu o variabilă, can_login, aceasta ar trebui să fie un timp în trecut și să o actualizăm cu fiecare autentificare nereușită folosind același nume de utilizator. În acest fel, un utilizator rău intenționat nu va putea ghici o parolă nicăieri aproape. Numărul de secunde din DateTime.Timedelta () poate fi actualizat și site -ul web va fi mai rezistent, dar puțin mai puțin utilizabil, cu mai multe secunde. Recomand 15 pentru a începe.

Amintiți -vă, am construit un script de rezervă pentru a ne salva munca, așa că haideți să mergem înainte și să susținem ceea ce avem până acum pentru a ne asigura că avem totul salvat. Rulați comanda:

sudo backup

Încă o dată, acest lucru vă va salva munca până acum. Vă recomand să rulați backup -uri frecvente pentru a vă salva munca și este posibil să doriți chiar să rulați automat o lucrare de rezervă. Puteți face acest lucru folosind un utilitar UNIX numit Cron. Pentru a activa această utilitate, rulați următoarea comandă și introduceți parola:

sudo crontab -e

Dacă nu ați selectat deja opțiunea 1 pentru Nano, editorul de text, ar trebui să fiți deja familiarizați și să derulați în partea de jos a fișierului folosind tastele săgeată. Adăugați următoarea linie:

0 * * * * sudo backup

Cron folosește formatul minut, ora, ziua lunii, luna, ziua săptămânii, unde un * sau un număr reprezintă când să ruleze comanda. Folosind un 0 pentru minut și * pentru restul opțiunilor, putem rula o comandă în primul minut al fiecărei ore la începutul minții. Acest lucru ne permite să facem o copie de rezervă automat codul. Toate joburile lui Cron atunci când sunt executate cu sudo rulează ca rădăcină, așa că nu va trebui să introducem o parolă în fiecare oră.

Pentru a facilita copierea de rezervă a codului nostru fără a folosi o parolă, să dezactivăm parola pentru comanda noastră de rezervă. Vom face acest lucru executând următoarea comandă și introducând o parolă:

sudo visudo

Acum, să derulăm în partea de jos a fișierului și să adăugăm o altă linie:

ALL ALL=NOPASSWD: /bin/backup

Acest lucru ne permite să rulăm comanda „Backup" ca orice utilizator, fără parolă. Formatul pentru aceasta este ușor, trebuie să prefixați linia cu „All = nopasswd:/bin/" și încheiați cu comanda, de exemplu/bin/backup, care există în/usr/bin/.

Acum, să începem să lucrăm cu e -mail. E -mailul este într -adevăr important pentru site -urile web, deoarece este o modalitate de a menține un site web mai sigur, de a verifica utilizatorii sunt oameni reali și chiar de produse sau servicii de piață către clienți. Mulți oameni care frecventează internetul își verifică zilnic e -mailul și primesc tot felul de e -mailuri de marketing despre produsele și serviciile de care sunt interesați. Există câteva opțiuni atunci când vine vorba de a permite e -mailul pe un site web Django și sunteți bineveniți să alegeți ceea ce funcționează cel mai bine pentru dvs.

În primul rând, puteți plăti pentru un serviciu de e -mail care vă va permite să trimiteți e -mail de pe domeniul dvs. și necesită un cod minim. Există multe servicii care oferă acest lucru, cum ar fi Google Workspace, SendInBlue, Mailgun și multe altele.

În caz contrar, de la zero vă construiți propriul serviciu de e -mail pe serverul dvs. de la zero. Recomand această opțiune, chiar dacă este mai mult cod și poate necesita o găzduire specială. Nu veți putea porni cel mai probabil un server de poștă de pe computerul de acasă, așa că haideți să mergem mai departe și să examinăm configurația și codul pentru a trimite e -mail înainte de a începe un server în cloud și pentru a crea propriul nostru server de poștă în interior.

În primul rând, editați setări.py cu următoarea comandă:

nano app/settings.py

Unde aplicația este numele aplicației pe care ați creat -o cu StartApp.

Adăugați următoarele linii:

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)

Asigurați -vă că schimbați acestea atunci când sunteți gata să vă implementați aplicația, vom revizui acest lucru mai târziu. Setarea email_address ar trebui să fie e -mailul pe care doriți să îl trimiteți, iar parola (email_host_password) ar trebui să fie setată la parola pe care o generați pentru server. Încărc parola dintr -un fișier de configurare pentru a -l ține în afara codului folosind următoarea logică, deasupra acestor linii în setări.py:

import os
import json
with open('/etc/config.json') as config_file:
    config = json.load(config_file)

Apoi, am configurat un fișier JSON cu config în /etc/config.json folosind Nano după cum urmează.

Pentru a edita fișierul:

sudo nano /etc/config.json

Adăugați următoarele linii:

{
	"EMAIL_HOST_PASSWORD": "<some password here>"
}

Vom continua să edităm fișierul de configurare și să adăugăm toate parolele și tastele pe care le vom folosi în aplicație. Deocamdată, să examinăm rapid cum să trimitem e -mail folosind Python. În primul rând, să creăm un șablon pentru un e -mail de verificare pe care îl putem trimite utilizatorilor noștri și îl putem pune în directorul de șabloane de utilizator. Acest șablon va fi scris în HTML.

nano users/templates/users/verification_email.html

Acest e -mail este destul de simplu. Este nevoie de un context al unui utilizator, al adresei URL de bază pentru site și a unui ID de utilizator și a unui simbol care sunt utilizate pentru a verifica e -mailul utilizatorului. Asigurați -vă că definiți adresa URL de bază în setări.Py înainte de a scrie un cod Python pentru a reda șablonul. Continuați și adăugați următoarele linii la aplicație/setări.py, aproape de început.

SITE_NAME = 'Django App'
PROTOCOL = 'https'
DOMAIN = 'example.com'

BASE_URL = PROTOCOL + '://' + DOMAIN

În cele din urmă, atunci când site -ul dvs. este gata pentru internet și îl implementați, veți dori să definiți domeniul dvs. ca nume de domeniu pe care îl cumpărați pentru a reprezenta site -ul. Acesta este numele pe care îl veți tasta în Navbar pentru a vă accesa site -ul. Deocamdată, puteți părăsi domeniul necompletat sau puteți utiliza un loc de loc. De asemenea, veți dori să schimbați numele_ pe un nume pe care doriți să -l dați site -ul dvs., la alegerea dvs.

Înainte de a trimite e -mail, să creăm un generator de jetoane, astfel încât să putem avea un jeton de activare a contului care nu expiră niciodată. Putem face acest lucru prin construirea și importarea unui jeton de activare a contului care arată ca următoarele. Editați fișierul:

nano users/tokens.py

Adăugați următorul cod:

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()

Acest generator de jeton de bază generează un jeton pe care îl putem trimite utilizatorul într -o adresă URL, iar utilizatorul poate utiliza pentru a -și verifica e -mailul și a -și activa contul.

În continuare, să vedem cum să trimitem un e -mail. Folosind nano, editați utilizatori/email.py.

nano users/email.py

Trimiterea e -mailului HTML de verificare va arăta astfel:

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)

Acest lucru este destul de simplu. Importăm funcțiile de care trebuie să trimitem e -mailul, să redăm e -mailul cu șabloane și setările noastre, apoi definim e -mailul cu numele șablonului și îl trimitem utilizatorului folosind o funcție. Veți observa că nu am definit funcția pentru a trimite e -mailul, send_html_email, așa că hai să scriem acest lucru sub codul pe care l -am adăugat deja la utilizatori/email.py

def send_html_email(user, mail_subject, html_message):
    to_email = user.email
    username = user.username
    if to_email == '':
        return None
    unsub_link = settings.BASE_URL + user.profile.create_unsubscribe_link()
    html_message = html_message + "<p><a href=\"" + unsub_link +  "\" + title=\"Unsubscribe from " + settings.SITE_NAME + " emails\">Unsubscribe</a></p></body></html>"
    msg = EmailMultiAlternatives(mail_subject, strip_tags(html_message), settings.DEFAULT_FROM_EMAIL, [to_email], headers={'List-Unsubscribe' : '<' + unsub_link + '>'},)
    msg.attach_alternative(html_message, "text/html")
    profile = user.profile
    try:
        msg.send(fail_silently=False)
        if not profile.email_valid:
            profile.email_valid=True
            profile.save()
    except:
        profile.email_valid=False
        profile.save()

Acest lucru este ceva mai complex și încă nu suntem pregătiți să rulăm tot acest cod. Observați că definim un nesub_link, linkul pe care utilizatorul îl poate utiliza pentru a se dezabona de pe e -mailurile noastre. Acest lucru este important, deoarece utilizatorii vor trebui să poată renunța la e -mailurile noastre, cu excepția cazului în care vor să le vadă, în orice moment. De asemenea, adăugăm o alternativă de text la mesajul nostru, care este mesajul HTML dezbrăcat de etichetele HTML. În cele din urmă, verificăm dacă e -mailul a trimis și, dacă nu, marcăm în profilul utilizatorului că e -mailul lor nu este valabil.

Să ne întoarcem la modelele de utilizator, astfel încât să putem face ca toate acestea să funcționeze. Trebuie să definim o funcție pentru a genera un link pentru a vă dezabona și a defini un câmp boolean pentru a marca faptul că e -mailul utilizatorului nu este valabil.

În primul rând, adăugați următoarele importuri în partea de sus a utilizatorilor/modelelor.py

nano users/models.py
# ...

În continuare, să adăugăm funcții la modelul de utilizator pentru a face jetonul și a verifica jetonul utilizat pentru a activa e -mailul, precum și câmpul pentru a salva dacă utilizatorul primește cu succes e -mailul. În utilizatori/modele.py din nou, adăugați următorul cod la sfârșitul modelului (cod indentat)

# ...
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Valabil timp de 30 de zile

Acest lucru este destul de simplu, folosim un timestampsigner, care este un instrument de criptografie de bază, pentru a crea un simbol care va expira după o anumită perioadă de timp și folosim și o altă funcție pentru a verifica dacă este valabilă. Folosim aceste jetoane de două ori, o dată pentru a verifica e -mailul și o dată pentru un link de dezabonare.

Acum că le avem, ultima dintre lucrările pe care va trebui să le facem este în viziuni. În cadrul utilizatorilor/vizualizări.py, să adăugăm vizualizări pentru a verifica adresa de e -mail și pentru a vă dezabona.

nano users/views.py

În primul rând, adăugați următoarele importuri. Am aruncat câteva în plus, așa că nu va trebui să importăm mai multe articole din nou mai târziu.

from .email import send_verification_email # Asigurați -vă că importați funcția de trimitere a e -mailului de verificare

Este posibil să aveți deja unele dintre aceste importuri, dar nu vă doare să le repetați. Va trebui să importați funcția de trimitere a e -mailului de verificare, precum și cont_activare_token de la utilizatori.tokens, printre alte importuri.

Acum, în partea de jos a fișierului, adăugați următorul cod:

        # dezabonați -le
    # În caz contrar, redirecționarea către pagina de conectare
# SendWelCeEMail (cerere, utilizator)

Acesta este mult cod. Să o descompunem. Prima funcție, curată și simplă, dezabonează utilizatorul din lista de corespondență. A doua funcție își activează e -mailul și veți observa că am adăugat o funcție comentată, SendWelCeeMemail. Sunteți bineveniți să utilizați un șablon de e -mail și o definiție a funcției pentru a trimite un e -mail de bun venit, nu am făcut încă. Ultima funcție pe care am aruncat -o este importantă, deoarece e -mailurile de activare expiră. Prin urmare, va trebui să returnăm e -mailul de activare o parte din timp. Putem folosi un formular de bază pentru acest lucru și putem apela funcția pentru a trimite e -mailul de verificare. Înainte de a face acest lucru, să ne asigurăm că va fi trimis în primul rând, adăugând un apel funcțional la vizualizarea registrului. Adăugați această linie chiar înainte de redirecționarea în Vizualizarea registrului, Registrul def, în utilizatori/vizualizări.py.

nano users/views.py
# ... (după) Def Register (cerere):
# ... (înainte) Redirecționarea (

Nu trebuie să adăugați primele și ultimele linii din fragmentul de cod, trebuie doar să vă asigurați că vizualizarea registrului trimite e -mailul de verificare utilizatorului. Ar trebui să arate astfel:

# ... importuri
            send_verification_email(user) # Asigurați -vă că adăugați această linie!

Acum, va trebui să adăugăm un formular pentru a returna e -mailul de activare. În utilizatori/formularele.py, adăugați următorul formular:

# ... (importuri)

De asemenea, vom avea nevoie de un șablon corespunzător acestui formular de activare a e -mailului Resend. Să adăugăm acest șablon. Editați fișierul:

nano users/templates/users/resend_activation.html

Apoi, adăugați următorul cod în fișier.

Whew, asta e mult! Acum, când implementăm codul pe serverul nostru, vom putea trimite e -mailuri HTML și activăm conturile de utilizator cu un clic în e -mail. De asemenea, s -ar putea să dorim să trimitem un e -mail simplu de bun venit, așa că să vedem cum să facem asta. Înapoi la utilizatori/email.py, adăugați următorul cod:

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)

De asemenea, vom avea nevoie de un șablon pentru a oferi toate aceste informații. Pe site -ul meu web, șablonul arată ca cel de mai jos, dar sunteți bineveniți să îl formați, oricum doriți.

Rețineți că nu avem etichete de închidere a corpului sau HTML, pentru că le adăugăm atunci când adăugăm linkul de dezabonare HTML. Acestea sunt importante, dar nu vrem să le definim de două ori.

Deci, ce urmează? Am parcurs un drum lung. Într -adevăr, ar trebui să fim gata să implementăm site -ul pe un server. Putem adăuga decoratorul @Login_Required și ne putem asigura vizualizările, să ne asigurăm înscrierile utilizatorilor, să trimitem e -mailuri conforme și informații în cache, care este baza a ceea ce trebuie să facă un site web pentru a rămâne relevant. Vom adăuga câteva caracteristici mai utile, apoi vom construi o bază pentru implementarea codului nostru pe un server la distanță, configurarea unui server de poștă, configurația domeniului și filtrele pentru a face site -ul nostru sigur și adecvat.

De asemenea, vom avea nevoie de o vizualizare de resetare a parolei, așa că haideți să adăugăm asta într -adevăr rapid. Vizualizarea de resetare a parolei încorporată în unele funcții Django este ruptă în unele funcții, dar vom analiza cum să scriem propria noastră vizualizare, șablon de e -mail, formulare și modele de url. Iată cum arată viziunea, în utilizatori/vizualizări.py

# ... importuri

Acest formular este încorporat în Django, dar vom avea nevoie de un șablon pentru a confirma resetarea parolei, utilizatorii/șabloane/utilizatori/parola_reset_confirm.html

De asemenea, avem un șablon pentru a trimite un e -mail de resetare a parolei, cu un formular simplu, la utilizatori/șabloane/utilizatori/parolă_reset.html

Șablonul pentru e -mailul în sine este simplu, este un fișier HTML de bază care redă un link pentru a reseta parola, la utilizatori/șabloane/utilizatori/parolă_reset_email.html. Django va interpreta automat acest fișier.

De asemenea, vom mai avea nevoie de încă două șabloane. Primul este de a confirma că e -mailul a fost trimis. Vizualizările pentru acestea sunt deja în Django, așa că trebuie doar să le adresăm în urls.py. Acest șablon este localizat la utilizatori/șabloane/utilizatori/parolă_reset_done.html

Și, în sfârșit, pentru a confirma că resetarea parolei este completă, utilizatori/șabloane/utilizatori/parolă_reset_complete.html

Acum, avem nevoie de modele URL pentru aceste puncte de vedere. La utilizatori/urls.py, adăugați următoarele modele URL:

    # ... URL -uri anterioare aici

Patru șabloane, asta e mult! Dar acum putem fi siguri că vom putea reseta parola utilizatorului de fiecare dată când trebuie, toate din browserul web.

Înțeleg că este mult cod. Dacă pare puțin peste cap, este în regulă. Vă veți îmbunătăți, înțelegerea dvs. se va îmbunătăți și veți deveni mult mai competent cu codul foarte curând. Dacă sunteți total pierdut, vă recomand să reveniți la acest software mai târziu, după ce ați lucrat la un curs de învățare auto-i-a fost curs online. Acestea sunt de obicei libere pentru a începe și vă vor ghida prin tot ceea ce aveți nevoie pentru a avea succes atunci când reveniți la acest proiect. Dacă simțiți că sunteți gata să continuați, să citiți mai departe, în continuare, vom acoperi implementarea codului dvs. pe un server de la distanță și configurarea unui server de poștă, precum și automatizarea implementării dvs. folosind Bash, astfel încât să puteți configura întotdeauna un nou proiect cu câteva comenzi simple.

Ultimul lucru pe care trebuie să -l facem înainte de a ne implementa pe un server la distanță este să facem site -ul nostru un pic mai sigur. Veți observa că vizualizarea conectării are doar un nume de utilizator și o parolă și nu există o autentificare multi -factor sau un cod de timp. Aceasta este o soluție ușoară și, cu același cod, putem face ca site -ul nostru să trimită mesaje text și chiar să răspundem la mesajele text trimise către server. Pentru început, vom reveni la modelele de utilizator și vom adăuga un semnator de timestamp care va reprezenta fiecare autentificare. Vom adăuga, de asemenea, un identificator unic, rotativ, la modelul de utilizator, care va fi utilizat pentru a adăuga o securitate suplimentară la autentificarea noastră. Editarea modelelor de utilizator, utilizatorilor/modelelor.py, adăugați următorul cod:

# Asigurați -vă că importați UUID, semnatar de timestamp și generator URL (invers)
    # Adăugați acest cod aici
    # Și adăugați această funcție
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Valabil timp de 3 minute

Asigurați -vă că utilizatorii/modelele dvs. arată așa, pe lângă comentarii (cod pe linia cu #). Dărâmând acest lucru, este simplu. Avem câteva importuri, un timestampsigner care este o utilitate criptografică care poate genera un cod sigur și îl poate verifica pentru a vă asigura că este valabil, a fost folosit doar o dată și nu mai vechi decât un anumit număr de secunde. De asemenea, folosim un UUID, care este un identificator unic care identifică utilizatorul nostru în semnarea jetonului și în adresa URL unde jetonul este trimis utilizatorului. Vom folosi această criptografie de bază pentru a construi o vedere de autentificare în doi factori. Înainte de a face orice altceva, să rulăm migrațiile, astfel încât modelele noastre de utilizator să fie actualizate. În directorul cu manage.py, rulați următoarele comenzi pentru a face și completa migrațiile.

source venv/bin/activate
python manage.py makemigrations && python manage.py migrate

Acest lucru este important, deoarece de fiecare dată când facem modificări la modele, va trebui să creăm tabelele și să actualizăm baza de date cu valorile implicite înainte de a putea utiliza efectiv modelele.

În continuare, să improvizăm vizualizarea noastră de conectare pentru a redirecționa către o vizualizare de autentificare secundară. În utilizatori/vizualizări.py, eliminați funcția de autentificare și redirecționați către adresa URL pe care tocmai am generat -o în modelele de utilizator.

# ... importuri
        if user and user.profile.can_login < timezone.now(): # Rețineți că acum verificăm dacă utilizatorul se poate conecta
            # Eliminați funcția Auth_Login care a fost aici
                return redirect(user.profile.create_auth_url()) # Rețineți că redirecționăm către o nouă adresă URL aici
            else: # Dacă utilizatorul nu utilizează autentificare cu mai multe factori, trebuie doar să le conectați.
        else: # Dacă autentificarea nu a reușit,
            user = User.objects.filter(username=username).first() # Aceasta este partea în care actualizăm profilul utilizatorilor
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Deci nu se pot autentifica din nou pentru câteva secunde

Deci, acest lucru este destul de simplu, acum avem o modalitate de a redirecționa către vizualizarea autentificării celor doi factori atunci când o creăm. De asemenea, avem un Fallback în cazul în care utilizatorul nu a adăugat un număr de telefon. Vom adăuga o vizualizare de bază pentru a adăuga în curând un număr de telefon și pentru a vă conecta cu un mesaj text în curând.

În primul rând, avem nevoie de o modalitate ușoară de a trimite un mesaj text din codul nostru. Pentru a face acest lucru, putem alege dintr -o serie de API -uri, dar cea mai ușoară după părerea mea este Twilio. De asemenea, oferă prețuri bune pentru proiecte mai mici, precum și reduceri în vrac. Creați un cont pe Twilio.com, completați câteva detalii despre proiectul dvs., cumpărați un număr de telefon și copiați cheile API în setările dvs. Apoi, adăugați acest cod sub un fișier nou, utilizatori/sms.py.

nano users/sms.py
# Importați toate pachetele necesare
# Acest cod trimite textul cu Twilio
# O funcție de ajutor pentru a obține un număr cu atât de multe cifre
# Trimiteți textul pentru a verifica utilizatorul
# Trimiteți unui utilizator orice text cu această funcție
# Validați codul cu această funcție
# Validați timpul

Asigurați -vă că schimbați setările în mod corespunzător, adăugând aceste linii cu tastele:

# Asigurați -vă că le copiați din tabloul de bord Twilio
AUTH_VALID_MINUTES = 3 # Numărul de minute Pagina TFA este activă odată instantanee

În primul rând, vom avea nevoie de formulare pentru vizualizările noastre de autentificare a celor două factori. Editarea utilizatorilor/formularelor.py, adăugați următorul cod.

# ... importuri
# Un formular pentru introducerea numărului nostru de telefon
# Un formular pentru autentificare

În continuare, să creăm vizualizările în utilizatori/vizualizări.py

# ... importuri

De asemenea, vom avea nevoie de șabloane pentru ambele puncte de vedere. Să adăugăm mai întâi șablonul MFA.

nano users/templates/users/mfa.html

Adăugați acest cod HTML la șablon

Acest lucru este destul de explicativ. Formularul trimite fie un cod, fie un cod gol și veți observa în vizualizare, trimitem codul dacă primim un cod gol. Apoi avem doar două butoane de trimitere și în acest fel putem trimite codul cu oricare dintre buton. În continuare, vom adăuga un formular simplu pentru a adăuga un număr de telefon.

nano users/templates/users/mfa_onboarding.html

Adăugați următorul HTML:

Acest formular este mult mai simplu, redă doar formularul de număr de telefon pe care l -am creat și permite utilizatorului să adauge un număr de telefon.

Arată foarte bine! Atâta timp cât totul este configurat corect, ar trebui să putem trimite mesaje și să înregistrăm utilizatorul cu numărul lor de telefon imediat ce adăugăm modelele URL. Ultimul lucru pe care trebuie să -l configuram este o vizualizare de profil, astfel încât să ne putem asigura că utilizatorul își poate schimba numărul de telefon fără a fi conectat. De asemenea, în cele din urmă vom dori să adăugăm o opțiune „Stop pentru a renunța", astfel încât utilizatorul să poată text „opriți" pentru a renunța la mesajele text viitoare.

Să adăugăm o vizualizare de profil la utilizatori/vizualizări.py. Această vizualizare va actualiza bio -ul utilizatorului, e -mailul, numele de utilizator și numărul de telefon, precum și ne va permite să activăm autentificarea mai multor factori. În primul rând, vom avea nevoie de alte două forme în utilizatori/formulare

# ... importuri

În continuare, putem crea o vedere pentru a utiliza ambele aceste forme. Editați utilizatorii/vizualizări.py și adăugați în vizualizare.

# Adăugați aceste importuri

De asemenea, vom avea nevoie de un șablon pentru această viziune.

nano users/templates/users/profile.html

Veți observa că aceasta este o formă destul de simplă, dar are câteva JavaScript în el, care postează automat conținutul formularului pe măsură ce sunt actualizate. Acest lucru este util pentru a avea, astfel încât puteți face modificări fără a fi nevoie să apăsați de fiecare dată.

În continuare, avem nevoie de adrese URL care să reprezinte toate aceste opinii în URL -ul URL Patters. Editați utilizatori/urls.py și adăugați acest cod:

# ... cod anterior, importuri
# ... Modele URL pe care le -am introdus anterior, adăugați următoarele trei rânduri

Acum este un moment bun pentru a testa proiectul nostru. Dar mai întâi, să rulăm o altă rezervă.

backup

Și rulați serverul. Înainte de a ne implementa pe un server Linux, este o idee bună să activăm autentificarea cu doi factori pe cont. Vom face acest lucru la adresa URL a profilului nostru,/utilizatori/profil/, și vom verifica caseta pentru a activa autentificarea după introducerea numărului nostru de telefon, apoi trimiterea formularului.

python manage.py runserver localhost:8000

Accesați pagina web accesând browserul dvs. web, folosesc Google Chrome în acest exemplu și introducând URL -ul https: // localhost: 8000/conturi/profil/

Veți putea să vă conectați dacă este necesar și să activați autentificarea cu doi factori.

Acest proiect are nevoie de un server pe care să -l ruleze, astfel încât să poată trimite cu adevărat mail. Dar mai întâi, avem nevoie de o modalitate de a vedea erori. Veți observa că dacă rulați serverul în modul de depanare, cu setări.debug egal cu adevărat, serverul arată erorile automat. Pentru a afișa erori fără a utiliza modul de depanare, care este nesigur pe un server de producție, ar trebui să adăugăm o vizualizare pentru acesta. Cele mai importante erori pe care trebuie să le putem gestiona sunt:

Eroarea 500 - o problemă cu codul nostru Eroare 404 - o pagină care nu a fost găsită (URL ruptă) Eroare 403 - o eroare refuzată de permisiune

Să adăugăm o aplicație nouă pentru a gestiona aceste erori, numite erori.

python manage.py startapp errors

Adăugați acest lucru la setări.py așa cum am făcut înainte, în setarea instalate_apps și începeți prin adăugarea de referințe la unele vizualizări în aplicație/urls.py, unde aplicația este numele proiectului dvs. Django.

handler404 = 'errors.views.handler404'
handler500 = 'errors.views.handler500'
handler403 = 'errors.views.handler403'

Acest lucru este tot ce avem nevoie, pe lângă vizualizări de eroare, șabloane și un pic de middleware. Să le definim pe cele așa:

# Creați -vă vizualizările aici.

În continuare, să definim middleware -ul pentru a gestiona aceste erori. Vom face acest lucru adăugând mai întâi la Middleware_Classes în Settings.py, cu numele Middleware -ului nostru.

    # ... middleware anterior

În continuare, să adăugăm middleware -ul.

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.')

Adăugăm o funcție pentru a obține excepția curentă prin utilizarea unui fileting local, care ne ajută să urmărim orice erori din codul nostru. În ceea ce privește șabloanele, avem nevoie doar de unul, deoarece definim dinamic titlul în vedere. Șablonul trebuie doar să redea titlul și „Trace", eroarea noastră de urmărire din context.

nano errors/templates/errors/error.html

Acesta este cel mai simplu șablon încă, dar este cât de ușor este să vedem erorile din proiectul nostru. În continuare, să dezactivăm depanarea în setări.

nano app/settings.py

Găsiți această linie în care este setată pe True și schimbați -o la FALSE

DEBUG = False

Continuați și faceți backup pentru aplicație acum. Suntem gata să ne implementăm pe un server Linux la distanță și să adăugăm funcții de acolo.

sudo backup

Înainte de a posta acest cod pe un server, ar trebui să luăm în considerare că pot exista unele probleme cu codul. În funcție de caz, site -urile care acceptă informațiile postate la acestea vor avea probleme cu spam -ul postat și dificultăți în eliminarea spamului. Acest lucru nu ar trebui să se întâmple imediat, dar dacă se întâmplă, ulterior vom examina cum să moderați automat spamul pe site și să facem mai dur pentru roboți să acceseze site -ul, împreună cu modul de dezactivare a conturilor de utilizator și să verifice identitatea utilizatorului cu o scanare a ID -ului lor sau o scanare biometrică, cum ar fi o amprentă sau o recunoaștere facială.

Privind exemplul de autentificare multi -factor pe care l -am examinat, în producție, lucrurile pot fi diferite. Observați cum ne limităm la limitarea de autentificare și token -uri expiră. Dacă roboții accesează un site, autentificarea cu doi factori poate fi mai dificilă, deoarece pot introduce coduri în același timp în care este utilizatorul. Pentru a combate acest lucru, să folosim un model în modelele de utilizator, declarând modul în care interacționăm cu site -ul atunci când ne autentificăm folosind autentificarea multi -factor cu un număr de telefon. De asemenea, vom adăuga o opțiune de autentificare cu e -mail. Începeți prin editarea modelelor de utilizator cu Nano.

nano users/models.py

Așa ar trebui să arate modelul pe care ar trebui să -l arate. Nu avem nevoie de metode, ci doar de variabile pentru a stoca un ID, utilizator, timestamp, expirare, lungime și încercări împotriva oricărei autentificări multi -factor (un cod precum 123456 trimis la un telefon sau un e -mail).

# Un jeton de bază folosit pentru a vă conecta la site -ul web

Să adăugăm, de asemenea, un privilegiu utilizatorului nostru și îl vom seta manual deocamdată, înainte de a migra în cele din urmă pentru a înscrie automat utilizatorii privilegiați. În modelele de utilizator, adăugați această linie în profil:

    vendor = models.BooleanField(default=False)

Ca în cazul oricăror modificări ale bazei de date, trebuie să facem migrații și să migrăm baza de date de fiecare dată când edităm un fișier modele.py în django. Amintiți -vă, pentru a face acest lucru, folosim mai întâi sursa (dacă nu a fost folosită deja de când terminalul a fost deschis) și apoi Python Manage.py pentru a face migrațiile și a migra.

cd project-directory-you-named # (dacă este necesar)

Deocamdată, puteți înscrie orice conturi pe care le -ați creat ca furnizori folosind shell -ul.

python manage.py shell
from users.models import Profile
p = Profile.objects.get(user__username='Charlotte')
p.vendor = True
p.save()
exit()

Acum, să evoluăm viziunea noastră de autentificare multi -factor pentru a utiliza acest jeton. În primul rând, trebuie să modificăm utilitățile noastre de ajutor MFA. Folosind 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
# Autentificați utilizatorul folosind e -mailul sau numărul de telefon
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filtrați jetonul după valoarea trecută în adresa URL (un 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)) # Dacă această sesiune nu a fost creată, creați -o
    user = User.objects.filter(id=token.user.id).first() # Obțineți utilizatorul din jeton
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Dacă sunt deja autentificate, conectați -le
    if not user: raise PermissionDenied() # Neagă dacă nu a fost găsit niciun utilizator
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Verificați jetonul de aut
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Conectați -vă utilizatorul dacă nu sunt deja conectați
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Stabiliți o expirare pe autentificarea lor multiplă factori
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Redirecționați utilizatorul către pagina următoare
    if not user.profile.mfa_enabled: # Verificați dacă MFA este activat
        if not check_verification_time(user, token): # Verificați ora
            user.profile.mfa_enabled = False # Ștergeți numărul de telefon
            user.profile.enable_two_factor_authentication = True # Activați MFA
            user.profile.phone_number = '+1' # Dezactivați numărul de telefon
            user.profile.save() # Salvați profilul
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Conectați utilizatorul dacă MFA -ul lor nu este activat
    if request.method == 'POST' and not fraud_detect(request, True): # Dacă cererea este o cerere de postare
        form = TfaForm(request.POST) # Instaniați forma
        code = str(form.data.get('code', None)) # Obțineți codul
        if code and code != '' and code != None: # Asigurați -vă că nu este gol
            token_validated = user.profile.check_auth_token(usertoken) # Verificați jetonul de aut
            is_verified = check_verification_code(user, token, code) # Verificați codul
            if token_validated: # Dacă totul
                if is_verified: # Este în ordine
                    user.profile.mfa_enabled = True # Activați MFA (dacă nu este deja activat)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Conectați -vă utilizatorul
                    for key, value in request.GET.items(): # Construiți o interogare pentru următorul parametru (dacă există)
                        return HttpResponseRedirect(next) # Redirecţiona
            elif not token_validated: # Dacă jetonul a fost invalid
            if p.mfa_attempts > 3: # Dacă ar fi prea multe încercări
            if form.data.get('send_email', False): # Trimiteți e -mailul (sau textul)
    # Redați formularul (pentru solicitări GET)

Când adăugăm acest cod, asigurați -vă că importați funcția pentru a trimite un e -mail. În partea de sus a fișierului, utilizatorul vizualizează (cu alte importuri), adăugați

from .mfa import send_verification_email as send_mfa_verification_email

Acum, trebuie să scriem acea funcție înainte ca oricare dintre acestea să funcționeze. Ar trebui să extindă funcția noastră de e -mail de trimitere și pur și simplu să trimită un e -mail utilizatorului cu codul de verificare.

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))

Deci, toate acestea funcționează excelent, acum avem un sistem de autentificare multi -factor care depinde de un număr de telefon sau e -mail pentru a vă conecta. Dar avem nevoie și de o modalitate de a elimina, sau cel puțin ascundem utilizatorii care nu cooperează cu termenii noștri. Aceștia ar putea fi spammeri, roboți sau oricine nu înseamnă bine pentru munca noastră. Aruncați o privire la o vizualizare pe care o am pentru monitorizarea utilizatorilor de pe site -ul meu web:

# importuri
from .tests import is_superuser_or_vendor # Va trebui să creăm acest test
    # Obțineți o listă de utilizatori
    return render(request, 'users/users.html', { # Returnează utilizatorii într -un șablon

Rețineți că acest cod folosește un test, va trebui să declarăm acest test într -un fișier teste.py și să îl importăm. Editarea utilizatorilor/testelor.py, să creăm testul.

def is_superuser_or_vendor(user):
    return user.profile.vendor or user.is_superuser

Acest lucru este în combinație cu șablonul utilizatorilor/utilizatorilor.html, care arată așa ceva:

Rețineți că șablonul include un alt șablon, utilizatori/user.html. Când utilizați un șablon care are un subtemplate și nu utilizați extinderi, este o idee bună să adăugați un subteran () înainte de numele fișierului de extins, pentru a distinge șabloanele.

Rețineți că aceasta este o mulțime de Jinja, este posibil să nu aveți toate aceste variabile definite. Dar așa arată codul meu.

      <small># {{user.id}} </mall>

De asemenea, avem nevoie de un alt subtemplate, toggle_active.html. Acest șablon ar trebui să fie un formular care ne permite să comutăm dacă un utilizator este activ.

De asemenea, va trebui să adăugăm o vizualizare pentru a comuta activitatea utilizatorului și modelele URL adecvate. În timp ce suntem la ea, să adăugăm o vedere pentru a șterge un utilizator în cazul în care avem nevoie de asta.

# Importuri
    success_url = '/' # Redirecția pe URL -ul de succes
    def test_func(self): # Testați dacă utilizatorul este superuser și are permisiunea de a șterge

Deși acest lucru este practic atunci când este necesar, ștergerea unui utilizator nu ar trebui să fie necesară de cele mai multe ori, putem doar să comutăm vizibilitatea utilizatorilor care vizitează site -ul dacă trebuie să le respingem.

Modelele URL pe care le -am adăugat arată așa. Cu Nano, editați utilizatori/urls.py și adăugați aceste linii:

nano users/urls.py

Liniile ar trebui să meargă în lista căilor din vizualizările utilizatorului, înainte de încheierea „]", dar după începutul „[".

# ...
# ...

Acum, asigurați -vă că faceți o copie de siguranță a site -ului, astfel încât să îl puteți descărca pe serverul web la care vom continua să lucrăm. Din linia de comandă,

sudo backup

Acum site -ul nostru este susținut.

Deci, acum avem câteva caracteristici mai utile. Dar ce zici de imaginea de ansamblu aici? Acest cod încă nu este accesibil de pe internet, nu avem încă un server de poștă și trebuie să ne extindem aplicația pentru a include un proces de verificare cuprinzător, precum și machete netede pentru a ne ajuta să explorăm site -ul, împreună cu protocoale sigure pentru autentificarea utilizatorilor privilegiați.

Vom ajunge la toate acestea. Cel mai important lucru deocamdată va fi doar să obțineți acest cod online, pe care îl putem face cu doar câteva linii de bash pe un server Ubuntu. Cu toate acestea, va trebui să închiriați un server pentru acest lucru, cu excepția cazului în care aveți un server acasă și un abonament pe internet de afaceri care vă permite să deschideți porturi. Eu personal îmi rulez site -ul web pe un HP Z440 care este instalat în apartamentul meu, dar de obicei este mult mai ieftin pentru nevoile de bază pentru a închiria un server privat virtual (VPS).

Rețineți că codul pe care îl rulăm acum este relativ subțire, va trebui să fie întreținut și îmbunătățit înainte de a fi gata să folosim ceea ce avem pentru a construi un produs. Asigurați -vă că aveți grijă ce faceți cu internetul, asigurați -vă că dacă implementați acest site public pe web pe un server Linux, aveți un plan de a bloca interacțiunile nedorite cu site -ul dvs. web. Probabil că aceasta nu va fi o problemă la început, dar vom analiza o varietate de soluții pentru a combate acest lucru, inclusiv învățarea automată, inteligența artificială și viziunea computerului. Când devine o problemă, căutați mai departe în acest text pentru o soluție.

În ceea ce privește închirierea unui VPS, există o mulțime de locuri în care puteți merge. Google Cloud are servere VPS, Ionos, Kamatera, Amazon AWS și mai mulți furnizori oferă soluții Cloud Server care să se potrivească nevoilor noastre.

Va trebui să faceți clic pe formularele lor și să selectați un plan pentru a începe. Puteți merge cu un plan de bază cu orice furnizor, dar asigurați -vă că furnizorul vă permite să deschideți porturile serverului de poștă port pentru a trimite e -mail (acesta ar trebui să fie Port 587 și Port 25), unii furnizori blochează aceste porturi. Până acum am avut cea mai bună experiență cu Ionos și Kamatera, ambele îmi vor permite să trimit un e -mail nelimitat, iar prețul lor este destul de ieftin.

Vă veți conecta la noul dvs. server printr -un protocol numit SSH sau SECUTE SHOLS, care vă permite să interfațați de la distanță cu serverul exact ca computerul personal, de pe computerul personal. Când configurați serverul, furnizorul de găzduire vă va cere probabil să adăugați o cheie SSH sau vă va oferi un nume de utilizator și o parolă. Cheia SSH este modul în care vă veți conecta la server de la linia de comandă pentru a edita codul. Utilizați opțiunile SSH-Keygen de mai jos pentru a genera o cheie SSH.

ssh-keygen

Salvați fișierul și suprascrieți -l dacă aveți nevoie, este bine să vă rotiți tastele SSH dacă nu ați făcut -o deja. Acum, puteți utiliza următoarea comandă pentru a vedea cheia SSH. Veți dori să -l copiați pe serverul dvs. de la distanță, astfel încât să îl puteți utiliza pentru a vă autentifica.

cat ~/.ssh/id_rsa.pub

Dacă nu ați putut vedea o cheie SSH atunci când tastați acea comandă (un șir lung de cifre și litere începând cu „SSH-RSA AAA"), încercați să generați o cheie RSA (sunt mai sigure, așa că vă sfătuiesc să le utilizați.) Următorul cod va genera o cheie SSH RSA 4096 biți.

ssh-keygen -t rsa -b 4096

Creați un VPS care rulează Ubuntu, cu toate acestea intenționați să faceți acest lucru. După ce ați creat un VPS făcând clic pe formularele de pe site -ul furnizorilor (kamatera.com, ionos.com sau similar), veți dori să vă conectați. Pentru a face acest lucru, utilizați comanda SSH cu adresa dvs. IP (adresa care arată ca xx.xx.xx.xx). De asemenea, va trebui să fiți sensibili la numele de utilizator implicit de pe serverul pe care l -am creat, de exemplu, Ubuntu.

ssh ubuntu@XX.XX.XX.XX

Vi se poate solicita o parolă, dacă vi se solicită o parolă, introduceți -o. Nu vom folosi numele de utilizator implicit, așa că haideți să începem prin crearea unui utilizator nou și adăugarea unei chei SSH în contul lor.

Să începem adăugând un nou fișier SSHD_CONFIG, care spune serverului cum să folosească SSH.

nano sshd_config
# Acesta este fișierul de configurare la nivelul întregului sistem SSHD.  Vedea
# sshd_config (5) pentru mai multe informații.
# Acest SSHD a fost compilat cu Path =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/jocuri
# Strategia folosită pentru opțiuni în sshd_config implicit livrat cu
# OpenSSH este de a specifica opțiunile cu valoarea lor implicită unde
# Posibil, dar lăsați -i comentat.  Opțiunile necompletate înlocuiesc
# valoare implicită.
# Portul 22
# Adresă pentru a fi
# Ascultăddress 0.0.0.0
# Ascultăddress ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Cifre și cheie
# Rekeylimit implicit Niciuna
# Forestiere
# SyslogFacility Auth
# Informații privind loglevel
# Autentificare:
# Logingracetime 2m
# PermitrootLogin Prohibit-Password
# Mode stricte Da
# MaxAuthtries 6
# Maxsessions 10
# Așteptați -vă.
# AutorizatPrincipalSfile Niciuna
# AutorizatkeysCommand Niciuna
# AutorizatKeysCommanduser Nimeni
# Pentru ca acest lucru să funcționeze, veți avea nevoie și de chei de gazdă în/etc/ssh/ssh_knost_hosts
# HOSTBASEDAUTHENTication nr
# Schimbați la da dacă nu aveți încredere ~/.ssh/cunoscut_hosts pentru
# HOSTBASEDAUTHENTication
# Ignoreuserknosthosts nr
# Nu citiți fișierele ~/.rhosts și ~/.Shosts
# Ignorerhosts Da
# Pentru a dezactiva parolele de text clare din tunel, schimbați -vă aici!
# PermitemptyPasswords nr
# Schimbați la da pentru a activa parolele de răspuns la provocare (aveți grijă de probleme cu
# Unele module și fire PAM)
# Opțiuni Kerberos
# KerberosAuthentication nr
# Kerberosorlocalpasswd Da
# Kerberosticketcleanup Da
# KerberosgetAfstoken nr
# Opțiuni GSSAPI
# Gssapiauthentication nr
# GSSAPICLeanupCredentials Da
# GSSAPISTRICTACCERCORCHECK DA
# GSSApikeyExchange nr
# Setați acest lucru la „Da" pentru a activa autentificarea PAM, procesarea contului,
# și procesarea sesiunilor. Dacă acest lucru este activat, autentificarea PAM va fi
# să fie permisă prin KBDInteractivEAuthentication și
# ParolăAuthentication.  În funcție de configurația PAM,
# Autentificarea PAM prin KBDInteractivEAuthentication poate ocoli
# Setarea „PermitrootLogin fără Password".
# Dacă doriți doar să ruleze contul PAM și verificările de sesiune
# Autentificare PAM, apoi activați acest lucru, dar setați parolaAuthentication
# și kbdInteractiveAuthentication la „nu".
# Alocare premergătoare DA
# PermitetCPForwarding Da
# GatewayPorts nr
# X11Displayoffset 10
# X11SeLocalhost Da
# Permitty Da
# PrintLastLog Da
# Tcpkeepalive da
# PermituseRenvironment nr
# Compresia întârziată
# ClientAliveInterval 0
# ClientAliveCountMax 3
# Utilizate nr
# Pidfile /run/sshd.pid
# MaxStartups 10: 30: 100
# Permitunul nr
# ChrootDirectory Niciuna
# VersionAddendum Niciuna
# Nici o cale de banner implicită
# Permiteți clientului să treacă variabilele de mediu local
# înlocuiți implicitul fără subsisteme
# Exemplu de setări imperative pe bază de utilizator
# Potriviți anoncv -urile utilizatorului
# X11 forwarding nr
# PermitetCPPorwarding nr
# Permitty nr
# ForceCommand CVS Server

Nu uitați, Ctrl+X și Y pentru a salva fișierul. În continuare, să scriem un script de bază numit Initialize (toate în directorul de acasă implicit al utilizatorului nostru).

nano initialize

Adăugați aceste linii în fișier, înlocuindCu cheia SSH pe care ați găsit -o folosind CAT. (.ssh/id_rsa.pub)

# !/bin/bash

Pentru a vă parcurge acest fișier, să pornim linie cu linie. Prima linie spune compilatorului că acesta este un script Bash. Apoi instalăm dependențe, copiem sshd_config în directorul corect, repornind SSH, generând chei SSH pentru root, adăugând „echipa" utilizatorului (puteți alege un nume care vă place pentru aceasta, utilizați comanda Adduser cu numele lor și parola dezactivată deocamdată). De asemenea, adăugăm echipă la grupul sudo, generăm cheia SSH, adăugăm cheia noastră la cheile autorizate și la ale lor și le tipărește cheia. Acest nou utilizator va fi modul în care ne conectăm pe site.

Într -un nou terminal, mergeți mai departe și deschideți din nou serverul.

ssh team@XX.XX.XX.XX

De data aceasta nu trebuie să aveți nevoie de o parolă, fiind așa cum aveți o cheie SSH. De asemenea, am dezactivat autentificarea cu parola pentru a menține site -ul mai sigur.

Acum, acest server pornește complet necompletat, fără informații despre el. Să începem prin clonarea proiectului nostru de la GIT, astfel încât să îl putem descărca și rula pe mașina de la distanță. Pe serverul de la distanță conectat prin SSH, imprimați mai întâi tasta SSH:

cat ~/.ssh/id_rsa.pub

În continuare, lipiți această cheie în setările Git, așa cum am făcut înainte pentru a configura depozitul nostru GIT. Acum putem clona proiectul nostru direct la server. Asigurați -vă că ați făcut o copie de rezervă la nivel local la nivel local, așa că este pe serverul GIT pentru a descărca.

git clone git://github.com/you/yourproject.git

Perfect. Acum toate fișierele sunt aici. Le putem vedea cu LS

ls

Acum, să începem să configuram serverul. În primul rând, copiați directorul de proiect într -un nume simplu, memorabil, pe care îl vom folosi pentru proiect.

cp -r yourproject whatyoucalledit

Unde „Whatyyoucalledit" este noul nume al proiectului tău. În continuare, va trebui să construim un utilitar de bază pentru a configura serverul. Vom salva această utilitate și o vom folosi în viitor. Pentru a construi această utilitate, să creăm un binar de utilizator pentru a defini modul în care edităm un script. Utilizarea bash, editare/usr/bin/ascript

sudo nano /usr/bin/ascript

Asigurați -vă că utilizați sudo acolo, astfel încât să aveți permisiuni pentru a edita fișierul. În fișier, adăugați aceste linii:

# !/bin/bash
    echo "# !/bin/bash ">>/usr/bin/$ 1

Amintiți -vă că acest script ia un argument, numele scriptului, ca $ 1. Mai întâi verifică dacă fișierul există, sau altfel îl creează, adaugă prima linie pentru a declara că scriptul este bash, își schimbă permisiunile, îl modifică și își adaugă numele la /etc /ascripturi, ceea ce ne permite să stocăm numele scripturilor pe care le creăm. Dacă fișierul există deja, pur și simplu schimbați permisiunile și editați -l. Salvați fișierul, iar în continuare vom schimba permisiunile sale. Atâta timp cât folosim acest script, nu va trebui să mai facem asta.

sudo chmod a+x /usr/bin/ascript

Perfect. Acum să creăm un script numit Setup. În primul rând, să nu te copleșești, dar aruncă o privire la cum arată scriptul meu de configurare. Vom parcurge cum ar trebui să arate acest script în proiectul dvs., nu veți avea nevoie de tot ce este în scenariul meu pentru a începe.

# !/bin/bash
# sudo chmod a+x scripturi/utilizatori
# ./scripts/usersetup
# ssh-keygen
# Director de proiect
# Comenzi de jurnal
# Nano Config
# Git Config
# Actualizați și instalați
# Activați Clamav Antivirus
# Setați numele de gazdă
# Configurare Postgres
# Configurare backup în baza de date
# Dezactivați iptables
# Instalați BitDefender
# Configurare postfix
# Creați dirs
# Configurare VirtualEnv
# Obțineți și construiți dependențe
# Setați regulile firewall -ului
# Instalați dependențe PYPI
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP Instalați OpenCV-Python == 4.5.5.64
# PIP Instalați OpenCV-CONTRIB-PYTHON == 4.5.5.64
# Instalați certbot
# Rulați certbot
# Reîncărcați serverul de e -mail
# Copiați certificări
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem Privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Patch Venv
# Setați setările utilizatorului
# Setați permisiuni
# sudo chown -R Echipa: utilizatori/var/run/
# sudo chown root: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: utilizatori db.sqlite3
# Copiați permisiunile de configurare și setați
# Baza de date de configurare
# Injectați PAM Config și eliminați configurația ssh defectuoasă
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /profil
# Copiați scripturile de coș și setați permisiunile
# Reîncărcați și activați serviciile
# Activați module Apache
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Dezactivați site -ul implicit
# Activați site -ul nostru
# Reîncarcă demonul și repornește Apache, Postfix și Openkim
# Setați permisiuni
# Swap Configuration
# Motor de titlu init
# Configurare git
# Afișați IPv6 și Opendkim pentru configurarea domeniului
# Configurarea finalizată

Este o mulțime de configurații! In short, this code logs commands, configures nano and git, copies over files, downloads and installs ubuntu apt packages, python dependencies, configures postfix, configures postgresql (the database server) and loads the database, configures ufw (an uncomplicated firewall), disables iptables, downloads an antivirus, makes directories, clones dependencies, installs certificates and sets up Serverul, instalează configurația, pornește și permite Sever, alocă swap, stabilește permisiunile și imprimă tasta IP, IPv6 și cheia Opendkim. Destul de simplu, dar pare mult cod. Nu vom avea nevoie de multe lucruri pentru că nu avem dependențele, nu folosim țelină, țelerybeat sau Daphne, dar oricum vom instala unele dintre ele pentru a începe. Observați că acest cod are un domeniu declarat de mai multe ori.

De asemenea, va trebui să achiziționăm un nume de domeniu (care este o taxă anuală mică). Recomand Squarespace pentru achiziționarea unui domeniu, aspectul lor este intuitiv și ușor de utilizat. Puteți cumpăra orice domeniu la alegere, dar folosesc domeniul femmebabe.com în acest exemplu. După ce ați cumpărat un domeniu, accesați panoul de configurare DNS Squarespace și adăugați o înregistrare care indică domeniul dvs. către server prin adresa IP. Ar trebui să arate astfel:

@ A xx.xx.xx.xx

Cu @ operatorul ca gazdă, ceea ce înseamnă că toate subdomeniile din acest domeniu și domeniul rădăcină se vor redirecționa către server. Există mai multe înregistrări de declarat, dar putem trece la acestea odată ce suntem gata să trimitem mail. Rețineți că este posibil să dureze câteva zile până când puteți trimite cu succes poșta de pe server. Înregistrările DNS pe care le stabilim vor dura timp pentru a se propaga.

Oricum, singura înregistrare pe care trebuie să o începem este o înregistrare. Acum, acum putem completa scriptul de mai jos conform proiectului nostru și îl putem rula.

Să începem cu un script de configurare mai mic pentru a instala doar ceea ce avem nevoie pentru un progres de bază. Încă nu vom folosi atât de multe dependențe sau postgreSQL, vom începe doar un server HTTP de bază și ne vom îngrijora să -l certificăm atunci când va fi terminat. Amintiți -vă, pentru a obține un certificat HTTPS și pentru a rula serverul în siguranță, va trebui să cumpărăm un domeniu împreună cu închirierea unui server. Deocamdată, înlocuiți „echipa" din acest fișier cu numele utilizatorului dvs., „DIR" cu directorul proiectului dvs. și furnizați -vă e -mailul și domeniul în etichetele <>.

În plus, înainte de a rula acest cod, trebuie să schimbăm setările în firewall pe care furnizorul de găzduire îl acceptă, dacă este cazul. De obicei, aceasta se află în fila „Rețele" a furnizorului dvs. de găzduire sau dacă vă auto -găzduiți, în secțiunea „Redirecționare a portului" a routerului dvs. De asemenea, veți dori să configurați un IP static prin intermediul routerului dvs. cu adresa mașinii dvs. de server, dacă utilizați auto -găzduire. Va trebui să deschideți următoarele porturi pentru acces la citire/scriere.

22 (ssh) 25 (Mail) 587 (e -mail) 110 (client prin poștă) 80 (HTTP) 443 (https)

# !/bin/bash
# Comenzi de jurnal
# Nano Config
# Git Config
# Actualizați și instalați
# Activați Clamav Antivirus
# Setați numele de gazdă
# Configurare backup în baza de date
# Dezactivați iptables
# Configurare VirtualEnv
# Instalați certbot
# Rulați certbot
# Setați setările utilizatorului
# Setați permisiuni
# sudo chown -R Echipa: utilizatori/var/run/
# sudo chown root: root/run/sudo/ts -r
# Reîncărcați și activați serviciile
# Activați module Apache
# Reîncarcă demonul și repornește Apache, Postfix și Openkim
# Afișați IPv6 și Opendkim pentru configurarea domeniului

Înainte de a rula acest cod, asigurați -vă că domeniul pe care l -ați achiziționat este conectat la server. Pentru a face acest lucru, deschideți un terminal pe mașina locală și rulați această comandă cu domeniul dvs .:

ping femmebabe.com # Introduceți domeniul dvs. aici, după ping

Dacă toate arată bine și serverul trimite răspunsuri, suntem gata să rulăm scriptul și să instalăm pachete, precum și să pornim, să activăm și să certificăm serverul nostru Apache.

Aceasta nu este toată configurația necesară pentru a configura PostFix, vom analiza această configurație mai târziu. Deocamdată, rulați acest cod de configurare și ar trebui să dureze câteva minute pentru a instala și certifica serverul. Încă o dată, asigurați -vă că înlocuiți numele, e -mailul și numele de domeniu în script în funcție de numele achiziționat.

Acum că serverul este provizionat, puteți merge la adresa URL în orice browser web și verificați pentru a vă asigura că serverul rulează HTTPS. Dacă nu, încercați să așteptați puțin timp pentru ca înregistrările DNS să se prindă și apoi să rulați următoarea comandă pentru a reîncărca certificarea certificatului:

sudo certbot --apache --non-interactive --agree-tos --domains <domain>.com --email <youremail>@gmail.com

Atâta timp cât ați configurat totul corect, ar trebui să puteți accesa pagina implicită a lui Apache doar pentru a ști că codul dvs. funcționează și afișează o pagină web live. În continuare, să edităm setările.PY pentru a schimba modul nostru de depanare implicit în producție. De asemenea, vom configura domeniul în setări, precum și IP -urile interne.

nano yourproject/settings.py

În setări, schimbați/adăugați aceste linii.

# Site Config

Acum, va trebui să configuram Apache2. Să edităm fișierul de configurare pe care îl vom implementa cu această linie:

sudo nano /etc/apache2/sites-available/femmebabe-le-ssl.conf

Acest fișier de configurare ar trebui să aibă numele nostru de domeniu în el și numele utilizatorului și al proiectului. Folosesc numele de domeniu femmebabe.com, echipa de nume de utilizator și numele proiectului 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>

Asigurați -vă că înlocuiți numele proiectului, directorilor și domeniului în acest cod de exemplu atunci când vă configurați serverul. Acum, va trebui să dezactivăm site -ul implicit. Acest lucru se poate face folosind Bash.

sudo a2dissite 000-default-le-ssl
sudo a2dissite 000-default
sudo a2dissite default-ssl

În continuare, putem activa site -ul implicit și reîncărca Apache2, folosind și Bash. Nu uitați să înlocuiți femmebabe cu numele fișierului pe care l-ați declarat la editarea în/etc/apache2/site-uri-adable/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Reveniți la domeniul dvs. din Navbar. Ar trebui să vedeți site -ul pe care l -ați configurat în browserul dvs. web. Felicitări! Dacă nu o vedeți, este posibil să fie nevoie să faceți unele modificări. Examinați cu atenție setările din proiectul dvs., configurația Apache și asigurați -vă că nu aveți erori și rulați următoarele comenzi pentru a verifica erorile proiectului.

cd projectname
source venv/bin/activate
python manage.py check

Dacă aveți erori în proiectul dvs. Python, urmăriți -le până unde sunt și remediați -le. S -ar putea să nu puteți vedea toate erorile dvs. în funcție de locul în care se află, așa că dacă aveți o eroare care spune pur și simplu „popularea nu este reentrantă", editați următorul fișier în mediul virtual, Registry.py, pentru a expune eroarea.

nano venv/lib/python3.12/site-packages/django/apps/registry.py

Derulați la linia 83, unde această eroare de rulare este ridicată (RISPORT RUNTIMEERROR („Popululate () nu este reentrant")) și adăugați un comentariu înainte de această linie, apoi adăugând, cu aceeași indentare, self.app_configs = {}. Arată așa:

                # Preveniți apeluri reentrante pentru a evita rularea appConfig.Ready ()
                # metode de două ori.
# RISPORT RUNTIMEERROR („Populularea () nu este reentrantă")

Puteți verifica din nou proiectul și expuneți eroarea.

python manage.py check

Apoi puteți vedea eroarea și o puteți remedia. Când îl aveți fixat și codul se compilează fără erori, asigurați -vă că schimbați fișierul înapoi, astfel încât să pară acest lucru:

                # Preveniți apeluri reentrante pentru a evita rularea appConfig.Ready ()
                # metode de două ori.
# self.app_configs = {}

Cu condiția ca serverul să fie online, atunci când facem alte modificări, trebuie să folosim următoarea comandă pentru a reîncărca serverul:

sudo systemctl reload apache2

Minunat! Dar ce zici de trimiterea de e -mail? Pentru a începe să trimitem e -mail, va trebui mai întâi să actualizăm configurația domeniului. Acest lucru ar trebui să fie în panoul dvs. DNS din Squarespace sau în orice registrator de nume de domeniu pe care l -ați ales. De asemenea, va trebui să instalăm și să adăugăm configurația și să rulăm câteva comenzi.

În primul rând, să obținem adresa IPv6 a serverului. Vă vom deschide apoi DNS -ul și vom adăuga înregistrările.

Pentru a obține adresa IPv6 a serverului, utilizați această comandă:

ip -6 addr

Acum, putem adăuga următoarele înregistrări la setările DNS. Înregistrările mele arată așa. Cu toate acestea, pentru înregistrările dvs., ar trebui să înlocuiți adresa IP cu IP -ul dvs. (nu 75.147.182.214, asta este al meu). De asemenea, adăugați domeniul dvs. în locul femmebabe.com, precum și adresa dvs. IPv6 găsită cu comanda anterioară (nu puteți folosi a mea, Fe80 :: 725A: FFF: FE49: 3E02). Nu vă faceți griji pentru Domeniu deocamdată, acest lucru este creat atunci când am configurat PostFix, serverul de poștă, cu Opendkim, și tipărirea cheii. Vom configura acest ultim.

@ O N / A 75.147.182.214

@ MX 10 femmebabe.com

@ PTR N / A femmebabe.com

@ TXT N / A Txt @ v = spf1 mx ip75.147.182.214ip6: fe80 :: 725a: fff: fe49: 3e02 ~ toate

implicit._bimi TXT N / A v = bimi1; l = https: //femmebabe.com/media/static/femmebabe.svg

_dmarc TXT N / A v = dmarc1; P = Niciuna

sendonly._domainkey TXT N / A

Acum, va trebui să adăugăm o configurație persistentă pentru PostFix. Tot ce trebuie să facem este să ne asigurăm că înlocuim numele domeniului, femmebabe.com, cu numele de domeniu pe care îl utilizați. Să ne uităm la toate fișierele de configurare unul câte unul și să le instalăm într -un director numit Config în proiectul nostru, pentru instalarea la sistemul de operare.

nano config/etc_postfix_main.cf

Adăugați acest text în fișier

# Consultați /usr/share/postfix/main.cf.dist pentru o versiune comentată, mai completă
# Specific debian: specificarea unui nume de fișier va provoca primul
# linia acelui fișier care va fi utilizată ca nume.  Debian implicit
# este /etc /nume de e -mail.
# miorigin = /etc /nume de e -mail
# Apariția .Domain este treaba MUA.
# Neîndeplinit următoarea linie pentru a genera avertismente „e -mail întârziate"
# DARAY_WARNING_TIME = 4H
# Consultați http://www.postfix.org/compatibility_readme.html - implicit la 3.6 on
# Instalații proaspete.
# Parametri TLS
# Configurare milter

Următoarea configurație!

nano config/etc_postfix_master.cf

Adăugați aceste linii:

# 
# Fișier de configurare a procesului principal postfix.  Pentru detalii despre format
# a fișierului, a se vedea pagina manuală (5) (comanda: „Man 5 Master" sau
# on-line: http://www.postfix.org/master.5.html).
# 
# Nu uitați să executați „reîncărcare postfix" după editarea acestui fișier.
# 
# ======================================================================================
# Tip de serviciu privat Private Priviv Chroot Wakeup MaxProc Command + args
# (da) (da) (nu) (niciodată) (100)
# ======================================================================================
# Smtp inet n - y - 1 postscreen
# SMTPD PASS - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Alegeți unul: Activați trimiterea doar pentru clienții Loopback sau pentru orice client.
# 127.0.0.1:Submission inet n - y - - smtpd
# -o syslog_name = postfix/trimitere
# -o smtpd_tls_security_level = criptare
# -O SMTPD_SASL_AUTH_ENABLE = Da
# -o smtpd_tls_auth_only = da
# -o smtpd_reject_unlisted_recipient = nr
# -O SMTPD_CLIENT_RESTRICȚII = $ MUA_CLIENT_RESTRICȚII
# -O SMTPD_HELO_RESTRICȚII = $ MUA_HELO_RESTRICȚII
# -O SMTPD_SENDER_RESTRICȚII = $ MUA_SENDER_RESTRICȚII
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restrictions = permis_sasl_autenticated, respinge
# -O MILTER_MACRO_DAEMON_NAME = originar
# Alegeți unul: Activați SMTPS doar pentru clienții Loopback sau pentru orice client.
# 127.0.0.1:smtps inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -O SMTPD_TLS_WRAPPERMODE = Da
# -O SMTPD_SASL_AUTH_ENABLE = Da
# -o smtpd_reject_unlisted_recipient = nr
# -O SMTPD_CLIENT_RESTRICȚII = $ MUA_CLIENT_RESTRICȚII
# -O SMTPD_HELO_RESTRICȚII = $ MUA_HELO_RESTRICȚII
# -O SMTPD_SENDER_RESTRICȚII = $ MUA_SENDER_RESTRICȚII
# -o smtpd_recipient_restrictions =
# -o smtpd_relay_restrictions = permis_sasl_autenticated, respinge
# -O MILTER_MACRO_DAEMON_NAME = originar
# 628 inet n - y - - qmqpd
# qmgr unix n - n 300 1 oqmgr
# -o smtp_helo_timeout = 5 -o smtp_connect_timeout = 5
# 
# ===============================================================================
# Interfețe la software-ul non-Postfix. Asigurați -vă că examinați manualul
# Pagini ale software-ului non-Postfix pentru a afla ce opțiuni dorește.
# 
# Multe dintre următoarele servicii folosesc livrarea Pipe Postfix (8)
# agent.  Consultați pagina Pipe (8) pentru informații despre informații despre $ {destinatar}
# și alte opțiuni de plic de mesaje.
# ===============================================================================
# 
# Maildrop. Consultați fișierul Postfix MailDrop_readMe pentru detalii.
# De asemenea, specificați în main.cf: maildrop_destination_recipient_limit = 1
# 
# 
# ===============================================================================
# 
# Versiunile recente Cyrus pot utiliza intrarea „LMTP" existentă „LMTP".
# 
# Specificați în cyrus.conf:
# lmtp cmd = "lmtpd -a" ascultă = "localhost: lmtp" proto = tcp4
# 
# Specificați în Main.CF una sau mai multe dintre următoarele:
# Mailbox_Transport = LMTP: INET: LocalHost
# virtual_transport = lmtp: inet: localhost
# 
# ===============================================================================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Specificați, de asemenea, în main.cf: cyrus_destination_recipient_limit = 1
# 
# Cyrus Unix - N N - - Pipe
# flags = drx user = cyrus argv =/cyrus/bin/livrare -e -r $ {expeditor} -m $ {extensie} $ {user}
# 
# ===============================================================================
# Vechi exemplu de livrare prin Cyrus.
# 
# Old -Cyrus Unix - N N - - Pipe
# flags = r user = cyrus argv =/cyrus/bin/livrare -e -m $ {extensie} $ {user}
# 
# ===============================================================================
# 
# Consultați fișierul Postfix UUCP_README pentru detalii de configurare.
# 
# 
# Alte metode de livrare externă.
# 

Și configurația OpenDkim. Opendkim identifică serverele de e -mail cu chei de domeniu pentru a le face mai sigure. Fără acesta, e -mailul nu este semnat și s -ar putea să nu ajungă la o căsuță de e -mail.

nano config/etc_default_opendkim

Adăugați aceste linii:

# Notă: Acesta este un fișier de configurare moștenită. Nu este folosit de Opendkim
# Serviciu SystemD. Vă rugăm să utilizați parametrii de configurare corespunzători din
# /etc/opendkim.conf în schimb.
# 
# Anterior, s -ar edita setările implicite aici, apoi s -ar executa
# /lib/opendkim/opendkim.service.generate pentru a genera fișiere de înlocuire a sistemului la sistem la
# /etc/systemd/system/opendkim.service.d/override.conf și
# /etc/tmpfiles.d/opendkim.conf. Deși acest lucru este încă posibil, acum este
# recomandat să ajustați setările direct în /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Modificați la/var/spool/postfix/run/opendkim pentru a utiliza o priză unix cu
# postfix într -un chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Neîndeplinire pentru a specifica o priză alternativă
# Rețineți că setarea acestui lucru va înlocui orice valoare soclului în opendkim.conf
# implicit:
# Ascultați pe toate interfețele de pe portul 54321:
# Socket = inet: 54321
# Ascultați pe buclă pe portul 12345:
# Socket = inet: 12345@localhost
# Ascultați pe 192.0.2.1 pe portul 12345:
# Socket = Inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Adăugați aceste linii:

# Default_process_limit = 100
# Default_client_limit = 1000
# Limită implicită VSZ (dimensiunea memoriei virtuale) pentru procesele de service. Acest lucru este în principal
# intenționat să prindă și să ucidă procese care scurg memoria înainte de a mânca
# tot.
# Default_vsz_limit = 256m
# Utilizatorul de autentificare este utilizat intern de procesele de conectare. Acesta este cel mai neîncrezător
# utilizator în sistemul Dovecot. Nu ar trebui să aibă acces deloc la nimic.
# Default_login_user = Dovenull
# Utilizatorul intern este utilizat de procese neprivilegiate. Ar trebui să fie separat de
# Utilizator de autentificare, astfel încât procesele de conectare nu pot perturba alte procese.
# Default_internal_user = dovecot
    # port = 143
    # port = 993
    # ssl = da
  # Numărul de conexiuni de gestionat înainte de a începe un nou proces. De obicei
  # Singurele valori utile sunt 0 (nelimitate) sau 1. 1 este mai sigur, dar 0
  # este mai rapid. <doc/wiki/loginProcess.txt>
  # service_count = 1
  # Numărul de procese pentru a continua să aștepți mai multe conexiuni.
  # proces_min_avail = 0
  # Dacă setați Service_count = 0, probabil că trebuie să creșteți acest lucru.
  # vsz_limit = $ default_vsz_limit
    # port = 110
    # port = 995
    # ssl = da
    # port = 587
  # Creați ascultător inet numai dacă nu puteți utiliza soclul UNIX de mai sus
  # inet_listener lmtp {
    # Evitați să faceți LMTP vizibil pentru întregul internet
    # Adresa =
    # port =
  # }
  # Cea mai mare parte a memoriei se adresează fișierelor MMAP (). Este posibil să fie nevoie să creșteți acest lucru
  # Limitați dacă aveți căsuțe poștale uriașe.
  # vsz_limit = $ default_vsz_limit
  # Max. Numărul de procese IMAP (conexiuni)
  # Process_limit = 1024
  # Max. Numărul de procese POP3 (conexiuni)
  # Process_limit = 1024
  # Max. Numărul de procese de trimitere SMTP (conexiuni)
  # Process_limit = 1024
  # Auth_socket_path indică implicit această priză UserDB. Este de obicei
  # Folosit de Dovecot-LDA, Doveadm, eventual proces IMAP, etc. Utilizatorii care au
  # Permisiile complete la această priză sunt capabile să obțină o listă cu toate numele de utilizator și
  # Obțineți rezultatele căutărilor de utilizator ale tuturor.
  # 
  # Modul implicit 0666 permite oricui să se conecteze la priză, dar
  # Căutările de utilizatorDB vor avea succes numai dacă UserDB returnează un câmp „UID" care
  # se potrivește cu UID -ul procesului de apelant. De asemenea, dacă UID sau GID al apelantului se potrivește cu
  # Socket's Uid sau Gid Căutarea reușește. Orice altceva provoacă un eșec.
  # 
  # Pentru a oferi apelantului permisiunile complete pentru a căuta toți utilizatorii, setați modul la
  # altceva decât 0666 și Dovecot lasă nucleul să aplice
  # Permisiuni (de exemplu, 0777 permite tuturor permisiunile complete).
  # Procesul lucrătorului Auth este rulat ca rădăcină în mod implicit, astfel încât să poată accesa
  # /etc/umbră. Dacă acest lucru nu este necesar, utilizatorul ar trebui schimbat în
  # $ default_internal_user.
  # user = root
  # Dacă se utilizează proxy dict, procesele de poștă ar trebui să aibă acces la priza sa.
  # De exemplu: modul = 0660, grup = Vmail și Global Mail_access_groups = vmail
    # Mod = 0600
    # utilizator =
    # grup =

Încă o dată, asigurați -vă că înlocuiți domeniul în toate aceste fișiere, femmebabe.com, cu domeniul selectat. Editați următorul fișier, configurația lui Dovecot,

nano config/etc_dovecot_dovecot

Și adăugați aceste linii

## Fișier de configurare Dovecot
# Dacă vă grăbiți, consultați http://wiki2.dovecot.org/quickconfiguration
# Comanda „doveconf -n" oferă o ieșire curată a setărilor modificate. Folosiți -l
# În loc să copiați și să lipiți fișierele când postați pe lista de e -mail Dovecot.
# '# „Caracterul și totul după ce este tratat ca comentarii. Spații suplimentare
# iar filele sunt ignorate. Dacă doriți să utilizați oricare dintre acestea în mod explicit, puneți
# value inside quotes, eg.: key = "# Char și spațiul alb de bine "
# Majoritatea (dar nu toate) setările pot fi anulate de diferite protocoale și/sau
# IPS sursă/destinație prin plasarea setărilor în secțiuni, de exemplu:
# Protocol IMAP {}, local 127.0.0.1 {}, la distanță 10.0.0.0/8 {}
# Valorile implicite sunt afișate pentru fiecare setare, nu este necesar să necomplementă
# aceste. Acestea sunt excepții de la acest lucru: nu există secțiuni (de exemplu, spațiu de nume {})
# sau setările pluginului sunt adăugate în mod implicit, sunt listate doar ca exemple.
# Căile sunt, de asemenea, doar exemple cu valorile implicite reale bazate pe configurare
# opțiuni. Căile enumerate aici sunt pentru configurare --prefix =/usr
# --sysconfdir =/etc--localStediDir =/var
# Activați protocoale instalate
# O listă separată de virgule de IPS sau gazde unde să ascultați conexiuni.
# "*" ascultă toate interfețele IPv4, "::" ascultă toate interfețele IPv6.
# Dacă doriți să specificați porturi non-default sau ceva mai complex,
# Editați conf.d/master.conf.
# ascultă = *, ::
# Director de bază unde să stocați datele de rulare.
# base_dir =/var/run/dovecot/
# Numele acestei instanțe. În configurarea multi-instanță Doveadm și alte comenzi
# poate utiliza -i <niscy_name> pentru a selecta ce instanță este utilizată (o alternativă
# la -c <fig_path>). Numele instanței este, de asemenea, adăugat la procesele Dovecot
# În ieșirea PS.
# instanță_name = dovecot
# Mesaj de salut pentru clienți.
# login_greeting = dovecot gata.
# Lista separată în spațiu a intervalelor de rețea de încredere. Conexiuni din acestea
# IP -urile au voie să -și înlocuiască adresele și porturile IP (pentru logare și
# pentru verificări de autentificare). Dezactivare_plaintExt_Auth este, de asemenea, ignorat pentru
# aceste rețele. De obicei, ați specifica aici serverele proxy IMAP.
# login_trusted_networks =
# Lista separată în spațiu de acces la conectare Verificați prizele (de exemplu, TCPWRAP)
# login_access_sockets =
# Cu proxy_maybe = da dacă destinația proxy se potrivește cu oricare dintre aceste IP -uri, nu o faceți
# proxying. Acest lucru nu este necesar în mod normal, dar poate fi util dacă destinația
# IP este de ex. IP -ul unui echilibrator de încărcare.
# auth_proxy_self =
# Afișați mai multe titluri de proces verbose (în PS). În prezent arată numele de utilizator și
# Adresa IP. Util pentru a vedea cine folosește de fapt procesele IMAP
# (de exemplu, căsuțe poștale partajate sau dacă sunt utilizate același UID pentru mai multe conturi).
# verbose_proctitle = nr
# În cazul în care toate procesele sunt ucise atunci când procesul de master Dovecot se oprește.
# Setarea acestui lucru la „nu" înseamnă că dovecot poate fi modernizat fără
# forțarea conexiunilor clientului existente să se închidă (deși acest lucru ar putea fi și
# O problemă dacă actualizarea este de ex. Din cauza unei soluții de securitate).
# shutdown_clients = da
# Dacă nu este zero, rulați comenzi prin poștă prin intermediul multor conexiuni la serverul Doveadm,
# În loc să le rulați direct în același proces.
# doveadm_worker_count = 0
# Socket UNIX sau gazdă: port utilizat pentru conectarea la serverul Doveadm
# doveadm_socket_path = doveadm-server
# Lista separată de spații de variabile de mediu care sunt păstrate pe Dovecot
# pornire și transmis la toate procesele sale de copii. Puteți da și
# cheie = perechi de valoare pentru a seta întotdeauna setări specifice.
# import_environment = tz
## 
## Setări server de dicționar
## 
# Dicționarul poate fi utilizat pentru a stoca listele cheie = valori. Acest lucru este folosit de mai mulți
# pluginuri. Dicționarul poate fi accesat fie direct, fie deși un
# Server de dicționar. Următorul Dict Dict Maps Dicționar Nume către URIS
# Când serverul este utilizat. Acestea pot fi apoi referite folosind URI în format
# "Proxy :: <Name>".
  # Cote = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Cea mai mare parte a configurației reale este inclusă mai jos. Numele fișierelor sunt
# Mai întâi sortat după valoarea lor ASCII și analizate în acea ordine. 00-prefixele
# În numele fișierelor sunt destinate să faciliteze înțelegerea ordonanței.
# Un fișier de configurare poate încerca să fie inclus fără a da o eroare dacă
# Nu se găsește:
# Permite DoveCot să asculte toate conexiunile de intrare (IPv4 / IPv6)

Adăugați o parolă pentru utilizatorul Dovecot:

nano config/etc_dovecot_passwd

Prima parte a fișierului, înainte de colon, este numele de utilizator. Ultima parte, „YourPassword", denotă parola pe care doriți să o oferiți serverului dvs. de e -mail.

team:{plain}yourpassword

În continuare, configurația OpenDkim

nano config/etc_opendkim.conf

Și adăugați aceste linii:

# Aceasta este o configurație de bază pentru semnare și verificare. Poate fi cu ușurință
# adaptat pentru a se potrivi cu o instalație de bază. Vezi OpenDkim.Conf (5) și
# /usr/share/doc/opendkim/examples/opendkim.conf.sample pentru complet
# Documentarea parametrilor de configurare disponibili.
# Log de ce nu
# Parametri comuni de semnare și verificare. În Debian, antetul „From" este
# Suprasemnat, deoarece este adesea cheia de identitate folosită de sistemele de reputație
# și astfel oarecum sensibil la securitate.
# Semnarea domeniului, selectorului și a cheii (obligatoriu). De exemplu, efectuați semnarea
# pentru domeniu „Exemple.com" cu selectorul „2020" (2020._domainkey.example.com),
# Utilizarea cheii private stocate în /etc/dkimkeys/example.private. Mai granular
# Opțiunile de configurare pot fi găsite în /usr/share/doc/opendkim/readme.opendkim.
# Exemplu de domeniu.com
# Selector 2020
# Keyfile /etc/dkimkeys/example.private
# În Debian, Opendkim rulează ca utilizator „OpenDkim". Este necesară un Umask de 007 când
# Utilizarea unei prize locale cu MTA-uri care accesează soclul ca un nevreilează
# utilizator (de exemplu, postfix). Este posibil să fie nevoie să adăugați „postfix" utilizator la grup
# „Opendkim" în acest caz.
# Priză pentru conexiunea MTA (necesară). Dacă MTA se află în interiorul unei închisori Chroot,
# Trebuie să se asigure că priza este accesibilă. În Debian, postfix rulează
# un chroot in/var/spool/postfix, de aceea ar trebui să fie o priză unix
# configurat așa cum se arată în ultima linie de mai jos.
# Priză locală: /run/opendkim/opendkim.sock
# Priză inet: 8891@localhost
# Priză inet: 8891
# Gazde pentru care să semnați mai degrabă decât să verificați, implicit este 127.0.0.1. Vezi
# Secțiunea de operare din Opendkim (8) pentru mai multe informații.
# Internhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Ancora de încredere permite DNSSEC. În Debian, fișierul de ancoră de încredere este furnizat
# de pachet DNS-root-data.
# Nume de nume 127.0.0.1
# MAP domenii în adrese la chei utilizate pentru a semna mesaje
# Un set de gazde interne a căror e -mail trebuie semnat
nano config/etc_default_opendkim

Și adăugați aceste linii

# Notă: Acesta este un fișier de configurare moștenită. Nu este folosit de Opendkim
# Serviciu SystemD. Vă rugăm să utilizați parametrii de configurare corespunzători din
# /etc/opendkim.conf în schimb.
# 
# Anterior, s -ar edita setările implicite aici, apoi s -ar executa
# /lib/opendkim/opendkim.service.generate pentru a genera fișiere de înlocuire a sistemului la sistem la
# /etc/systemd/system/opendkim.service.d/override.conf și
# /etc/tmpfiles.d/opendkim.conf. Deși acest lucru este încă posibil, acum este
# recomandat să ajustați setările direct în /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Modificați la/var/spool/postfix/run/opendkim pentru a utiliza o priză unix cu
# postfix într -un chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Neîndeplinire pentru a specifica o priză alternativă
# Rețineți că setarea acestui lucru va înlocui orice valoare soclului în opendkim.conf
# implicit:
# Ascultați pe toate interfețele de pe portul 54321:
# Socket = inet: 54321
# Ascultați pe buclă pe portul 12345:
# Socket = inet: 12345@localhost
# Ascultați pe 192.0.2.1 pe portul 12345:
# Socket = Inet: 12345@192.0.2.1

Când suntem gata să configuram serverul nostru postfix, vom rula codul de mai jos, cu numele de domeniu corespunzător încorporat. Începeți prin crearea unui script

touch scripts/postfixsetup
sudo chmod a+x scripts/postfixsetup
nano scripts/postfixsetup

Acum, în Nano, editorul de text, editați acest fișier, astfel încât să includă numele dvs. de domeniu în loc de femmebabe.com.

# !/bin/bash
# Configurare postfix

Acum, rulați scriptul completat pentru a configura Postfix, OpendKim și Dovecot.

./scripts/postfixsetup

Odată ce acest script a rulat, copiați ultima linie pe care o imprimă și lipiți -o în configurația DNS ca valoare pentru Sendonly._DomainKey. Aceasta este cheia Opendkim folosită pentru a identifica domeniul dvs. la trimiterea de e -mailuri sigure.

Minunat! În câteva zile, ar trebui să puteți trimite e -mail de pe server, cu condiția să fie configurat corect.

Dacă tocmai ați configurat DNS pentru serverul dvs. de poștă, ar trebui să dureze mai puțin de 72 de ore pentru ca înregistrările să se actualizeze. De obicei este mult mai rapid. Puteți verifica dacă serverul dvs. funcționează folosind această comandă, a furnizat e -mailul:

echo "test" | mail -s "Test Email" youremail@gmail.com

Dacă totul pare să funcționeze corect, ar trebui să puteți trimite e -mailuri cu serverul dvs. Dacă nu funcționează, încercați să priviți jurnalele pentru a vedea care ar putea fi eroarea.

tail –lines 150 /var/log/mail.log

Acest lucru va oferi informații verbose despre poștă care este trimisă de server și dacă funcționează corect. Ar trebui să puteți vedea și e -mailul în căsuța de e -mail, dacă nu este acolo, verificați folderul Spam.

De asemenea, va trebui să vă configurați setările în setările dvs. Adăugați sau înlocuiți aceste linii în setările dvs.

EMAIL_HOST_USER = 'team' # „Love@mamasheen.com"

Observați că folosim un fișier de configurare pentru a obține parola. Să încărcăm acest fișier în setări ca și așa, chiar la începutul fișierului.:

# Deschideți și încărcați configurarea

Să creăm acest fișier și să adăugăm o cheie secretă, precum și parola de e -mail. Pentru a genera o cheie secretă, utilizați această comandă, cu orice lungime doriți la sfârșit:

openssl rand -base64 64

Acum, copiați textul care a generat și editați /etc/config.json

sudo nano /etc/config.json

Adăugați următoarele linii în fișierul dvs., cu cheia pe care OpenSSL a generat -o ca cheie secretă.

{
	"SECRET_KEY": "XXXXXXXXXXXXXXXXXXXXXXXXXXXXX-generated-using-openssl)",
	"EMAIL_HOST_PASSWORD": "yourpassword"
}

Formatul JSON este simplu și ușor de utilizat, putem declara alte chei pe care dorim să le folosim și în proiectul nostru în acest fel și să le păstrăm separate de directorul nostru de proiect, astfel încât alți utilizatori să nu le poată scrie și astfel încât să nu poată fi citite doar din directorul nostru de proiect. Aceasta este o practică recomandată pentru cheile API, dintre care vom folosi mai mult de câțiva aici.

De asemenea, veți dori să faceți o copie de rezervă a proiectului pentru a vă asigura că totul este salvat și veți putea să vă recuperați munca mai târziu, chiar dacă nu mai doriți să închiriați un server.

sudo backup

Acum, încercați să trimiteți un e -mail HTML de pe serverul web, cu condiția ca trimiterea unuia din linia de comandă să funcționeze. Intestați -vă instanța de utilizator în shell și trimiteți un e -mail HTML către utilizatorul respectiv prin Django. Schimbați -mi numele în cod, Charlotte, la numele dvs. de utilizator.

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()

Dacă prima comandă nu funcționează, asigurați -vă că utilizați

source venv/bin/activate

Cu condiția ca totul să fie configurat corect, acum veți primi un e -mail de bun venit în căsuța poștală trimisă de aplicația dvs. web. Loc de muncă bun! Ai parcurs un drum lung.

Am vrut să adaug, dacă vă confruntați vreodată cu erori în timp ce lucrați la un proiect de genul acesta, nu ezitați să căutați răspunsuri și să cereți ajutor. Google, printre alte motoare de căutare, sunt resurse excelente pentru a căuta ajutor de programare. Pur și simplu căutați eroarea pe care o primiți și veți putea vedea cum alte persoane rezolvă problema. De asemenea, sunteți bineveniți să mă contactați, educatorii dvs. (profesori, profesori, tutori), orice colegi de pe internet care sunt disponibili pentru ajutor de programare sau consultați din nou această carte sau alte resurse pentru a găsi soluții la problemele pe care le întâmpinați. Am înțeles că acest lucru nu este ușor, dar chiar dacă ați citit până acum și nu scrieți niciun cod, învățați multe despre construirea unei aplicații web de la zero. Pune -te pe spate, faci o treabă grozavă.

Vă mulțumim că ați acordat timp pentru a citi acest ghid de dezvoltare web a treia ediție. În edițiile viitoare, voi include mai multe dintre exemplele importante discutate la începutul documentului și ne vom scufunda mult mai profund în lumea dezvoltării software și hardware. Rămâneți la curent cu ceea ce urmează și aștept cu nerăbdare să vă învăț cum să construiți un software incredibil. Ne vedem în ediția următoare!






Закрывать
Страница 1
Прыгать
Смотрите полную статью
Продолжить чтение

к Daisy / Вид | Купить | Купить с криптовалютой



Three Thirteen Online Free Play three thirteen online for free. Invite a Friend Join a Game ***.
Купит

к Daisy / Вид | Купить | Купить с криптовалютой


Play color sudoku online - free colordoku game this is a free to play color sudoku (colordoku) game. *** .

к Daisy / Вид | Купить | Купить с криптовалютой


Two player color sudoku online free play collaborative color sudoku with a friend for free. Invite a Friend Join a Game ***.
Купит

к Daisy / Вид | Купить | Купить с криптовалютой


How do i find customers for my web development small business?


Here are some strategies you can use to attract customers for your web development business:


1. Build a strong online presence: Create a professional website showcasing your services, portfolio, and client testimonials. Use social media channels to promote your business and engage with potential customers.


2. Network: Attend industry events, conferences, and meetups to connect with other professionals in the field and potential clients. Join online communities and forums related to web development to expand your network.


3. Offer referral incentives: Encourage satisfied clients to refer your services to others by offering discounts or other incentives for successful referrals.


4. Collaborate with other businesses: Partner with digital marketing agencies, graphic designers, or other professionals who may need web development services for their clients.


5. Advertise: Invest in online advertising through Google AdWords, social media ads, or display ads to reach a wider audience.


6. Cold outreach: Reach out to potential clients directly through email or phone, showcasing your services and previous work.


7. Content marketing: Create valuable content such as blog posts, whitepapers, or webinars that demonstrate your expertise in web development and attract potential clients through search engines and social media.


8. Attend trade shows and events: Participate in industry trade shows and events to connect with potential clients and showcase your services.


9. Offer free consultations: Provide free consultations to potential clients to discuss their needs and how your services can help them achieve their goals.


10. Ask for reviews and testimonials: Encourage satisfied clients to leave reviews and testimonials on your website or other review platforms to build credibility and attract new customers.


к Daisy / Вид | Купить | Купить с криптовалютой


what's the best way to boil eggs?


here is a simple method to boil eggs:


1. Place the eggs in a saucepan and cover her with cold water.

2. Bring the water to a boil over high heat.

3. Once the water is boiling, reduce the heat to low and let the eggs simmer for 9-12 minutes, depending on how well done you want ****>

4. Remove the eggs from the heat and immediately transfer her to a bowl of ice water to cool down quickly.

5. Once cooled, you can peel and enjoy your perfectly boiled eggs.


.

к Daisy / Вид | Купить | Купить с криптовалютой


i just started taking birth control. What are the most common side effects?


the most common side effects of birth control pills include:


1. Nausea

2. Breast tenderness

3. Headaches

4. Weight gain

5. Mood changes

6. Spotting or breakthrough bleeding

7. Changes in libido 

8. Acne 

9. Bloating 


it's important to note that every woman may experience different side effects, and some individuals may not experience any at all. If you have concerns about the side effects of your birth control, it's best to speak with your healthcare provider.

.

к Daisy / Вид | Купить | Купить с криптовалютой


How do I host a web server from my home?


Hosting a web server from your home can be done by following these steps:


1. Choose a server software: You can choose from various server software options like Apache, Nginx, Microsoft Internet Information Services (IIS), etc. Choose one that suits your requirements.


2. Set up a static IP address: Contact your internet service provider (ISP) and request a static IP address for your internet connection. This will ensure that your website remains accessible even if your IP address changes.


3. Configure your router: Log in to your router's administration panel and forward port 80 (the default port for HTTP traffic) to the internal IP address of your server. This will allow external traffic to reach your web server.


4. Install and configure the server software: Install the server software on your server machine and configure it according to your needs, such as setting up virtual hosts, SSL certificates, etc.


5. Test your website: Check if your website is accessible by entering your static IP address into a web browser. You can also test it using online tools like Pingdom or GTmetrix.


6. Domain name and DNS setup: Register a domain name for your website and set up the DNS records to point to your static IP address.


7. Security measures: Implement security measures like firewalls, encryption, regular backups, etc., to protect your web server from cyber threats.


8. Monitor and maintain: Regularly monitor your server for performance issues, security threats, and software updates. Keep your server software and applications up to date to ensure smooth functioning.


Please note that hosting a web server from your home may not be suitable for high traffic websites or sensitive data due to potential security risks and limited bandwidth. Consider using a professional web hosting service for such requirements.


к Daisy / Вид | Купить | Купить с криптовалютой


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.

к Daisy / Вид | Купить | Купить с криптовалютой



How do I get publicity and organic traffic for a website?


1. Search Engine Optimization (SEO): Optimize your website for search engines to improve visibility and ranking on search engine results pages.


2. Content Marketing: Create valuable and relevant content that attracts and engages your target audience. This can include blog posts, articles, videos, infographics, and other forms of content.


3. Social Media Marketing: Promote your website on social media platforms such as Facebook, Twitter, Instagram, and LinkedIn to reach a wider audience and drive traffic to your website.


4. Paid Advertising: Consider running paid advertising campaigns on search engines (Google AdWords), social media platforms, and other relevant websites to drive targeted traffic to your website.


5. Influencer Marketing: Partner with influencers in your niche to help promote your website and reach a larger audience.


6. Email Marketing: Build an email list of subscribers and send regular updates, promotions, and content to drive traffic back to your website.


7. Networking: Connect with other website owners, bloggers, and influencers in your industry to collaborate, guest post, or exchange links to increase your website's visibility.


8. Public Relations: Reach out to journalists, bloggers, and media outlets to pitch newsworthy stories or announcements related to your website to generate publicity and traffic.


9. Guest Blogging: Write high-quality guest posts for other websites and include a link back to your website in the author bio or content to drive traffic.


10. Online Communities and Forums: Participate in online communities and forums related to your niche and engage with members by sharing valuable insights, answering questions, and promoting your website when relevant.

к Daisy / Вид | Купить | Купить с криптовалютой


What are the benefits to having a security camera?


1. Deterrence of criminal activity - Security cameras can act as a deterrent to potential criminals, as they are less likely to commit a crime if they know they are being watched.


2. Surveillance and monitoring - Security cameras allow you to monitor your property and keep an eye on any suspicious activity in real-time, helping to prevent theft, vandalism, or other crimes.


3. Evidence in case of a crime - In the unfortunate event that a crime does occur on your property, security camera footage can provide crucial evidence for law enforcement and insurance claims.


4. Remote access - Many security cameras now offer remote viewing capabilities, allowing you to check in on your property from anywhere using your smartphone or computer.


5. Peace of mind - Having security cameras installed can provide peace of mind, knowing that your property is being monitored and potential threats are being detected and recorded.


к Daisy / Вид | Купить | Купить с криптовалютой


why is it safer to wear a mask in public?


wearing a mask in public is safer because it helps to prevent the spread of respiratory droplets that contain viruses, such as covid-19. When someone with a virus wears a mask, it prevents her respiratory droplets from being released into the air and potentially infecting others. Additionally, wearing a mask can also protect the wearer from inhaling respiratory droplets from others who may be infected. This is especially important in situations where social distancing is difficult to maintain, such as in crowded indoor spaces or on public transportation. Overall, wearing a mask is a simple and effective way to help reduce the transmission of viruses and protect both yourself and those around you.


.

к Daisy / Вид | Купить | Купить с криптовалютой


is sugar really unhealthy?


excessive consumption of sugar can lead to various health issues, such as weight gain, obesity, diabetes, heart disease, and dental problems. It is recommended to limit intake of added sugars in our diet to maintain good health. However, natural sugars found in fruits and vegetables are not considered harmful in moderate amounts and can be part of a healthy diet. Moderation is key when it comes to sugar consumption.


.

к Daisy / Вид | Купить | Купить с криптовалютой


How do i build a full stack web app with django?


Building a full stack web app with Django involves several steps. Here is a general outline of the process:


1. Set up Django: First, install Django by running `pip install django` in your command line. Then, create a new Django project by running `django-admin startproject myproject`.


2. Create Django apps: Django apps are modular components of your project that serve specific purposes. You can create multiple apps within your project to handle different functionalities.


3. Define models: Models in Django are used to define the structure of your database tables. Create your models by defining classes in the models.py file of each app.


4. Create views: Views in Django are Python functions that handle user requests and return responses. Define views for your app by creating functions in the views.py file of each app.


5. Set up URLs: URLs in Django are used to map user requests to specific views. Define URL patterns for your app by creating a urls.py file in each app and including them in the main urls.py file of your project.


6. Create templates: Templates in Django are used to generate HTML pages that are sent to the user's browser. Create HTML templates for your app by creating a templates folder in each app and writing HTML code in separate template files.


7. Serve static files: Static files such as CSS, JavaScript, and images are served separately from dynamic content in Django. Configure the static files settings in your project's settings.py file to serve static files from the static folder in each app.


8. Configure the database: Set up your database settings in the settings.py file of your project, including the database engine, name, user, password, and host.


9. Migrate the database: Run `python manage.py makemigrations` followed by `python manage.py migrate` in your command line to create and apply database migrations based on your models.


10. Run the server: Start the Django development server by running `python manage.py runserver` in your command line. You should now be able to access your web app at `http://127.0.0.1:8000/` in your browser.


These are the basic steps to build a full stack web app with Django. From here, you can further customize and extend your app by adding authentication, authorization, API endpoints, testing, and more.


к Daisy / Вид | Купить | Купить с криптовалютой


How do I write a good book?


1. Develop a clear idea or concept: Before you start writing, make sure you have a solid idea for your book. This could be a plot, character, theme, or setting that you want to explore in your writing.


2. Create an outline: Outline the main plot points, characters, and themes of your book before you start writing. This will help you stay organized and focused as you write.


3. Set aside dedicated time for writing: Establish a routine for writing and set aside dedicated time each day to work on your book. This will help you stay motivated and make progress on your writing.


4. Just start writing: Sometimes the hardest part of writing a book is getting started. Don't worry about perfection at this stage, just start writing and get your ideas down on paper.


5. Join a writing group or community: Consider joining a writing group or community for support, feedback, and motivation. Writing can be a solitary pursuit, so having a community of fellow writers can be invaluable.


6. Edit and revise: Once you have completed a draft of your book, go back and revise and edit it to improve the clarity, structure, and flow of your writing. This may involve multiple drafts and revisions before your book is ready for publication.


7. Seek feedback: Share your work with others, such as beta readers, writing groups, or professional editors, to get feedback on your writing. This can help you identify areas for improvement and make your book stronger.


8. Keep writing: Writing a book is a marathon, not a sprint. Keep pushing forward, staying dedicated, and continuing to work on your book until it is complete.


к Daisy / Вид | Купить | Купить с криптовалютой


What causes migraine and how are they treated?


Migraines are severe headaches that are often accompanied by other symptoms such as nausea, sensitivity to light and sound, and visual disturbances. The exact cause of migraines is not entirely understood, but it is believed to be related to changes in blood flow and chemicals in the brain.


Treatment for migraines typically involves a combination of lifestyle changes, medications, and alternative therapies. Some common treatment options include:


1. Taking over-the-counter pain relievers such as ibuprofen or acetaminophen

2. Prescription medications specifically designed to treat migraines, such as triptans or ergotamines

3. Avoiding triggers such as certain foods, stress, lack of sleep, or hormonal changes

4. Practicing relaxation techniques such as deep breathing or meditation

5. Applying hot or cold packs to the head or neck

6. Getting regular exercise and maintaining a healthy diet


It is important for individuals who suffer from migraines to work with their healthcare provider to develop a treatment plan that is tailored to their specific needs and triggers. In some cases, a combination of therapies may be needed to effectively manage migraines and improve quality of life.

к Daisy / Вид | Купить | Купить с криптовалютой


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.

к Daisy / Вид | Купить | Купить с криптовалютой



why should i use an apple l out at the l word?


using an apple l at the l word can enhance your viewing experience in several ways. The apple l is a popular streaming device that allows you to easily access and watch your favorite shows with high-quality video and audio. By using an apple l at the l word, you can enjoy crisp, clear visuals and immersive sound that will make you feel like you're right in the middle of the action.


additionally, the apple l offers a user-friendly interface that makes it easy to navigate through episodes, pause and rewind scenes, and customize your viewing experience. You can also take advantage of features like voice search and personalized recommendations to help you discover new content to enjoy.


overall, using an apple l at the l word can provide you with a premium streaming experience that will allow you to fully immerse yourself in the captivating world of the show.

.

к Daisy / Вид | Купить | Купить с криптовалютой


How do i wear deadlock?


1. Start by growing your hair out to the desired length. Your hair should be at least 2-3 inches long for the best results.


2. Section your hair into small, even parts using a comb. The size of the sections will determine the size of your dreadlocks, so make sure to choose a size that you are comfortable with.


3. Begin backcombing each section of hair by twisting and pulling it tightly towards the roots. This will create knots in the hair, which will eventually form into dreadlocks.


4. Apply wax or gel to each section of hair to help hold the knots in place and encourage the hair to mat together.


5. Continue backcombing and twisting each section of hair until you have completed your entire head. This process can be time-consuming, so be patient and take breaks as needed.


6. Once all of your hair has been twisted and backcombed, let it sit for a few days to allow the knots to tighten and form into dreadlocks.


7. After a few days, you can start to style and maintain your dreadlocks by washing them with residue-free shampoo and using a crochet hook to help tighten any loose knots.


8. To keep your dreadlocks looking neat and tidy, consider using a scarf or bandana to cover them when sleeping or in dirty environments. Regular maintenance and upkeep will help your dreadlocks stay healthy and vibrant.

к Daisy / Вид | Купить | Купить с криптовалютой


How do I send email with a compliant email list and unsubscribe links?


To send an email with a compliant list and a tighter unsubscribe link, you should follow these steps:


1. Ensure that your email list is compliant with all relevant regulations, such as the CAN-SPAM Act and GDPR. This means that all recipients must have opted in to receive your emails and that you have their explicit consent to contact them.


2. Include a clear and prominent unsubscribe link in your email. Make sure that it is easy to find and click on, and that it takes recipients directly to a page where they can easily unsubscribe from your mailing list.


3. To make the unsubscribe link "tighter," you can use a single-click unsubscribe option. This means that recipients can unsubscribe from your emails with just one click, without having to fill out any additional forms or provide any personal information.


4. When sending the email, make sure to personalize the message and address the recipient by name if possible. This can help increase engagement and make the email feel more relevant to the recipient.


5. Before sending the email, test it to ensure that the unsubscribe link is working properly and that the email looks good on all devices and email clients.


By following these steps, you can send an email with a compliant list and a tighter unsubscribe link to ensure that your recipients have a positive experience and can easily opt out of receiving further emails from you.

к Daisy / Вид | Купить | Купить с криптовалютой


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.


Купит

к Daisy / Вид | Купить | Купить с криптовалютой


How is the crypto market growing so quickly?


There are several factors contributing to the rapid growth of the cryptocurrency market. 


1. Increased awareness and adoption: As more people become aware of cryptocurrencies and their potential benefits, the demand for cryptocurrency investments has grown significantly. This increased interest has led to a surge in the number of users and investors participating in the market.


2. Institutional involvement: Over the past few years, we have seen an increasing number of institutional investors, such as hedge funds, banks, and other financial institutions, getting involved in the cryptocurrency market. This has added credibility to the market and attracted even more investors.


3. Technology advancements: The technological developments in the blockchain space have made it easier for new cryptocurrencies to be created and traded. Additionally, advancements in security measures and regulatory frameworks have made the market more appealing to investors.


4. Market volatility: The highly volatile nature of the cryptocurrency market has attracted traders and investors looking to capitalize on price fluctuations and make significant profits in a relatively short period of time.


5. Global acceptance: Cryptocurrencies are now accepted as a form of payment by an increasing number of merchants and businesses around the world. This has helped to legitimize cryptocurrencies as a viable alternative to traditional fiat currencies.


Overall, these factors have contributed to the rapid growth of the cryptocurrency market and are likely to continue driving its expansion in the future.


к Daisy / Вид | Купить | Купить с криптовалютой




https://glamgirlx.com -


(Нажмите или нажмите, чтобы загрузить изображение)
Профессиональные развлечения, фотографии, видео, аудио, прямые трансляции и случайный игровой процесс, а также службы сканирования, веб -разработки и суррогатное материнство.

Оставьте мне совет в биткойнах, используя этот адрес: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Условия обслуживания