Notizia - Visita il sito
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 ...
Deep Learning e sicurezza pratici basati sul web per esempio

Deep Learning e sicurezza pratici basati sul web per esempio Terza edizione Charlotte Harper 3 luglio 2024 Aggiornato/convertito il 3 giugno 2025

Prefazione:

Le considerazioni sulla sicurezza nella costruzione di software per il Web sono una parte importante del piano e dell'esecuzione di qualsiasi sviluppatore Web, mentre ingegnerono un prototipo affidabile, stabile e utile per scopi pratici. Il DOM (Document Object Markup), con la sua implementazione di HTML, JavaScript e CSS, nonché software di backend che implementano Python, C/C ++, Java e Bash, dare agli sviluppatori Web la libertà e il potere per creare una vasta gamma di progetti che esprimono la creatività, offrono la facilità di uso terminale, che offrono la facilità con gli utenti che si trovano in termini di joe che esprimono la via di lavoro, che esprimono la facilità di ambientazione, che offrono la facilità con l'utente, la facilità con cui si esprimono la via di lavoro. Uccidi il tempo o fai qualcosa su Internet, di solito su un dispositivo per smartphone touchscreen. La maggior parte delle persone non saprebbe nemmeno da dove iniziare quando vogliono costruire un sito Web da zero, tenderanno a iniziare sul sito Web di un'altra persona e costruire qualcosa di limitato in funzionalità, affidabilità, facilità d'uso e soprattutto creatività quando avrebbero potuto avere tutti gli ultimi potenti strumenti a loro disposizione per costruire qualcosa di utile e per perdere tempo senza perdere tempo a pressione del tempo, e soprattutto per perdere denaro per i abbonamenti costosi per il software per il software che avrebbero voluto usare comunque il limite per facilitare la facilità per facilitare. Se hai qualche minuto per leggere questo libro e imparare ciò che voglio insegnarti, o addirittura parlare con me personalmente dei tuoi obiettivi e ottenere una guida nella giusta direzione e sei motivato a imparare a codificare e scrivere il tuo software, prendere questo libro a casa e metterne da parte il tuo tempo per costruire il prossimo pubblico influente, potente, semplificato e importante.

Su di me: Sono uno sviluppatore di software con una vasta gamma di esperienza in C/C ++, Java, Python, HTML, CSS e JavaScript. Costruisco i siti Web che le persone vogliono usare, vogliono visitare e persino essere dipendenti dall'uso solo per imparare, ricreare e uccidere il tempo e, soprattutto, vendo software. Se avessi un'idea su come volevi che un sito Web guardasse e funzionino, eri disposto a supportarmi in modo da poter soddisfare le mie esigenze mentre soddisfi le tue e sei disposto a coprire i costi di gestione di un sito Web da solo, ti costruirei il prossimo YouTube, Tiktok, Twitter, Google o anche un'app di sicurezza ad alta tecnologia che puoi accedere. Invece di provare a venderti il ​​mio tempo, sto cercando di acquistare il tuo: voglio convincerti a costruire un'app (sito Web) con le informazioni già esistenti e insegnarti ciò di cui hai bisogno per essere uno sviluppatore di software indipendente, imprenditore, conducendo una carriera di successo in qualunque campo desideri. E lascia che sia chiaro, l'educazione che ti do sarà informale. Potresti andare a scuola e imparare tutto questo con un'istruzione formale o persino leggere questo libro a scuola, completare i tuoi incarichi e portare via molto dalla tua istruzione, ma non ti metterò formalmente sul posto caldo e ti chiederò di completare i compiti. Non sono il tuo professore, puoi pensare a me come un amico che vuole guidarti verso una carriera guidata dal tuo successo personale. E non sto vendendo nemmeno il successo, dovrai acquistarlo con il tuo tempo. Imparare a programmare ha una curva di apprendimento ripida e non è mai stato facile, o addirittura dovrebbe esserlo. Devi lavorare più duramente possibile e continuare a provare a fallire e riprovare anche quando sei frustrato per imparare e costruire le app da solo. Questo è nella natura del codice stesso. Il codice è gestito da un compilatore progettato per fornire messaggi di errore del programmatore e questi ti insegnerà come codificare, anche se stai semplicemente copiando l'errore nel motore di ricerca e leggendo gli esempi di altre persone. E devo dire che non devi essere estremamente ricco, intelligente, di successo o persino orientato o organizzato per creare un'app. Il computer si occupa di quell'organizzazione per te. Devi solo perseverare attraverso la prova ed errore, mantenere la concentrazione e lavorare sodo per quello che fai e avrai una carriera di grande successo in tutto ciò che fai.

Chi sono: Mi rendo conto che l'ultima sezione riguardava più l'apprendimento e il tuo modo di fare un modo da questo libro. Chi sono esattamente? Questa è una domanda complicata. Non sono chiaro su questo, poiché soffro di condizioni mediche che possono rendermi difficile anche il codice o scrivere questo libro a volte, mentre presentavo sfide con i problemi di socializzazione e identità che rendono la mia vita più difficile quando si tratta di introdurmi. In breve, se stai leggendo questo libro, l'hai portato a casa perché l'hai sfogliato e hai pensato che fosse utile, o anche se hai appena letto così lontano, a te sono un individuo affini che vuole vederti avere successo in tutto ciò che fai. Anch'io sono un ingegnere, uno sviluppatore di software e uno studente, e sto scrivendo questo libro per altri studenti che vogliono semplificare la propria vita avendo un manuale del software che hanno bisogno di semplificare la loro vita dando esempi per copiare che si adattano come un grande puzzle in un'app operativa, utile, grande, funzionale, coesa e coinvolgente che può guidare il successo non importa la linea di attività. In gran parte, questo è quello che faccio: costruisco app per aiutare me stesso e le altre persone ad avere successo. Sono anche un autore, anche se questa è la mia prima pubblicazione che intendo completare per mettere insieme il mio portafoglio in un documento utile e sono anche un artista. Ti ammetterò questo, sono una specie di strana persona. Non sono perfetto, ho fatto correre con la legge che mi ha anche portato a lasciare college e università e lasciare gli stati per cercare di farmi un nome con più successo. Sono una donna di nascita, mi trucco, scatto foto di me stesso, indosso abiti e altri abiti da donna e rimango consapevole di me stesso come femmina per natura. Ho avuto problemi con altre persone in passato che hanno portato a lotte con la scrittura e la costruzione di WebApps, e mi scuso per non essere stato in grado di mettere questo libro in mano prima: ne avevi bisogno. Ti consigliamo di leggere e scrivere un codice che assomiglia al mio e che funzioni come il mio e fa la stessa cosa, ma anche meglio, perché se puoi permetterti di acquistare questo libro invece di schiacciare la tastiera come faccio solo per creare un libro da solo chiedendo denaro, hai le risorse di cui hai bisogno per avere successo nella tua vita. Ho avuto tutti i tipi di problemi con la famiglia che cresce, le condizioni di salute, i medici, i media e la legge e il mio codice riflettono profondamente la lotta che è il femminismo e la natura femminile in un mondo diviso e frustrato. Tuttavia, questo libro è qualcosa di cui tengo profondamente, il mio bambino, il mio portfolio e il mio sostentamento, quindi apprezzo la tua considerazione quando porti il ​​testo a casa e ci metti con cura per imparare da me. Tieni presente che non sono perfetto, questo libro avrà errori, revisioni e nuove edizioni e dovrai pensare con il tuo cervello logico nel miglior modo possibile per avere un'esperienza di successo con la mia scrittura. Inoltre, capisci che intendo bene per te anche quando affronti sfide durante la scrittura. Pensaci in questo modo: quando puoi semplicemente noleggiare un sistema informatico per fare qualsiasi cosa tu possa immaginare nello spazio digitale, archiviare tutte le informazioni che incontri, analizzale e organizzarle e capirlo, incontrerai inevitabilmente difficoltà con le informazioni che stai ingerendo e persino pubblicando. Te lo dico perché incontro le stesse difficoltà. 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 lavoro, Internet. Potresti non avere molta familiarità con chi sono con poche parole, ma ti incoraggio a leggere, mi conoscerai mentre continuerai a leggermi e capirmi mentre costruisci i tuoi progetti per completare il tuo lavoro. Non ci saranno compiti a casa con questo libro, purché i tuoi professori o insegnanti non ti assegnino, ma ti incoraggio vivamente a costruire un portafoglio di progetti da solo mentre leggi, nonché un progetto Capstone che mostra come puoi applicare ciò che hai imparato. Il mio progetto Capstone è la base per la maggior parte di ciò che leggerai in questo libro, in quanto incorpora il codice dei miei progetti precedenti, il codice che ho creato e imparato a scrivere metodicamente a mano, e una vasta gamma di idee e suggerimenti che mi hanno aiutato ad avere successo nel punto in cui posso far girare una semplice app che è pienamente caratterizzata e sembra e si comporta come un'app popolare che potresti vedere la tua amica o la tua famiglia usando, su Internet, pubblicizzato a te e nelle notizie.

Cos'è questo libro: Questo libro è un tutorial per esempio. 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 Costruisci nella migliore luce in assoluto per essere la più attraente possibile per gli utenti finali, i visitatori del tuo sito Web. In questo libro, dimostrerò una serie di esempi di progettazione di software con particolare attenzione al Web come piattaforma e sicurezza. Inizieremo l'esperienza di apprendimento costruendo un progetto di base utilizzando UNIX Shell, con funzionalità di backup e scripting. Quindi, esamineremo un sito Web del blog di base, aggiorneremo il nostro blog con funzionalità fotografiche e video e utilizzeremo queste funzionalità per utilizzare soluzioni di sicurezza utilizzando il software gratuito e proteggere il nostro server utilizzando un modulo di autenticazione pluggable (PAM). Esamineremo quindi la gestione e l'elaborazione dei file, esplorando l'editing video, la donazione vocale, la scansione dei codici a barre e il riconoscimento ottico dei personaggi, tra gli altri concetti. Lungo la strada esamineremo le API che ci aiuteranno a rendere il nostro software più utile e sicuro, con opzioni gratuite e a pagamento. Lungo la strada, esploreremo gli strumenti di sicurezza fisica e militanti come armi da fuoco e munizioni e manifatturiero tra cui il design a barile e ripetitore, la progettazione di torretta e droni e altri principi che integreremo con il nostro software sulla rete esistente al fine di proteggere il nostro software e dimostrare l'autodifesa e la resillenza. Faremo pause lungo la strada per costruire giochi, motori di rendering 2D e 3D e lavorare con hardware incorporato nei casi di studio esempi di software di rendering dimensionale di base e un massaggiatore vibrante elettronico cast in gomma siliconica rispettivamente. Lungo la strada, utilizzeremo anche soluzioni di apprendimento automatico già disponibili per proteggere meglio il nostro software. Impiegheremo anche strumenti di borsa disponibili per il Web al fine di semplificare e proteggere il processo. Questo libro è una guida al tuo successo nella costruzione di un'applicazione Web e nell'integrazione con una rete professionale di computer e sistemi meccanici incorporati e nel complesso una guida per la costruzione di software e hardware incorporato senza conoscenza di base o esperienza precedente.

Quello che questo libro non è: Se vuoi davvero avere un sito Web, potresti semplicemente impostare un semplice negozio e vendere ciò di cui hai bisogno, pubblicare un blog, pubblicare foto o video o altrimenti senza mai scrivere una singola riga di codice. Questo libro non è quello. Questo libro ti insegnerà come costruire software più utile, completamente presente, funzionale e sicuro di qualsiasi software che puoi già trovare, perché distribuisce le ultime software che sono ancora prototipi, potrebbe essere costoso da funzionare in una scala a cui operano le aziende anziane e non appellano a backwards, aziende contorte preparate per fare soldi per le persone che non stanno davvero facendo nulla. Se segui da vicino questo libro, vorrai scrivere codice, codice di ricerca, creare le tue app e fare soldi da ciò che fai. Farò soldi da questo libro, anche nelle prime fasi, perché contiene informazioni che le persone hanno bisogno e vogliono leggere e stanno già acquistando quando acquistano o usano le mie app. Questo libro non costruirà un'app per te, ma ti indicherà la giusta direzione e ti armato con gli strumenti di cui hai bisogno e le abilità e i suggerimenti che faciliteranno il tuo successo nella costruzione di software per il Web, con ogni linea di codice che dovrai scrivere come esempio, pronto a essere messo insieme nei software che tu e i vostri sostenitori, ospiti, clienti, amici, familiari, visitatori, appaltatori e persone che desideri utilizzare e supportare.

Cosa imparerai: Questo libro ti insegnerà come creare e vendere software, software davvero funzionale, utile, registrazione dei media, funzionalità di sicurezza come riconoscimento facciale, scansione dei codici a barre delle zone leggibili da macchina, API Web per autenticare, registrare e rendere video e foto e scambiare messaggi come la comunicazione Bluetooth e Near Field (NFC). Questo libro ti insegnerà come utilizzare un computer in rete, concentrandosi su Debian Linux, come costruire il codice bash per rendere l'installazione e il backup del tuo software una brezza senza soluzione di continuità e automatizzata, come costruire il codice Python come back -end per servire messaggi dinamici, modellare le cose che utilizzano benefici come CSS come gli stili di sicurezza come i bombole di sicurezza come i text di sicurezza o l'utilizzo di text di sicurezza come text di sicurezza come i messaggi di sicurezza come CSS come STYS come CSS come Stili di sicurezza come Ormature OrG. Altri scopi, scansione ID, moderazione delle immagini e video, microtransazioni di dati per mantenere il tuo software sicuro, elaborazione dei pagamenti, negoziazione di criptovaluta, attività asincroni e altro ancora. Imparerai come costruire i tuoi dispositivi Bluetooth, con batterie, caricabatterie, microcontrollori, circuiti, motori e sensori, utilizzando materiali di saldatura, filo e 3D stampati e fusioni. Dimostrerò i principi di progettazione 3D applicati alla produzione additiva e agli strumenti e alla making, in modo da essere in grado di produrre i tuoi dispositivi hardware incorporati con batterie integrate, caricabatterie, circuiti elettronici e uscite funzionali. e in rete con Bluetooth e il Web. In particolare, esamineremo due casi studio, un massaggiatore vibrante e un'arma da fuoco fatta in casa, entrambi programmati in OpenScad, che è disponibile come interfaccia grafica o utilità della linea di comando e può essere integrato in una rete per risultati più rapidi. Imparerai come costruire e distribuire un sito Web da zero senza alcuna esperienza precedente, renderlo funzionale, sicuro, bello, utile e, soprattutto, pratico. Imparerai come utilizzare l'apprendimento automatico e la visione informatica per rendere un sito sicuro e più pratico, registrare video e audio dal tuo sito Web, donare la tua voce, fare musica e modulare l'audio per creare campioni utili e come sfondare il rumore sfruttando altri siti Web per costruire la migliore rete possibile di siti Web che puoi collegare direttamente ai tuoi per condividere tutte le informazioni utili che devi offrire e ancora più importanti portando le persone e le tue attività. Questo libro si concentrerà molto su media, sicurezza e apprendimento automatico, che sono i tre componenti principali che ti aiuteranno a creare software utili per il Web coinvolgendo gli utenti giusti e disimpegnando quelli sbagliati in un modo realistico, pratico, pratico e coinvolgente pur automatico e robusto. Questo libro insegna UNIX, in particolare Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript e una serie di utili pacchetti software per le richieste di Python, nonché utili software bash come Git e FFMPEG. Ti insegnerò anche come scambiare automaticamente la criptovaluta e prendere i pagamenti in criptovaluta o da carte di debito regolari, pur pagando ai tuoi visitatori una quota delle tue entrate se scegli di farlo. Ti insegnerò come fare soldi dal tuo sito Web anche attraverso la pubblicità, come preparare la tua app per i motori di ricerca e renderla veloce, classificata nella prima classifica per ciò che i tuoi clienti cercheranno per trovarti e classificare il maggior numero possibile di ricerche comuni. Ti insegnerò come vendere il tuo software, pubblicizzarlo, fare appello ai clienti che cercano i tuoi servizi e fatti un nome su Internet attraverso viali che già esistono, sono economici e funzionano bene. Ti insegnerò come salvare i tuoi dati sui cloud computer che funzionano per te e salvare i tuoi dati a buon mercato, come pianificare e costruire un sito Web che faccia ciò che i tuoi utenti desiderano e ciò che desideri e come mantenere i tuoi utenti coinvolti mettendo il tuo sito un tocco con i loro telefoni con le notifiche con un pulsante a scatto di un clic. Questo libro si concentrerà sulla praticità della pubblicazione e della distribuzione dei media in grandi quantità, dal testo alle foto ai video all'audio, facendo una buona impressione sugli utenti finali (la tua clientela) e la vendita in qualsiasi modo per creare un sito Web, un'app che è rappresentativa di te e di te solo e te, e ti rende il tuo software nel miglior modo possibile. Imparerai anche alcuni suggerimenti e trucchi da me, dai consigli di codifica, una vanità pratica come il trucco e la fotografia, la modellazione e la recitazione e altro ancora, il che sarà importante per interpretare te stesso e la tua azienda nella migliore luce possibile usando tutti gli strumenti disponibili durante la distribuzione di tutti i contenuti di cui hai bisogno attraverso un saluto equilibrio di piattaforme per portare il tuo software per fruttificare senza sforzo, lavoro di quanto non sia necessario. Questo libro si chiama "PraticoWeb Based Deep Learning and Security by Example" for a reason: It deals with learning to code, specifically for the web, specifically with a focus on security, from a practical standpoint, with examples of working code that serves the practical purposes outlined in the text. The learning component of this text also encompasses machine learning, the code I will show you how to run for the web that will handle computer vision, facial recognition, image and video moderation, image enhancement, resolution Miglioramento, didascalie all'immagine e altre attività come metriche di previsione provenienti da immagini, come la natura dell'immagine come un'immagine autentica e strutturata al computer o una copia ottica (una foto di un'immagine o una foto stampata è molto importante quando si tratta di essere molto importante quando si tratta di essere più importante quando si tratta di essere più importante quando si tratta di essere più importante quando si tratta di essere più importante quando si tratta di essere più importante quando si tratta di essere più importante quando si tratta di essere più importante, ma è molto importante quando si tratta di essere più importante, ma è molto importante quando si tratta di essere più importante, ma è molto importante quando si tratta di essere più importante, ma è molto importante quando si tratta di essere più importante, ma è molto importante quando si tratta di essere più importante, ma si tratta di un cambio di accesso. Con la tua faccia. utilizzo). Chiunque costruisca software che sia impeccabilmente sicuro ha un certo senso di ciò che ciò implica. Il software è intrinsecamente insicuro perché i dispositivi e gli account che utilizziamo per accedervi non sono sempre a nostra disposizione, potrebbero essere nelle mani di chiunque abbia un cattivo intento per il software e quindi potrebbero rappresentare un rischio per il software stesso. Questo è un focus di questo libro. Un computer in rete è per impostazione predefinita protetta con un token a chiave lunga, chiamato e SSH o chiave Shell Shell, ed è altrimenti meglio protetto con un server Web, poiché il server Web fornisce l'accesso aperto e lo stato degli strumenti di sicurezza artistica in esecuzione sul server stesso. Il server Web ha accesso al browser Web dell'utente, che è probabilmente la parte più potente del dispositivo dell'utente, perché è il luogo in cui l'utente può accedere al software in rete. This toolkit can render text, the webpages you see, and can also record images, audio and video (like a photo of a face or a state ID), can read and write to Bluetooth radio devices, and can read and write to near field transponder tags, inexpensive key cards, fobs, stickers, rings and even chip implants with unique serial numbers that can be read and written to with data generated and validated by a web server tied to the web site. Utilizzando tutti gli strumenti a tua disposizione, con questo libro ti dovererai le conoscenze per costruire un sito Web sicuro e nel complesso un sistema informatico in rete sicuro che funzioni per te, fa le tue offerte, si sente e si sente

Da dove cominciare: Sei il benvenuto per saltare oltre la sezione con cui inizio questo libro, o qualsiasi sezione, al codice esatto di cui hai bisogno, soprattutto se hai esperienza con la codifica prima o uno qualsiasi degli strumenti di cui sopra che descriverò in dettaglio in questo libro, oltre a documentare casi d'uso e esempi pratici di essi. Se non hai esperienza nella scrittura del codice, ti consiglio vivamente di leggere tutto questo libro e in particolare ti consiglio di leggere le sezioni precedenti, per assicurarti che questo libro sia giusto per te. Se questo libro non è giusto per te, considera di regalarlo a un amico o parente che potrebbe essere interessato a conoscere lo sviluppo del web stesso e persino prendere in considerazione il prestito e l'apprendimento da loro per colmare le lacune in cui ti ho deluso come insegnante o altri insegnanti hanno fatto prima di me. Inizia dove farai, ogni parte di questo libro sarà utile se si intende creare un'app utile e considera che le migliori app sono costruite pensando all'utente finale: conosci il tuo cliente. Ora mi conosci, conosci questo libro e sei pronto per iniziare. Per iniziare, prendi un computer (anche il laptop più economico da un box store, Amazon o un vecchio desktop funziona e impostalo in un modo che funzioni per te.

Come leggere questo libro: Testo evidenziato, indica che il testo appartiene a un prompt dei comandi, in cui scriverai il codice eseguito. Il prompt dei comandi è fortemente focalizzato sulla tastiera e richiede poca o nessun clic, accelerando il flusso di lavoro e rendendo le cose più facili su di te.

Iniziare: Ci immergiamo. Iniziamo costruendo il codice su una macchina locale e inizieremo senza costruire un sito Web connesso a Internet. Questo è più sicuro per cominciare, non costa nulla ed è facile per te. A seconda del sistema operativo, entrare in una conchiglia di bash sarà un po 'diverso. Per Mac OS, ti consiglio di installare una macchina virtuale a questo punto, poiché otterrai la massima compatibilità con una macchina virtuale. Vari provider come VirtualBox e Palells possono eseguire una macchina virtuale per te, sebbene sia anche possibile installare Ubuntu direttamente sulla macchina, se si preferisce utilizzare un ambiente nativo che è consigliato per creare un'esperienza rapida e snella. Se stai usando Linux o Windows, che ti consiglio, dovrebbe essere abbastanza facile creare un progetto. Apri il tuo terminale, regola il dimensionamento come si vede adatta e inizia il passaggio seguente 2. Se si utilizza Windows, seguire il passaggio 1.

Passaggio 1: - Solo utenti di Windows In Windows, apri il prompt dei comandi come amministratore e digita WSL –Install

Passaggio 2: - Continua qui o salta il passaggio 1 a qui se non si utilizza Windows In un terminale aperto, (a seconda del sistema operativo, chiamato Ubuntu in Windows, terminale in Mac o Linux o un nome simile), inizia creando un progetto. Lo facciamo con il comando MKDIR, che crea una directory. Se è necessario creare una directory per archiviare il progetto, che è consigliato, utilizzare il comando CD per passare alla directory e e

CD/PATH/TO/Directory - Il percorso è le cartelle (file) che precedono la directory di destinazione, il percorso predefinito è ~ o/home/nome utente (dove il nome utente è il tuo nome utente). Per passare alla directory predefinita, digitare CD o CD ~ Esempio MKDIR - Sostituisci "esempio" con il nome della directory

Ora hai una directory di lavoro per il tuo progetto. Essere come è così importante salvare questa directory nel caso in cui sia necessario passare a una macchina diversa o distribuire il codice che scrivi in ​​modo che sia pronto per il Web, costruiremo uno script per eseguire il backup della tua directory nei prossimi passaggi. Ma la creazione di uno script richiede un po 'di codice e il codice deve essere automatizzato per essere il più utile possibile. Quindi costruiamo prima una sceneggiatura per creare script. Cominciamo creando lo script e rendendolo eseguibile. Useremo Sudo, Chmod e Touch per questo e chiameremo lo script "Ascript".

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

Ora abbiamo creato lo script, reso eseguibile e siamo pronti a modificarlo. Nano è un editor di testo che ti consente di modificare il testo senza fare clic, il che è molto più semplice rispetto all'utilizzo di un'interfaccia utente grafica. Per modificare un file con nano, utilizzare nano e quindi il percorso del file. Per creare una sceneggiatura che produce una sceneggiatura, è abbastanza simile a fare la nostra sceneggiatura in primo luogo. Useremo lo stesso codice di cui sopra, sostituendo il nome dello script, "AScript" con un parametro Argomento, $ 1. Questo ci consente di chiamare lo script digitando semplicemente sudo ascript Newscript, a quel punto possiamo creare qualsiasi nuovo script sostituendo "Newscript" con il nome del tuo script. Il codice in nano dovrebbe apparire:

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

E per chiudere Nano, possiamo tenere premuto il tasto di controllo e premere X, quindi Y per indicare che stiamo salvando il file e prendiamo il ritorno. Ora invece di digitare questi tre comandi per modificare uno script, saremo in grado di digitare sudo ascript ascript per modificare nuovamente lo script. Questo funziona! E qualsiasi nuovo script può essere eseguito facilmente chiamandolo nella shell. Salviamo il nostro lavoro ora: scriviamo uno script di backup per salvare il nostro nuovo script e poi eseguirlo nel nostro directory del progetto, eseguendo anche il backup dello script di backup.

sudo ascript backup

Ora, in nano:

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

Dove/path/to/directory è il percorso del progetto creato con MKDIR. Più tardi impareremo come copiare percorsi di ripetizione come questo con un ciclo e un elenco, che è meno codice, ma per ora manteniamolo semplice e abbiamo alcune righe. Per eseguire questo script e eseguire il backup del codice, salva il file in nano con Control+X, Y e Return e digita il di seguito nella shell

backup

Se ti viene richiesto una password durante la lettura di questo libro e si seguono nella shell, inserisci correttamente la password dell'utente, avrai tre tentativi prima di dover ripetere il comando. È possibile utilizzare le frecce su e giù per riesarcizzare i comandi e modificarle, se hai bisogno di eseguire qualsiasi cosa due volte. Semplice premere su e giù in modo intermittente per selezionare un comando, prima di modificare il comando con le frecce destra, sinistra ed eliminare il tasto oltre alla tastiera e eseguirlo con reso.

Congratulazioni! Sei riuscito a creare uno script di backup fantastico che esegue il backup di due importanti script di shell nella tua directory di lavoro. Potremmo muovere le cose più tardi quando il progetto diventa più grande, ma per ora funziona. Andiamo a fare il backup nel cloud, useremo GitHub per questo (anche se ci sono numerose altre soluzioni GIT per il backup, sono tutte più o meno lo stesso.) Git è un software di controllo delle verisioni che ti consente di eseguire il backup delle modifiche al tuo software mentre le fai a un server, consentendo anche di scaricare intere copie del tuo software dietro una password o chiave. È determinante nel salvare il tuo software, soprattutto quando migriamo su istanze di Linux protette che a volte si rompono quando una singola riga di codice fallisce, lasciandoti bloccato mentre il codice potrebbe non essere eseguito il backup se non hai la possibilità di eseguirlo automaticamente, che copriremo.

Se non stai già utilizzando una macchina virtuale Ubuntu a questo punto, a questo punto mi consiglierò utilizzando una macchina virtuale di Ubuntu perché renderà la vita più semplice quando si installa tutti i pacchetti necessari per costruire un sito Web funzionante e preformare operazioni di apprendimento profondo sul tuo computer. Sposteremo il codice su un server Web nel prossimo futuro, ma vogliamo assicurarci che ci siano almeno alcuni livelli di sicurezza dietro il nostro server Web resistenti al phishing e impiegano una serie di pacchetti Linux per farlo. Se vuoi ancora utilizzare Mac OS, sei invitato a cercare e installare i pacchetti necessari online, ma potrebbero non esserci alternative per ogni pacchetto che questo libro o serie copriranno.

Aggiungiamo alcuni comandi per commettere il nostro lavoro con lo script di backup eseguendo il comando sudo ascript backup.

# ...

Ancora una volta, controlla X per salvare.

Ora dobbiamo fare una configurazione una volta per questo progetto. Poiché presto sarà un progetto GIT, non abbiamo bisogno di digitare ogni comando ogni volta che distribuiamo da un repository Git, ma avremo la sospensione di questo quando scriviamo i nostri script di distribuzione. Per iniziare, assicuriamoci di essere nella directory giusta e inizializzare il repository GIT e generare chiavi SSH.

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

Dopo aver digitato SSH-Keygen, la nuova chiave dovrebbe essere salvata nella cartella domestica in una cartella chiamata .SSH. Si chiama id_rsa.pub. Troviamo questa chiave e copialo. Per vederlo,

cd ~
cat .ssh/id_rsa.pub

Copia il testo che viene restituito dall'ultimo comando e crea un account con il tuo provider GIT (idealmente GitHub), prima di aggiungere la chiave SSH al tuo account. Una volta che hai un account, fai clic sul menu in alto a destra e immetti le impostazioni, prima di aggiungere il tasto SSH in tasti SSH e GPG sotto accesso nel menu. Seleziona Aggiungi una chiave SSH e aggiungi il tuo incollandolo e dandogli un titolo, prima di salvare e tornare a GitHub per creare un nuovo repository. Questo è simile per altri fornitori di GIT, dovrai leggere la loro documentazione. Nella nuova configurazione del repository, dai al tuo repository un nome descrittivo e decidi se si desidera pubblicarlo e assicurarsi di configurare nessun file per l'inclusione. Una volta creato il repository, copiare il clone con URL SSH e incollarlo nel comando seguente.

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

Ora puoi tornare al tuo repository con CD, avrai familiarità con questo. Prova ora il tuo script di backup con backup

Grande! Ora possiamo davvero ottenere la codifica. Installiamo Django ora che abbiamo una buona comprensione di Bash e Git. Django ci consentirà di eseguire il backup automatico del nostro software, anche Bash può farlo, ma Django dovrebbe avere un'implementazione più sicura più sicura (può essere disabilitato e configurato più facilmente).

Per installare il software in Ubuntu, utilizzeremo il comando sudo apt-get. Innanzitutto, aggiorniamo e aggiorniamo il software che abbiamo già avuto. Questo può essere fatto con Sudo Apt-get Update e sudo Apt-get Upgrade -y. Successivamente, installamo Python e il nostro ambiente virtuale, la casa del nostro codice, con il seguente comando: sudo apt-get Installa Python-is-Python3 Python3-Venvv

Questo è tutto ciò che serve per andare avanti con Django in termini di installazioni di software nell'istanza di Ubuntu. Per Windows e Linux questo dovrebbe essere abbastanza semplice, ma per Mac potresti voler installare una macchina virtuale e Linux su di essa utilizzando un ambiente virtuale gratuito o a pagamento come VirtualBox o Paralells Desktop e ricreare i passaggi sopra per configurare un ambiente Ubuntu. Ubuntu è fondamentale in questo caso perché è il software eseguito i siti Web e consente loro di ospitare siti Web con tutto il software sopra menzionato.

Scaviamo nel Django.

Di nuovo nella nostra directory, con CD:

python -m venv venv # Crea l'ambiente virtuale in cui il codice viene archiviato
source venv/bin/activate # Attiva l'ambiente virtuale
django-admin startproject mysite . # Dove mysite è il progetto che sto iniziando nella mia directory attuale.

Django ci sta appena iniziando, perché Django ospita il server Web e sta facendo tutto il necessario per ottenere un sito Web locale di base attivo e funzionante. Ora che abbiamo installato Django, modifichiamo un po 'le impostazioni per farlo funzionare come abbiamo bisogno. Innanzitutto, creiamo una nuova app

python manage.py startapp feed

Noterai che la prima app si chiama feed. L'app dovrebbe essere chiamata come vuoi e creeremo nuove app, ma il nome di ogni app deve essere coerente ogni volta che l'app viene referenziata nel codice. Per aggiungere una nuova app, modificheremo sempre le impostazioni.py nella directory creata dall'app, denominata in startProject, in seguito app. Usando nano,

nano app/settings.py

Nelle impostazioni, trova Instald_Apps e separa il [] in 3 righe. Usando quattro spazi sulla linea centrale vuota, aggiungi "feed" o il nome della tua app. Questa sezione di impostazioni di impostazione dovrebbe apparire:

INSTALLED_APPS = [
    'feed',
]

Prima di dimenticare, testiamo che Django funziona. Utilizzando il comando Python Manage.py Runserver 0.0.0.0:8000, possiamo eseguire il server e quindi navigare in un browser Web sul computer che esegue il codice su http: // localhost: 8000 e vedere una pagina Web di esempio (funziona!) Smettere del server con il controllo C, lo stesso di qualsiasi altro comando.

Ora, scaviamo a scrivere del codice Python. Django ha tre componenti principali, tutti eseguiti dal codice interamente. I componenti sono chiamati modello, vista e modello e ognuno è rispettivamente a livello più alto e più basso prima che la pagina Web venga consegnata all'utente.

Il modello è il codice che memorizza le informazioni nel database per il recupero, la selezione e il rendering.

La vista decide come il modello viene reso, manipolato e modificato, quasi ogni vista utilizzerà direttamente un modello.

Il modello è il codice HTML con alcune campane e fischi extra chiamati Lingua Template. Il modello è reso dalla vista in cui è pieno di codice Python e contesto come modelli e informazioni (stringhe e numeri interi) dalla vista.

Django ha anche altri componenti, tra cui ma non limitato a:

Impostazioni, che configura l'app come abbiamo discusso.

URL, che sono modelli che l'utente segue per ottenere l'accesso a parti specifiche dell'applicazione Web.

Moduli, che definiscono il modo in cui le informazioni inviate al server vengono gestite e rese al database e all'utente. Queste sono le basi delle informazioni di elaborazione sul lato server e possono accettare qualsiasi tipo di informazione che il computer memorizza, in particolare stringhe di testo, numeri e booleani True/False (di solito caselle di controllo).

I modelli, che sono il codice HTML e il linguaggio dei modelli e colpiscono il divario tra Python e HTML, il che significa che le informazioni di Python possono essere servite come codice HTML a cui chiunque può accedere e può proteggere un sito Web con accesso limitato, rendendo il codice Python accessibile al Web e utile per una varietà di scopi su un dispositivo remoto che non deve essere vicino al server.

File statici, che di solito sono JavaScript e le sue librerie che il server serve e sono collegate al modello.

I file multimediali, che il server serve o sono ospitati esternamente o appena scritti sul server prima di essere elaborati e pubblicati su un altro server (un bucket) per l'hosting.

Middleware, che è pezzi di codice che vengono eseguiti contemporaneamente a ogni vista e considerato "incluso" nella vista.

Processori di contesto, che elaborano il contesto di ogni vista e vengono utilizzati per aggiungere un contesto extra.

Test, che convalidano che l'utente o la richiesta superano determinati requisiti prima che venga resa.

I consumatori, che determinano il modo in cui WebSockets gestisce e rispondono alla comunicazione.

Amministratore, che viene utilizzato per registrare i modelli in modo che possano essere manipolati in dettaglio all'interno della pagina di amministrazione di Django, in cui il database può essere somministrato attraverso un'interfaccia grafica.

Il sedano, che definisce compiti asincroni, parti del codice Django possono iniziare prima di procedere immediatamente all'attività successiva o alla linea di codice.

Django può avere molti altri componenti, di cui discuteremo in dettaglio qui. Esistono molti modi per rendere il Django più funzionale, aggiungendo websocket, che sono canali di comunicazione a semplificate, sedano, che esegue compiti asincroni e una moltitudine di altri software per estendere Django, specialmente nelle funzioni di vista, dove viene eseguita la maggior parte del codice. Le funzioni di visualizzazione sono fondamentali perché di solito dichiarano ogni pezzo di codice specifico per un modello URL specifico o una sezione del server.

Innanzitutto, esploriamo le funzioni di visualizzazione. Le funzioni di visualizzazione iniziano con le importazioni che indicano il codice che verrà utilizzato nella vista e sono definite utilizzando le normali definizioni o classi di funzioni. Le viste più semplici sono definite dalla definizione della funzione DEF e restituiscono un HTTPresponse con un modello di base. Cominciamo definendo una vista di base per restituire il testo "Hello World". Ricorda che ogni volta che aggiungi codice dopo un'istruzione come def, se, mentre, per, ecc., Dovrai aggiungere 4 spazi per ciascuna delle definizioni precedenti che desideri applicare alla tua funzione. Entreremo presto in ciò che ognuno di questi significa.

Dalla directory del nostro sito, modifica il file Feed/Views.py utilizzando Nano e aggiungi le seguenti righe alla fine del file.

from django.http import HttpResponse

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

HttPresponse di Django risponde con una stringa di testo, indicata con l'apertura e la chiusura '. Ogni volta che si passa informazioni a una funzione o classe, come richiesta o una stringa, dovrai utilizzare tra parentesi (, apertura e chiusura).

Non è tutto ciò di cui abbiamo ancora bisogno per vedere la nostra opinione. Naturalmente, non abbiamo detto al server dove è esattamente la vista, dobbiamo ancora definire un percorso attraverso il quale dovrebbe essere resa la vista. Cominciamo definendo un percorso di base in app/urls.py e entreremo in gruppi di percorso in seguito.

In app/urls.py, aggiungi una riga dopo le istruzioni di importazione dopo l'inizio dell'importazione della vista che abbiamo appena creato.

from feed import views as feed_views

Ora, definiamo il modello di vista. I modelli di visualizzazione hanno tre componenti, il componente del percorso, che indica al server in cui esiste la vista all'interno del server (il percorso URL che l'utente digita nella barra di navigazione per inserire la pagina web), il componente di visualizzazione in cui è specificata la vista e un nome amichevole per la vista logica. Ha senso fare le cose in questo modo ed essere flessibili, perché la tua base di codice sarà un ambiente in continua evoluzione che necessita di flessibilità e improvvisazione per essere preziosa e facile da lavorare. Ecco come sarà la tua vista, puoi aggiungerlo a UrlPatterns = [Sezione di app/urls.py. Il modello di vista è definito con i tre componenti sopra descritti e una funzione chiamata percorso. I tuoi schemi URL sono un elenco, quindi assicurati di terminare sempre ogni elemento in essi con una virgola, perché questo separa ciascuno. Ogni articolo dovrebbe anche andare su una nuova riga, ancora una volta con quattro spazi prima, proprio come l'app in Impostazioni. Definiremo il primo componente della vista con una funzione di stringa vuota, al fine di creare una vista che viene eseguita nella directory principale del server Web. I tuoi urls.py ora dovrebbero assomigliare a questo:

from feed import views as feed_views

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

Questa è la base per la creazione di un sito Web con Django completamente statico. Per creare un sito Web più dinamico in cui possiamo iniziare le informazioni sulla memorizzazione nella cache, come immagini, video, audio e altro ancora, dovremo usare i modelli, che esploreremo dopo. Per ora, controlliamo il nostro codice ed eseguiamo il server. Per controllare il codice per errori, eseguire:

python manage.py check

Se ci sono messaggi di errore, dovresti rivedere attentamente le modifiche apportate alla tua app e vedere se c'è qualcosa che deve essere risolto, come uno spazio estraneo o privo di un carattere extra, una stringa non chiusa, qualsiasi errore di battitura, qualsiasi carattere eliminato accidentalmente o qualsiasi altra cosa. Leggendo il messaggio di errore (se ne hai uno), dovresti essere in grado di vedere il percorso di un file che hai creato o modificato insieme a un numero di riga, quindi guarda in quel file e una riga e vedi se riesci a correggere qualsiasi cosa sia lì. Se hai risolto il problema, eseguire di nuovo il comando sopra. Quando il tuo software è pronto per essere eseguito e funziona, vedrai il "controllo del sistema di output non identificato". Ora sei pronto per partire. Esegui il server con:

python manage.py runserver 0.0.0.0:8000

Ora apri un browser Web e vai su http: // localhost: 8000. Dovresti vedere il testo restituito nella parentesi e le citazioni della funzione HttPresponse nel tuo punto di vista. Questo è solo un esempio di base, ma se sei arrivato così lontano, capisci le basi di come funzionano Linux, Bash, Python e Django. Scaviamo più a fondo in alcuni modelli di database ed esploriamo il potere di una classe Python nella memorizzazione di informazioni. Quindi, inizieremo a prendere una presa su HTML e CSS prima di rendere il nostro sito completamente presente, flessibile e sicuro utilizzando JavaScript e Machine Learning.

Le lezioni sono archiviate in models.py della tua app. Utilizzando Nano, modifica app/models.py e aggiungi una nuova classe. Una classe è definita con la definizione della classe e viene superata una superclasse da cui eredita, in questo caso modelli.model. Il nome della classe arriva dopo la definizione della classe e dopo la definizione della classe A: (colon), prima che gli attributi e le definizioni delle funzioni legate alla classe siano indicati di seguito. La nostra classe ha bisogno di un ID che possiamo usare per recuperarlo e mantenerlo unico, e ha anche bisogno di un campo di testo per archiviare alcune informazioni. Successivamente possiamo aggiungere un timestamp, file, booleani (definizioni vere o false che possono aiutare il nostro codice a prendere decisioni su cosa fare con il modello e possono essere utilizzati per ordinarlo), un'istanza per legare il modello a un utente che ha effettuato l'accesso al server e altro ancora. Disimballiamo il codice qui sotto:

from django.db import models # L'importazione che viene utilizzata per definire la nostra classe e i suoi attributi
class Post(models.Model): # La definizione della nostra classe stessa
    id = models.AutoField(primary_key=True) # L'ID del nostro modello, una chiave generata automaticamente che ci consentirà di interrogare il modello, lo manterrà unico ed è utile quando dobbiamo interagire con il modello una volta che è stato creato.
    text = models.TextField(default='') # L'attributo i nostri negozi di classe, in questo caso, un po 'di testo, inadempiente a una stringa vuota.

Chiudi e salva il file come facevamo prima per finire.

Ci sono molti altri campi e opzioni che esploreremo quando aggiorneremo questa classe man mano che la nostra app si evolve, ma questa è le necessità di base della creazione di un'app per pubblicare un po 'di testo. Tuttavia, questo modello non funzionerà da solo. Come descritto in precedenza, avremo bisogno di una vista personalizzata e un modello URL personalizzato per far funzionare questo modello e avremo anche bisogno di una forma insieme a un modello. Esploriamo prima il modulo.

Per definire un modulo, modifica app/forms.py con nano e aggiungi le seguenti righe. Avremo bisogno di due importazioni, della nostra classe di moduli e del modello che abbiamo creato (feed.models.post), una definizione di classe simile al modello e un campo insieme a una sottoclasse chiamata Meta che definirà il modello con cui la forma interagisce. Il modulo può anche avere una funzione di inizializzazione che la imposta in base alle informazioni nella richiesta, nel modello o in altro modo, lo esploreremo in seguito.

I moduli del modello sono così utili perché possono creare un modello o anche modificare un modello, quindi li useremo per entrambi. Definiamo uno in forms.py di seguito.

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

Questa è le basi di come sono una forma e un modello. Questo modulo del modello può essere utilizzato per istanziare o modificare un post, modificando il testo che contiene. Verreremo a integrare questo modulo in una vista dopo. Innanzitutto, facciamo le migrazioni e migriamo il database in modo che il nostro codice possa interagire con il modello quando viene eseguito. Per fare ciò, esegui i seguenti comandi:

python manage.py makemigrations
python manage.py migrate

Questo richiederà un minuto per essere eseguito, ma una volta che lo farà, ti permetterà di accedere al modello nelle viste, nel middleware o in qualsiasi altra parte del software. Continuiamo facendo una vista in cui possiamo vedere il nostro modello. Modifica feed/views.py e aggiungi il seguente codice, come notato. Non dovrai aggiungere nulla dopo il segno #, quel codice è commenti utilizzati per indicare informazioni sul codice. Inizieremo importando il nostro modello nelle viste e aggiungendolo a un contesto in cui possiamo renderlo in un modello come elenco per la visualizzazione. Successivamente, aggiungeremo un modello in cui possiamo rendere il modulo e il modello con un pulsante per creare un nuovo oggetto in base al modello e pubblicarlo sul server. Sembra complicato, quindi prendiamolo passo dopo passo. Prima di finire la vista, creiamo un modello che rende il modello e assicuramo di poterlo vedere creando un nuovo post nella shell. Ecco come dovrebbe apparire quella visione:

    posts = Post.objects.all() # Interroga tutti i post nel database finora

Tutto questo sembra piuttosto semplice fino a quando non arriviamo in fondo. Render, il valore restituito dalla funzione anziché in una risposta HTTP come l'esempio precedente, prende sempre una richiesta come primo input, accetta un contesto (in questo caso i post nel database), che ora può essere reso nel modello e restituisce il modello definito nella funzione. Il modello sarà un documento HTML con un po 'di lingua chiamata Jinja2, che rende Python Informazioni nell'HTML.

Per iniziare a creare modelli, fai due directory in feed.

mkdir feed/templates
mkdir feed/templates/feed

Quindi, modifica un modello nella directory sopra, feed/modelli/feed e aggiungi il codice per questo esempio. Diamo un'occhiata al modello per questo esempio.

Questo è un modello molto semplice. Definisce l'apertura e la chiusura dei tag HTML, un tag di tipo di documento, un tag corpore con un titolo di legenda, un tag di interruzione che aggiunge una piccola linea sullo schermo e un ciclo che rende ogni post nell'elenco dei post come paragrafo nel modello. Questo è tutto ciò che serve per rendere post, ma non ce ne sono ancora nel database. Creiamo un po 'con il guscio. Possiamo eseguire la shell con manage.py

python manage.py shell

Ora, importiamo il nostro modello post

from feed.models import Post

Successivamente, creeremo un semplice post con una stringa ed escimo nella shell. La stringa può essere qualsiasi cosa, finché è un testo valido.

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

Infine, dovremo aggiungere un modello URL al nostro feed. Poiché la nostra app di feed utilizzerà più URL e vogliamo mantenere piccole dimensioni di file, creiamo un URLS.PY locale nella nostra app di feed che assomiglia a questo:

from django.urls import path
from . import views

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

Dovremo anche modificare l'URLS.PY nell'app di base, qualunque cosa abbiamo deciso di chiamarlo, questa è stata la prima directory che abbiamo creato. Modifica app/app.py e aggiungi quanto segue ai modelli URL

from django.urls import include # in alto
    # ... codice precedente qui

Ora, quando eseguiamo il server con Python Manage.py Runserver, vedremo la pagina che abbiamo creato perché abbiamo il modello, la vista e il modello, nonché il modello URL, insieme agli elementi nel database. Successivamente, implementiamo il modulo che abbiamo creato e iniziamo a creare i nostri post. Ma prima di scrivere troppo codice, facciamo un backup usando lo script che abbiamo scritto in precedenza, backup. Esegui questo script nella shell, attendi alcuni momenti e tutto il codice sarà eseguito il backup del nostro repository Git.

backup

L'implementazione della forma è relativamente semplice. Importeremo il nostro modulo, aggiungiamo un gestore di richieste di post alla vista e salveremo il post nel database prima di reindirizzare alla stessa vista. Possiamo utilizzare la funzione di reindirizzamento che abbiamo già importato e un'altra funzione chiamata reverse per ottenere l'URL per il modello di vista. Lo interrogheremo con la stringa "feed: feed" perché lo spazio dei nomi del modello incluso è feed e la vista è anche chiamata feed.

    posts = Post.objects.all() # Interroga tutti i post nel database finora
    if request.method == 'POST': # Gestire la richiesta post
        form = PostForm(request.POST) # Crea un'istanza del modulo e salva i dati su di esso
        if form.is_valid(): # Convalida la forma
            form.save() # Salva il nuovo oggetto
        return redirect(reverse('feed:feed')) # Reindirizza allo stesso URL con una richiesta GET
        'form': PostForm(), # Assicurati di passare la forma nel contesto in modo da poterlo renderlo.

Ora dovremo aggiornare il modello per tenere conto del nuovo modulo. Possiamo farlo usando il

Tag in HTML e rendendo il modulo nel modello HTML con un pulsante di invio. Avremo anche bisogno di un token CSRF, un token che impedisce ai siti esterni di pubblicare nel modulo senza prima caricare una pagina.

Abbattiamo questo. C'è una nuova classe di moduli, un token, il modulo stesso e un pulsante di invio. Abbastanza semplice, ma quando lo diamo un'occhiata, potremmo volerlo far sembrare migliore. Funziona, possiamo pubblicare nuovi post con il modulo e ora vengono salvati nel database. Ci sono alcune cose in corso qui. Usiamo i tag HTML per dichiarare che il documento è un documento HTML, utilizziamo un tag modello ({ % ... %}) per rendere il token per il modulo e un altro, {{…}} per rendere il modulo. Abbiamo anche un ciclo per rendere il testo usando tag a blocchi e un tag modello. I tag a blocchi sono davvero importanti perché possiamo definire come vengono rese le sezioni del modello e i tag del modello sono la base di come inseriamo le variabili nel nostro codice.

Ora dobbiamo rendere la nostra app migliore, perché per ora sembra davvero semplice. Possiamo farlo usando CSS, in linea o in classi legate a ciascun oggetto nel documento. CSS è davvero bello perché dice tutto sulla pagina come dovrebbe apparire e può renderlo davvero bello. Ci sono alcune biblioteche che possono farlo, ma il mio personale va a Bootstrap.

Bootstrap può essere scaricato dal loro sito Web,getbootstrap.com/. Una volta lì, premere il pulsante per leggere i documenti di installazione e copiare il codice dalla sezione Includi tramite CDN. Avrai bisogno di questo codice nella parte superiore del tuo documento HTML, in un tag chiamato Head. Inoltre, andiamo avanti e creiamo un modello di base in modo da non dover ricreare questi collegamenti in ogni modello.

Crea una nuova directory chiamata modelli con modelli MKDIR, quindi modifica modelli/base.html.

Dovrebbe sembrare così:

Assicurati di copiare i file CSS e JavaScript, i file .CSS e .JS, perché avremo bisogno del JavaScript per rendere il nostro sito più funzionale in futuro.

Ora torniamo alla shell bash ed eseguiamo un comando rapido. Ricorda, se hai mai bisogno di accedere all'ambiente virtuale, digita la sorgente VENV/Bin/Activate. Questo ti permetterà di installare pacchetti Python localmente in un modo che consente a Django di accedervi. Per dare le nostre forme generate dalle classi Django Bootstrap, useremo un pacchetto Python chiamato Crispy Forms. Possiamo scaricarlo con il seguente comando

pip install django-crispy-forms

Una volta installato, aggiungilo a impostazioni

    # ... codice precedente qui

Ora, nel nostro modello di alimentazione, possiamo rimuovere alcune cose. Rimuoviamo l'inizio e la fine del documento e sostituiamolo con eredità dal nostro modello di base, usando Extends e la definizione del blocco. Inoltre, aggiungeremo un'importazione di filtro modello con carico e filtro modello al modulo. Infine, aggiungiamo una classe bootstrap al pulsante sul modulo per renderlo più simile a un pulsante. Dovrebbe sembrare così:

Bellissimo! È già un po 'di codice. Successivamente, dovremmo testarlo e assicurarci di poter vedere che tutto sembra bello e anche assicurati che tutto funzioni correttamente. Esegui il server secondo le istruzioni precedenti e assicurati che il sito appaia e funzioni bene. Ottimo lavoro! Sei pronto per passare al passaggio successivo, in cui aggiungeremo funzionalità di accesso utente utilizzando URL, forme, viste e modelli simili. Il modello di base è importante e continueremo a modificarlo e apportare modifiche in base alle necessità, ma per ora concentriamoci sul rendere il nostro sito più sicuro, consentendo agli utenti di accedere con un nome utente e un passcode e infine informazioni ancora più importanti che aiuteranno a mantenere la tua app sicura e il tuo account accessibile solo da te.

Per fare ciò, dovremo utilizzare il modello utente integrato in Django. Il modello utente è un modello di database, come il nostro post, che può essere reso per accedere a un utente nel sito Web. In futuro, prima di distribuire il sito su Internet, estenderemo questo modello con altri modelli attribuiti ad esso e creeremo ulteriori misure di sicurezza per l'accesso resistenti al phishing. Inizieremo utilizzando alcuni moduli di accesso integrati che Django fornisce. Innanzitutto, creiamo una nuova app che useremo per rendere i modelli e le viste per la pagina di accesso di base. Creeremo anche altre app per rappresentare le continue sfide di accesso al fine di garantire l'app, tra cui un pincode, il riconoscimento facciale, la comunicazione vicino al campo, i dispositivi esterni, l'autenticazione multi -fattore e il riconoscimento delle impronte digitali.

Abbiamo già parlato dell'avvio di un'app. Dalla nostra directory, all'interno dell'ambiente virtuale, passano gestire.py questi argomenti

python manage.py startapp users

Ora dovremmo avere una directory per la nuova app. Iniziamo creando una vista in quella directory che corrisponde al login dell'utente. Django ha visualizzazioni integrate per gli accessi degli utenti, ma questi non saranno adatti a noi perché abbiamo bisogno di una vista personalizzata, che è preferibilmente fatta con una definizione.

In questa visione, inizieremo controllando una richiesta di post, pass richiesta.post a unaformio di login importato da Django, autenticare l'account utente e accedere all'utente prima di reindirizzarli alla nostra app di feed.

In utenti/views.py, aggiungi il seguente codice

        username = request.POST['username'] # Ottieni il nome utente e la password dalla richiesta post
        password = request.POST['password'] # Autentica l'utente

Questo è tutto ciò di cui hai bisogno per una vista di accesso di base. Ora, creiamo un modulo per la vista estendendo il modello di base. Inizieremo creando una nuova directory per i modelli nella cartella degli utenti.

mkdir users/templates
mkdir users/templates/users

Ora dovremmo essere in grado di modificare utenti/modelli/utenti/login.html. Mentre ci siamo, creeremo un modello per consentire anche all'utente di iscriversi.

nano users/templates/users/login.html

Ora, nel modello,

Questa è le basi di un modello di accesso. È davvero proprio come l'altro modello nella struttura, ma sembra un po 'diverso quando è reso. Possiamo copiare questo codice per creare un altro modello molto simile chiamato register.html, dove cambieremo la formulazione e useremo un nuovo modulo che costruiamo. Facciamo prima il modello. Modifica utenti/modelli/utenti/register.html e aggiungi il seguente codice:

Ora, costruiamo un modulo per la nostra registrazione degli utenti e torniamo alle viste prima di aggiornare i nostri accessi degli utenti con un modello. Faremo questo modulo di base per cominciare, ma incorporeremo maggiori dettagli e funzionalità di sicurezza come accordi e captcha in futuro. Modifica i moduli con nano utenti/forms.py e aggiungi il seguente codice.

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

Quindi abbiamo un'altra forma qui, che funziona in modo abbastanza semplicemente. È un modulo di registro utente con nome utente, e -mail e password, nonché un campo di conferma della password. Si noti che questo modulo non estende i moduli moduli. Classe delle forme, è una forma modello, il che significa che ha un meta. Un campo è definito allo stesso modo e la meta di classe definisce il modello che il modulo corrisponde al resto delle informazioni che verranno scritte nel modulo. La maggior parte di questo esiste già nella formazione utente incorporata di Django, quindi lo useremo come base per la classe (passata nella parentesi).

Successivamente, esamineremo la vista per registrare un utente, ora che abbiamo un modulo e un modello. Questo è un modelform, proprio come quello nella nuova visualizzazione dei post. Modifica utenti/views.py e aggiungi il seguente codice:

# ... importazioni

Questo è tutto ciò di cui abbiamo bisogno per la registrazione di un utente, ma dovremmo avere maggiori informazioni. Vogliamo sapere il tempo che l'utente si è registrato, a che ora sono stati per l'ultimo sul sito, alcune informazioni su di essi, come una biografia, un fuso orario, ecc. Inoltre, dovremo aggiornare il nostro modello di feed, post, per tenere conto del modello utente e dei post di attributo a ciascun utente. Per farlo, aggiorneremo i modelli.py in entrambe le app. Cominciamo modificando il modello di feed. Dovrebbe sembrare così ora:

from django.db import models # ... importazioni
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Aggiungi questa riga

Presta attenzione alla seconda riga che è stata aggiunta al file. Questa è una chiave esterna, che attribuirà ogni post a un singolo utente per post, in modo da poter assicurarci di salvare i post su una base utente per utente e nessun post può essere fatto senza attribuirlo a un utente. Definiamo questa chiave straniera con la classe che rappresenta, un argomento eliminato per garantire che i post siano eliminati con gli utenti, argomenti null e vuoti per assicurarsi di poter rimuovere l'utente se necessario e per adattarsi alla mancanza di un utente che abbiamo già creato e un nome correlato, che possiamo usare per fare riferimento agli oggetti post che l'utente crea. Questo nome correlato, a differenza di Post.Author, l'autore del post, ci dà l'utente che ha pubblicato il post stesso. Ora possiamo ottenere i post che un utente viene pubblicato mediante user.posts.all () o autore.posts.all ().

Ora, rendiamo i nostri accessi più resilienti. Possiamo già rendere il nostro sito molto meno vulnerabile al phishing semplicemente limitando il numero di volte in cui consentiremo un accesso al sito, questo è abbastanza facile. Iniziamo anche a archiviare alcune informazioni su ciascun utente prima che continuiamo a sviluppare la nostra app. Modifica degli utenti/modelli.py, aggiungere il seguente codice.

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

Si noti che questo modello è abbastanza simile al modello post. Abbiamo un'importazione aggiuntiva, il fuso orario, che ci consentirà di impostare le impostazioni predefinite sui campi datetime e abbiamo anche un personaggio e un campo di testo come il post. L'uso di tutti questi timestamp ci aiuta a proteggere il sito e comprenderne l'uso e i campi di testo ci consentono di fornire informazioni su ciascun utente o autore, sul sito Web. L'ONETOOnefield dovrebbe essere l'unica considerazione minore, si comporta esattamente come un Foreginkey ma con solo uno per modello successivo. In questo modo, l'utente ha un solo profilo, mentre può avere molti post.

Ora, miglioriamo le nostre visualizzazioni di accesso e registriamo per tenere conto del profilo. Innanzitutto, modifica utenti/views.py e concentrati sulla vista del registro:

# ... importazioni
            Profile.objects.create(user=user) # Assicurati di aggiungere questa riga, per creare un profilo per l'utente

Questo crea semplicemente un profilo per l'utente, senza compilare nessuna delle informazioni. Ora, vogliamo assicurarci che l'account utente non possa essere effettuato troppo spesso, o almeno le password non possono essere provate troppo spesso, quindi aggiorniamo la vista di accesso.

# ... importazioni
        if user and user.profile.can_login < timezone.now(): # Si noti che ora controlliamo se l'utente può accedere
        else: # Se l'accesso non ha avuto successo,
            user = User.objects.filter(username=username).first() # Questa è la parte in cui aggiorniamo il profilo degli utenti
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Quindi non possono accedere di nuovo per alcuni secondi

Questo è il fondamentale di base per la sicurezza. Assicurati che il sito non sia vulnerabile a qualcuno che prova semplicemente ogni possibile combinazione di password, o anche alcune di esse contemporaneamente. Questo non sarà frustrante per l'utente normale che conosce il proprio passcode e accederà solo ad alcuni dispositivi, ma manterrà numerosi robot di phishing fuori dall'app. Si noti che abbiamo aggiunto un'istruzione IF con una variabile, CAN_LOGIN, che dovrebbe essere un tempo in passato e aggiornarla con ogni accesso senza successo usando lo stesso nome utente. In questo modo, un utente dannoso non sarà in grado di indovinare una password da nessuna parte vicino. Anche il numero di secondi in DateTime.timedelta () può essere aggiornato e il sito Web sarà più resiliente ma leggermente meno utilizzabile con più secondi. Consiglio 15 di cominciare.

Ricorda, abbiamo costruito uno script di backup per salvare il nostro lavoro, quindi andiamo avanti e eseguiamo il backup di ciò che abbiamo finora per assicurarci di salvare tutto. Esegui il comando:

sudo backup

Ancora una volta, questo salverà il tuo lavoro finora. Consiglio di eseguire backup frequenti per salvare il tuo lavoro e potresti persino voler eseguire automaticamente un lavoro di backup. Puoi farlo usando un'utilità UNIX chiamata Cron. Per attivare questa utilità, eseguire il seguente comando e inserire la password:

sudo crontab -e

Se non hai già selezionato l'opzione 1 per Nano, l'editor di testo che dovresti già avere familiarità e scorrere fino alla parte inferiore del file usando i tasti freccia. Aggiungi la seguente riga:

0 * * * * sudo backup

Cron usa il minuto formato, ora, giorno del mese, mese, giorno della settimana, in cui un * o un numero rappresenta quando eseguire il comando. Usando uno 0 per il minuto e * per il resto delle opzioni, possiamo eseguire un comando al primo minuto di ogni ora all'inizio del minuto. Questo ci consente di eseguire il backup del codice automaticamente. Tutti i lavori di Cron se eseguiti con sudo esegui come root, quindi non dovremo digitare una password ogni ora.

Per semplificare il backup del nostro codice senza utilizzare una password, disabilitiamo la password per il nostro comando di backup. Lo faremo eseguendo il seguente comando e inserendo una password:

sudo visudo

Ora, scorrere fino in fondo al file e aggiungere un'altra riga:

ALL ALL=NOPASSWD: /bin/backup

Questo ci consente di eseguire il comando "backup" come qualsiasi utente, senza una password. Il formato per questo è facile, basta prefissa la linea con "All = NOPASSWD:/bin/" e termina con il comando, ad esempio/bin/backup, che esiste in/usr/bin/.

Ora, iniziamo a lavorare con e -mail. L'e -mail è davvero importante per i siti Web, perché è un modo per mantenere un sito Web più sicuro, verificare che gli utenti siano persone reali e persino prodotti o servizi di mercato ai clienti. Molte persone che frequentano Internet controllano quotidianamente la loro e -mail e ricevono tutti i tipi di e -mail di marketing su prodotti e servizi a cui sono interessati. Ci sono alcune opzioni quando si tratta di abilitare e -mail su un sito Web Django e sei il benvenuto a scegliere ciò che funzioni meglio per te.

Innanzitutto, puoi pagare per un servizio di posta elettronica che ti consente di inviare e -mail dal tuo dominio e richiede un codice minimo. Ci sono molti servizi che offrono questo, come Google Workspace, SendinBlue, Mailgun e altro ancora.

Altrimenti, sei ben costruito da zero il tuo servizio di posta elettronica all'interno del tuo server. Consiglio questa opzione, anche se è più codice e potrebbe richiedere un hosting speciale. Non sarai in grado di avviare un server di posta dal tuo computer di casa molto probabilmente, quindi andiamo avanti ed esaminiamo la configurazione e il codice per inviare e -mail prima di avviare un server nel cloud e creare il nostro server di posta all'interno.

Innanzitutto, modifica impostazione.py con il seguente comando:

nano app/settings.py

Dove l'app è il nome dell'app creata con StartApp.

Aggiungi le seguenti righe:

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)

Assicurati di modificarli quando sei pronto a distribuire la tua app, lo rivisiteremo in seguito. L'impostazione di email_address dovrebbe essere l'e -mail da cui si desidera inviare e la password (email_host_password) dovrebbe essere impostata sulla password che genera per il server. Carico la password da un file di configurazione per tenerla fuori dal codice utilizzando la seguente logica, al di sopra di queste righe in impostazione.py:

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

Quindi, ho impostato un file JSON con la configurazione in /etc/config.json usando Nano come segue.

Per modificare il file:

sudo nano /etc/config.json

Aggiungi le seguenti righe:

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

Continueremo a modificare il file di configurazione e aggiungere tutte le password e le chiavi che useremo nell'app. Per ora, esaminiamo rapidamente come inviare e -mail utilizzando Python. Innanzitutto, creiamo un modello per un'e -mail di verifica che possiamo inviare ai nostri utenti e inserirlo nella directory dei modelli utente. Questo modello sarà scritto in HTML.

nano users/templates/users/verification_email.html

Questa e -mail è abbastanza semplice. Prende un contesto di un utente, l'URL di base per il sito e un ID utente e un token che vengono utilizzati per verificare l'e -mail dell'utente. Assicurati di definire l'URL di base in impostazioni.py prima di scrivere un codice Python per rendere il modello. Vai avanti e aggiungi le seguenti righe all'app/impostazione.py, vicino all'inizio.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

Alla fine, quando il tuo sito è pronto per Internet e lo distribuisci, vorrai definire il tuo dominio come nome di dominio che acquisti per rappresentare il sito. Questo è il nome che digiterà nella barra navic per accedere al tuo sito. Per ora, puoi lasciare il dominio in bianco o utilizzare un segnaposto. Ti consigliamo inoltre di cambiare il SIT_NAME in un nome che desideri dare al tuo sito, di scelta.

Prima di inviare e -mail, creiamo un generatore di token in modo da poter avere un token di attivazione dell'account che non scade mai. Possiamo farlo costruendo e importando un token di attivazione dell'account che assomiglia al seguente. Modifica il file:

nano users/tokens.py

Aggiungi il seguente codice:

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

Questo generatore di token di base genera un token che possiamo inviare all'utente in un URL e l'utente può utilizzare per verificare la propria e -mail e attivare il proprio account.

Quindi, vediamo come inviare un'e -mail. Utilizzando Nano, Modifica utenti/email.py.

nano users/email.py

L'invio dell'e -mail HTML di verifica sarà simile a questa:

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)

Questo è abbastanza semplice. Importiamo le funzioni di cui abbiamo bisogno per inviare l'e -mail, rendere l'e -mail con modelli e le nostre impostazioni, quindi definiamo l'e -mail con il nome del modello e la inviamo all'utente utilizzando una funzione. Noterai che non abbiamo definito la funzione per inviare la posta, send_html_email, quindi scriviamo questo sotto il codice che abbiamo già aggiunto agli utenti/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()

Questo è un po 'più complesso e non siamo ancora pronti a eseguire tutto questo codice. Si noti che stiamo definendo un Unsub_Link, il collegamento che l'utente può utilizzare per annullare l'iscrizione alle nostre e -mail. Questo è importante, perché gli utenti dovranno essere in grado di rinunciare alle nostre e -mail a meno che non possano vederle, in qualsiasi momento. Aggiungiamo anche un'alternativa di testo al nostro messaggio, che è il messaggio HTML spogliato dei tag HTML. Infine, controlliamo se l'e -mail inviata e, in caso contrario, segniamo il profilo dell'utente che la loro e -mail non è valida.

Ritorniamo ai modelli utente in modo da poter farlo funzionare tutto. Dobbiamo definire una funzione per generare un collegamento a annullare l'iscrizione e definire un campo booleano per contrassegnare che l'e -mail dell'utente non è valida.

Innanzitutto, aggiungi le seguenti importazioni nella parte superiore degli utenti/modelli.py

nano users/models.py
# ...

Successivamente, aggiungiamo funzioni al modello utente per creare il token e controllare il token utilizzato per attivare l'e -mail, nonché il campo per salvare se l'utente sta ricevendo correttamente la propria posta. In utenti/models.py di nuovo, aggiungi il seguente codice alla fine del modello (codice rientrato)

# ...
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Valido per 30 giorni

Questo è abbastanza semplice, utilizziamo un timestampsigner, che è uno strumento di crittografia di base, per creare un token che scadrà dopo un certo periodo di tempo e utilizziamo anche un'altra funzione per verificare se è valido. Usiamo questi token due volte, una volta per verificare l'e -mail e una volta per un link all'iscrizione.

Ora che abbiamo questi, l'ultimo lavoro che dovremo fare è nelle opinioni. All'interno degli utenti/Views.py, aggiungiamo visualizzazioni per verificare l'indirizzo e -mail e annullare l'iscrizione.

nano users/views.py

Innanzitutto, aggiungi le seguenti importazioni. Ho lanciato qualche extra in modo da non dover importare più articoli più tardi.

from .email import send_verification_email # Assicurati di importare la funzione di invio dell'email di verifica

Potresti già avere alcune di queste importazioni, ma non fa male ripeterle. Avrai bisogno di importare la funzione di invio dell'email di verifica, nonché account_activation_token da utenti.tokens, tra le altre importazioni.

Ora, in fondo al file, aggiungi il seguente codice:

        # annullare l'iscrizione
    # Altrimenti reindirizzare alla pagina di accesso
# Sendwelcomemail (richiesta, utente)

Questo è un sacco di codice. Abbattiamolo. La prima funzione, pulita e semplice, annulla l'iscrizione all'utente dalla mailing list. La seconda funzione attiva la loro e -mail e noterai che ho aggiunto una funzione commentata, Sendwelcomemail. Sei il benvenuto a utilizzare un modello di posta elettronica e la definizione della funzione per inviare un'e -mail di benvenuto, non l'ho ancora fatto. L'ultima funzione che ho lanciato è importante, perché le e -mail di attivazione scadono. Pertanto, dovremo nuovamente nuovamente l'e -mail di attivazione. Possiamo utilizzare un modulo di base per questo e chiamare la funzione per inviare l'e -mail di verifica. Prima di farlo, assicuriamoci che venga inviato in primo luogo, aggiungendo una chiamata di funzione alla vista del registro. Aggiungi questa riga poco prima del reindirizzamento nella vista Register, DEF Register, in Users/Views.Py.

nano users/views.py
# ... (dopo) DEF Register (richiesta):
# ... (prima) reindirizza (

Non è necessario aggiungere la prima e le ultime righe in quel frammento di codice, assicurati solo che la vista del registro invii l'e -mail di verifica all'utente. Dovrebbe sembrare così:

# ... importazioni
            send_verification_email(user) # Assicurati di aggiungere questa riga!

Ora, dovremo aggiungere un modulo per nuovamente l'e -mail di attivazione. In utenti/forms.py, aggiungi il seguente modulo:

# ... (importazioni)

Avremo anche bisogno di un modello corrispondente a questo modulo di attivazione e -mail di Resend. Aggiungiamo questo modello in. Modifica il file:

nano users/templates/users/resend_activation.html

Quindi, aggiungi il seguente codice al file.

Accidenti, è molto! Ora, quando distribuiamo il codice sul nostro server, saremo in grado di inviare e -mail HTML e attivare gli account utente con un clic nell'e -mail. Potremmo anche voler inviare una semplice e -mail di benvenuto, quindi vediamo come farlo. Di nuovo in utenti/email.py, aggiungi il seguente codice:

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)

Inoltre, avremo bisogno di un modello per rendere tutte queste informazioni. Sul mio sito Web, il modello sembra sotto, ma sei invitato a formattarlo come preferisci.

Nota che non disponiamo di un corpo di chiusura o tag HTML, perché li aggiungiamo quando aggiungiamo il link all'iscrizione HTML. Questi sono importanti, ma non vogliamo definirli due volte.

Allora cosa ci aspetta? Abbiamo fatto molta strada. Davvero, dovremmo essere pronti a distribuire il sito su un server. Possiamo aggiungere il decoratore @login_required e rendere sicure le nostre viste, prendere le iscrizioni utente, inviare e -mail conformi e informazioni sulla cache, che è la base di ciò che un sito Web deve fare per rimanere pertinente. Aggiungeremo alcune funzionalità utili e quindi creeremo una base per la distribuzione del nostro codice su un server remoto, la configurazione di un server di posta, la configurazione del dominio e i filtri per rendere il nostro sito sicuro e appropriato.

Avremo anche bisogno di una visualizzazione reimpostazione della password, quindi aggiungiamola molto rapidamente. La visualizzazione reimpostazione della password integrata di Django è rotta in alcune funzioni, ma esamineremo come scrivere la nostra vista, il modello di posta elettronica, i moduli e i modelli URL. Ecco come appare la vista, in utenti/views.py

# ... importazioni

Questo modulo è integrato su Django, ma avremo bisogno di un modello per confermare il reimpostazione della password, utenti/modelli/utenti/password_reset_confirm.html

Abbiamo anche un modello per inviare un'e -mail di reimpostazione della password, con un modulo semplice, in utenti/modelli/utenti/password_reset.html

Il modello per l'e -mail stessa è semplice, è un file HTML di base che rende un link per reimpostare la password, in utenti/modelli/utenti/password_reset_email.html. Django interpreterà automaticamente questo file.

Avremo anche bisogno di altri due modelli. Il primo è confermare che l'e -mail è stata inviata. Le opinioni per questi sono già a Django, quindi dobbiamo solo affrontarle negli URLS.PY. Questo modello si trova su utenti/modelli/utenti/password_reset_done.html

E infine, per confermare che il reimpostazione della password è completato, utenti/modelli/utenti/password_reset_complete.html

Ora abbiamo bisogno di motivi URL per queste viste. In utenti/urls.py, aggiungi i seguenti schemi URL:

    # ... URL precedenti qui

Quattro modelli, è molto! Ma ora possiamo essere sicuri di essere in grado di ripristinare la password dell'utente ogni volta che è necessario, tutto dal browser Web.

Capisco che questo è un sacco di codice. Se ti sembra un po 'sopra la testa, va bene. Migliorerai, la tua comprensione migliorerà e diventerai molto più competente con il codice molto presto. Se sei totalmente perso, ti consiglio di tornare su questo software in seguito dopo aver lavorato su un ritmo autonomo a codificare il corso online. Questi sono di solito liberi di iniziare e ti guideranno attraverso tutto ciò di cui hai bisogno per avere successo quando torni a questo progetto. Se ti senti come se fossi pronto per continuare, leggere, successivamente, copriremo la distribuzione del tuo codice su un server remoto e la configurazione di un server di posta, oltre ad automatizzare la distribuzione utilizzando Bash in modo da poter sempre impostare un nuovo progetto con alcuni semplici comandi.

L'ultima cosa che dobbiamo fare prima di distribuire su un server remoto è rendere il nostro sito un po 'più sicuro. Noterai che la vista di accesso prende solo un nome utente e una password e non esiste un'autenticazione multi -fattore o un codice tempo. Questa è una soluzione semplice e, con lo stesso codice, possiamo far inviare al nostro sito i messaggi di testo e persino essere sensibili ai messaggi di testo inviati al server. Per iniziare, torneremo nei modelli utente e aggiungeremo un firmatario del timestamp che rappresenterà ogni accesso. Aggiungeremo anche un identificatore univoco e rotante al modello utente che verrà utilizzato per aggiungere ulteriore sicurezza al nostro accesso. Modifica dei modelli utente, utenti/modelli.py, aggiungere il seguente codice:

# Assicurati di importare UUID, TIMESTAMP SIGNER e URL Generator (Reverse)
    # Aggiungi questo codice qui
    # E aggiungi questa funzione
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Valido per 3 minuti

Assicurati che i tuoi utenti/models.py abbiano questo modo, oltre ai commenti (codice sulle righe con #). Abbattere questo, è semplice. Abbiamo alcune importazioni, un timestampsigner che è un'utilità crittografica che può generare un codice sicuro e verificarlo per assicurarsi che sia valido, sia stato utilizzato solo una volta e non più vecchio di un certo numero di secondi. Usiamo anche un UUID, che è un identificatore univoco che identifica il nostro utente nella firma del token e nell'URL in cui il token viene inviato all'utente. Useremo questa crittografia di base per costruire una vista di autenticazione a due fattori. Prima di fare qualsiasi altra cosa, eseguiamo le migrazioni in modo che i nostri modelli utente vengano aggiornati. Nella directory con manage.py, eseguire i seguenti comandi per realizzare e completare le migrazioni.

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

Questo è importante perché ogni volta che apportiamo modifiche ai modelli, dovremo creare le tabelle e aggiornare il database con le impostazioni predefinite prima di poter effettivamente utilizzare i modelli.

Successivamente, improvvisiamo la nostra vista di accesso per reindirizzare a una vista di autenticazione secondaria. Negli utenti/Views.py, rimuovi la funzione di accesso e reindirizza all'URL che abbiamo appena generato nei modelli utente.

# ... importazioni
        if user and user.profile.can_login < timezone.now(): # Si noti che ora controlliamo se l'utente può accedere
            # Rimuovi la funzione Auth_login che era qui
                return redirect(user.profile.create_auth_url()) # Nota che reindirizzano a un nuovo URL qui
            else: # Se l'utente non utilizza l'autenticazione a più fattori, accedili.
        else: # Se l'accesso non ha avuto successo,
            user = User.objects.filter(username=username).first() # Questa è la parte in cui aggiorniamo il profilo degli utenti
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Quindi non possono accedere di nuovo per alcuni secondi

Quindi questo è piuttosto semplice, ora abbiamo un modo per reindirizzare alla vista di autenticazione a due fattori quando la creiamo. Abbiamo anche un fallback nel caso in cui l'utente non abbia aggiunto un numero di telefono. Aggiungeremo una vista di base per aggiungere presto un numero di telefono e accedere presto con un messaggio di testo.

Innanzitutto, abbiamo bisogno di un modo semplice per inviare un messaggio di testo dal nostro codice. Per fare ciò, possiamo scegliere tra un numero di API, ma la più semplice secondo me è Twilio. Offrono anche buoni prezzi per progetti più piccoli e sconti in blocco. Crea un account su TWIIO.com, compila alcuni dettagli sul tuo progetto, acquista un numero di telefono e copia le chiavi API su Settings.Py. Quindi, aggiungi questo codice con un nuovo file, utenti/sms.py.

nano users/sms.py
# Importa tutti i pacchetti necessari
# Questo codice invia il testo con Twilio
# Una funzione di supporto per ottenere un numero con così tante cifre
# Invia il testo per verificare l'utente
# Invia a un utente qualsiasi testo con questa funzione
# Convalida il codice con questa funzione
# Convalida il tempo

Assicurati di modificare le impostazioni in modo appropriato, aggiungendo queste linee con le chiavi:

# Assicurati di copiarli dal tuo dashboard Twilio
AUTH_VALID_MINUTES = 3 # Il numero di minuti la pagina TFA è attivo una volta istanziato

Innanzitutto, avremo bisogno di forme per le nostre visualizzazioni di autenticazione a due fattori. Modifica degli utenti/forms.py, aggiungere il seguente codice.

# ... importazioni
# Un modulo per entrare nel nostro numero di telefono
# Una forma per autenticarsi

Successivamente, creiamo le visualizzazioni in utenti/views.py

# ... importazioni

Avremo anche bisogno di modelli per entrambe queste opinioni. Aggiungiamo prima il modello MFA.

nano users/templates/users/mfa.html

Aggiungi questo codice HTML al modello

Questo è piuttosto autoesplicativo. Il modulo invia un codice o un codice vuoto e noterai nella visualizzazione inviamo il codice se riceviamo un codice vuoto. Quindi abbiamo solo due pulsanti di invio e in questo modo possiamo inviare il codice con entrambi i pulsanti. Successivamente, aggiungeremo un modulo semplice per aggiungere un numero di telefono.

nano users/templates/users/mfa_onboarding.html

Aggiungi il seguente HTML:

Questo modulo è molto più semplice, rende solo il modulo del numero di telefono che abbiamo creato e consente all'utente di aggiungere un numero di telefono.

Questo sembra davvero buono! Finché tutto è impostato correttamente, dovremmo essere in grado di inviare messaggi e accedere all'utente con il loro numero di telefono non appena aggiungiamo i modelli URL. L'ultima cosa che dobbiamo impostare è una visualizzazione del profilo in modo da poter assicurarci che l'utente possa cambiare il loro numero di telefono senza essere effettuato l'accesso. Inoltre, alla fine vorremo aggiungere un'opzione "Stop to smettere", in modo che l'utente possa inviare un messaggio "Stop" per annullare i messaggi di testo futuri.

Aggiungiamo una vista profilo agli utenti/views.py. Questa vista aggiornerà la bio, l'e -mail, il nome utente e il numero di telefono dell'utente, oltre a consentirci di abilitare l'autenticazione multi -fattore. Innanzitutto, avremo bisogno di altri due moduli in utenti/forms.py

# ... importazioni

Successivamente, possiamo creare una vista per utilizzare entrambe queste forme. Modifica utenti/views.py e aggiungi la vista.

# Aggiungi queste importazioni

Avremo anche bisogno di un modello per questa visione.

nano users/templates/users/profile.html

Noterai che questo è un modulo abbastanza semplice, ma ha un po 'di JavaScript che pubblica automaticamente il contenuto del modulo mentre vengono aggiornati. Questo è utile avere, quindi sei in grado di apportare modifiche senza dover premere invio ogni volta.

Successivamente, abbiamo bisogno di URL che rappresentano tutte queste opinioni negli utenti degli URL. Modifica utenti/urls.py e aggiungi questo codice:

# ... codice precedente, importazioni
# … Schemi URL che abbiamo inserito in precedenza, aggiungi le tre righe successive

Ora è un buon momento per testare il nostro progetto. Ma prima, eseguiamo un altro backup.

backup

Ed eseguire il server. Prima di distribuire su un server Linux, è una buona idea abilitare l'autenticazione a due fattori sull'account. Faremo questo andando al nostro profilo URL,/utenti/profilo/e controllando la casella per abilitare l'autenticazione dopo aver inserito il nostro numero di telefono e quindi l'invio del modulo.

python manage.py runserver localhost:8000

Visita la pagina Web andando sul tuo browser Web, in questo esempio sto usando Google Chrome e inserendo l'URL https: // localhost: 8000/account/profilo/

Sarai in grado di accedere se necessario e abilitare l'autenticazione a due fattori.

Questo progetto ha bisogno di un server su cui eseguire in modo che possa davvero inviare posta. Ma prima, abbiamo bisogno di un modo per vedere errori. Noterai che se esegui il server in modalità debug, con impostazioni.debug uguale a true, il server mostra gli errori automaticamente. Per mostrare errori senza utilizzare la modalità di debug, che non è sicuro su un server di produzione, dovremmo aggiungere una vista per questo. Gli errori più importanti che dobbiamo essere in grado di gestire sono:

Errore 500 - Un problema con il nostro codice Errore 404 - Una pagina che non è stata trovata (URL rotto) Errore 403 - Un errore negato dell'autorizzazione

Aggiungiamo una nuova app per gestire questi errori, chiamati errori.

python manage.py startapp errors

Aggiungi questo a impostazione.py come abbiamo fatto prima, nell'impostazione installata_apps e inizia aggiungendo riferimenti ad alcune visualizzazioni in app/urls.py, dove l'app è il nome del tuo progetto Django.

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

Questo è tutto ciò di cui abbiamo bisogno oltre alle viste di errore, ai modelli e un po 'di middleware. Definiamo quelli così:

# Crea le tue opinioni qui.

Quindi, definiamo il middleware per gestire questi errori. Faremo questo aggiungendo prima a Middleware_classes in impostazioni.py, con il nome del nostro middleware.

    # ... Middleware precedente

Quindi, aggiungiamo il middleware.

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

Aggiungiamo una funzione per ottenere l'attuale eccezione utilizzando un locale di threading, che ci aiuta a tracciare eventuali errori nel nostro codice. In termini di modelli, ne abbiamo solo bisogno, perché definiamo dinamicamente il titolo nella vista. Il modello deve solo rendere il titolo e "traccia", il nostro rintracciatore di errore dal contesto.

nano errors/templates/errors/error.html

Questo è il nostro modello più semplice di sempre, ma è così facile vedere gli errori nel nostro progetto. Quindi, disabilitiamo il debug nelle impostazioni.

nano app/settings.py

Trova questa riga in cui è impostata su True e cambiala in Falso

DEBUG = False

Vai avanti e esegui il backup dell'app ora. Siamo pronti a distribuire su un server Linux remoto e continuiamo ad aggiungere funzionalità da lì.

sudo backup

Prima di pubblicare questo codice su un server, dovremmo considerare che potrebbero esserci alcuni problemi con il codice. A seconda del caso, i siti che accettano le informazioni pubblicati avranno problemi con lo spam che viene pubblicato e difficoltà a rimuovere lo spam. Ciò non dovrebbe accadere immediatamente, ma se sta accadendo, esamineremo in seguito come moderare automaticamente lo spam sul sito e rendere più difficile per i robot accedere al sito, insieme a come disattivare gli account utente e verificare l'identità di un utente con una scansione del loro ID o una scansione biometrica, come un'impronta digitale o un riconoscimento facciale.

Guardando l'esempio di autenticazione multi -fattore che abbiamo esaminato, in produzione, le cose possono essere diverse. Notare come stiamo limitando gli accessi e i token in scadenza. Se i robot accedono a un sito, l'autenticazione a due fattori può essere più difficile in quanto possono inserire codici contemporaneamente l'utente. Per combattere questo, utilizziamo un modello nei modelli utente, dichiarando come interagiamo con il sito quando stiamo autenticando utilizzando l'autenticazione multi -fattore con un numero di telefono. Aggiungeremo anche un'opzione per l'autenticazione con e -mail. Inizia modificando i modelli utente con Nano.

nano users/models.py

Questo è l'aspetto del modello che stiamo aggiungendo. Non abbiamo bisogno di metodi, solo variabili per archiviare un ID, l'utente, il timestamp, la scadenza, la lunghezza e i tentativi contro qualsiasi autenticazione multi -fattore (un codice come 123456 inviato a un telefono o e -mail).

# Un token di base utilizzato per accedere al sito Web

Aggiungiamo anche un privilegio al nostro utente e lo imposteremo manualmente per ora, prima di migrare automaticamente all'arrgresso automaticamente degli utenti privilegiati. Nei modelli utente, aggiungi questa riga nel profilo:

    vendor = models.BooleanField(default=False)

Come per eventuali modifiche al database, dobbiamo effettuare migrazioni e migrare il database ogni volta che modifichiamo un file Models.py in Django. Ricorda, per fare questo utilizziamo prima la fonte (se non è già stato utilizzato da quando il terminale era aperto) e quindi Python gestisce.py per fare le migrazioni e migrare.

cd project-directory-you-named # (se necessario)

Per ora, puoi arruolare tutti gli account creati come fornitori utilizzando la shell.

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

Ora, evolviamo la nostra vista di autenticazione multi -fattore per utilizzare questo token. Innanzitutto, dobbiamo modificare le nostre utility Helper MFA. Usando 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
# Autentica l'utente utilizzando la propria e -mail o numero di telefono
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Filtra il token per il valore passato nell'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)) # Se questa sessione non è stata creata, creala
    user = User.objects.filter(id=token.user.id).first() # Ottieni l'utente dal token
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Se sono già autenticati, accedili
    if not user: raise PermissionDenied() # Nega se nessun utente è stato trovato
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Controlla il token di autentica
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Accedi l'utente se non sono già effettuati
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Imposta una scadenza sulla loro autenticazione multi -fattore
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Reindirizza l'utente alla pagina successiva
    if not user.profile.mfa_enabled: # Controlla se MFA è abilitato
        if not check_verification_time(user, token): # Controlla l'ora
            user.profile.mfa_enabled = False # Cancella il numero di telefono
            user.profile.enable_two_factor_authentication = True # Abilita MFA
            user.profile.phone_number = '+1' # Disabilita il numero di telefono
            user.profile.save() # Salva il profilo
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Accedi all'utente in se il proprio MFA non è abilitato
    if request.method == 'POST' and not fraud_detect(request, True): # Se la richiesta è una richiesta post
        form = TfaForm(request.POST) # Istanziare il modulo
        code = str(form.data.get('code', None)) # Ottieni il codice
        if code and code != '' and code != None: # Assicurati che non sia vuoto
            token_validated = user.profile.check_auth_token(usertoken) # Controlla il token di autentica
            is_verified = check_verification_code(user, token, code) # Controlla il codice
            if token_validated: # Se tutto
                if is_verified: # È in ordine
                    user.profile.mfa_enabled = True # Abilita MFA (se non già abilitato)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Accedi l'utente
                    for key, value in request.GET.items(): # Crea una querystring per il parametro successivo (se presente)
                        return HttpResponseRedirect(next) # Reindirizzare
            elif not token_validated: # Se il token non era valido
            if p.mfa_attempts > 3: # Se ci fossero troppi tentativi
            if form.data.get('send_email', False): # Invia l'e -mail (o il testo)
    # Render il modulo (per richiedere richieste)

Quando stiamo aggiungendo questo codice, assicurati di importare la funzione per inviare un'e -mail. Nella parte superiore del file, l'utente visualizza (con altre importazioni), aggiungi

from .mfa import send_verification_email as send_mfa_verification_email

Ora, dobbiamo scrivere quella funzione prima che tutto ciò funzioni. Dovrebbe estendere la nostra funzione di e -mail di invio e semplicemente inviare un'e -mail all'utente con il codice di verifica.

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

Quindi tutto funziona alla grande, ora abbiamo un sistema di autenticazione a più fattori che dipende da un numero di telefono o e -mail per accedere. Ma abbiamo anche bisogno di un modo per rimuovere o almeno a nascondere gli utenti che non collaborano con i nostri termini. Questi potrebbero essere spammer, robot o chiunque non significhi bene per il nostro lavoro. Dai un'occhiata a una vista che ho per monitorare gli utenti sul mio sito Web:

# importazioni
from .tests import is_superuser_or_vendor # Dovremo creare questo test
    # Ottieni un elenco di utenti
    return render(request, 'users/users.html', { # Restituisci gli utenti in un modello

Si noti che questo codice utilizza un test, dovremo dichiarare questo test in un file tests.py e importarlo. Modifica degli utenti/tests.py, creiamo il test.

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

Questo è in combinazione con il modello utenti/utenti.html, che assomiglia a questo:

Si noti che il modello include un altro modello, utenti/User.html. Quando si utilizza un modello che ha un sottotempato e non si utilizza estende, è una buona idea aggiungere un sottolineaggio () prima del nome del file da estendere, al fine di distinguere i modelli.

Nota che questo è un sacco di jinja, potresti non avere tutte queste variabili definite. Ma questo è l'aspetto del mio codice.

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

Abbiamo anche bisogno di un altro sottotemplato, toggle_active.html. Questo modello dovrebbe essere un modulo che ci consente di attivare se un utente è attivo.

Dovremo anche aggiungere una vista per attivare l'attività dell'utente e i modelli URL appropriati. Mentre ci siamo, aggiungiamo una vista per eliminare un utente nel caso in cui ne abbiamo bisogno.

# Importazioni
    success_url = '/' # Il reindirizzamento sull'URL di successo
    def test_func(self): # Test Se l'utente è superuser e ha il permesso di eliminare

Sebbene ciò sia pratico se necessario, l'eliminazione di un utente non dovrebbe essere necessario per la maggior parte del tempo, possiamo semplicemente attivare la visibilità degli utenti che visitano il sito se dobbiamo respingerli.

I modelli URL che abbiamo aggiunto sembrano questo. Con Nano, modifica utenti/urls.py e aggiungi queste righe:

nano users/urls.py

Le linee dovrebbero andare nell'elenco dei percorsi nelle viste dell'utente, prima della fine "]" ma dopo l'inizio "[".

# ...
# ...

Ora, assicurati di eseguire il backup del sito in modo da poterlo scaricare sul server Web su cui continueremo a lavorare. Dalla riga di comando,

sudo backup

Ora il nostro sito è eseguito il backup.

Quindi ora abbiamo alcune funzionalità più utili. Ma per quanto riguarda il quadro generale qui? Questo codice non è ancora accessibile da Internet, non abbiamo ancora un server di posta e dobbiamo espandere la nostra app per includere un processo di verifica completa e layout regolare per aiutarci a esplorare il sito, insieme a protocolli sicuri per l'autenticazione degli utenti privilegiati.

Arriveremo a tutto questo. La cosa più importante per ora sarà solo ottenere questo codice online, cosa che possiamo fare con poche righe di bash su un server Ubuntu. Per questo dovrai noleggiare un server, a meno che tu non abbia un server a casa e un abbonamento Business Internet che ti consente di aprire le porte. Personalmente gestisco il mio sito Web su un HP Z440 installato nel mio appartamento, ma di solito è molto più economico per le esigenze di base per noleggiare un server privato virtuale (VPS).

Tieni presente che il codice che stiamo eseguendo ora è relativamente sottile, dovrà essere mantenuto e migliorato prima che siamo pronti a usare ciò che abbiamo per costruire un prodotto. Assicurati di fare attenzione a ciò che fai con Internet, assicurati di distribuire pubblicamente questo sito sul Web su un server Linux, hai un piano per bloccare interazioni indesiderate con il tuo sito Web. Questo probabilmente non sarà un problema all'inizio, ma esamineremo una varietà di soluzioni per combattere questo, tra cui l'apprendimento automatico, l'intelligenza artificiale e la visione artificiale. Quando diventa un problema, guarda ulteriormente in questo testo per una soluzione.

In termini di affitto di un VPS, ci sono molti posti in cui puoi andare. Google Cloud ha server VPS, Ionos, Kamatera, Amazon AWS e più provider offrono soluzioni di server cloud che soddisferanno le nostre esigenze.

Dovrai fare clic sui loro moduli e selezionare un piano per iniziare. È possibile seguire un piano di base con qualsiasi provider, ma assicurati che il provider ti consenta di aprire le porte del server di posta delle porte per inviare e -mail (questa dovrebbe essere la porta 587 e la porta 25), alcuni provider bloccano queste porte. Finora ho avuto la migliore esperienza con Ionos e Kamatera, entrambi mi permetteranno di inviare e -mail illimitate e il loro prezzo è piuttosto economico.

Ti connetterai al tuo nuovo server su un protocollo chiamato SSH o Secure Shell, che ti consente di interfacciarsi a distanza con il server esattamente come il tuo personal computer, dal tuo personal computer. Quando si imposta il server, probabilmente il provider di hosting ti chiederà di aggiungere una chiave SSH o ti forniranno un nome utente e una password. La chiave SSH è come accederai al server dalla riga di comando per modificare il codice. Utilizzare le opzioni SSH-keygen di seguito per generare una chiave SSH.

ssh-keygen

Salva il file e sovrascrivilo se è necessario, è bene ruotare le chiavi SSH se non l'hai già fatto. Ora puoi usare il seguente comando per vedere la chiave SSH. Ti consigliamo di copiarlo sul tuo server remoto in modo da poterlo utilizzare per autenticare.

cat ~/.ssh/id_rsa.pub

Se non sei stato in grado di vedere una chiave SSH durante la digitazione di quel comando (una lunga serie di cifre e lettere che inizia con "SSH-RSA AAA"), prova a generare una chiave RSA (sono più sicure, quindi consiglio di usarle.) Il seguente codice genererà una chiave RSA SSH da 4096 bit.

ssh-keygen -t rsa -b 4096

Crea un VPS che esegue Ubuntu, come prevedi di farlo. Dopo aver creato un VPS facendo clic sui moduli sul sito Web Provider (kamatera.com, ionos.com o simile), ti consigliamo di accedere. Per fare questo, utilizzare il comando SSH con il tuo indirizzo IP (l'indirizzo che assomiglia a xx.xx.xx.xx). Dovrai anche essere sensibile al nome utente predefinito sul server che abbiamo creato, ad esempio Ubuntu.

ssh ubuntu@XX.XX.XX.XX

Potrebbe essere chiesto una password, se ti viene chiesto una password, inseriscila. Non utilizzeremo il nome utente predefinito, quindi iniziamo creando un nuovo utente e aggiungendo una chiave SSH al loro account.

Iniziamo aggiungendo un nuovo file sshd_config, che dice al server come utilizzare SSH.

nano sshd_config
# Questo è il file di configurazione a livello di sistema SSHD Server.  Vedere
# SSHD_CONFIG (5) per ulteriori informazioni.
# Questo sshd è stato compilato con percorso =/usr/locale/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
# La strategia utilizzata per le opzioni in SSHD_Config predefinito spedito con
# OpenSSH è specificare le opzioni con il loro valore predefinito dove
# possibile, ma lasciali commentati.  Le opzioni non commentate sovrascrivono il
# valore predefinito.
# Porta 22
# Indirizzo Family qualsiasi
# Ascoltaddress 0.0.0.0
# Ascoltaddress ::
# HostKey/etc/ssh/ssh_host_rsa_key
# HostKey/etc/ssh/ssh_host_ecdsa_key
# HostKey/etc/ssh/ssh_host_ed25519_key
# Cifre e chiave
# Rekeylimit predefinito nessuno
# Registrazione
# Syslogfacility auth
# Informazioni loglevel
# Autenticazione:
# Logingracetime 2m
# Per altirootlogin proibit-password
# Strictmodes sì
# Maxauthtries 6
# Maxsession 10
# Aspettatevi che .SSH/AUTORITED_KEYS2 venga ignorato per impostazione predefinita in futuro.
# AutorizedPrincipalsfile nessuno
# AutorizeyysCommand Nessuno
# AutorizeyysCommanduser nessuno
# Affinché questo funzioni avrai anche bisogno di chiavi host in/etc/ssh/ssh_ known_hosts
# HostBadeDautenticazione n
# Cambia in sì se non ti fidi ~/.ssh/nod_hosts per
# HostBasedAuthentication
# IgnoreUser Woltodhosts NO
# Non leggere i file ~/.rhosts e ~/.shosts dell'utente
# IGNorerhosts Sì
# Per disabilitare le password di testo chiarite in tunnel, cambia in no qui!
# AmistEmptyPasswords n
# Passa a SÌ per abilitare le password di risposta sfida (attenzione ai problemi con
# alcuni moduli e thread PAM)
# Opzioni Kerberos
# Kerberosautentica n
# Kerberosorlocalpasswd Sì
# KerberosticketCleanup Sì
# Kerberosgetafstoken no
# Opzioni GSSAPI
# GSSAPIATUTENTIMENTION NO
# Gssapicleanupcredentials Sì
# GSSAPISTRICTACCECTERCHECK SÌ
# GSSAPIKEYExchange n
# Imposta questo su "Sì" per abilitare l'autenticazione PAM, l'elaborazione dell'account,
# ed elaborazione della sessione. Se questo è abilitato, l'autenticazione PAM lo farà
# essere consentito attraverso il kbdinteractiveauthentication e
# Passwordautenticazione.  A seconda della configurazione PAM,
# L'autenticazione PAM tramite kbdinteractiveautenticazione può bypassare
# L'impostazione di "PermistrootLogin senza password".
# Se desideri solo che l'account PAM e gli assegni di sessione siano eseguiti senza
# Autenticazione PAM, quindi abilita questo ma imposta passwordautenticazione
# e kbdinteractiveauthentication to 'no'.
# Abilitando sì
# Consentire aforwarding sì
# Gatewayports n
# X11Displayoffset 10
# X11Uselocalhost Sì
# Perdette sì
# Printlastlog Sì
# TCPeepalive Sì
# Autoriterenvironment n
# Compressione ritardata
# ClienaliveInterval 0
# ClieonaliveCountMax 3
# Usato n
# Pidfile /run/ssshd.pid
# MaxStartups 10: 30: 100
# Autorittunnel n
# Chrootdirectory nessuno
# Versioneddendum nessuno
# Nessun percorso di banner predefinito
# Consenti al cliente di superare le variabili di ambiente locale
# Sostituire il default di nessun sottosistema
# Esempio di impostazioni prevalenti su base per utente
# Abbina l'utente anoncvs
# X11forwarding n
# Consentire NO
# Perdite n
# ForceCommand CVS Server

Ricorda, Ctrl+X e Y per salvare il file. Successivamente, scriviamo uno script di base chiamato Initialize (tutto nella directory home predefinita del nostro utente).

nano initialize

Aggiungi queste righe al file, sostituendoCon la chiave SSH che hai trovato usando il gatto. (.SSH/ID_RSA.PUB)

# !/bin/bash

Per guidarti attraverso questo file, iniziamo la riga per riga. La prima riga dice al compilatore che si tratta di uno script bash. Quindi stiamo installando dipendenze, copiando SSHD_CONFIG nella directory corretta, riavviando SSH, generando tasti SSH per root, aggiungendo il "team" dell'utente (puoi scegliere un nome che ti piace, usa per ora il comando Adduser con il loro nome e la password disabilitata). Aggiungiamo anche team al gruppo Sudo, generiamo la loro chiave SSH, aggiungiamo la nostra chiave per le chiavi autorizzate e anche le loro e stampano la loro chiave. Questo nuovo utente sarà il modo in cui accediamo al sito.

In un nuovo terminale, vai avanti e apri di nuovo il server.

ssh team@XX.XX.XX.XX

Questa volta non dovresti aver bisogno di una password, essere come hai una chiave SSH. Abbiamo anche disabilitato l'accesso con password per mantenere il sito più sicuro.

Ora, questo server si avvia completamente vuoto senza informazioni al riguardo. Cominciamo clonando il nostro progetto da GIT in modo da poterlo scaricare ed eseguirlo sulla macchina remota. Sul server remoto collegato su SSH, prima stampa la chiave SSH:

cat ~/.ssh/id_rsa.pub

Successivamente, incolla questa chiave nelle impostazioni GIT come abbiamo fatto prima per impostare il nostro repository Git. Ora possiamo clonare il nostro progetto direttamente sul server. Assicurati di aver eseguito il backup del progetto a livello locale per primo, quindi è sul server GIT da scaricare.

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

Perfetto. Ora tutti i file sono qui. Possiamo vederli con LS

ls

Ora, iniziamo a impostare il server. Innanzitutto, copia la tua directory del progetto in un nome semplice e memorabile che useremo per il progetto.

cp -r yourproject whatyoucalledit

Dove "WhayouCalledit" è il nuovo nome del tuo progetto. Successivamente, dovremo creare un'utilità di base per impostare il server. Salveremo questa utilità e la useremo in futuro. Per creare questa utilità, creiamo un binario utente per definire come modifichiamo uno script. Utilizzo di Bash, EDIT/USR/Bin/AScript

sudo nano /usr/bin/ascript

Assicurati di usare sudo lì in modo da avere autorizzazioni per modificare il file. Nel file, aggiungi queste righe:

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

Ricorda che questo script prende un argomento, il nome dello script, come $ 1. Innanzitutto verifica se il file esiste, o altrimenti lo crea, aggiunge la prima riga per dichiarare che lo script è bash, modifica le sue autorizzazioni, lo modifica e aggiunge il suo nome a /etc /strumenti che ci consente di archiviare i nomi degli script che stiamo creando. Se il file esiste già, modificare semplicemente le autorizzazioni e modificarlo. Salva il file e poi cambieremo le autorizzazioni. Finché usiamo questo script, non dovremo farlo di nuovo.

sudo chmod a+x /usr/bin/ascript

Perfetto. Ora creiamo uno script chiamato setup. Innanzitutto, non sopraffarti, ma dai un'occhiata a come appare il mio script di configurazione. Cammineremo attraverso come dovrebbe essere questa sceneggiatura nel tuo progetto, non avrai bisogno di tutto nella mia sceneggiatura per cominciare.

# !/bin/bash
# sudo chmod a+x scripts/usersEtup
# ./scripts/usersetup
# ssh-keygen
# Directory del progetto
# Comandi di registro
# Nano config
# Config git
# Aggiorna e installa
# Abilita antivirus Clamav
# Imposta il nome host
# Imposta Postgres
# Imposta backup del database
# Disabilita iptables
# Installa bitdefender
# Setup Postfix
# Crea dirs
# Imposta Virtualenv
# Ottieni e costruisci dipendenze
# Imposta le regole del firewall
# Installare le dipendenze PYPI
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP Installa OpenCv-Python == 4.5.5.64
# PIP Installa OpenCv-Contrib-Python == 4.5.5.64
# Installa certbot
# Esegui certbot
# Ricarica Mail Server
# Copia certificati
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Patch Venv
# Imposta le impostazioni utente
# Impostare le autorizzazioni
# sudo chown -r team: utenti/var/run/
# SUDO CHOWN ROOT: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# sudo chown www-data: utenti db.sqlite3
# Copia config e imposta le autorizzazioni
# Setup Database
# Iniettare config Pam e rimuovere la configurazione ssh difettosa
# sudo sed -i '' -e '$ d' /etc/pam.d/ssshd
# sudo sed -i '' -e '$ d' /etc /profilo
# Copia gli script del bidone e imposta le autorizzazioni
# Ricarica e abilita i servizi
# Abilita moduli Apache
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Disabilita il sito predefinito
# Abilita il nostro sito
# Ricarica demone e riavvia Apache, Postfix e OpenDkim
# Impostare le autorizzazioni
# Swap Configuration
# Motore di didascalia Init
# Setup git
# Mostra IPv6 e OpenDkim per la configurazione del dominio
# Configurazione completata

È un sacco di configurazione! In breve, questo codice registri comandi, configura nano e git, copie su file, download e installa pacchetti APT ubuntu, dipendenze Python, configura postfix, configura PostgreSQL (il server di database) e caricano i clonati, si imposta il database, configura UFW e un setwall non distribuito) Sul server, installa la configurazione, avvia e abilita il Sever, alloca lo swap, imposta le autorizzazioni e stampa IP, indirizzo IPv6 e tasto OpendKim. Abbastanza semplice, ma sembra un sacco di codice. Non ne avremo bisogno molto perché non abbiamo le dipendenze, non stiamo usando sedano, sedano o Daphne, ma ne installeremo comunque alcuni per iniziare. Si noti che questo codice ha un dominio dichiarato più volte.

Dovremo anche acquistare un nome di dominio (che è una piccola tassa annuale). Raccomando Squarespace per l'acquisto di un dominio, il loro layout è intuitivo e facile da usare. Puoi acquistare qualsiasi dominio a tua scelta, ma in questo esempio sto usando il dominio femmebabe.com. Una volta acquistato un dominio, vai al pannello di configurazione DNS di Squarespace e aggiungi un record A che punta il tuo dominio al server per indirizzo IP. Dovrebbe sembrare così:

@ A xx.xx.xx.xx

Con l'operatore @ come host, il che significa che tutti i sottodomi sotto questo dominio e il dominio root reindiriranno tutti al server. Ci sono più record da dichiarare, ma possiamo passare a questi una volta che siamo pronti a inviare posta. Tieni presente che potrebbero essere necessari diversi giorni prima che tu sia in grado di inviare correttamente la posta dal server. I record DNS che stiamo impostando richiederanno del tempo per propagare.

Comunque, l'unico record che dobbiamo iniziare è un record A. Quindi ora possiamo inserire lo script di seguito secondo il nostro progetto ed eseguirlo.

Cominciamo con uno script di installazione più piccolo per installare ciò di cui abbiamo bisogno per un progresso di base. Non useremo ancora così tante dipendenze o PostgreSQL, avvieremo semplicemente un server HTTP di base e ci preoccuperemo di certificarlo quando è fatto. Ricorda, per ottenere un certificato HTTPS ed eseguire il server in modo sicuro, dovremo acquistare un dominio insieme al noleggio di un server. Per ora, sostituire "team" in questo file con il nome del tuo utente, "Dir" con la directory del tuo progetto e fornire la tua e -mail e il tuo dominio nei tag <>.

Inoltre, prima di eseguire questo codice, dobbiamo modificare le impostazioni nel firewall che il provider di hosting supporta, se presente. Di solito questo è nella scheda "Networks" del tuo provider di hosting, o se si è auto hosting, è nella sezione "Port Forwarding" del tuo router. Ti consigliamo inoltre di impostare un IP statico tramite il router con l'indirizzo della macchina del server, se si utilizza l'auto hosting. Dovrai aprire le seguenti porte per l'accesso di lettura/scrittura.

22 (SSH) 25 (posta) 587 (posta) 110 (Cliente di posta) 80 (HTTP) 443 (HTTPS)

# !/bin/bash
# Comandi di registro
# Nano config
# Config git
# Aggiorna e installa
# Abilita antivirus Clamav
# Imposta il nome host
# Imposta backup del database
# Disabilita iptables
# Imposta Virtualenv
# Installa certbot
# Esegui certbot
# Imposta le impostazioni utente
# Impostare le autorizzazioni
# sudo chown -r team: utenti/var/run/
# SUDO CHOWN ROOT: root/run/sudo/ts -r
# Ricarica e abilita i servizi
# Abilita moduli Apache
# Ricarica demone e riavvia Apache, Postfix e OpenDkim
# Mostra IPv6 e OpenDkim per la configurazione del dominio

Prima di eseguire questo codice, assicurarsi che il dominio acquistato sia connesso al server. Per fare ciò, apri un terminale sulla macchina locale ed esegui questo comando con il tuo dominio:

ping femmebabe.com # Inserisci qui il tuo dominio, dopo il ping

Se tutto sembra bene e il server sta inviando risposte, siamo pronti per eseguire lo script e installare i pacchetti, nonché avviarsi, abilitare e certificare il nostro server Apache.

Non è tutta la configurazione necessaria per configurare PostFix, esamineremo questa configurazione più tardi. Per ora, eseguire questo codice di configurazione e dovrebbero essere necessari qualche minuto per installare e certificare il tuo server. Ancora una volta, assicurati di sostituire il nome, e -mail e il nome di dominio nello script in base al nome acquistato.

Ora che il server viene fornito, è possibile andare all'URL in qualsiasi browser Web e verificare che il server stia eseguendo HTTPS. In caso contrario, prova ad aspettare un po 'che i record DNS raggiungano e quindi esegui il seguente comando per riprovare la certificazione CERTBOT:

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

Finché hai configurato tutto correttamente, dovresti essere in grado di accedere alla pagina predefinita di Apache solo per sapere che il tuo codice funziona e visualizza una pagina Web in diretta. Successivamente, modifichiamo le impostazioni.py per modificare la nostra modalità di debug predefinita in produzione. Configureremo anche il dominio nelle impostazioni e gli IP interni.

nano yourproject/settings.py

Nelle impostazioni, modifica/aggiungi queste righe.

# Configurazione del sito

Ora dovremo configurare Apache2. Modifichiamo il file di configurazione che distribuiremo con questa riga:

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

Questo file di configurazione dovrebbe contenere il nostro nome di dominio e il nome dell'utente e del progetto. Sto usando il nome di dominio femmebabe.com, il team di nome utente e il nome del progetto 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>

Assicurati di sostituire il nome del progetto, delle directory e del dominio in questo codice di esempio durante la configurazione del server. Ora dovremo disabilitare il sito predefinito. Questo può essere fatto usando Bash.

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

Successivamente, possiamo abilitare il sito predefinito e ricaricare Apache2, anche usando Bash. Ricorda di sostituire Femmebabe con il nome del file dichiarato durante la modifica in/etc/apache2/siti-disponibile/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Torna al tuo dominio nella barra navy. Dovresti vedere il sito che hai configurato nel tuo browser Web. Congratulazioni! Se non lo vedi, potrebbe essere necessario apportare alcune modifiche. Esamina attentamente le impostazioni del progetto, la configurazione di Apache e assicurati di non avere errori ed eseguire i seguenti comandi per controllare il progetto per errori.

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

Se hai errori nel tuo progetto Python, tracciali verso dove sono e fissarli. Potresti non essere in grado di vedere tutti i tuoi errori a seconda di dove si trovano, quindi se hai un errore che dice semplicemente "la popolazione non è rientrante", modifica il seguente file nell'ambiente virtuale, Registry.py, per esporre l'errore.

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

Scorri fino alla riga 83, in cui viene sollevato questo errore di runtime (solleva runtimeerror ("populate () non è rientrante")) e aggiungi un commento prima di questa riga, quindi aggiungendo, con lo stesso rientro, self.app_configs = {}. Sembra questo:

                # Prevenire le chiamate rientranti per evitare l'esecuzione di appconfig.ready ()
                # Metodi due volte.
# sollevare runtimeerror ("populate () non è rientrante")

È quindi possibile controllare di nuovo il progetto ed esporre l'errore.

python manage.py check

Quindi puoi vedere l'errore e risolverlo. Quando lo hai risolto e il codice si compila senza errori, assicurati di cambiare il file in modo che sia così:

                # Prevenire le chiamate rientranti per evitare l'esecuzione di appconfig.ready ()
                # Metodi due volte.
# self.app_configs = {}

A condizione che il server sia online, quando apportiamo ulteriori modifiche, dobbiamo utilizzare il seguente comando per ricaricare il server:

sudo systemctl reload apache2

Eccezionale! Ma che dire di inviare posta? Per iniziare a inviare e -mail, dovremo prima aggiornare la configurazione del dominio. Questo dovrebbe essere nel tuo pannello DNS a Squarespace o qualunque registrar dei nomi di dominio tu abbia scelto. Dovremo anche installare e aggiungere configurazione ed eseguire alcuni comandi.

Innanzitutto, otteniamo l'indirizzo IPv6 del server. Apriamo quindi i tuoi DN e aggiungeremo i record.

Per ottenere l'indirizzo IPv6 del server, utilizzare questo comando:

ip -6 addr

Ora possiamo aggiungere i seguenti record alle impostazioni DNS. I miei dischi sembrano così. Tuttavia, per i tuoi record, è necessario sostituire l'indirizzo IP con il tuo IP (non 75.147.182.214, questo è mio). Aggiungi anche il tuo dominio al posto di femmebabe.com, nonché il tuo indirizzo IPv6 trovato con il comando precedente (non puoi usare il mio, Fe80 :: 725a: FFF: FE49: 3E02). Non preoccuparti per il domainKey per ora, questo viene creato quando impostiamo Postfix, il server di posta, con OpenDkim e stampano la chiave. Configurare quest'ultimo.

@ UN 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 ~

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

_dmarc TXT N / A v = dmarc1; p = nessuno

SendOnly._Domainkey TXT N / A

Ora dovremo aggiungere una configurazione persistente per Postfix. Tutto ciò che dobbiamo fare è assicurarci di sostituire il nome di dominio, femmebabe.com, con il nome di dominio che stai usando. Diamo un'occhiata a tutti i file di configurazione uno per uno e installali in una directory chiamata config nel nostro progetto, per installare sul sistema operativo.

nano config/etc_postfix_main.cf

Aggiungi questo testo al file

# Vedi /usr/share/postfix/main.cf.dist per una versione commentata e più completa
# Debian Specifica: specificare un nome file causerà il primo
# riga di quel file da utilizzare come nome.  Il default di Debian
# è /etc /mailname.
# myorigin = /etc /mailname
# Apprendendo .Domain è il lavoro del MUA.
# Rompente la riga successiva per generare avvertimenti di "posta ritardata"
# Delay_warning_time = 4H
# Vedi http://www.postfix.org/compatibility_readme.html - impostazione predefinita a 3.6 on
# installazioni fresche.
# Parametri TLS
# Configurazione a più milter

Next config!

nano config/etc_postfix_master.cf

Aggiungi queste righe:

# 
# File di configurazione del processo principale postfix.  Per i dettagli sul formato
# del file, vedere la pagina manuale Master (5) (comando: "Man 5 Master" o
# On-line: http://www.postfix.org/master.5.html).
# 
# Non dimenticare di eseguire "PostFix RELOAD" dopo aver modificato questo file.
# 
# =========================================================================
# Tipo di servizio privato non priv chroot wakeup maxproc comando + args
# (sì) (sì) (no) (mai) (100)
# =========================================================================
# SMTP INET N - Y - 1 PostScreen
# SMTPD PASS - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Scegli uno: abilita l'invio solo per i client Loopback o per qualsiasi cliente.
# 127.0.0.1: Submission Inet N - Y - - SMTPD
# -o syslog_name = postfix/invio
# -O SMTPD_TLS_SECURITY_LEVEL = CRIPT
# -O SMTPD_SASL_AUTH_ENABLE = Sì
# -O SMTPD_TLS_AUTH_ONLY = Sì
# -o SMTPD_Reject_unlisted_recipient = no
# -O SMTPD_CLIENT_RESTRITIONS = $ MUA_CLIENT_RESTRITIONS
# -O SMTPD_HELO_RESTRITIONS = $ MUA_HELO_RESTRITIONS
# -O SMTPD_SENDER_RESTRITIONS = $ MUA_SENDER_RESTRITIONS
# -O SMTPD_RECIPIENT_RESTRITIONS =
# -O SMTPD_RELAY_RESTRITIONS = autorite_sasl_authenticato, rifiuta
# -o milter_macro_daemon_name = originaria
# Scegli uno: abilita SMTPS solo per i client Loopback o per qualsiasi cliente.
# 127.0.0.1: SMTPS INET N - Y - - SMTPD
# SMTPS INET N - Y - - SMTPD
# -o syslog_name = postfix/SMTPS
# -O SMTPD_TLS_WRAPPERMODE = Sì
# -O SMTPD_SASL_AUTH_ENABLE = Sì
# -o SMTPD_Reject_unlisted_recipient = no
# -O SMTPD_CLIENT_RESTRITIONS = $ MUA_CLIENT_RESTRITIONS
# -O SMTPD_HELO_RESTRITIONS = $ MUA_HELO_RESTRITIONS
# -O SMTPD_SENDER_RESTRITIONS = $ MUA_SENDER_RESTRITIONS
# -O SMTPD_RECIPIENT_RESTRITIONS =
# -O SMTPD_RELAY_RESTRITIONS = autorite_sasl_authenticato, rifiuta
# -o milter_macro_daemon_name = originaria
# 628 INET N - Y - - QMQPD
# QMGR UNIX N - N 300 1 OQMGR
# -o SMTP_HELO_Timeout = 5 -o SMTP_CONNECT_Timeout = 5
# 
# =====================================================================
# Interfacce al software non postfisso. Assicurati di esaminare il manuale
# Pagine del software non postfisso per scoprire quali opzioni desidera.
# 
# Molti dei seguenti servizi utilizzano la consegna Postfix Pipe (8)
# agente.  Vedi la pagina Man (8) Man per informazioni su $ {destinatario}
# e altre opzioni di busta.
# =====================================================================
# 
# MailDrop. Vedere il file Postfix MailDrop_ReadMe per i dettagli.
# Specificare anche in main.cf: MailDrop_destination_recipient_limit = 1
# 
# 
# =====================================================================
# 
# Le recenti versioni di Cyrus possono utilizzare la voce "LMTP" Master.CF esistente.
# 
# Specificare in Cyrus.conf:
# lmtp cmd = "lmtpd -a" ascolta = "localhost: lmtp" proto = tcp4
# 
# Specificare in main.cf uno o più dei seguenti:
# Mailbox_Transport = LMTP: INET: LocalHost
# virtual_transport = LMTP: Inet: localhost
# 
# =====================================================================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Specificare anche in main.cf: cyrus_destination_recipient_limit = 1
# 
# Cyrus Unix - N N - - Pipe
# flags = drx user = cyrus argv =/cirus/bin/consegna -e -r $ {mittente} -m $ {estensione} $ {user}
# 
# =====================================================================
# Vecchio esempio di consegna tramite Ciro.
# 
# Old -Cyrus Unix - N - - Pipe
# flags = r user = cirus argv =/cirus/bin/consegna -e -m $ {estensione} $ {user}
# 
# =====================================================================
# 
# Vedere il file Postfix UUCP_ReadMe per i dettagli di configurazione.
# 
# 
# Altri metodi di consegna esterna.
# 

E la configurazione Opendkim. OpenDkim identifica i server di posta elettronica con le chiavi del dominio per renderli più sicuri. Senza di essa, la posta non è firmata e potrebbe non arrivare a una casella di posta.

nano config/etc_default_opendkim

Aggiungi queste righe:

# Nota: questo è un file di configurazione legacy. Non è usato da OpenDkim
# Servizio SystemD. Si prega di utilizzare i parametri di configurazione corrispondenti in
# /etc/opendkim.conf invece.
# 
# In precedenza, si avrebbero modificato le impostazioni predefinite qui e quindi eseguire
# /lib/opendkim/opendkim.service.genera per generare systemd override file su
# /etc/systemd/system/opendkim.service.d/override.conf e
# /etc/tmpfiles.d/opendkim.conf. Mentre questo è ancora possibile, ora è
# Consigliato per regolare le impostazioni direttamente in /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Modifica in/var/spool/postfix/run/opendkim per utilizzare un socket unix con
# Postfix in un chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Rompente specificare una presa alternativa
# Si noti che l'impostazione di ciò sovrascriverà qualsiasi valore socket in OpenDkim.conf
# predefinito:
# Ascolta tutte le interfacce sulla porta 54321:
# Socket = Inet: 54321
# Ascolta il loopback sulla porta 12345:
# Socket = Inet: 12345@localhost
# Ascolta il 192.0.2.1 sulla porta 12345:
# Socket = Inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Aggiungi queste righe:

# default_process_limit = 100
# default_client_limit = 1000
# Limite predefinito VSZ (dimensione della memoria virtuale) per i processi di servizio. Questo è principalmente
# destinato a catturare e uccidere i processi che perdono la memoria prima di mangiare
# qualunque cosa.
# default_vsz_limit = 256m
# L'utente di accesso viene utilizzato internamente dai processi di accesso. Questo è il più non attendibile
# utente nel sistema di piccione. Non dovrebbe avere accesso a nulla.
# default_login_user = dovenull
# L'utente interno viene utilizzato da processi non privilegiati. Dovrebbe essere separato da
# Accedi utente, in modo che i processi di accesso non possano disturbare altri processi.
# default_internal_user = dovecot
    # porta = 143
    # porta = 993
    # SSL = Sì
  # Numero di connessioni da gestire prima di avviare un nuovo processo. In genere
  # Gli unici valori utili sono 0 (illimitati) o 1. 1 è più sicuro, ma 0
  # è più veloce. <doc/wiki/loginprocess.txt>
  # Service_Count = 1
  # Numero di processi per continuare sempre ad aspettare più connessioni.
  # Process_min_avail = 0
  # Se imposti Service_Count = 0, probabilmente devi crescere questo.
  # vsz_limit = $ default_vsz_limit
    # porta = 110
    # porta = 995
    # SSL = Sì
    # porta = 587
  # Crea un ascoltatore Inet solo se non è possibile utilizzare la presa UNIX sopra
  # inet_listener lmtp {
    # Evita di rendere visibile LMTP per l'intera Internet
    # indirizzo =
    # porta =
  # }
  # La maggior parte della memoria va ai file MMAP (). Potrebbe essere necessario aumentarlo
  # limite se hai enormi cassette postali.
  # vsz_limit = $ default_vsz_limit
  # Max. Numero di processi IMAP (connessioni)
  # Process_limit = 1024
  # Max. Numero di processi POP3 (connessioni)
  # Process_limit = 1024
  # Max. Numero di processi di invio SMTP (connessioni)
  # Process_limit = 1024
  # Auth_socket_Path punta a questo socket UserDB per impostazione predefinita. È in genere
  # Utilizzato da Dovecot-LDA, Doveadm, possibilmente processo IMAP, ecc.
  # Le autorizzazioni complete a questa presa sono in grado di ottenere un elenco di tutti i nomi utente e
  # Ottieni i risultati delle ricerche UserDB di tutti.
  # 
  # La modalità predefinita 0666 consente a chiunque di connettersi alla presa, ma il
  # Le ricerche UserDB avranno successo solo se UserDB restituisce un campo "UID"
  # corrisponde all'UID del processo chiamante. Anche se l'UID o il GID del chiamante corrisponde al
  # UID o GID di Socket La ricerca ha successo. Qualsiasi altra cosa provoca un fallimento.
  # 
  # Per dare al chiamante le autorizzazioni complete per cercare tutti gli utenti, impostare la modalità su
  # Qualcos'altro di 0666 e DOVECOT permette al kernel di applicare il
  # autorizzazioni (ad es. 0777 consente a tutti le autorizzazioni complete).
  # Il processo del lavoratore di auth è eseguito come root per impostazione predefinita, in modo che possa accedere
  # /etc/ombra. Se questo non è necessario, l'utente dovrebbe essere modificato
  # $ default_internal_user.
  # utente = root
  # Se viene utilizzato il proxy DICT, i processi di posta dovrebbero avere accesso alla sua presa.
  # Ad esempio: modalità = 0660, gruppo = VMAIL e Global Mail_Access_Groups = vmail
    # modalità = 0600
    # utente =
    # gruppo =

Ancora una volta, assicurati di sostituire il dominio in tutti questi file, femmebabe.com, con il dominio selezionato. Modifica il file successivo, la configurazione di Dovecot,

nano config/etc_dovecot_dovecot

E aggiungi queste righe

## File di configurazione DOVECOT
# Se hai fretta, vedi http://wiki2.dovecot.org/quickconfiguration
# Il comando "DoveConf -N" fornisce un'uscita pulita delle impostazioni modificate. Usalo
# Invece di copiare e incollare file quando si pubblicano nella mailing list di Dovecot.
# '# 'Personaggio e tutto dopo che è stato trattato come commenti. Spazi extra
# e le schede vengono ignorate. Se vuoi usare uno di questi esplicitamente, metti il
# value inside quotes, eg.: key = "# Char e trailer di spazi bianchi "
# La maggior parte (ma non tutte) le impostazioni possono essere sovrascritte da diversi protocolli e/o
# IP di origine/destinazione posizionando le impostazioni all'interno delle sezioni, ad esempio:
# Protocollo IMAP {}, locale 127.0.0.1 {}, remoto 10.0.0.0/8 {}
# I valori predefiniti sono mostrati per ogni impostazione, non è necessario per il rompicapo
# quelli. Queste sono eccezioni a questo però: nessuna sezione (ad esempio spazio dei nomi {})
# Oppure le impostazioni del plug -in vengono aggiunte per impostazione predefinita, sono elencate solo come esempi.
# I percorsi sono anche solo esempi con le impostazioni predefinite reali che si basano sulla configurazione
# opzioni. I percorsi qui elencati sono per configure --prefix =/usr
# -Sysconfdir =/etc--localstateDir =/var
# Abilita protocolli installati
# Una virgola separata da IP o host dove ascoltare per le connessioni.
# "*" Ascolta in tutte le interfacce IPv4 "::" Ascolta in tutte le interfacce IPv6.
# Se si desidera specificare porte non default o qualcosa di più complesso,
# Modifica conf.d/master.conf.
# Ascolta = *, ::
# Directory di base dove archiviare i dati di runtime.
# base_dir =/var/run/dovecot/
# Nome di questo istanza. In Multi-Intence Setup Doveadm e altri comandi
# può usare -i <stance_name> per selezionare quale istanza viene utilizzata (un'alternativa
# a -c <config_path>). Il nome dell'istanza viene inoltre aggiunto ai processi DOVECOT
# nell'output PS.
# Instance_name = dovecot
# Messaggio di saluto per i clienti.
# login_greeting = dovecot pronto.
# Elenco separato dello spazio di intervalli di rete affidati. Connessioni da questi
# Gli IP sono autorizzati a sovrascrivere i loro indirizzi e porte IP (per la registrazione e
# Per controlli di autenticazione). disable_plaintext_auth è anche ignorato per
# queste reti. In genere specificheresti i tuoi server proxy IMAP qui.
# login_trusted_networks =
# Elenco separato dello spazio di accesso di accesso di accesso Controllo (ad es. TCPWRAP)
# login_access_sockets =
# Con proxy_maybe = sì se la destinazione proxy corrisponde a uno di questi IP, non farlo
# proxy. Questo non è necessario normalmente, ma può essere utile se la destinazione
# IP è ad es. Un IP di un bilanciamento del carico.
# auth_proxy_self =
# Mostra più titoli di processo verbosio (in PS). Attualmente mostra il nome utente e
# Indirizzo IP. Utile per vedere chi sta effettivamente usando i processi IMAP
# (ad es. Cassette di posta condivisa o se lo stesso UID viene utilizzato per più account).
# verbose_proctitle = no
# Dovrebbero essere uccisi tutti i processi quando il processo principale di Dovecot si spegne.
# Impostare questo su "no" significa che il dovecot può essere aggiornato senza
# costringendo a chiudere le connessioni client esistenti (anche se questo potrebbe essere
# Un problema se l'aggiornamento è ad es. a causa di una soluzione di sicurezza).
# Shutdown_Client = Sì
# Se diverso da zero, eseguire i comandi di posta tramite così tante connessioni al server Doveadm,
# Invece di eseguirli direttamente nello stesso processo.
# doveadm_worker_count = 0
# Società o host UNIX: porta utilizzata per la connessione al server Doveadm
# DoveADM_Socket_path = DoveADM-Server
# Elenco separati di spazio di variabili di ambiente che sono conservate su Dovecot
# startup e tramandati a tutti i processi dei suoi figli. Puoi anche dare
# Tasto = coppie di valori per impostare sempre impostazioni specifiche.
# import_environment = tz
## 
## Impostazioni del server del dizionario
## 
# Il dizionario può essere utilizzato per archiviare la chiave = elenchi di valori. Questo è usato da diversi
# plugin. È possibile accedere al dizionario direttamente o sebbene a
# Dizionario Server. I seguenti nomi di dizionario di blocchi di blocco di DtCt a Uris
# Quando viene utilizzato il server. Questi possono quindi essere referenziati usando URI in formato
# "Proxy :: <nome>".
  # quota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# La maggior parte della configurazione effettiva viene inclusa di seguito. I filenati sono
# Sorto per la prima volta per il loro valore ASCII e analizzato in quell'ordine. 00 prefissi
# Nei nomi dei file sono destinati a semplificare la comprensione dell'ordinamento.
# Un file di configurazione può anche provare ad essere incluso senza dare un errore se
# Non è trovato:
# Consente a DoveCot di ascoltare tutte le connessioni di input (IPv4 / IPv6)

Aggiungi una password per l'utente DOVECOT:

nano config/etc_dovecot_passwd

La prima parte del file, davanti al colon, è il nome utente. L'ultima parte, "YourPassword", indica la password che desideri dare al tuo server di posta.

team:{plain}yourpassword

Successivamente, la configurazione Opendkim

nano config/etc_opendkim.conf

E aggiungi queste righe:

# Questa è una configurazione di base per la firma e la verifica. Può essere facilmente
# Adattato per soddisfare un'installazione di base. Vedi OpenDkim.conf (5) e
# /usr/share/doc/opendkim/examples/opendkim.conf.sample per completare
# Documentazione dei parametri di configurazione disponibili.
# Log perché no
# Parametri di firma e verifica comuni. In Debian, l'intestazione "da" è
# Overdrio, perché è spesso la chiave di identità utilizzata dai sistemi di reputazione
# e quindi un po 'sensibile alla sicurezza.
# Dominio di firma, selettore e chiave (richiesto). Ad esempio, eseguire la firma
# Per il dominio "Esempio.com" con selettore "2020" (2020._Domainkey.example.com),
# Utilizzando la chiave privata memorizzata in /etc/dkimkeys/example.private. Più granulare
# Le opzioni di configurazione sono disponibili in /usr/share/doc/opendkim/readme.opendkim.
# Dominio Esempio.com
# Selettore 2020
# Keyfile /etc/dkimkeys/example.private
# In Debian, Opendkim funziona come utente "Opendkim". È richiesto un Umask di 007 quando
# Utilizzo di una presa locale con MTA che accedono alla presa come non privilegiato
# utente (ad esempio, postfix). Potrebbe essere necessario aggiungere un "postfix" dell'utente al gruppo
# "Opendkim" in quel caso.
# Socket per la connessione MTA (richiesta). Se l'MTA è all'interno di una prigione di Chroot,
# deve essere assicurato che la presa sia accessibile. In Debian, Postfix è in corso
# Un chroot in/var/spool/postfix, quindi dovrebbe essere una presa unix
# configurato come mostrato nell'ultima riga seguente.
# Socket Local: /run/opendkim/opendkim.sock
# Socket Inet: 8891@localhost
# Socket Inet: 8891
# Host per i quali firmare anziché verificare, il valore predefinito è 127.0.0.1. Vedere il
# Sezione operativa di Opendkim (8) per ulteriori informazioni.
# InternalHosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# L'ancoraggio di fiducia consente DNSSEC. In Debian, viene fornito il file di ancoraggio di fiducia
# dal pacchetto DNS-Root-Data.
# Nameservers 127.0.0.1
# Mappa i domini da tra gli indirizzi ai tasti utilizzati per firmare i messaggi
# Un insieme di host interni la cui posta dovrebbe essere firmata
nano config/etc_default_opendkim

E aggiungi queste righe

# Nota: questo è un file di configurazione legacy. Non è usato da OpenDkim
# Servizio SystemD. Si prega di utilizzare i parametri di configurazione corrispondenti in
# /etc/opendkim.conf invece.
# 
# In precedenza, si avrebbero modificato le impostazioni predefinite qui e quindi eseguire
# /lib/opendkim/opendkim.service.genera per generare systemd override file su
# /etc/systemd/system/opendkim.service.d/override.conf e
# /etc/tmpfiles.d/opendkim.conf. Mentre questo è ancora possibile, ora è
# Consigliato per regolare le impostazioni direttamente in /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Modifica in/var/spool/postfix/run/opendkim per utilizzare un socket unix con
# Postfix in un chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Rompente specificare una presa alternativa
# Si noti che l'impostazione di ciò sovrascriverà qualsiasi valore socket in OpenDkim.conf
# predefinito:
# Ascolta tutte le interfacce sulla porta 54321:
# Socket = Inet: 54321
# Ascolta il loopback sulla porta 12345:
# Socket = Inet: 12345@localhost
# Ascolta il 192.0.2.1 sulla porta 12345:
# Socket = Inet: 12345@192.0.2.1

Quando siamo pronti per impostare il nostro server postfix, eseguiremo il codice seguente, con il nome di dominio appropriato incorporato. Inizia creando uno script

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

Ora, in Nano, l'editor di testo, modifica questo file in modo che includa il tuo nome di dominio invece di femmebabe.com.

# !/bin/bash
# Setup Postfix

Ora, esegui lo script completato per configurare PostFix, OpenDkim e Dovecot.

./scripts/postfixsetup

Una volta eseguito questo script, copiare l'ultima riga, lo stampa e lo incolla nella configurazione DNS come valore per SendOnly._Domainkey. Questa è la chiave Opendkim utilizzata per identificare il tuo dominio quando si inviano posta sicura.

Eccezionale! Entro pochi giorni, dovresti essere in grado di inviare posta dal server a condizione che tutto sia configurato correttamente.

Se hai appena configurato il DNS per il tuo server di posta, dovrebbero essere necessarie meno di 72 ore per l'aggiornamento dei record. Di solito è molto più veloce. Puoi verificare se il tuo server funziona utilizzando questo comando, fornito la tua e -mail:

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

Se tutto sembra funzionare correttamente, dovresti essere in grado di inviare e -mail con il tuo server. Se non funziona, prova a guardare i registri per vedere quale potrebbe essere l'errore.

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

Ciò offrirà informazioni verbose sulla posta inviata dal server e se funziona correttamente. Dovresti essere in grado di vedere l'email anche nella tua casella di posta, se non è lì, controlla la cartella spam.

Dovrai anche configurare le tue impostazioni in Impostazioni.py in modo che il tuo server di posta elettronica possa parlare con la tua app Django, il progetto. Aggiungi o sostituisci queste righe nelle impostazioni

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

Si noti che stiamo utilizzando un file di configurazione per ottenere la password. Cariciamo questo file nelle impostazioni come così, all'inizio del file.:

# Apri e caricano configurazione

Crea questo file e aggiungiamo una chiave segreta ad esso, nonché la password della posta. Per generare una chiave segreta, usa questo comando, con qualsiasi lunghezza che ti piace alla fine:

openssl rand -base64 64

Ora, copia il testo che OpenSSL ha generato e modifica /etc/config.json

sudo nano /etc/config.json

Aggiungi le seguenti righe al tuo file, con la chiave che OpenSSL generata come chiave segreta.

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

Il formato JSON è semplice e facile da usare, possiamo dichiarare anche altre chiavi che vogliamo utilizzare nel nostro progetto in questo modo e tenerli separati dalla nostra directory di progetto in modo che altri utenti non possano scrivere a loro e quindi non possono essere letti dalla nostra directory del progetto da solo. Questa è una pratica consigliata per le chiavi API, di cui useremo più di alcuni qui.

Ti consigliamo anche di eseguire il backup del tuo progetto per assicurarti che tutto sia salvato e sarai in grado di recuperare il tuo lavoro in seguito anche se non desideri più noleggiare un server.

sudo backup

Ora, prova a inviare un'e -mail HTML dal server Web, a condizione che l'invio della riga di comando è funzionante. Interroga l'istanza dell'utente nella shell e invia un'e -mail HTML a quell'utente tramite Django. Cambia il mio nome nel codice, Charlotte, nel tuo nome utente.

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

Se il primo comando non funziona, assicurati di utilizzare

source venv/bin/activate

A condizione che tutto sia impostato correttamente, ora riceverai un'e -mail di benvenuto nella tua casella di posta inviata dalla tua app web. Buon lavoro! Hai fatto molta strada.

Volevo aggiungere, se stai lottando con qualsiasi errore mentre lavori su un progetto come questo, non esitare a cercare risposte e chiedere aiuto. Google, tra gli altri motori di ricerca, sono grandi risorse per cercare aiuto per la programmazione. Basta cercare l'errore che stai ricevendo e sarai in grado di vedere come le altre persone risolvono il problema. Inoltre, sei il benvenuto a contattarmi, i tuoi educatori (insegnanti, professori, tutor), tutti i coetanei su Internet che sono disponibili per l'aiuto di programmazione o consultare questo libro o altre risorse per trovare soluzioni ai problemi che stai riscontrando. Capisco che non è facile, ma anche se hai letto così lontano e non stai scrivendo alcun codice, stai imparando molto sulla costruzione di un'app Web da zero. Passati sulla schiena, stai facendo un ottimo lavoro.

Grazie per aver dedicato del tempo a leggere questa guida Web di terza edizione. Nelle edizioni future, includerò più esempi importanti discussi all'inizio del documento e ci immergeremo molto più a fondo nel mondo dello sviluppo di software e hardware. Resta sintonizzato per quello che verrà e non vedo l'ora di insegnarti come costruire software incredibile. Ci vediamo nella prossima edizione!






Vicino
Pagina 1
Salto
Vedi l'articolo completo
Continua a leggere

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta



Three Thirteen Online Free Play three thirteen online for free. Invite a Friend Join a Game ***.
Acquista

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


Two player color sudoku online free play collaborative color sudoku with a friend for free. Invite a Friend Join a Game ***.
Acquista

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.

.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta



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.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta



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.

.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


Acquista

di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta


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.


di Daisy / Visualizzazione | Acquistare | Acquista con criptovaluta




https://glamgirlx.com -


(Fare clic o toccare per scaricare l'immagine)
Intrattenimento professionale, foto, video, audio, livestreaming e gameplay casual, nonché servizi di scansione, sviluppo web e surrogatore dell'ID.

Lasciami un suggerimento in bitcoin usando questo indirizzo: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Termini di servizio