Νέα - Επισκέπτομαι τον ιστότοπο
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 ...
Πρακτική βαθιά μάθηση και ασφάλεια στο διαδίκτυο με παράδειγμα

Πρακτική βαθιά μάθηση και ασφάλεια στο διαδίκτυο με παράδειγμα Τρίτη έκδοση Σαρλόττα Χάρπερ 3 Ιουλίου 2024 Ενημερώθηκε/μετατράπηκε στις 3 Ιουνίου 2025

Πρόλογος:

Οι εκτιμήσεις ασφαλείας στην οικοδόμηση λογισμικού για τον Ιστό αποτελούν σημαντικό μέρος του σχεδίου και της εκτέλεσης οποιουδήποτε ιστού προγραμματιστή, ενώ η μηχανική είναι ένα πρωτότυπο που είναι αξιόπιστο, σταθερό και χρήσιμο για πρακτικούς σκοπούς. Το DOM (Document Object markup), με την εφαρμογή του HTML, JavaScript και CSS καθώς και το λογισμικό backend που εφαρμόζει το Python, το C/C ++, το Java και το Bash, δίνουν στους προγραμματιστές ιστού την ελευθερία και τη δύναμη για να δημιουργήσουν μια μεγάλη ποικιλία έργων που εκφράζουν τη δημιουργικότητα, παρέχουν ευκολία χρήσης και λειτουργικότητας, απεικόνιση και χαρακτήρα, Για να σκοτώσετε το χρόνο ή να κάνετε κάτι στο διαδίκτυο, συνήθως σε μια συσκευή smartphone της οθόνης αφής. Οι περισσότεροι άνθρωποι δεν θα ξέρουν καν από πού να ξεκινήσουν όταν θέλουν να οικοδομήσουν έναν ιστότοπο από το μηδέν, θα τείνουν να ξεκινούν από τον ιστότοπο ενός άλλου ατόμου και να οικοδομήσουν κάτι περιορισμένο σε λειτουργικότητα, αξιοπιστία, ευκολία χρήσης και ειδικά δημιουργικότητα, όταν θα μπορούσαν να έχουν όλα τα τελευταία ισχυρά εργαλεία στη διάθεσή τους για να χτίσουν κάτι χρήσιμο χωρίς να χάσουν τα κουμπιά πιέζοντας και ειδικά να σπαταλούν τα χρήματα που πληρώνουν τις ακριβές συνδρομές σε λίγα λογισμικά που θέλουν να χρησιμοποιήσουν ούτως ή άλλως ό, Εάν έχετε λίγα λεπτά για να διαβάσετε αυτό το βιβλίο και να μάθετε τι θέλω να σας διδάξω ή ακόμα και να μιλήσετε μαζί μου προσωπικά για τους στόχους σας και να πάρετε κάποια καθοδήγηση προς τη σωστή κατεύθυνση και έχετε κίνητρο να μάθετε να κωδικοποιείτε και να γράφετε το δικό σας λογισμικό, να πάρετε αυτό το βιβλίο και να αφήσετε λίγο χρόνο για να μάθετε το επόμενο επιρροή, ισχυρή, βελτιωμένη και σημαντική εφαρμογή στο διαδίκτυο, που είναι όλα σε σας και είναι ακριβώς αυτό που θέλετε και να πληροί τις ανάγκες σας.

Για εμένα: Είμαι προγραμματιστής λογισμικού με ευρύ φάσμα εμπειρίας σε C/C ++, Java, Python, HTML, CSS και JavaScript. Δημιουργώ ιστοσελίδες που οι άνθρωποι θέλουν να χρησιμοποιήσουν, θέλουν να επισκεφθούν και ακόμη και να εθιστούν στη χρήση μόνο για να μάθουν, να αναδημιουργήσουν και να σκοτώσουν το χρόνο, και το σημαντικότερο, πωλούν λογισμικό. Εάν είχατε μια ιδέα για το πώς ακριβώς θέλετε να κοιτάξετε και να λειτουργήσετε έναν ιστότοπο, ήσασταν πρόθυμοι να με υποστηρίξετε, ώστε να μπορώ να ανταποκριθώ στις δικές μου ανάγκες ενώ θα συναντήσω τη δική σας και είστε πρόθυμοι να καλύψετε το κόστος της λειτουργίας ενός δικτυακού τόπου, θα σας δημιουργήσω το επόμενο YouTube, Tiktok, Twitter, Google ή ακόμα και μια εφαρμογή ασφαλείας υψηλής τεχνολογίας που μπορείτε να έχετε πρόσβαση. Αντί να προσπαθώ να σας πουλήσω το χρόνο μου, προσπαθώ να αγοράσω τη δική σας: Θέλω να σας μιλήσω για την οικοδόμηση μιας εφαρμογής (ιστοσελίδα) με τις πληροφορίες που υπάρχουν ήδη και να σας διδάξω τι πρέπει να είστε ανεξάρτητος προγραμματιστής λογισμικού, επιχειρηματίας, οδηγώντας μια επιτυχημένη καριέρα σε ό, τι επιθυμείτε. Και επιτρέψτε μου να είμαι σαφής, η εκπαίδευση που σας δίνω θα είναι άτυπη. Θα μπορούσατε να πάτε στο σχολείο και να μάθετε όλα αυτά με μια επίσημη εκπαίδευση ή ακόμα και να διαβάσετε αυτό το βιβλίο στο σχολείο, να ολοκληρώσετε τις εργασίες σας και να αφαιρέσετε πολλά από την εκπαίδευσή σας, αλλά δεν θα σας βάλω επίσημα στο καυτό κάθισμα και θα σας ζητήσω να ολοκληρώσετε τις εργασίες. Δεν είμαι ο καθηγητής σας, μπορείτε να με σκεφτείτε σαν έναν φίλο που θέλει να σας καθοδηγήσει προς μια καριέρα που οδηγείται από τη δική σας προσωπική επιτυχία. Και δεν σας πωλούν επιτυχία, θα πρέπει να το αγοράσετε με το χρόνο σας. Η μάθηση για τον κώδικα έχει μια απότομη καμπύλη μάθησης και ποτέ δεν ήταν εύκολη, ή ακόμα και υποτίθεται ότι είναι. Πρέπει να εργαστείτε τόσο σκληρά όσο μπορείτε και να συνεχίσετε να προσπαθείτε να αποτύχετε και να προσπαθήσετε ξανά ακόμα και όταν είστε απογοητευμένοι για να μάθετε και να δημιουργείτε εφαρμογές μόνοι σας. Αυτό έχει τη φύση του ίδιου του κώδικα. Ο κώδικας εκτελείται από έναν μεταγλωττιστή που έχει σχεδιαστεί για να δώσει τα μηνύματα σφάλματος προγραμματιστή και αυτά θα σας διδάξουν πώς να κωδικοποιήσετε, ακόμη και αν απλά αντιγράφετε το σφάλμα στη μηχανή αναζήτησης και διαβάζετε τα παραδείγματα άλλων ανθρώπων. Και πρέπει να πω, δεν χρειάζεται να είστε εξαιρετικά πλούσιοι, έξυπνοι, επιτυχημένοι ή ακόμα και λεπτομερείς προσανατολισμένοι ή οργανωμένοι για να δημιουργήσετε μια εφαρμογή. Ο υπολογιστής φροντίζει για αυτόν τον οργανισμό για εσάς. Απλά πρέπει να επιμείνετε μέσα από τη δοκιμή και το λάθος, να διατηρήσετε την εστίαση και να εργαστείτε σκληρά σε αυτό που κάνετε και θα έχετε μια πολύ επιτυχημένη καριέρα στο σύνολο του τι κάνετε.

Ποιος είμαι: Συνειδητοποιώ ότι το τελευταίο τμήμα ήταν περισσότερο για τη μάθηση και τη λήψη σας από αυτό το βιβλίο. Ποιος είμαι ακριβώς; Αυτή είναι μια περίπλοκη ερώτηση. Δεν είμαι ασαφής για αυτό τον εαυτό μου, καθώς υποφέρω από ιατρικές παθήσεις που μπορούν να δυσκολευτούν να κωδικοποιήσω ή να γράψω αυτό το βιβλίο κατά περιόδους, ενώ παρουσιάζω προκλήσεις με θέματα κοινωνικοποίησης και ταυτότητας που κάνουν τη ζωή μου πιο δύσκολη όταν πρόκειται να εισαγάγει τον εαυτό μου. Εν ολίγοις, αν διαβάζετε αυτό το βιβλίο, το έφερα στο σπίτι επειδή το γυρίσατε και νομίζατε ότι ήταν χρήσιμο ή ακόμα και αν διαβάζετε αυτό το μακρινό, σε σας είμαι σαν ένα άτομο που θέλει να σας δει να πετύχετε σε ό, τι κάνετε. Είμαι ο ίδιος μηχανικός, ένας προγραμματιστής λογισμικού και ένας φοιτητής και γράφω αυτό το βιβλίο για άλλους φοιτητές που θέλουν να κάνουν τη ζωή τους ευκολότερη με το να έχει ένα εγχειρίδιο του λογισμικού που χρειάζονται τη ζωή τους ευκολότερη δίνοντας παραδείγματα για να αντιγράψουν μαζί σαν ένα μεγάλο παζλ σε ένα λειτουργικό, μεγάλο, λειτουργικό, συνεκτικό και εμπνευσμένο app που μπορεί να οδηγήσει την επιτυχία ανεξάρτητα από τη γραμμή της επιχείρησης. Σε μεγάλο βαθμό, αυτό είναι που κάνω: Δημιουργώ εφαρμογές για να βοηθήσω τον εαυτό μου και άλλους ανθρώπους να πετύχουν. Είμαι επίσης συγγραφέας, αν και αυτή είναι η πρώτη μου δημοσίευση που σκοπεύω να ολοκληρώσω για να βάλω το χαρτοφυλάκιό μου μαζί σε ένα χρήσιμο έγγραφο και είμαι και καλλιτέχνης. Θα το παραδεχτώ αυτό, είμαι ένα παράξενο άτομο. Δεν είμαι τέλειος, είχα τρέξει τα Ins με το νόμο ακόμη και με οδηγεί να αφήσω κολέγια και πανεπιστήμια και να αφήσω τα κράτη για να προσπαθήσω να κάνω ένα όνομα για τον εαυτό μου με μεγαλύτερη επιτυχία. Είμαι γυναίκα από τη γέννηση, φορώ μακιγιάζ, τραβάω φωτογραφίες από τον εαυτό μου, φορούν φορέματα και άλλα γυναικεία ρούχα και μένω συνειδητοποιώντας τον εαυτό μου ως γυναίκα από τη φύση. Είχα προβλήματα με άλλους ανθρώπους στο παρελθόν που οδήγησαν σε αγώνες με το γράψιμο και την οικοδόμηση webapps, και ζητώ συγγνώμη ότι δεν ήμουν σε θέση να πάρω αυτό το βιβλίο στα χέρια σας νωρίτερα: χρειάζεστε αυτό. Θα θελήσετε να διαβάσετε και να γράψετε κώδικα που μοιάζει με το δικό μου και λειτουργεί όπως το δικό μου και κάνει το ίδιο πράγμα, αλλά ακόμα καλύτερα, γιατί αν μπορείτε να αντέξετε οικονομικά να αγοράσετε αυτό το βιβλίο αντί να πολοποιήσετε το πληκτρολόγιό σας, όπως κάνω μόνο για να δημιουργήσω ένα βιβλίο που ζητά χρήματα γι 'αυτό, έχετε τους πόρους που πρέπει να είστε επιτυχημένοι στη ζωή σας. Είχα όλα τα θέματα με την οικογένεια που μεγαλώνει, οι συνθήκες υγείας, οι γιατροί, τα μέσα μαζικής ενημέρωσης και ο νόμος και ο κώδικας μου αντικατοπτρίζει βαθιά τον αγώνα που είναι ο φεμινισμός και η γυναικεία φύση σε έναν διαιρεμένο και απογοητευμένο κόσμο. Ωστόσο, αυτό το βιβλίο είναι κάτι που με νοιάζει βαθιά, το μωρό μου, το χαρτοφυλάκιό μου και το βιοπορισμό μου, γι 'αυτό εκτιμώ την εκτίμησή σας όταν παίρνετε το κείμενο στο σπίτι και προσεκτικά πόρους πάνω του για να μάθετε από μένα. Λάβετε υπόψη ότι δεν είμαι τέλειος, αυτό το βιβλίο θα έχει λάθη, αναθεωρήσεις και νέες εκδόσεις και θα πρέπει να σκεφτείτε με τον λογικό σας εγκέφαλο όσο καλύτερα μπορείτε για να έχετε μια επιτυχημένη εμπειρία με το γράψιμό μου. Επίσης, καταλάβετε ότι εννοώ καλά για εσάς ακόμα και όταν αντιμετωπίζετε προκλήσεις κατά τη συγγραφή. Σκεφτείτε το ως εξής: Όταν μπορείτε απλά να νοικιάσετε ένα σύστημα υπολογιστή για να κάνετε οτιδήποτε μπορείτε να φανταστείτε στον ψηφιακό χώρο, να αποθηκεύσετε όλες τις πληροφορίες που συναντάτε, να αναλύσετε και να το οργανώσετε και να το καταλάβετε, θα αντιμετωπίσετε αναπόφευκτα δυσκολίες με τις πληροφορίες που καταναλώνετε και ακόμη και δημοσίευση. Σας το λέω αυτό γιατί συναντώ τις ίδιες δυσκολίες. Χρησιμοποιήστε αυτό το βιβλίο με δική σας ευθύνη, συνεργαστείτε με την κοινότητά σας και τις κοινότητές σας που είναι διαθέσιμες σε εσάς για να δημιουργήσετε λογισμικό μέσα σε ένα ασφαλές περιβάλλον και μην παίρνετε τα πράγματα προσωπικά όταν αποτυγχάνετε ή ακόμα και να πετύχετε με λάθος τρόπο: έτσι ώστε να φτάσω σε μια παγκόσμια κλίμακα και να σας φέρω αυτό το κείμενο και να σας βοηθήσω να πετύχω χωρίς να αποκλίνω από το μονοπάτι της τρέλας που με αφήνει να καταστρέψει, να σχιστεί και να φτιάξω, ενώ ταυτόχρονα αντιμετωπίζω τα συνηθισμένα προβλήματα σε μια παγκόσμια κλίμακα για να φτιάξω το παγκόσμιο κείμενο και να σας βοηθήσω να πετύχω το δίκτυο για να φτάσετε σε ένα μονοπάτι που με αφήνει να καταστραφεί, να σπρώξει και να φτιάξει το δίκτυο για το γεγονός ότι το Parlaintish Scale και το Fray Of Terny On To ProsureTness, Θα δουλέψουμε, το Διαδίκτυο. Μπορεί να μην είστε πολύ εξοικειωμένοι με το ποιος είμαι με λίγα λόγια, αλλά σας ενθαρρύνω να διαβάσετε, θα με γνωρίσετε καθώς συνεχίζετε να διαβάζετε και να με καταλαβαίνετε ενώ χτίζετε τα δικά σας έργα για να ολοκληρώσετε την εργασία σας. Δεν θα υπάρξει εργασία με αυτό το βιβλίο, εφόσον οι καθηγητές ή οι δάσκαλοί σας δεν σας αναθέτουν, αλλά σας ενθαρρύνω να δημιουργήσετε ένα χαρτοφυλάκιο έργων μόνοι σας όπως διαβάζετε, καθώς και ένα έργο Capstone που παρουσιάζει πώς μπορείτε να εφαρμόσετε αυτό που έχετε μάθει. Το έργο μου είναι η βάση για τα περισσότερα από αυτά που θα διαβάσετε σε αυτό το βιβλίο, καθώς ενσωματώνει κώδικα από τα προηγούμενα έργα μου, τον κωδικό που έχω δημιουργήσει και έμαθα να γράφω μεθοδικά με το χέρι και ένα ευρύ φάσμα ιδεών και συμβουλών που με βοήθησαν να πετύχω στο σημείο όπου μπορώ να γυρίσω μια απλή εφαρμογή που είναι πλήρως χαρακτηρισμένη και φαίνεται ότι μια δημοφιλής εφαρμογή που μπορείτε να δείτε τον φίλο σας ή την οικογένεια σας, στο Διαδίκτυο, να διαφημίσετε, να διαφημιστείτε ή να σας βοηθήσουν.

Τι είναι αυτό το βιβλίο: Αυτό το βιβλίο είναι ένα σεμινάριο με παράδειγμα. Μπορείτε να βρείτε κώδικα εδώ, οδηγίες για το πώς να μάθετε να κωδικοποιείτε, πληροφορίες σχετικά με τον κώδικα εντοπισμού σφαλμάτων και να διορθώσετε σφάλματα, να αντιμετωπίσετε τα βήματα, τις οδηγίες για το πώς να δημιουργήσετε αντίγραφα ασφαλείας και να αποθηκεύσετε τον κωδικό σας, να επαναπροσδιορίσετε και να παρουσιάσετε τον κωδικό σας, να εξασφαλίσετε τον κωδικό σας, να αναπτύξετε τον κωδικό σας, να δημιουργήσετε διαδραστικές ιστοσελίδες που διασκεδάζουν, εμπλέκουν και προσθέτουν την αίσθηση και την εικόνα σας, Λογισμικό που δημιουργείτε στο απόλυτο καλύτερο φως για να είναι το πιο ελκυστικό για τους τελικούς χρήστες σας, τους επισκέπτες του ιστότοπού σας. Σε αυτό το βιβλίο, θα επιδείξω μια σειρά παραδειγμάτων σχεδιασμού λογισμικού με έμφαση στον ιστό ως πλατφόρμα καθώς και την ασφάλεια. Θα ξεκινήσουμε την μαθησιακή εμπειρία δημιουργώντας ένα βασικό έργο χρησιμοποιώντας το κέλυφος UNIX, με χαρακτηριστικά αντιγράφων ασφαλείας και δέσμης ενεργειών. Στη συνέχεια, θα εξετάσουμε έναν βασικό ιστότοπο ιστολογίου, θα αναβαθμίσουμε το ιστολόγιό μας με δυνατότητες φωτογραφιών και βίντεο, καθώς και για να χρησιμοποιήσουμε αυτές τις λειτουργίες για να χρησιμοποιήσουμε λύσεις ασφαλείας χρησιμοποιώντας το ελεύθερο λογισμικό και να εξασφαλίσουμε τον διακομιστή μας χρησιμοποιώντας μια ενότητα ταυτότητας με pluggable (PAM). Στη συνέχεια, θα αναθεωρήσουμε τη διαχείριση και την επεξεργασία αρχείων, θα εξερευνήσουμε την επεξεργασία βίντεο, τη δωρεά φωνής, τη σάρωση γραμμωτού κώδικα και την αναγνώριση οπτικών χαρακτήρων, μεταξύ άλλων εννοιών. Κατά μήκος του δρόμου θα εξετάσουμε API που θα μας βοηθήσουν να κάνουμε το λογισμικό μας πιο χρήσιμο και ασφαλές, με δωρεάν και πληρωμένες επιλογές. Κατά μήκος του δρόμου, θα διερευνήσουμε τη φυσική ασφάλεια και τα μαχητικά εργαλεία, όπως το σχεδιασμό και τη δημιουργία πυρομαχικών και των πυρομαχικών, συμπεριλαμβανομένου του σχεδιασμού του βαρελιού και του επαναλήπτη, του σχεδιασμού του πυργίσκου και του drone και άλλων διευθυντών που θα ενσωματώσουμε με το λογισμικό μας στο υπάρχον δίκτυο προκειμένου να προστατεύσουμε το λογισμικό μας και να επιδείξουμε την αυτοάμυνα και την ανασκόπηση. Θα κάνουμε διαλείμματα κατά μήκος του δρόμου για να χτίσουμε παιχνίδια, 2D και 3D κινητήρες απόδοσης και να συνεργαστούμε με ενσωματωμένο υλικό σε παραδείγματα μελέτης περίπτωσης βασικού λογισμικού απόδοσης και ηλεκτρονικού δονητικού μασάζ που χυτεύεται σε καουτσούκ σιλικόνης αντίστοιχα. Στην πορεία, θα χρησιμοποιήσουμε επίσης λύσεις μηχανικής μάθησης που είναι ήδη διαθέσιμες για να εξασφαλίσουμε καλύτερα το λογισμικό μας. Θα χρησιμοποιήσουμε επίσης διαθέσιμα εργαλεία αποθεμάτων για τον Ιστό για να εξορθολογίσουμε και να εξασφαλίσουμε τη διαδικασία. Αυτό το βιβλίο είναι ένας οδηγός για την επιτυχία σας στην οικοδόμηση μιας εφαρμογής ιστού και την ενσωμάτωσή του με ένα επαγγελματικό δίκτυο υπολογιστή και ενσωματωμένα μηχανικά συστήματα και συνολικά έναν οδηγό για την οικοδόμηση λογισμικού και ενσωματωμένο υλικό χωρίς γνώση φόντου ή προηγούμενη εμπειρία.

Αυτό που δεν είναι αυτό το βιβλίο: Εάν θέλετε πραγματικά να έχετε έναν ιστότοπο, θα μπορούσατε απλά να δημιουργήσετε ένα απλό κατάστημα και να πουλήσετε ό, τι χρειάζεστε, να δημοσιεύσετε ένα blog, να δημοσιεύσετε φωτογραφίες ή βίντεο ή με άλλο τρόπο χωρίς να γράφετε ποτέ μία γραμμή κώδικα. Αυτό το βιβλίο δεν είναι αυτό. Αυτό το βιβλίο θα σας διδάξει πώς να δημιουργήσετε λογισμικό που είναι πιο χρήσιμο, πλήρως χαρακτηρισμένο, λειτουργικό και ασφαλές από οποιοδήποτε λογισμικό που μπορείτε ήδη να βρείτε, επειδή αναπτύσσει το τελευταίο λογισμικό που εξακολουθεί να είναι πρωτότυπα, μπορεί να είναι δαπανηρό να τρέχει σε κλίμακα ηλικιωμένες εταιρείες που λειτουργούν και δεν απευθύνονται προς τα πίσω, οι συγκλονισμένες εταιρείες που δημιουργούνται για να κερδίσουν χρήματα για άτομα που δεν κάνουν τίποτα. Εάν ακολουθήσετε προσεκτικά αυτό το βιβλίο, θα θελήσετε να γράψετε κώδικα, να ερευνήσετε τον κωδικό, να δημιουργήσετε τις δικές σας εφαρμογές και θα κερδίσετε χρήματα από αυτό που κάνετε. Θα κερδίσω χρήματα από αυτό το βιβλίο, ακόμη και σε πρώιμα στάδια, επειδή περιέχει πληροφορίες που χρειάζονται οι άνθρωποι και θέλουν να διαβάσουν και αγοράζουν ήδη όταν αγοράζουν ή χρησιμοποιούν τις εφαρμογές μου. Αυτό το βιβλίο δεν θα δημιουργήσει μια εφαρμογή για εσάς, αλλά θα σας δείξει προς τη σωστή κατεύθυνση και θα σας οπλίσει με τα εργαλεία που χρειάζεστε και τις δεξιότητες και τις συμβουλές που θα διευκολύνουν τη δική σας επιτυχία στην οικοδόμηση λογισμικού για το διαδίκτυο, με κάθε γραμμή κώδικα που θα πρέπει να γράψετε ως παράδειγμα, έτοιμοι να συναρμολογηθούν σε λογισμικό που εσείς και οι υποστηρικτές σας, οι επισκέπτες, οι πελάτες, οι φίλοι, οι οικογενειακοί, οι εργολάβοι και οι άνθρωποι των ανθρώπων και των ανθρώπων σας που θέλουν να χρησιμοποιήσετε και να υποστηρίξετε.

Τι θα μάθετε: Αυτό το βιβλίο θα σας διδάξει πώς να κατασκευάσετε και να πουλήσετε λογισμικό, πραγματικά λειτουργικό, χρήσιμο λογισμικό, εγγραφή μέσων, χαρακτηριστικά ασφαλείας, όπως αναγνώριση προσώπου, σάρωση γραμμωτού κώδικα ζώνης με αναγνώστη, επικοινωνία Web για να πιστοποιήσετε, να καταγράφετε και να κάνετε βίντεο και να ανταλλάξετε μηνύματα όπως η επικοινωνία Bluetooth και Near Field (NFC). Αυτό το βιβλίο θα σας διδάξει πώς να χρησιμοποιήσετε έναν δικτυωμένο υπολογιστή, εστιάζοντας στο Debian Linux, πώς να δημιουργήσετε κώδικα bash για να κάνετε την εγκατάσταση και την δημιουργία αντιγράφων ασφαλείας του λογισμικού σας ένα απρόσκοπτο, αυτοματοποιημένο αεράκι, πώς να δημιουργήσετε το Python Code ως backend για να εξυπηρετήσετε δυναμικά μηνύματα, στυλ τα πράγματα ωραία χρησιμοποιώντας τα στυλ CSS με τα μέσα bootstrap, επιτρέπουν τα logins χρήστη και την αλληλεπίδραση μέσω των δικτύων ή των άλλων ενδιάμεσων μέσων ενδιάμεσων μέσων. Σκοπός, σάρωση ID, μετριοπάθεια εικόνας και βίντεο, μικροδιαμεσολάβηση δεδομένων για να διατηρήσετε το λογισμικό σας ασφαλές, την επεξεργασία πληρωμών, τις συναλλαγές κρυπτογράφησης, τα ασύγχρονα καθήκοντα και πολλά άλλα. Θα μάθετε πώς να δημιουργείτε τις δικές σας συσκευές Bluetooth, με μπαταρίες, φορτιστές, μικροελεγκτές, κυκλώματα, κινητήρες και αισθητήρες, χρησιμοποιώντας συγκολλητικά, σύρματα και 3D τυπωμένα καθώς και χυτικά υλικά. Θα επιδείξω 3D διευθυντές σχεδιασμού που εφαρμόζονται στην παραγωγή και το εργαλείο προσθέτων και το εργαλείο και να πεθάνετε, οπότε είστε σε θέση να κατασκευάσετε τις δικές σας ενσωματωμένες συσκευές υλικού με ενσωματωμένες μπαταρίες, φορτιστές, ηλεκτρονικά κυκλώματα και λειτουργικές εξόδους. και να τα δίκτυα με Bluetooth και τον ιστό. Συγκεκριμένα, θα εξετάσουμε δύο μελέτες περιπτώσεων, ένα δονητικό μασάζ και ένα σπιτικό πυροβόλο όπλο, και οι δύο προγραμματισμένες στο OpenSCAD, το οποίο είναι διαθέσιμο ως γραφική διεπαφή ή βοηθητική γραμμή εντολών και μπορεί να ενσωματωθεί σε έναν ιστό για ταχύτερα αποτελέσματα. Θα μάθετε πώς να χτίζετε και να αναπτύξτε έναν ιστότοπο από το έδαφος χωρίς προηγούμενη εμπειρία, να το κάνετε λειτουργικό, ασφαλές, όμορφο, χρήσιμο και πιο σημαντικό πρακτικό. Θα μάθετε πώς να χρησιμοποιείτε την εκμάθηση μηχανών και το όραμα του υπολογιστή για να κάνετε έναν ιστότοπο ασφαλή και πιο πρακτική, να καταγράψετε βίντεο και ήχο από τον ιστότοπό σας, να δώσετε τη φωνή σας, να κάνετε μουσική και να διαμορφώσετε τον ήχο για να δημιουργήσετε χρήσιμα δείγματα και πώς να ξεπεράσετε το θόρυβο, αξιοποιώντας άλλους ιστότοπους για να δημιουργήσετε το καλύτερο δυνατό δίκτυο ιστότοπων που μπορείτε να συνδέσετε απευθείας με τη δική σας για να μοιραστείτε όλες τις χρήσιμες πληροφορίες που πρέπει να προσφέρετε και ακόμη και να δημιουργήσετε τα άτομα για να μεταφέρετε τα άτομα και τις επιχειρήσεις σας. Αυτό το βιβλίο θα επικεντρωθεί σε μεγάλο βαθμό στα μέσα μαζικής ενημέρωσης, την ασφάλεια και τη μηχανική μάθηση, τα οποία είναι τα κύρια τρία εξαρτήματα που θα σας βοηθήσουν να δημιουργήσετε χρήσιμο λογισμικό για τον ιστό, εμπλέκοντας τους σωστούς χρήστες και αποσυνδέοντας τα λανθασμένα με τρόπο που είναι ρεαλιστικό, πρακτικό, χέρια και εμπλοκή, ενώ ταυτόχρονα και αυτόματη και ανθεκτική. Αυτό το βιβλίο διδάσκει το Unix, συγκεκριμένα το Debian (Ubuntu), το Bash Shell, το Python, το HTML, το CSS, το JavaScript και μια σειρά χρήσιμων πακέτων λογισμικού για αιτήματα Python, καθώς και χρήσιμο λογισμικό bash όπως το GIT και το FFMPEG. Θα σας διδάξω επίσης πώς να ανταλλάξετε αυτόματα την κρυπτογράφηση και να λάβετε πληρωμές σε κρυπτογράφηση ή από τακτικές χρεωστικές κάρτες, ενώ θα πληρώσετε ακόμη και τους επισκέπτες σας ένα μερίδιο των εσόδων σας, αν επιλέξετε να το κάνετε. Θα σας διδάξω πώς να κερδίσετε χρήματα από τον ιστότοπό σας μέσω της διαφήμισης, πώς να προετοιμάσετε την εφαρμογή σας για μηχανές αναζήτησης και να το κάνετε γρήγορα, να κατατάσσεται στην πρώτη κατάταξη για ό, τι οι πελάτες σας θα αναζητήσουν για να σας βρουν και να κατατάσσονται σε όσο το δυνατόν περισσότερες κοινές αναζητήσεις. Θα σας διδάξω πώς να πουλήσετε το λογισμικό σας, να το διαφημίσετε, να απευθυνθώ σε πελάτες που αναζητούν τις υπηρεσίες σας και να κάνουν ένα όνομα για τον εαυτό σας στο διαδίκτυο μέσω λεωφόρων που ήδη υπάρχουν, είναι φθηνά και εργάζονται καλά. Θα σας διδάξω πώς να αποθηκεύσετε τα δεδομένα σας σε υπολογιστές cloud που λειτουργούν για εσάς και να αποθηκεύσετε τα δεδομένα σας φτηνά, πώς να σχεδιάσετε και να δημιουργήσετε έναν ιστότοπο που κάνει ό, τι θέλουν οι χρήστες σας και τι θέλετε και πώς να κρατάτε τους χρήστες σας να ασχοληθούν με το site σας μια βρύση στα τηλέφωνά τους με ειδοποιήσεις, μηνύματα ηλεκτρονικού ταχυδρομείου, μηνύματα κειμένου, τηλεφωνικές κλήσεις και περισσότερες εκτάσεις για να φέρουν τους χρήστες σας πίσω στην ιστοσελίδα σας στη διάθεσή σας πίσω από το κλικ ενός κουμπιού. Αυτό το βιβλίο θα επικεντρωθεί στην πρακτικότητα της δημοσίευσης και διανομής μέσων σε μεγάλα ποσά, από κείμενο σε φωτογραφίες σε βίντεο σε ήχο, κάνοντας μια καλή εντύπωση στους τελικούς χρήστες (πελατεία σας) και να πουλάτε τον εαυτό σας με οποιονδήποτε τρόπο που κάνετε για να δημιουργήσετε μια ιστοσελίδα, μια εφαρμογή που είναι αντιπροσωπευτική για εσάς και εσείς μόνο και σας κάνει το λογισμικό σας και την εταιρεία σας. Θα μάθετε επίσης μερικές συμβουλές και κόλπα από μένα, από συμβουλές κωδικοποίησης, πρακτική ματαιοδοξία όπως μακιγιάζ και φωτογραφία, μοντελοποίηση και δράση και πολλά άλλα, που θα είναι σημαντικά για την απεικόνιση του εαυτού σας και της εταιρείας σας στο καλύτερο δυνατό φως χρησιμοποιώντας όλα τα διαθέσιμα εργαλεία για εσάς, ενώ διανέμετε όσο το δυνατόν περισσότερο το περιεχόμενο που χρειάζεστε σε μια υγιή ισορροπία πλατφορμών για να φέρετε το λογισμικό σας για να καρφώσετε με όχι περισσότερη προσπάθεια ή χρήματα από ό, τι είναι απαραίτητο. Αυτό το βιβλίο ονομάζεται "ΠρακτικόΗ βαθιά μάθηση και η ασφάλεια που βασίζεται στο διαδίκτυο με παράδειγμα "Για έναν λόγο: ασχολείται με την εκμάθηση του κωδικού, ειδικά για τον ιστό, ειδικά με την εστίαση στην ασφάλεια, από πρακτική άποψη, με παραδείγματα κώδικα εργασίας που εξυπηρετεί την εικόνα και το βίντεο που θα σας περιγράφουν. Η λεζάνη της εικόνας και άλλα καθήκοντα όπως οι μετρήσεις πρόβλεψης που προέρχονται από εικόνες, όπως η φύση της εικόνας ως αυθεντική, η οποία μπορεί να το χρησιμοποιήσει. Μπορεί να δημιουργήσει έναν υπολογιστή διακομιστή αυτό το ασφαλές, έναν υπολογιστή που κανονικά θα σας ζητήσει ένα όνομα χρήστη και ένα κωδικό πρόσβασης και θα σας καταγράψει, ίσως με ένα διακριτικό επιβεβαίωσης για κάθε νέα σύνδεση ή νέα διεύθυνση IP, αλλά αν δημιουργείτε ευκολότερο να χρησιμοποιήσετε, να χρησιμοποιείτε το λογισμικό σας. Όποιος χτίζει λογισμικό που είναι άψογα ασφαλές έχει κάποια αίσθηση του τι υπονοεί αυτό. Το λογισμικό είναι εγγενώς ανασφαλής επειδή οι συσκευές και οι λογαριασμοί που χρησιμοποιούμε για την πρόσβαση σε αυτό δεν είναι πάντα στη διάθεσή μας, θα μπορούσαν να είναι στα χέρια οποιουδήποτε με κακή πρόθεση για το λογισμικό και επομένως ενδέχεται να θέσει σε κίνδυνο το ίδιο το λογισμικό. Αυτό είναι κάτι που επικεντρώνεται σε αυτό το βιβλίο. Ένας δικτυακός υπολογιστής είναι από προεπιλογή εξασφαλισμένη με ένα μακρύ κλειδί διακριτικό, ονομάζεται SSH ή ασφαλές κλειδί κελύφους και είναι κατά τα άλλα καλύτερα ασφαλισμένο με έναν διακομιστή ιστού, επειδή ο διακομιστής ιστού παρέχει την ανοικτή πρόσβαση καθώς και τα εργαλεία ασφαλείας της τεχνολογίας που εκτελούνται στον ίδιο τον διακομιστή. Ο διακομιστής ιστού έχει πρόσβαση στο πρόγραμμα περιήγησης ιστού του χρήστη, το οποίο είναι αναμφισβήτητα το πιο ισχυρό μέρος της συσκευής του χρήστη, επειδή είναι ο τόπος όπου ο χρήστης μπορεί να έχει πρόσβαση στο δίκτυο λογισμικού. Αυτό το εργαλείο μπορεί να κάνει κείμενο, τις ιστοσελίδες που βλέπετε και μπορεί επίσης να καταγράψει εικόνες, ήχο και βίντεο (όπως μια φωτογραφία ενός προσώπου ή ένα αναγνωριστικό κατάστασης), μπορεί να διαβάσει και να γράψει σε bluetooth ραδιοφωνικές συσκευές και μπορεί να διαβάσει και να γράψει σε ετικέτες με μοναδικό site που μπορούν να διαβάσουν και να είναι οι ετικέτες του WET, οι οποίες μπορούν να διαβάσουν και να γίνουν ο Web Site, οι οποίες μπορούν να διαβάσουν με το Web Site. Χρησιμοποιώντας όλα τα εργαλεία που έχετε στη διάθεσή σας, με αυτό το βιβλίο θα εξοπλίσετε τον εαυτό σας με τη γνώση για να δημιουργήσετε έναν ασφαλή ιστότοπο και συνολικά ένα ασφαλές δίκτυο υπολογιστών που λειτουργεί για εσάς, κάνει την προσφορά σας και φαίνεται και αισθάνεται

Πού να ξεκινήσετε: Είστε ευπρόσδεκτοι να παραλείψετε το τμήμα που ξεκινώ αυτό το βιβλίο με οποιοδήποτε τμήμα, στον ακριβή κώδικα που χρειάζεστε, ειδικά εάν έχετε εμπειρία με την κωδικοποίηση πριν ή κάποια από τα προαναφερθέντα εργαλεία που θα περιγράψω λεπτομερώς σε αυτό το βιβλίο καθώς και την τεκμηρίωση των περιπτώσεων χρήσης και των πρακτικών παραδειγμάτων αυτών. Εάν δεν έχετε εμπειρία γραπτώς, σας συνιστούμε να διαβάσετε όλο αυτό το βιβλίο και ειδικά συνιστούμε να διαβάσετε τα προηγούμενα τμήματα, για να βεβαιωθείτε ότι αυτό το βιβλίο είναι κατάλληλο για εσάς. Εάν αυτό το βιβλίο δεν είναι κατάλληλο για εσάς, σκεφτείτε να το δώσετε σε έναν φίλο ή έναν συγγενή που μπορεί να ενδιαφέρεται να μάθει για την ανάπτυξη του ιστού και ακόμη και να εξετάσει το δανεισμό του πίσω και μαθαίνοντας από αυτούς για να γεμίσει τα κενά όπου σας απέτυχα ως δάσκαλος ή άλλοι δάσκαλοι που έκαναν μπροστά μου. Ξεκινήστε όπου θέλετε, κάθε μέρος αυτού του βιβλίου θα είναι χρήσιμο εάν σκοπεύετε να δημιουργήσετε μια χρήσιμη εφαρμογή και θεωρήστε ότι οι καλύτερες εφαρμογές είναι κατασκευασμένες με τον τελικό χρήστη: Γνωρίστε τον πελάτη σας. Τώρα με ξέρετε, ξέρετε αυτό το βιβλίο και είστε έτοιμοι να ξεκινήσετε. Για να ξεκινήσετε, αρπάξτε έναν υπολογιστή (ακόμη και το φθηνότερο φορητό υπολογιστή από ένα κατάστημα κουτιού, το Amazon ή μια παλιά επιφάνεια εργασίας λειτουργεί και το ρυθμίστε με τρόπο που λειτουργεί για εσάς.

Πώς να διαβάσετε αυτό το βιβλίο: Το κείμενο επισημάνθηκε, υποδηλώνει ότι το κείμενο ανήκει σε μια γραμμή εντολών, όπου θα γράψετε τον κωδικό που εκτελείτε. Η γραμμή εντολών είναι έντονα επικεντρωμένη στο πληκτρολόγιο και απαιτεί ελάχιστα ή καθόλου κλικ, επιταχύνοντας τη ροή εργασίας σας και διευκολύνοντας τα πράγματα σε εσάς.

Ξεκινώντας: Ας βουτήξουμε μέσα. Θα ξεκινήσουμε με την οικοδόμηση κώδικα σε ένα τοπικό μηχάνημα και θα αρχίσουμε χωρίς να δημιουργήσουμε έναν ιστότοπο συνδεδεμένο στο Διαδίκτυο. Αυτό είναι ασφαλέστερο για να ξεκινήσετε, δεν κοστίζει τίποτα και είναι εύκολο για εσάς. Ανάλογα με το λειτουργικό σας σύστημα, η είσοδος σε ένα κέλυφος bash θα είναι λίγο διαφορετικό. Για το Mac OS, συνιστώ να εγκαταστήσετε μια εικονική μηχανή σε αυτό το σημείο, καθώς θα έχετε την μεγαλύτερη συμβατότητα με μια εικονική μηχανή. Διάφοροι πάροχοι όπως το VirtualBox και το Paralells μπορούν να εκτελούν μια εικονική μηχανή για εσάς, αν και είναι επίσης δυνατό να εγκαταστήσετε το Ubuntu απευθείας στο μηχάνημα, εάν προτιμάτε να χρησιμοποιήσετε ένα εγγενές περιβάλλον που συνιστάται για να δημιουργήσετε μια γρήγορη, εξορθολογισμένη εμπειρία. Εάν χρησιμοποιείτε το Linux ή τα Windows, τα οποία συνιστώ, θα πρέπει να είναι αρκετά εύκολο να δημιουργήσετε ένα έργο. Ανοίξτε το τερματικό σας, ρυθμίστε το μέγεθος όπως θεωρείτε κατάλληλο και ξεκινήστε μετά το βήμα 2. Εάν χρησιμοποιείτε Windows, ακολουθήστε το βήμα 1.

Βήμα 1: - Μόνο οι χρήστες των Windows Στα Windows, ανοίξτε τη γραμμή εντολών ως διαχειριστής και τύπος WSL -install

Βήμα 2: - Συνεχίστε εδώ ή παραλείψτε το βήμα 1 σε εδώ αν δεν χρησιμοποιείτε τα Windows Σε ένα ανοικτό τερματικό, (ανάλογα με το λειτουργικό σας σύστημα, που ονομάζεται Ubuntu στα Windows, Terminal σε Mac ή Linux, ή παρόμοιο όνομα), αρχίζει με τη δημιουργία ενός έργου. Το κάνουμε αυτό με την εντολή MKDIR, η οποία δημιουργεί έναν κατάλογο. Εάν πρέπει να δημιουργήσετε έναν κατάλογο για να αποθηκεύσετε το έργο σας, το οποίο συνιστάται, χρησιμοποιήστε την εντολή CD για να αλλάξετε στον κατάλογο και και

CD/PATH/TO/DIRECTORY - Η διαδρομή είναι οι φάκελοι (αρχεία) που προηγούνται του καταλόγου προορισμού σας, η προεπιλεγμένη διαδρομή σας είναι ~ ή/σπίτι/username (όπου το όνομα χρήστη είναι το όνομα χρήστη σας). Για να αλλάξετε στον προεπιλεγμένο κατάλογο, πληκτρολογήστε CD ή CD ~ Παράδειγμα MKDIR - Αντικαταστήστε το "Παράδειγμα" με το όνομα του καταλόγου

Τώρα έχετε έναν κατάλογο εργασίας για το έργο σας. Όντας όπως είναι τόσο σημαντικό να αποθηκευτεί αυτός ο κατάλογος σε περίπτωση που πρέπει να μεταβείτε σε διαφορετικό μηχάνημα ή να αναπτύξετε τον κωδικό που γράφετε, ώστε να είναι έτοιμο για τον ιστό, θα δημιουργήσουμε ένα σενάριο για να δημιουργήσουμε αντίγραφα ασφαλείας του καταλόγου σας στα επόμενα βήματα. Αλλά η οικοδόμηση ενός σεναρίου παίρνει λίγο κώδικα και ο κώδικας πρέπει να αυτοματοποιηθεί για να είναι όσο το δυνατόν πιο χρήσιμη. Ας φτιάξουμε λοιπόν ένα σενάριο για να δημιουργήσουμε σενάρια πρώτα. Ας ξεκινήσουμε δημιουργώντας το σενάριο και καθιστώντας το εκτελέσιμο. Θα χρησιμοποιήσουμε το sudo, το chmod και θα το αγγίξουμε και θα καλέσουμε το σενάριο "ascript".

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

Τώρα δημιουργήσαμε το σενάριο, το κάναμε εκτελέσιμο και είμαστε έτοιμοι να το επεξεργαστούμε. Το Nano είναι ένας επεξεργαστής κειμένου που θα σας επιτρέψει να επεξεργαστείτε κείμενο χωρίς να κάνετε κλικ, το οποίο είναι πολύ πιο εύκολο από τη χρήση γραφικού περιβάλλοντος χρήστη. Για να επεξεργαστείτε ένα αρχείο με το Nano, χρησιμοποιήστε το Nano και στη συνέχεια τη διαδρομή προς το αρχείο. Για να φτιάξετε ένα σενάριο που κάνει ένα σενάριο, είναι αρκετά παρόμοιο με το να φτιάξετε το σενάριό μας στην πρώτη θέση. Θα χρησιμοποιήσουμε τον ίδιο κωδικό όπως παραπάνω, αντικαθιστώντας το όνομα του σεναρίου, "Ascript" με παράμετρο επιχειρήματος, $ 1. Αυτό μας επιτρέπει να καλέσουμε το σενάριο πληκτρολογώντας απλά το Sudo Ascript Newscript, οπότε μπορούμε να δημιουργήσουμε οποιοδήποτε νέο σενάριο αντικαθιστώντας το "Newscript" με το όνομα του σεναρίου σας. Ο κώδικας στο Nano πρέπει να μοιάζει:

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

Και για να κλείσουμε το Nano, μπορούμε να κρατήσουμε το πλήκτρο ελέγχου και να πατήσετε το x, στη συνέχεια να δηλώσετε ότι αποθηκεύουμε το αρχείο και χτυπήσουμε την επιστροφή. Τώρα αντί να πληκτρολογήσουμε αυτές τις τρεις εντολές για να επεξεργαστούμε ένα σενάριο, θα μπορέσουμε να πληκτρολογήσουμε το Sudo Ascript για να επεξεργαστούμε ξανά το σενάριο. Αυτό λειτουργεί! Και κάθε νέο σενάριο μπορεί να τρέξει εύκολα καλώντας το στο κέλυφος. Ας αποθηκεύσουμε τη δουλειά μας τώρα: Ας γράψουμε ένα σενάριο αντιγράφων ασφαλείας για να αποθηκεύσουμε το νέο μας σενάριο και στη συνέχεια να το υποστηρίξουμε στον κατάλογο του έργου μας, ενώ παράλληλα δημιουργούμε αντίγραφα ασφαλείας του σεναρίου αντιγράφων ασφαλείας.

sudo ascript backup

Τώρα, στο Nano:

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

Where/Path/to/Directory είναι η διαδρομή προς το έργο που δημιουργήσατε με το MKDIR. Αργότερα θα μάθουμε πώς να αντιγράψουμε επαναλαμβανόμενες διαδρομές όπως αυτό με ένα βρόχο και μια λίστα, η οποία είναι λιγότερο κώδικα, αλλά για τώρα ας το κρατήσουμε απλό και να έχουμε μερικές γραμμές. Για να εκτελέσετε αυτό το σενάριο και να δημιουργήσετε αντίγραφα ασφαλείας του κώδικα σας, αποθηκεύστε το αρχείο στο Nano με έλεγχο+x, y και επιστροφή και πληκτρολογήστε το παρακάτω στο κέλυφος σας

backup

Εάν σας ζητηθεί καθόλου για έναν κωδικό πρόσβασης κατά την ανάγνωση αυτού του βιβλίου και ακολουθώντας το κέλυφος, εισαγάγετε σωστά τον κωδικό πρόσβασης χρήστη, θα έχετε τρεις προσπάθειες προτού χρειαστεί να εκτελέσετε ξανά την εντολή. Μπορείτε να χρησιμοποιήσετε τα βέλη πάνω και κάτω για να επαναλάβετε τις εντολές και να τις επεξεργαστείτε, αν χρειαστεί να εκτελέσετε οτιδήποτε δύο φορές. Απλά πατήστε προς τα πάνω και προς τα κάτω για να επιλέξετε μια εντολή, πριν επεξεργαστείτε την εντολή με τα δεξιά, αριστερά βέλη και διαγραφή κλειδιού καθώς και πληκτρολογίου, και εκτελήστε την με επιστροφή.

Συγχαρητήρια! Καταφέρατε να δημιουργήσετε ένα φοβερό σενάριο αντιγράφων ασφαλείας που υποστηρίζει δύο σημαντικά σενάρια κελύφους στον κατάλογο εργασίας σας. Μπορούμε να μετακινήσουμε τα πράγματα αργότερα καθώς το έργο μεγαλώνει, αλλά αυτό λειτουργεί για τώρα. Ας προχωρήσουμε στη δημιουργία αντιγράφων ασφαλείας στο σύννεφο, θα χρησιμοποιήσουμε το GitHub για αυτό (αν και υπάρχουν πολλές άλλες λύσεις GIT για αντίγραφα ασφαλείας, είναι όλα σχετικά με το ίδιο.) Το Git είναι ένα λογισμικό ελέγχου Verision που σας επιτρέπει να δημιουργήσετε αντίγραφα ασφαλείας στο λογισμικό σας καθώς τα κάνετε σε ένα διακομιστή, ενώ παράλληλα σας επιτρέπει να κατεβάσετε τα αντίγραφα του λογισμικού σας πίσω από έναν κωδικό πρόσβασης ή το κλειδί. Είναι καθοριστικό για την εξοικονόμηση του λογισμικού σας, ειδικά καθώς μεταναστεύουμε σε ασφαλείς περιπτώσεις Linux που μερικές φορές σπάνε όταν αποτυγχάνει μία μόνο γραμμή κώδικα, αφήνοντάς σας κλειδωμένο ενώ ο κωδικός σας ενδέχεται να μην δημιουργηθεί αντίγραφο ασφαλείας εάν δεν έχετε την ευκαιρία να το υποστηρίξετε αυτόματα, κάτι που θα καλύψουμε.

Εάν δεν χρησιμοποιείτε ήδη ένα εικονικό μηχάνημα Ubuntu σε αυτό το σημείο, συνιστούμε χρησιμοποιώντας μια εικονική μηχανή του Ubuntu σε αυτό το σημείο, επειδή θα διευκολύνει τη ζωή σας κατά την εγκατάσταση όλων των απαιτούμενων πακέτων για να δημιουργήσετε έναν ιστότοπο εργασίας και να προμηθευτείτε τις εργασίες βαθιάς μάθησης στον υπολογιστή σας. Θα μεταφέρουμε τον κώδικα σε έναν διακομιστή ιστού στο εγγύς μέλλον, αλλά θέλουμε να βεβαιωθούμε ότι υπάρχουν τουλάχιστον μερικά στρώματα ασφάλειας πίσω από τον διακομιστή ιστού μας που είναι ανθεκτικά στο phishing και χρησιμοποιούν μια σειρά πακέτων Linux για να το κάνουμε αυτό. Εάν εξακολουθείτε να θέλετε να χρησιμοποιήσετε το Mac OS, είστε ευπρόσδεκτοι να αναζητήσετε και να εγκαταστήσετε τα απαραίτητα πακέτα online, αλλά μπορεί να μην υπάρχουν εναλλακτικές λύσεις για κάθε πακέτο που θα καλύψει αυτό το βιβλίο ή σειρά.

Ας προσθέσουμε μερικές εντολές για να δεσμεύσουμε τη δουλειά μας με το σενάριο αντιγράφων ασφαλείας εκτελώντας την εντολή Sudo Ascript Backup.

# …

Για άλλη μια φορά, ελέγξτε το X για αποθήκευση.

Τώρα πρέπει να κάνουμε κάποια διαμόρφωση ενός χρόνου για αυτό το έργο. Επειδή σύντομα θα είναι ένα έργο GIT, δεν χρειάζεται να πληκτρολογούμε κάθε εντολή κάθε φορά που αναπτύσσουμε από ένα χώρο αποθήκευσης GIT, αλλά θα πάρουμε το κρέμονται από αυτό όταν γράφουμε τα σενάρια ανάπτυξης. Για να ξεκινήσετε, ας σιγουρευτούμε ότι βρισκόμαστε στον σωστό κατάλογο και αρχικοποιούμε το αποθετήριο Git και δημιουργούμε πλήκτρα SSH.

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

Αφού πληκτρολογήσουμε το SSH-Keygen, το νέο κλειδί θα πρέπει να αποθηκευτεί στο φάκελο στο σπίτι κάτω από ένα φάκελο που ονομάζεται .ssh. Ονομάζεται id_rsa.pub. Ας βρούμε αυτό το κλειδί και να το αντιγράψουμε. Για να το δείτε,

cd ~
cat .ssh/id_rsa.pub

Αντιγράψτε το κείμενο που επιστρέφεται από την τελευταία εντολή και δημιουργήστε έναν λογαριασμό με τον πάροχο GIT (ιδανικά GitHub), πριν προσθέσετε το κλειδί SSH στον λογαριασμό σας. Μόλις έχετε λογαριασμό, κάντε κλικ στο επάνω δεξί μενού και εισαγάγετε τις ρυθμίσεις, πριν προσθέσετε το πλήκτρο SSH σε πλήκτρα SSH και GPG υπό πρόσβαση στο μενού. Επιλέξτε Προσθέστε ένα κλειδί SSH και προσθέστε το δικό σας, επικολλώντας το και δίνοντάς του έναν τίτλο, πριν από την αποθήκευση και την επιστροφή στο GitHub για να δημιουργήσετε ένα νέο αποθετήριο. Αυτό είναι παρόμοιο για άλλους παρόχους GIT, θα πρέπει να διαβάσετε την τεκμηρίωσή τους. Στη νέα διαμόρφωση αποθετηρίου, δώστε στο αποθετήριο σας ένα περιγραφικό όνομα και αποφασίστε αν θέλετε να το δημοσιεύσετε και φροντίστε να ρυθμίσετε ακόμα να μην συμπληρώσετε αρχεία για συμπερίληψη. Μόλις δημιουργηθεί το αποθετήριο, αντιγράψτε τον κλώνο με URL SSH και επικολλήστε το στην ακόλουθη εντολή.

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

Τώρα μπορείτε να επιστρέψετε στο αποθετήριο σας με το CD, θα είστε εξοικειωμένοι με αυτό. Δοκιμάστε το σενάριο αντιγράφων ασφαλείας τώρα με αντίγραφο ασφαλείας

Μεγάλος! Τώρα μπορούμε πραγματικά να πάρουμε κωδικοποίηση. Ας εγκαταστήσουμε τώρα το Django που έχουμε μια καλή αντίληψη για το bash και το git. Το Django θα μας επιτρέψει αυτόματα να δημιουργήσουμε αντίγραφα ασφαλείας του λογισμικού μας, το Bash μπορεί να το κάνει αυτό, αλλά ο Django θα πρέπει να έχει μια απλούστερη ασφαλέστερη εφαρμογή (μπορεί να απενεργοποιηθεί και να διαμορφωθεί πιο εύκολα).

Για να εγκαταστήσετε το λογισμικό στο Ubuntu, θα χρησιμοποιήσουμε την εντολή sudo apt-get. Πρώτον, ας ενημερώσουμε και να αναβαθμίσουμε το λογισμικό που είχαμε ήδη. Αυτό μπορεί να γίνει με την ενημέρωση Sudo Apt-Get και την αναβάθμιση Sudo Apt-Get -y. Στη συνέχεια, ας εγκαταστήσουμε το Python και το εικονικό μας περιβάλλον, το σπίτι του κώδικα μας, με την ακόλουθη εντολή: sudo apt-get εγκαθιστά python-is-python3 python3-venv

Αυτό είναι το μόνο που χρειάζεστε για να προχωρήσετε με το Django όσον αφορά τις εγκαταστάσεις λογισμικού στην παρουσία του Ubuntu. Για τα Windows και Linux αυτό θα πρέπει να είναι αρκετά απλό, αλλά για το Mac μπορεί να θέλετε να εγκαταστήσετε ένα εικονικό μηχάνημα και το Linux σε αυτό χρησιμοποιώντας ένα δωρεάν ή πληρωμένο εικονικό περιβάλλον όπως το VirtualBox ή το Paralells Desktop και να αναδημιουργήσετε τα παραπάνω βήματα για να ρυθμίσετε ένα περιβάλλον Ubuntu. Το Ubuntu είναι κρίσιμο σε αυτή την περίπτωση, επειδή είναι το λογισμικό που εκτελούνται οι ιστότοποι και τους επιτρέπει να φιλοξενούν ιστότοπους με όλο το προαναφερθέν λογισμικό.

Ας σκάψουμε στο Django.

Στον κατάλογό μας ξανά, με CD:

python -m venv venv # Δημιουργεί το εικονικό περιβάλλον όπου αποθηκεύεται ο κώδικας
source venv/bin/activate # Ενεργοποιεί το εικονικό περιβάλλον
django-admin startproject mysite . # Όπου το MySite είναι το έργο που ξεκινώ στον τρέχοντα κατάλογό μου.

Το Django μόλις ξεκινά, επειδή ο Django φιλοξενεί τον διακομιστή ιστού και κάνει ό, τι χρειαζόμαστε για να αποκτήσουμε έναν βασικό τοπικό ιστότοπο. Τώρα που έχουμε εγκαταστήσει το Django, ας επεξεργαστούμε τις ρυθμίσεις λίγο για να λειτουργήσουμε πώς χρειαζόμαστε. Πρώτον, ας δημιουργήσουμε μια νέα εφαρμογή

python manage.py startapp feed

Θα παρατηρήσετε ότι η πρώτη εφαρμογή ονομάζεται Feed. Η εφαρμογή θα πρέπει να ονομάζεται ό, τι θέλετε και θα δημιουργήσουμε νέες εφαρμογές, αλλά το όνομα κάθε εφαρμογής πρέπει να είναι συνεπές κάθε φορά που αναφέρεται η εφαρμογή στον κώδικα. Για να προσθέσουμε μια νέα εφαρμογή, θα επεξεργαστούμε πάντα το settings.py στον άλλο κατάλογο που δημιουργήθηκε η εφαρμογή, που ονομάζεται στο StartProject, στη συνέχεια στην εφαρμογή. Χρησιμοποιώντας νανο,

nano app/settings.py

Στις ρυθμίσεις, βρείτε εγκατεστημένα_APPS και διαχωρίσετε τις [] σε 3 γραμμές. Χρησιμοποιώντας τέσσερις χώρους στην κενή κεντρική γραμμή, προσθέστε «τροφοδοσία» ή το όνομα της εφαρμογής σας. Αυτό το τμήμα του ρυθμίσεων.py πρέπει να μοιάζει:

INSTALLED_APPS = [
    'feed',
]

Πριν ξεχάσουμε, ας δοκιμάσουμε ότι ο Django λειτουργεί. Χρησιμοποιώντας την εντολή python manage.py runserver 0.0.0.0:8000, μπορούμε να εκτελέσουμε το διακομιστή και στη συνέχεια να περιηγηθούμε σε ένα πρόγραμμα περιήγησης ιστού στον υπολογιστή που εκτελεί τον κωδικό στο http: // localhost: 8000 και να δείτε μια ιστοσελίδα (λειτουργεί!)

Τώρα, ας ανακαλύψουμε κάποιο κώδικα Python. Το Django διαθέτει τρία βασικά στοιχεία, όλα αυτά που διευθύνονται από τον κώδικα εξ ολοκλήρου. Τα εξαρτήματα ονομάζονται μοντέλο, προβολή και πρότυπο και το καθένα βρίσκεται σε υψηλότερο και χαμηλότερο επίπεδο αντίστοιχα πριν από την παραδοχή της ιστοσελίδας στον χρήστη.

Το μοντέλο είναι ο κώδικας που αποθηκεύει πληροφορίες στη βάση δεδομένων για ανάκτηση, ταξινόμηση και απόδοση.

Η προβολή αποφασίζει πώς το μοντέλο αποδίδεται, χειραγωγείται και τροποποιηθεί, σχεδόν κάθε άποψη θα χρησιμοποιήσει ένα μοντέλο απευθείας.

Το πρότυπο είναι ο κώδικας HTML με μερικές επιπλέον καμπάνες και σφυρίχτρες που ονομάζονται γλώσσα προτύπου. Το πρότυπο αποδίδεται από την άποψη όπου είναι γεμάτη με κώδικα Python και πλαίσιο, όπως μοντέλα και πληροφορίες (συμβολοσειρές και ακέραιοι ακέραιοι) από την άποψη.

Το Django έχει και άλλα εξαρτήματα, συμπεριλαμβανομένων, ενδεικτικά,

Ρυθμίσεις, οι οποίες ρυθμίζουν την εφαρμογή όπως συζητήσαμε.

Οι διευθύνσεις URL, που είναι μοτίβα που ακολουθεί ο χρήστης για να αποκτήσει πρόσβαση σε συγκεκριμένα τμήματα της εφαρμογής ιστού.

Τα έντυπα, τα οποία καθορίζουν τον τρόπο με τον οποίο μεταφέρονται και μεταφέρονται πληροφορίες στον διακομιστή και αποδίδονται στη βάση δεδομένων καθώς και στον χρήστη. Αυτά είναι τα θεμέλια των πληροφοριών επεξεργασίας από την πλευρά του διακομιστή και μπορούν να δεχτούν οποιοδήποτε τύπο πληροφοριών που τα καταστήματα υπολογιστών, κυρίως συμβολοσειρές κειμένου, αριθμούς και αληθινά/ψεύτικα booleans (συνήθως πλαίσια ελέγχου).

Τα πρότυπα, τα οποία είναι ο κώδικας HTML και η γλώσσα του προτύπου και γεφυρώνουν το χάσμα μεταξύ Python και HTML, που σημαίνει ότι οι πληροφορίες Python μπορούν να λειτουργήσουν ως κώδικας HTML που μπορεί να έχει πρόσβαση σε οποιονδήποτε και μπορεί να εξασφαλίσει έναν ιστότοπο με περιορισμένη πρόσβαση, ενώ παράλληλα καθιστά τον κώδικα Python προσβάσιμο στον ιστό και χρήσιμο για μια ποικιλία από σκοπούς σε μια απομακρυσμένη συσκευή που δεν χρειάζεται να βρίσκεται κοντά στον διακομιστή.

Τα στατικά αρχεία, τα οποία είναι συνήθως JavaScript και είναι βιβλιοθήκες που εξυπηρετεί ο διακομιστής και συνδέονται με το πρότυπο.

Αρχεία πολυμέσων, τα οποία ο διακομιστής εξυπηρετεί ή φιλοξενείται εξωτερικά, ή μόλις γραμμένο στο διακομιστή πριν υποβληθεί σε επεξεργασία και τοποθετημένη σε άλλο διακομιστή (κουβά) για φιλοξενία.

Middleware, το οποίο είναι κομμάτια κώδικα που εκτελούνται ταυτόχρονα με κάθε άποψη και θεωρούνται "περιλαμβάνονται" στην άποψη.

Επεξεργαστές περιβάλλοντος, οι οποίοι επεξεργάζονται το πλαίσιο κάθε προβολής και χρησιμοποιούνται για να προσθέσουν επιπλέον πλαίσιο.

Δοκιμές, οι οποίες επικυρώνουν ότι ο χρήστης ή το αίτημα μεταδίδει ορισμένες απαιτήσεις πριν από την απόδοση της προβολής.

Οι καταναλωτές, οι οποίοι υπαγορεύουν τον τρόπο με τον οποίο χειρίζονται οι websockets και ανταποκρίνονται στην επικοινωνία.

Ο διαχειριστής, ο οποίος χρησιμοποιείται για την εγγραφή μοντέλων, ώστε να μπορεί να χειριστεί λεπτομερώς στη σελίδα διαχειριστή Django, όπου η βάση δεδομένων μπορεί να χορηγηθεί μέσω γραφικής διεπαφής.

Το σέλινο, το οποίο καθορίζει τις ασύγχρονες εργασίες του κώδικα Django, μπορούν να αρχίσουν να τρέχουν πριν προχωρήσουν αμέσως στην επόμενη εργασία ή γραμμή κώδικα.

Το Django μπορεί να έχει πολλά άλλα στοιχεία, τα οποία θα συζητήσουμε λεπτομερώς εδώ. Υπάρχουν πολλοί τρόποι για να γίνει το Django πιο λειτουργικό, προσθέτοντας websockets, τα οποία είναι γρήγορα, εξορθολογισμένα κανάλια επικοινωνίας, σέλινο, τα οποία εκτελούν ασύγχρονες εργασίες και πλήθος άλλων τεμαχίων λογισμικού για την επέκταση του Django, ειδικά στις λειτουργίες προβολής, όπου εκτελείται το μεγαλύτερο μέρος του κώδικα. Οι λειτουργίες προβολής είναι κλειδί επειδή συνήθως δηλώνουν κάθε κομμάτι κώδικα που είναι ειδικό για ένα συγκεκριμένο πρότυπο URL ή ένα τμήμα του διακομιστή.

Πρώτον, ας εξερευνήσουμε τις λειτουργίες προβολής. Οι λειτουργίες προβολής ξεκινούν με τις εισαγωγές που υποδηλώνουν κώδικα που θα χρησιμοποιηθεί στην προβολή και ορίζονται χρησιμοποιώντας τακτικούς ορισμούς ή κλάσεις λειτουργιών. Οι απλούστερες προβολές καθορίζονται από τον ορισμό της λειτουργίας DEF και επιστρέφουν ένα HTTPRESPOSSE με ένα βασικό πρότυπο. Ας ξεκινήσουμε καθορίζοντας μια βασική προβολή για να επιστρέψουμε το κείμενο "Hello World". Θυμηθείτε ότι κάθε φορά που προσθέτετε κώδικα μετά από μια δήλωση όπως def, αν, ενώ, για, κλπ, θα πρέπει να προσθέσετε 4 χώρους για καθέναν από τους προηγμένους ορισμούς που θέλετε να υποβάλετε αίτηση για τη λειτουργία σας. Θα εισέλθουμε σε ό, τι σύντομα σημαίνει.

Από τον κατάλογο του ιστότοπού μας, επεξεργαστείτε το αρχείο feed/views.py χρησιμοποιώντας το Nano και προσθέστε τις ακόλουθες γραμμές στο τέλος του αρχείου.

from django.http import HttpResponse

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

Το Httpresponse του Django αποκρίνεται με μια συμβολοσειρά κειμένου, που σημειώνεται με το άνοιγμα και το κλείσιμο ». Κάθε φορά που μεταβιβάζετε πληροφορίες σε μια λειτουργία ή μια κλάση, όπως το αίτημα ή μια συμβολοσειρά, θα χρειαστεί να χρησιμοποιήσετε παρένθεση (, άνοιγμα και κλείσιμο).

Αυτό δεν είναι το μόνο που πρέπει να δούμε ακόμα την άποψή μας. Φυσικά, δεν έχουμε πει στον διακομιστή όπου η προβολή είναι ακριβώς, πρέπει ακόμα να ορίσουμε μια διαδρομή με την οποία πρέπει να κάνει η προβολή. Ας ξεκινήσουμε καθορίζοντας μια βασική διαδρομή στο App/URLS.PY, και θα μπει σε ομάδες μονοπατιών αργότερα.

Στο App/URLS.PY, προσθέστε μια γραμμή μετά τις δηλώσεις εισαγωγής μετά την εισαγωγή της προβολής που μόλις δημιουργήσαμε.

from feed import views as feed_views

Τώρα, ας καθορίσουμε το μοτίβο προβολής. Τα μοτίβα προβολής έχουν τρία εξαρτήματα, το στοιχείο διαδρομής, το οποίο αναφέρει τον διακομιστή όπου υπάρχει η προβολή μέσα στο διακομιστή (η διαδρομή URL που ο χρήστης πληκτρολογεί στη γραμμή πλοήγησης για να εισέλθει στην ιστοσελίδα), το στοιχείο προβολής όπου η προβολή καθορίζεται και ένα φιλικό όνομα για την προβολή, ώστε να είναι εύκολο να ανακτήσετε το πρότυπο του όταν εργάζεστε με ένα πρότυπο, ειδικά έτσι ώστε να είναι το όνομα και να ενημερωθεί αν είναι απαραίτητο για να κάνει το διάστημα για ένα άλλο προτύπου, Είναι λογικό να κάνετε τα πράγματα με αυτόν τον τρόπο και να είστε ευέλικτοι, επειδή ο κώδικας σας θα είναι ένα συνεχώς μεταβαλλόμενο περιβάλλον που χρειάζεται ευελιξία και αυτοσχεδιασμό για να είναι πολύτιμος και εύκολος στην εργασία. Εδώ είναι η άποψή σας, μπορείτε να προσθέσετε αυτό στο urlpatterns = [Τμήμα app/urls.py. Το πρότυπο προβολής ορίζεται με τα τρία συστατικά που περιγράφηκαν παραπάνω και μια συνάρτηση που ονομάζεται διαδρομή. Τα μοτίβα URL σας είναι μια λίστα, οπότε φροντίστε να τελειώσετε πάντα κάθε στοιχείο σε αυτά με ένα κόμμα, επειδή αυτό χωρίζει το καθένα. Κάθε στοιχείο θα πρέπει επίσης να προχωρήσει σε μια νέα γραμμή, για άλλη μια φορά με τέσσερις χώρους πριν από αυτό, όπως και η εφαρμογή στο settings.py. Θα ορίσουμε το πρώτο στοιχείο της προβολής με μια κενή λειτουργία συμβολοσειράς, προκειμένου να δημιουργηθεί μια προβολή που εκτελείται στον ριζικό κατάλογο του διακομιστή ιστού. Οι urls.py σας πρέπει τώρα να μοιάζουν με αυτό:

from feed import views as feed_views

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

Αυτή είναι η βάση για τη δημιουργία ενός ιστότοπου με το Django που είναι εντελώς στατικό. Προκειμένου να δημιουργήσουμε έναν πιο δυναμικό ιστότοπο όπου μπορούμε να ξεκινήσουμε τις πληροφορίες προσωρινής αποθήκευσης, όπως εικόνες, βίντεο, ήχο και πολλά άλλα, θα χρειαστεί να χρησιμοποιήσουμε μοντέλα, τα οποία θα εξερευνήσουμε στη συνέχεια. Προς το παρόν, ας ελέγξουμε τον κωδικό μας και να εκτελέσουμε το διακομιστή. Για να ελέγξετε τον κωδικό για σφάλματα, εκτελέστε:

python manage.py check

Εάν υπάρχουν μηνύματα σφάλματος, θα πρέπει να ελέγξετε προσεκτικά τις αλλαγές που κάνατε στην εφαρμογή σας και να δείτε αν υπάρχει κάτι που πρέπει να διορθωθεί, όπως ένας ξένος ή στερείται χώρου, ένας επιπλέον χαρακτήρας, μια μη συνηθισμένη συμβολοσειρά, οποιοδήποτε τυπογραφικό λάθος, τυχόν τυχαία διαγραμμένος χαρακτήρας ή οτιδήποτε άλλο. Ανάγνωση μέσω του μηνύματος σφάλματος (αν έχετε ένα), θα πρέπει να μπορείτε να δείτε τη διαδρομή προς ένα αρχείο που δημιουργήσατε ή επεξεργαστείτε μαζί με έναν αριθμό γραμμής, οπότε κοιτάξτε σε αυτό το αρχείο και γραμμή και δείτε αν μπορείτε να διορθώσετε οτιδήποτε υπάρχει. Εάν έχετε διορθώσει το πρόβλημα, εκτελέστε ξανά την παραπάνω εντολή. Όταν το λογισμικό σας είναι έτοιμο να εκτελεστεί και λειτουργεί, θα δείτε την έξοδο "Ο έλεγχος του συστήματος δεν προσδιορίζεται προβλήματα". Τώρα είστε έτοιμοι να πάτε. Εκτελέστε τον διακομιστή με:

python manage.py runserver 0.0.0.0:8000

Τώρα ανοίξτε ένα πρόγραμμα περιήγησης ιστού και μεταβείτε στο http: // localhost: 8000. Θα πρέπει να δείτε το κείμενο που επιστρέφεται στην παρένθεση και τα αποσπάσματα της συνάρτησης httpresponse κατά την άποψή σας. Αυτό είναι μόνο ένα βασικό παράδειγμα, αλλά αν το καταφέρατε μέχρι τώρα, καταλαβαίνετε τα βασικά στοιχεία για το πώς το Linux, Bash, Python και το Django. Ας σκάψουμε βαθύτερα σε κάποια μοντελοποίηση βάσεων δεδομένων και να εξερευνήσουμε τη δύναμη μιας κλάσης Python στην αποθήκευση πληροφοριών. Στη συνέχεια, θα αρχίσουμε να παίρνουμε μια λαβή στο HTML και CSS προτού να κάνουμε τον ιστότοπό μας πλήρως χαρακτηρισμένο, ευέλικτο και ασφαλές χρησιμοποιώντας JavaScript και μηχανική μάθηση.

Οι κλάσεις αποθηκεύονται στα μοντέλα.py της εφαρμογής σας. Χρησιμοποιώντας το Nano, Επεξεργασία app/models.py και προσθέστε μια νέα κλάση. Μια κλάση ορίζεται με τον ορισμό της κλάσης και περνάει ένα superclass που κληρονομεί από, σε αυτή την περίπτωση models.model. Το όνομα της κλάσης έρχεται μετά τον ορισμό της κλάσης και μετά τον ορισμό της κλάσης Α: (COLL) χρησιμοποιείται, πριν οι ορισμοί των χαρακτηριστικών και των λειτουργιών που συνδέονται με την κλάση υποδηλώνονται παρακάτω. Η τάξη μας χρειάζεται ένα αναγνωριστικό που μπορούμε να χρησιμοποιήσουμε για να την ανακτήσουμε και να το διατηρήσουμε μοναδικό και χρειάζεται επίσης ένα πεδίο κειμένου για την αποθήκευση κάποιων πληροφοριών. Αργότερα μπορούμε να προσθέσουμε μια χρονική σήμανση, αρχεία, booleans (αληθινά ή ψευδείς ορισμούς που μπορούν να βοηθήσουν τον κώδικα μας να λάβει αποφάσεις σχετικά με το τι πρέπει να κάνει με το μοντέλο και μπορεί να χρησιμοποιηθεί για να το ταξινομήσει), μια παρουσία να συνδέσει το μοντέλο με έναν χρήστη που έχει συνδεθεί στον διακομιστή και πολλά άλλα. Ας αποσυμπιέσουμε τον παρακάτω κωδικό:

from django.db import models # Η εισαγωγή που χρησιμοποιείται για τον καθορισμό της τάξης μας και των χαρακτηριστικών της
class Post(models.Model): # Ο ορισμός της ίδιας της τάξης μας
    id = models.AutoField(primary_key=True) # Το αναγνωριστικό του μοντέλου μας, ένα πλήκτρο που δημιουργείται αυτόματα που θα μας επιτρέψει να ζητήσουμε το μοντέλο, να το κρατήσουμε μοναδικό και είναι χρήσιμο όταν πρέπει να αλληλεπιδράσουμε με το μοντέλο μόλις δημιουργηθεί.
    text = models.TextField(default='') # Το χαρακτηριστικό τα καταστήματα της κλάσης μας, σε αυτή την περίπτωση, κάποιο κείμενο, προεπιλογή σε μια κενή συμβολοσειρά.

Κλείστε και αποθηκεύστε το αρχείο όπως κάναμε πριν για να τελειώσετε.

Υπάρχουν πολλά άλλα πεδία και επιλογές που θα εξερευνήσουμε όταν ενημερώνουμε αυτήν την κλάση καθώς η εφαρμογή μας εξελίσσεται, αλλά αυτό είναι οι βασικές ανάγκες δημιουργίας μιας εφαρμογής για την ανάρτηση κάποιου κειμένου. Ωστόσο, αυτό το μοντέλο δεν θα λειτουργήσει μόνο του. Όπως περιγράφηκε προηγουμένως, θα χρειαστούμε μια προσαρμοσμένη προβολή και προσαρμοσμένο μοτίβο διεύθυνσης URL για να κάνουμε αυτό το μοντέλο εργασίας και θα χρειαστούμε επίσης μια φόρμα μαζί με ένα πρότυπο. Ας εξερευνήσουμε πρώτα τη φόρμα.

Για να ορίσετε μια φόρμα, επεξεργαστείτε το App/Forms.py με το Nano και προσθέστε τις ακόλουθες γραμμές. Θα χρειαστούμε δύο εισαγωγές, την τάξη των μορφών μας, καθώς και το μοντέλο που δημιουργήσαμε (feed.models.post), έναν ορισμό κλάσης παρόμοιο με το μοντέλο και ένα πεδίο μαζί με μια υποκατηγορία που ονομάζεται meta που θα καθορίσει το μοντέλο που αλληλεπιδρά με το μοντέλο. Η φόρμα μπορεί επίσης να έχει μια συνάρτηση αρχικοποίησης που να την θέτει με βάση τις πληροφορίες στο αίτημα, το μοντέλο ή με άλλο τρόπο, θα το διερευνήσουμε αργότερα.

Οι μορφές μοντέλων είναι τόσο χρήσιμες επειδή μπορούν να δημιουργήσουν ένα μοντέλο ή επίσης να επεξεργαστούν ένα μοντέλο, οπότε θα τα χρησιμοποιήσουμε και για τα δύο. Ας ορίσουμε ένα σε μορφές.py παρακάτω.

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

Αυτά είναι τα βασικά της μορφής και του μοντέλου. Αυτή η φόρμα μοντέλου μπορεί να χρησιμοποιηθεί για να δημιουργήσει ή να επεξεργαστεί μια ανάρτηση, αλλάζοντας το κείμενο που περιέχει. Θα εξετάσουμε την ενσωμάτωση αυτής της φόρμας σε μια θέα στη συνέχεια. Πρώτον, ας κάνουμε τις μεταναστεύσεις και να μεταναστεύσουμε τη βάση δεδομένων, ώστε ο κώδικας μας να μπορεί να αλληλεπιδράσει με το μοντέλο όταν τρέχει. Για να το κάνετε αυτό, εκτελέστε τις ακόλουθες εντολές:

python manage.py makemigrations
python manage.py migrate

Αυτό θα διαρκέσει ένα λεπτό για να εκτελεστεί, αλλά μόλις το κάνει, θα σας επιτρέψει να αποκτήσετε πρόσβαση στο μοντέλο στις προβολές, στο middleware ή οπουδήποτε αλλού στο λογισμικό. Ας συνεχίσουμε κάνοντας μια άποψη όπου μπορούμε να δούμε το μοντέλο μας. Επεξεργασία feed/views.py και προσθέστε τον ακόλουθο κωδικό, όπως σημειώθηκε. Δεν θα χρειαστεί να προσθέσετε τίποτα μετά το σημάδι #, αυτός ο κώδικας είναι σχόλια που χρησιμοποιούνται για να δηλώσουν πληροφορίες σχετικά με τον κώδικα. Θα ξεκινήσουμε εισάγοντας το μοντέλο μας στις απόψεις και προσθέτοντας το σε ένα πλαίσιο όπου μπορούμε να το καταστήσουμε σε ένα πρότυπο ως λίστα για την προβολή. Στη συνέχεια, θα προσθέσουμε ένα πρότυπο όπου μπορούμε να καταστήσουμε τη φόρμα και το μοντέλο με ένα κουμπί για να δημιουργήσουμε ένα νέο αντικείμενο με βάση το μοντέλο και να το δημοσιεύσουμε στο διακομιστή. Αυτό ακούγεται περίπλοκο, οπότε ας το πάρουμε βήμα προς βήμα. Πριν τελειώσουμε την θέα, ας δημιουργήσουμε ένα πρότυπο που απλώς καθιστά το μοντέλο και βεβαιωθείτε ότι μπορούμε να το δούμε δημιουργώντας μια νέα θέση στο κέλυφος. Δείτε πώς πρέπει να φανεί αυτή η άποψη:

    posts = Post.objects.all() # Αναζητήστε όλες τις δημοσιεύσεις στη βάση δεδομένων μέχρι στιγμής

Όλα αυτά φαίνονται αρκετά απλά μέχρι να φτάσουμε στο κάτω μέρος. Το Render, η τιμή που επιστρέφεται από τη συνάρτηση αντί της απόκρισης HTTP όπως το προηγούμενο παράδειγμα, παίρνει πάντα ένα αίτημα ως την πρώτη εισροή της, δέχεται ένα πλαίσιο (στην περίπτωση αυτή οι αναρτήσεις στη βάση δεδομένων), οι οποίες τώρα μπορούν να δοθούν στο πρότυπο και επιστρέφουν το πρότυπο που ορίζεται στη λειτουργία. Το πρότυπο πρόκειται να είναι ένα έγγραφο HTML με λίγη γλώσσα που ονομάζεται Jinja2, η οποία καθιστά πληροφορίες Python στο HTML.

Για να αρχίσετε να δημιουργείτε πρότυπα, κάντε δύο καταλόγους σε ζωοτροφές.

mkdir feed/templates
mkdir feed/templates/feed

Στη συνέχεια, επεξεργαστείτε ένα πρότυπο στον παραπάνω κατάλογο, τροφοδοσία/πρότυπα/τροφοδοσία και προσθέστε τον κώδικα για αυτό το παράδειγμα. Ας δούμε το πρότυπο για αυτό το παράδειγμα.

Αυτό είναι ένα πολύ απλό πρότυπο. Ορίζει το άνοιγμα και το κλείσιμο των ετικετών HTML, μια ετικέτα τύπου εγγράφου, μια ετικέτα σώματος με τίτλο μύθου, μια ετικέτα διάλειμμα που προσθέτει μια μικρή γραμμή στην οθόνη και ένα για βρόχο που καθιστά κάθε θέση στη λίστα των θέσεων ως παράγραφο στο πρότυπο. Αυτό είναι το μόνο που χρειάζεται για την απόδοση των αναρτήσεων, αλλά δεν υπάρχουν ακόμα στη βάση δεδομένων. Ας δημιουργήσουμε μερικά με το κέλυφος. Μπορούμε να τρέξουμε το κέλυφος με διαχείριση

python manage.py shell

Τώρα, ας εισαγάγουμε το μοντέλο post μας

from feed.models import Post

Στη συνέχεια, θα δημιουργήσουμε μια απλή ανάρτηση με μια συμβολοσειρά και θα βγούμε από το κέλυφος. Η συμβολοσειρά μπορεί να είναι οτιδήποτε, όσο είναι έγκυρο το κείμενο.

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

Τέλος, θα πρέπει να προσθέσουμε ένα μοτίβο URL στη ροή μας. Επειδή η εφαρμογή Feed μας θα χρησιμοποιήσει πολλαπλές διευθύνσεις URL και θέλουμε να διατηρήσουμε μικρά μεγέθη αρχείων, ας δημιουργήσουμε μια τοπική διεύθυνση URLs.py στην εφαρμογή Feed που μοιάζει με αυτό:

from django.urls import path
from . import views

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

Θα χρειαστεί επίσης να επεξεργαστούμε τις urls.py στην εφαρμογή βάσης, ό, τι αποφασίσαμε να το ονομάσουμε, αυτός ήταν ο πρώτος κατάλογος που δημιουργήσαμε. Επεξεργασία app/app.py και προσθέστε τα παρακάτω στα πρότυπα διεύθυνσης URL

from django.urls import include # στην κορυφή
    # ... Προηγούμενο κωδικό εδώ

Τώρα, όταν εκτελούμε το διακομιστή με το python manager.py runserver, θα δούμε τη σελίδα που δημιουργήσαμε επειδή έχουμε το μοντέλο, την προβολή και το πρότυπο καθώς και το μοτίβο URL, μαζί με στοιχεία στη βάση δεδομένων. Στη συνέχεια, ας εφαρμόσουμε τη φόρμα που δημιουργήσαμε και αρχίζουμε να δημιουργούμε τις δικές μας θέσεις. Αλλά πριν γράψουμε πάρα πολύ κώδικα, ας κάνουμε ένα αντίγραφο ασφαλείας χρησιμοποιώντας το σενάριο που γράψαμε νωρίτερα, backup. Εκτελέστε αυτό το σενάριο στο κέλυφος, περιμένετε λίγα λεπτά και όλο τον κώδικα θα υποστηριχθεί στο χώρο αποθήκευσης GIT.

backup

Η εφαρμογή της φόρμας είναι σχετικά απλή. Θα εισαγάγουμε τη φόρμα μας, θα προσθέσουμε έναν χειριστή αίτησης μετά την προβολή και θα αποθηκεύσουμε τη θέση στη βάση δεδομένων πριν από την ανακατεύθυνση στην ίδια προβολή. Μπορούμε να χρησιμοποιήσουμε τη λειτουργία ανακατεύθυνσης που ήδη εισαγάγαμε και μια άλλη λειτουργία που ονομάζεται Reverse για να πάρει τη διεύθυνση URL για το μοτίβο προβολής. Θα ζητήσουμε αυτό με τη συμβολοσειρά 'τροφοδοσία: τροφοδοσία' επειδή ο χώρος ονομάτων του σχεδίου που περιλαμβάνεται είναι η τροφή και η θέα ονομάζεται επίσης τροφοδοσία.

    posts = Post.objects.all() # Αναζητήστε όλες τις δημοσιεύσεις στη βάση δεδομένων μέχρι στιγμής
    if request.method == 'POST': # Χειριστείτε το αίτημα μετά
        form = PostForm(request.POST) # Δημιουργήστε μια παρουσία της φόρμας και αποθηκεύστε τα δεδομένα σε αυτό
        if form.is_valid(): # Επικυρώστε τη φόρμα
            form.save() # Αποθηκεύστε το νέο αντικείμενο
        return redirect(reverse('feed:feed')) # Ανακατεύθυνση στην ίδια διεύθυνση URL με αίτημα λήψης
        'form': PostForm(), # Βεβαιωθείτε ότι έχετε μεταβιβάσει τη φόρμα στο πλαίσιο, ώστε να μπορέσουμε να το καταστήσουμε.

Τώρα, θα πρέπει να ενημερώσουμε το πρότυπο για να υπολογίσουμε τη νέα φόρμα. Μπορούμε να το κάνουμε αυτό χρησιμοποιώντας το

Ετικέτα στο HTML και καθιστώντας τη φόρμα στο πρότυπο HTML με ένα κουμπί υποβολής. Θα χρειαστούμε επίσης ένα διακριτικό CSRF, ένα διακριτικό που εμποδίζει τις εξωτερικές τοποθεσίες από την απόσπαση στη φόρμα χωρίς να φορτώσουμε πρώτα μια σελίδα.

Ας το σπάσουμε. Υπάρχει μια νέα κατηγορία φόρμας, ένα διακριτικό, η ίδια η φόρμα και ένα κουμπί υποβολής. Αρκετά απλό, αλλά όταν το ρίχνουμε μια ματιά, ίσως να θέλουμε να το φανείτε καλύτερα. Λειτουργεί, μπορούμε να δημοσιεύσουμε νέες δημοσιεύσεις με τη φόρμα και τώρα αποθηκεύονται στη βάση δεδομένων. Υπάρχουν μερικά πράγματα που συμβαίνουν εδώ. Χρησιμοποιούμε ετικέτες HTML για να δηλώσουμε ότι το έγγραφο είναι ένα έγγραφο HTML, χρησιμοποιούμε μια ετικέτα προτύπου ({ % ... %}) για να καταστήσουμε το διακριτικό για τη φόρμα και ένα άλλο, {{...}} για να καταστήσουμε τη φόρμα. Έχουμε επίσης ένα βρόχο για να καταστήσουμε το κείμενο χρησιμοποιώντας ετικέτες μπλοκ και μια ετικέτα προτύπου. Οι ετικέτες μπλοκ είναι πραγματικά σημαντικές επειδή μπορούμε να καθορίσουμε τον τρόπο με τον οποίο τα τμήματα του προτύπου παρέχονται μαζί τους και οι ετικέτες προτύπων αποτελούν τη βάση για το πώς βάζουμε μεταβλητές στον κώδικα μας.

Τώρα πρέπει να κάνουμε την εφαρμογή μας να φαίνεται καλύτερα, γιατί προς το παρόν φαίνεται πραγματικά βασικό. Μπορούμε να το κάνουμε αυτό χρησιμοποιώντας CSS, είτε inline είτε σε κατηγορίες που συνδέονται με κάθε αντικείμενο στο έγγραφο. Το CSS είναι πολύ ωραίο γιατί λέει τα πάντα στη σελίδα πώς πρέπει να φανεί και μπορεί να το κάνει να φαίνεται πολύ καλό. Υπάρχουν μερικές βιβλιοθήκες που μπορούν να το κάνουν αυτό, αλλά η προσωπική μου πηγαίνει είναι το Bootstrap.

Το Bootstrap μπορεί να μεταφορτωθεί από τον ιστότοπό τους,getbootstrap.com/. Μόλις εκεί, πατήστε το κουμπί για να διαβάσετε τα έγγραφα εγκατάστασης και αντιγράψτε τον κώδικα από το τμήμα Include Via CDN. Θα χρειαστείτε αυτόν τον κωδικό στο επάνω μέρος του εγγράφου HTML, σε μια ετικέτα που ονομάζεται Head. Επίσης, ας προχωρήσουμε και να δημιουργήσουμε ένα πρότυπο βάσης, οπότε δεν χρειάζεται να αναδημιουργήσουμε αυτούς τους συνδέσμους σε κάθε πρότυπο.

Κάντε έναν νέο κατάλογο που ονομάζεται πρότυπα με πρότυπα MKDIR και, στη συνέχεια, επεξεργαστείτε τα πρότυπα/base.html.

Θα πρέπει να μοιάζει με αυτό:

Βεβαιωθείτε ότι έχετε αντιγράψει το CSS και το JavaScript, τα αρχεία .css και .js, επειδή θα χρειαστούμε το JavaScript για να καταστήσουμε τον ιστότοπό μας πιο λειτουργικό στο μέλλον.

Τώρα, ας επιστρέψουμε στο κέλυφος bash και να τρέξουμε μια γρήγορη εντολή. Θυμηθείτε, αν χρειαστεί ποτέ να έχετε πρόσβαση στο εικονικό περιβάλλον, πληκτρολογήστε Venv/BIN/Activate. Αυτό θα σας επιτρέψει να εγκαταστήσετε πακέτα Python τοπικά με τρόπο που επιτρέπει στο Django να τους έχει πρόσβαση. Για να δώσουμε τις μορφές μας που δημιουργούνται από τις κλάσεις Django Bootstrap, θα χρησιμοποιήσουμε ένα πακέτο Python που ονομάζεται Crispy Forms. Μπορούμε να το κατεβάσουμε με την ακόλουθη εντολή

pip install django-crispy-forms

Μόλις εγκατασταθεί αυτό, προσθέστε το στο settings.py

    # … Προηγούμενο κωδικό εδώ

Τώρα, πίσω στο πρότυπο ζωοτροφών μας, μπορούμε να αφαιρέσουμε μερικά πράγματα. Ας αφαιρέσουμε την αρχή και το τέλος του εγγράφου και να το αντικαταστήσουμε με κληρονομιά από το πρότυπο βάσης μας, χρησιμοποιώντας τις επεκτάσεις και τον ορισμό του μπλοκ. Επίσης, θα προσθέσουμε μια εισαγωγή φίλτρου προτύπου με φορτίο και ένα φίλτρο προτύπου στη φόρμα. Τέλος, ας προσθέσουμε μια κλάση bootstrap στο κουμπί της φόρμας για να φανεί περισσότερο σαν ένα κουμπί. Που πρέπει να μοιάζει με αυτό:

Ομορφος! Αυτό είναι αρκετό κώδικα ήδη. Στη συνέχεια, θα πρέπει να το δοκιμάσουμε και να βεβαιωθούμε ότι μπορούμε να δούμε ότι όλα φαίνονται ωραία, και επίσης να είστε βέβαιοι ότι όλα λειτουργούν σωστά. Εκτελέστε τον διακομιστή σύμφωνα με προηγούμενες οδηγίες και βεβαιωθείτε ότι ο ιστότοπος φαίνεται και λειτουργεί εντάξει. Εξαιρετική δουλειά! Είστε έτοιμοι να προχωρήσετε στο επόμενο βήμα, στο οποίο θα προσθέσουμε λειτουργικότητα σύνδεσης χρήστη χρησιμοποιώντας παρόμοιες διευθύνσεις URL, φόρμες, προβολές και πρότυπα. Το πρότυπο βάσης είναι σημαντικό και θα συνεχίσουμε να το τροποποιούμε και να κάνουμε αλλαγές όπως απαιτείται, αλλά προς το παρόν, ας επικεντρωθούμε στο να καταστήσουμε τον ιστότοπό μας πιο ασφαλή, επιτρέποντας στους χρήστες να συνδεθούν με ένα όνομα χρήστη και κωδικό πρόσβασης και τελικά ακόμη πιο σημαντικές πληροφορίες που θα σας βοηθήσουν να διατηρήσετε την εφαρμογή σας ασφαλή και τη δική σας λογιστική μόνο από εσάς.

Για να γίνει αυτό, θα πρέπει να χρησιμοποιήσουμε το μοντέλο χρήστη ενσωματωμένο στο Django. Το μοντέλο χρήστη είναι ένα μοντέλο βάσης δεδομένων, όπως η ανάρτησή μας, που μπορεί να αποδοθεί για να καταγράψει έναν χρήστη στον ιστότοπο. Στο μέλλον, πριν αναπτύξουμε τον ιστότοπο στο Διαδίκτυο, θα επεκτείνουμε αυτό το μοντέλο με άλλα μοντέλα που του αποδίδονται και θα δημιουργήσουμε πρόσθετα μέτρα ασφαλείας για την σύνδεση που είναι ανθεκτικά στο phishing. Θα ξεκινήσουμε χρησιμοποιώντας μερικές ενσωματωμένες φόρμες σύνδεσης που παρέχει το Django. Πρώτον, ας δημιουργήσουμε μια νέα εφαρμογή που θα χρησιμοποιήσουμε για να καταστήσουμε τα πρότυπα και τις προβολές για τη βασική σελίδα σύνδεσης. Θα δημιουργήσουμε επίσης άλλες εφαρμογές για να αντιπροσωπεύουμε τις συνεχιζόμενες προκλήσεις σύνδεσης για να εξασφαλίσουμε την εφαρμογή, συμπεριλαμβανομένης μιας πόλης, αναγνώρισης προσώπου, επικοινωνίας κοντά στο πεδίο, εξωτερικών συσκευών, ελέγχου ταυτότητας πολλαπλών παραγόντων και αναγνώρισης δακτυλικών αποτυπωμάτων.

Μιλήσαμε ήδη για την έναρξη μιας εφαρμογής. Από τον κατάλογό μας, μέσα στο εικονικό περιβάλλον, περάστε

python manage.py startapp users

Τώρα, πρέπει να έχουμε έναν κατάλογο για τη νέα εφαρμογή. Ας ξεκινήσουμε δημιουργώντας μια προβολή σε αυτόν τον κατάλογο που αντιστοιχεί στη σύνδεση του χρήστη. Το Django έχει ενσωματώσει τις προβολές για τις συνδέσεις χρηστών, αλλά αυτά δεν θα είναι κατάλληλα για εμάς επειδή χρειαζόμαστε μια προσαρμοσμένη προβολή, η οποία γίνεται κατά προτίμηση με έναν ορισμό.

Σε αυτή την άποψη, θα ξεκινήσουμε ελέγχοντας για ένα αίτημα δημοσίευσης, pass request.post σε μια loginform που εισάγεται από το django, επαληθεύστε τον λογαριασμό χρήστη και συνδεθείτε στον χρήστη πριν την ανακατευθύνετε στην εφαρμογή Feed μας.

Στους χρήστες/προβολές.py, προσθέστε τον ακόλουθο κωδικό

        username = request.POST['username'] # Λάβετε το όνομα χρήστη και τον κωδικό πρόσβασης από το αίτημα δημοσίευσης
        password = request.POST['password'] # Πιστοποίηση του χρήστη

Αυτό είναι το μόνο που χρειάζεστε για μια βασική προβολή σύνδεσης. Τώρα, ας δημιουργήσουμε μια φόρμα για την προβολή επεκτείνοντας το πρότυπο βάσης. Θα ξεκινήσουμε δημιουργώντας έναν νέο κατάλογο για πρότυπα στο φάκελο των χρηστών.

mkdir users/templates
mkdir users/templates/users

Τώρα, θα πρέπει να είμαστε σε θέση να επεξεργαστούμε χρήστες/πρότυπα/χρήστες/login.html. Ενώ είμαστε σε αυτό, θα δημιουργήσουμε ένα πρότυπο για να επιτρέψουμε στον χρήστη να εγγραφεί επίσης.

nano users/templates/users/login.html

Τώρα, στο πρότυπο,

Αυτά είναι τα βασικά ενός προτύπου σύνδεσης. Είναι πραγματικά ακριβώς όπως το άλλο πρότυπο στη δομή, αλλά φαίνεται λίγο διαφορετικό όταν είναι αποδοθεί. Μπορούμε να αντιγράψουμε αυτόν τον κώδικα για να δημιουργήσουμε ένα άλλο πολύ παρόμοιο πρότυπο που ονομάζεται Register.html, όπου θα αλλάξουμε τη διατύπωση και θα χρησιμοποιήσουμε μια νέα φόρμα που δημιουργούμε. Ας κάνουμε πρώτα το πρότυπο. Επεξεργασία χρηστών/προτύπων/χρηστών/register.html και προσθέστε τον ακόλουθο κωδικό:

Τώρα, ας οικοδομήσουμε μια φόρμα για την εγγραφή χρήστη και να επιστρέψουμε στις προβολές πριν αναβαθμίσουμε τους χρήστες μας με ένα μοντέλο. Θα κάνουμε αυτό το έντυπο βασικό για να ξεκινήσουμε, αλλά να ενσωματώσουμε περισσότερες λεπτομέρειες και χαρακτηριστικά ασφαλείας, όπως συμφωνίες και CAPTCHA στο μέλλον. Επεξεργαστείτε τις φόρμες με τους χρήστες/forms.py νανο -Nano και προσθέστε τον ακόλουθο κωδικό.

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

Έχουμε λοιπόν μια άλλη μορφή εδώ, η οποία λειτουργεί αρκετά απλά. Είναι ένα έντυπο μητρώου χρήστη με όνομα χρήστη, email και κωδικό πρόσβασης, καθώς και ένα πεδίο επιβεβαίωσης κωδικού πρόσβασης. Σημειώστε ότι αυτή η φόρμα δεν επεκτείνει τις κανονικές μορφές. Ένα πεδίο ορίζεται ακριβώς το ίδιο και η κλάση meta ορίζει το μοντέλο που η φόρμα αντιστοιχεί στις υπόλοιπες πληροφορίες που θα γράφονται στο έντυπο. Τα περισσότερα από αυτά υπάρχουν ήδη στο ενσωματωμένο στο Django στο UserCreationForm, οπότε θα το χρησιμοποιήσουμε ως βάση για την τάξη (που πέρασε στην παρένθεση).

Στη συνέχεια, θα εξετάσουμε την άποψη για να καταχωρήσουμε έναν χρήστη, τώρα που έχουμε μια φόρμα και ένα πρότυπο. Αυτό είναι ένα modelform, όπως και αυτό στη νέα προβολή post. Επεξεργασία χρηστών/προβολών. ΠΡΟΣΦΟΡΑ ΚΑΙ ΠΡΟΣΘΗΚΗ ΤΟΥ ΑΚΟΛΟΥΘΗΣΟΥ ΚΩΔΙΚΟΥ:

# … Εισαγωγές

Αυτό είναι το μόνο που πρέπει να λάβουμε έναν χρήστη, αλλά θα πρέπει να έχουμε περισσότερες πληροφορίες. Θέλουμε να γνωρίζουμε το χρόνο που έχει εγγραφεί ο χρήστης, τι ώρα ήταν τελευταία στον ιστότοπο, μερικές πληροφορίες σχετικά με αυτές, όπως μια βιογραφία, μια ζώνη ώρας, κλπ. Επίσης, θα πρέπει να ενημερώσουμε το μοντέλο ροής μας, να αντισταθμίσουμε το μοντέλο χρήστη και τις θέσεις χαρακτηριστικών σε κάθε χρήστη. Για να γίνει αυτό, θα ενημερώσουμε τα μοντέλα.py και στις δύο εφαρμογές. Ας ξεκινήσουμε με την επεξεργασία του μοντέλου τροφοδοσίας. Θα πρέπει να μοιάζει τώρα:

from django.db import models # … Εισαγωγές
    author = models.ForeignKey(User, on_delete=models.CASCADE, null=True, blank=True, related_name='posts') # Προσθέστε σε αυτήν τη γραμμή

Δώστε προσοχή στη δεύτερη γραμμή που προστέθηκε στο αρχείο. Αυτό είναι ένα ξένο κλειδί, το οποίο θα αποδώσει κάθε ανάρτηση σε έναν μόνο χρήστη ανά ανάρτηση, ώστε να μπορέσουμε να διασφαλίσουμε ότι αποθηκεύουμε τις δημοσιεύσεις σε βάση χρήστη ανά χρήστη και δεν μπορεί να γίνει ανάρτηση χωρίς να το αποδώσει σε έναν χρήστη. Ορίζουμε αυτό το ξένο κλειδί με την κλάση που αντιπροσωπεύει, ένα επιχείρημα διαγραφής για να διασφαλίσουμε ότι οι θέσεις διαγράφονται με χρήστες, μηδενικά και κενά επιχειρήματα για να βεβαιωθούμε ότι μπορούμε να καταργήσουμε τον χρήστη εάν είναι απαραίτητο και να φιλοξενήσουμε την έλλειψη χρήστη στις δημοσιεύσεις που δημιουργήσαμε ήδη και ένα σχετικό όνομα, το οποίο μπορούμε να χρησιμοποιήσουμε για να αναφερθούμε στα αντικείμενα που δημιουργεί το χρήστη. Αυτό το σχετικό όνομα, σε αντίθεση με το Post.Author, ο συγγραφέας της θέσης, μας δίνει χρήστη που δημοσίευσε την ίδια την ανάρτηση. Μπορούμε τώρα να πάρουμε τις δημοσιεύσεις που κατασκευάζεται από το user.posts.all () ή το author.posts.all ().

Τώρα, ας κάνουμε τις συνδέσεις μας πιο ανθεκτικές. Μπορούμε ήδη να καταστήσουμε τον ιστότοπό μας πολύ λιγότερο ευάλωτο στο phishing, απλώς να περιορίζουμε τον αριθμό των φορών που θα επιτρέψουμε μια σύνδεση στον ιστότοπο, αυτό είναι αρκετά εύκολο. Ας αρχίσουμε επίσης να αποθηκεύουμε κάποιες πληροφορίες για κάθε χρήστη πριν καθώς συνεχίζουμε να αναπτύσσουμε την εφαρμογή μας. Επεξεργασία χρηστών/models.py, προσθέστε τον ακόλουθο κωδικό.

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

Σημειώστε ότι αυτό το μοντέλο είναι αρκετά παρόμοιο με το μοντέλο post. Έχουμε μια πρόσθετη εισαγωγή, τη ζώνη ώρας, η οποία θα μας επιτρέψει να ορίσουμε προεπιλογές στα πεδία DateTime και έχουμε επίσης ένα χαρακτήρα και ένα Textfield όπως η θέση. Χρησιμοποιώντας όλα αυτά τα χρονικά σήματα μας βοηθά να εξασφαλίσουμε τον ιστότοπο και να κατανοήσουμε τη χρήση του και τα πεδία κειμένου μας επιτρέπουν να κάνουμε πληροφορίες για κάθε χρήστη ή συγγραφέα στον ιστότοπο. Το OneToonefield θα πρέπει να είναι το μόνο μικρό ζήτημα, συμπεριφέρεται ακριβώς το ίδιο με το ForeginKey αλλά με μόνο ένα ανά επόμενο μοντέλο. Με αυτόν τον τρόπο, ο χρήστης έχει μόνο ένα προφίλ, ενώ μπορεί να έχουν πολλές θέσεις.

Τώρα, ας βελτιώσουμε την σύνδεσή μας και να καταγράψουμε τις προβολές για να υπολογίσουμε το προφίλ. Πρώτον, επεξεργαστείτε τους χρήστες/views.py και εστιάστε στην προβολή καταχωρητή:

# … Εισαγωγές
            Profile.objects.create(user=user) # Βεβαιωθείτε ότι έχετε προσθέσει αυτήν τη γραμμή, για να δημιουργήσετε ένα προφίλ για τον χρήστη

Αυτό απλά δημιουργεί ένα προφίλ για τον χρήστη, χωρίς να συμπληρώνει καμία από τις πληροφορίες. Τώρα, θέλουμε να βεβαιωθούμε ότι ο λογαριασμός χρήστη δεν μπορεί να συνδεθεί πολύ συχνά ή τουλάχιστον οι κωδικοί πρόσβασης δεν μπορούν να δοκιμαστούν πολύ συχνά, οπότε ας ενημερώσουμε την προβολή σύνδεσης.

# … Εισαγωγές
        if user and user.profile.can_login < timezone.now(): # Σημειώστε ότι τώρα ελέγξουμε εάν ο χρήστης μπορεί να συνδεθεί
        else: # Εάν η σύνδεση δεν ήταν επιτυχής,
            user = User.objects.filter(username=username).first() # Αυτό είναι το μέρος όπου ενημερώνουμε το προφίλ των χρηστών
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Έτσι δεν μπορούν να συνδεθούν ξανά για μερικά δευτερόλεπτα

Αυτό είναι το βασικό θεμελιώδες της ασφάλειας. Βεβαιωθείτε ότι ο ιστότοπος δεν είναι ευάλωτος σε κάποιον που απλώς δοκιμάζει κάθε πιθανό συνδυασμό κωδικού πρόσβασης ή ακόμα και μερικούς από αυτούς ταυτόχρονα. Αυτό δεν θα είναι απογοητευτικό για τον συνηθισμένο χρήστη που γνωρίζει τον κωδικό πρόσβασης και απλώς συνδέεται με μερικές συσκευές, αλλά θα κρατήσει πολλά ρομπότ ηλεκτρονικού ψαρέματος από την εφαρμογή. Σημειώστε ότι προσθέσαμε μια δήλωση IF με μια μεταβλητή, can_login, που θα πρέπει να είναι ένας χρόνος στο παρελθόν και να το ενημερώσετε με κάθε ανεπιτυχή σύνδεση χρησιμοποιώντας το ίδιο όνομα χρήστη. Με αυτόν τον τρόπο, ένας κακόβουλος χρήστης δεν θα είναι σε θέση να μαντέψει έναν κωδικό πρόσβασης οπουδήποτε κοντά. Ο αριθμός των δευτερολέπτων στο dateTime.timedelta () μπορεί επίσης να ενημερωθεί και ο ιστότοπος θα είναι πιο ανθεκτικός αλλά ελαφρώς λιγότερο χρησιμοποιήσιμος με περισσότερα δευτερόλεπτα. Συνιστώ 15 για να ξεκινήσετε.

Θυμηθείτε, χτίσαμε ένα σενάριο εφεδρικών ειδών για να σώσουμε τη δουλειά μας, οπότε ας προχωρήσουμε και να δημιουργήσουμε αντίγραφα ασφαλείας ό, τι έχουμε μέχρι στιγμής για να βεβαιωθούμε ότι έχουμε αποθηκεύσει τα πάντα. Εκτελέστε την εντολή:

sudo backup

Για άλλη μια φορά, αυτό θα σώσει την εργασία σας μέχρι τώρα. Συνιστώ να εκτελείτε συχνές αντίγραφα ασφαλείας για να αποθηκεύσετε την εργασία σας και ίσως θέλετε να εκτελέσετε αυτόματα μια εφεδρική εργασία. Μπορείτε να το κάνετε αυτό χρησιμοποιώντας ένα βοηθητικό πρόγραμμα UNIX που ονομάζεται Cron. Για να ενεργοποιήσετε αυτό το βοηθητικό πρόγραμμα, εκτελέστε την ακόλουθη εντολή και εισαγάγετε τον κωδικό πρόσβασής σας:

sudo crontab -e

Εάν δεν έχετε ήδη επιλέξει την επιλογή 1 για το Nano, ο επεξεργαστής κειμένου θα πρέπει να είστε ήδη εξοικειωμένοι με και μετακινηθείτε στο κάτω μέρος του αρχείου χρησιμοποιώντας τα πλήκτρα βέλους. Προσθέστε την ακόλουθη γραμμή:

0 * * * * sudo backup

Ο Cron χρησιμοποιεί τη μορφή λεπτού, ώρα, ημέρα του μήνα, μήνα, ημέρα της εβδομάδας, όπου ένας * ή ένας αριθμός αντιπροσωπεύει πότε πρέπει να εκτελέσετε την εντολή. Χρησιμοποιώντας ένα 0 για το λεπτό και * για τις υπόλοιπες επιλογές, μπορούμε να εκτελέσουμε μια εντολή στο πρώτο λεπτό κάθε ώρας στην αρχή του λεπτού. Αυτό μας επιτρέπει αυτόματα να δημιουργήσετε αντίγραφα ασφαλείας του κώδικα. Όλες οι εργασίες του Cron όταν εκτελούνται με το Sudo Run ως ρίζα, οπότε δεν θα χρειαστεί να πληκτρολογήσουμε έναν κωδικό πρόσβασης κάθε ώρα.

Για να διευκολυνθεί η δημιουργία αντιγράφων ασφαλείας του κώδικα χωρίς να χρησιμοποιήσετε έναν κωδικό πρόσβασης, ας απενεργοποιήσουμε τον κωδικό πρόσβασης για την εντολή backup. Θα το κάνουμε αυτό εκτελώντας την ακόλουθη εντολή και εισάγοντας έναν κωδικό πρόσβασης:

sudo visudo

Τώρα, ας μετακινηθούμε στο κάτω μέρος του αρχείου και προσθέστε μια άλλη γραμμή:

ALL ALL=NOPASSWD: /bin/backup

Αυτό μας επιτρέπει να εκτελούμε την εντολή "αντίγραφο ασφαλείας" ως οποιονδήποτε χρήστη, χωρίς κωδικό πρόσβασης. Η μορφή για αυτό είναι εύκολη, απλώς προθέστε τη γραμμή με "all all = nopasswd:/bin/" και τελειώνει με την εντολή, για παράδειγμα/bin/backup, το οποίο υπάρχει στο/usr/bin/.

Τώρα, ας αρχίσουμε να δουλεύουμε με email. Το ηλεκτρονικό ταχυδρομείο είναι πραγματικά σημαντικό για τους ιστότοπους, επειδή είναι ένας τρόπος για να διατηρηθεί ένας ιστότοπος πιο ασφαλής, να επαληθεύσετε ότι οι χρήστες είναι πραγματικοί άνθρωποι και ακόμη και προϊόντα αγοράς ή υπηρεσίες προς τους πελάτες. Πολλοί άνθρωποι που συχνάζουν στο Διαδίκτυο ελέγχουν καθημερινά το ηλεκτρονικό ταχυδρομείο τους και λαμβάνουν όλα τα είδη ηλεκτρονικού ταχυδρομείου μάρκετινγκ σχετικά με τα προϊόντα και τις υπηρεσίες που τους ενδιαφέρουν. Υπάρχουν μερικές επιλογές όταν πρόκειται να επιτρέψετε το ηλεκτρονικό ταχυδρομείο σε έναν ιστότοπο Django και είστε ευπρόσδεκτοι να επιλέξετε όποιο είναι καλύτερα για εσάς.

Πρώτον, μπορείτε να πληρώσετε για μια υπηρεσία ηλεκτρονικού ταχυδρομείου που θα σας επιτρέψει να στείλετε email από τον τομέα σας και απαιτεί ελάχιστο κώδικα. Υπάρχουν πολλές υπηρεσίες που προσφέρουν αυτό, όπως ο χώρος εργασίας Google, το SendInblue, το MailGun και πολλά άλλα.

Διαφορετικά, είστε καλά από την οικοδόμηση της δικής σας υπηρεσίας ηλεκτρονικού ταχυδρομείου μέσα στο διακομιστή σας από το μηδέν. Συνιστώ αυτήν την επιλογή, παρόλο που είναι περισσότερος κώδικας και μπορεί να απαιτεί ειδική φιλοξενία. Δεν θα μπορείτε να ξεκινήσετε έναν διακομιστή αλληλογραφίας από τον οικιακό σας υπολογιστή πιθανότατα, οπότε ας προχωρήσουμε και να εξετάσουμε τη διαμόρφωση και τον κωδικό για να στείλουμε email πριν ξεκινήσουμε έναν διακομιστή στο σύννεφο και να δημιουργήσουμε το δικό μας διακομιστή αλληλογραφίας μέσα.

Πρώτον, επεξεργασία settings.py με την ακόλουθη εντολή:

nano app/settings.py

Όπου η εφαρμογή είναι το όνομα της εφαρμογής που δημιουργήσατε με το StartApp.

Προσθέστε τις ακόλουθες γραμμές:

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)

Βεβαιωθείτε ότι έχετε αλλάξει αυτά όταν είστε έτοιμοι να αναπτύξετε την εφαρμογή σας, θα το επανεξετάσουμε αργότερα. Η ρύθμιση Email_Address θα πρέπει να είναι το email που θα θέλατε να στείλετε από και ο κωδικός πρόσβασης (Email_Host_PassWord) θα πρέπει να ρυθμιστεί στον κωδικό πρόσβασης που δημιουργείτε για το διακομιστή. Φορτώσω τον κωδικό πρόσβασης από ένα αρχείο ρυθμίσεων για να το κρατήσω έξω από τον κώδικα χρησιμοποιώντας την ακόλουθη λογική, πάνω από αυτές τις γραμμές στο settings.py:

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

Στη συνέχεια, έχω δημιουργήσει ένα αρχείο JSON με το config στο /etc/config.json χρησιμοποιώντας το Nano ως εξής.

Για να επεξεργαστείτε το αρχείο:

sudo nano /etc/config.json

Προσθέστε τις ακόλουθες γραμμές:

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

Θα συνεχίσουμε να επεξεργάζουμε το αρχείο ρυθμίσεων και να προσθέσουμε όλους τους κωδικούς πρόσβασης και τα κλειδιά που θα χρησιμοποιήσουμε στην εφαρμογή. Προς το παρόν, ας εξετάσουμε γρήγορα πώς να στείλετε email χρησιμοποιώντας την Python. Πρώτον, ας δημιουργήσουμε ένα πρότυπο για ένα μήνυμα ηλεκτρονικού ταχυδρομείου επαλήθευσης που μπορούμε να στείλουμε στους χρήστες μας και να το βάλουμε στον κατάλογο των προτύπων χρήστη. Αυτό το πρότυπο θα γραφτεί σε HTML.

nano users/templates/users/verification_email.html

Αυτό το email είναι αρκετά απλό. Παίρνει ένα πλαίσιο ενός χρήστη, τη διεύθυνση URL βάσης για τον ιστότοπο και ένα αναγνωριστικό χρήστη και ένα διακριτικό που χρησιμοποιείται για την επαλήθευση του ηλεκτρονικού ταχυδρομείου του χρήστη. Βεβαιωθείτε ότι έχετε καθορίσει τη διεύθυνση URL βάσης στο settings.py πριν γράψουμε κάποιο κώδικα Python για να καταστήσουμε το πρότυπο. Προχωρήστε και προσθέστε τις ακόλουθες γραμμές στο app/settings.py, κοντά στην αρχή.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

Τελικά, όταν ο ιστότοπός σας είναι έτοιμος για το Διαδίκτυο και το αναπτύξετε, θα θελήσετε να ορίσετε τον τομέα σας ως το όνομα τομέα που αγοράζετε για να εκπροσωπήσετε τον ιστότοπο. Αυτό είναι το όνομα που θα πληκτρολογήσετε στο NAVBAR για να αποκτήσετε πρόσβαση στον ιστότοπό σας. Προς το παρόν, μπορείτε να αφήσετε τον τομέα κενό ή να χρησιμοποιήσετε ένα σύμβολο κράτησης θέσης. Θα θελήσετε επίσης να αλλάξετε το όνομα site_name σε ένα όνομα που θέλετε να δώσετε στον ιστότοπό σας, της επιλογής σας.

Πριν στείλουμε email, ας δημιουργήσουμε μια γεννήτρια συμβόλων, ώστε να μπορούμε να έχουμε ένα διακριτικό ενεργοποίησης λογαριασμού που ποτέ δεν λήγει. Μπορούμε να το κάνουμε αυτό με την οικοδόμηση και την εισαγωγή ενός διακριτικού ενεργοποίησης λογαριασμού που μοιάζει με τα ακόλουθα. Επεξεργαστείτε το αρχείο:

nano users/tokens.py

Προσθέστε τον ακόλουθο κωδικό:

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

Αυτή η βασική γεννήτρια συμβόλων δημιουργεί ένα διακριτικό που μπορούμε να στείλουμε το χρήστη σε μια διεύθυνση URL και ο χρήστης μπορεί να χρησιμοποιήσει για να επαληθεύσει το ηλεκτρονικό ταχυδρομείο του και να ενεργοποιήσει τον λογαριασμό του.

Στη συνέχεια, ας δούμε πώς να στείλετε ένα email. Χρήση Nano, Επεξεργασία χρηστών/Email.py.

nano users/email.py

Η αποστολή του ηλεκτρονικού ταχυδρομείου HTML επαλήθευσης θα μοιάζει με αυτό:

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)

Αυτό είναι αρκετά απλό. Εισάγουμε τις λειτουργίες που πρέπει να στείλουμε το μήνυμα ηλεκτρονικού ταχυδρομείου, να καθιστούμε το μήνυμα ηλεκτρονικού ταχυδρομείου με πρότυπα και τις ρυθμίσεις μας και στη συνέχεια καθορίζουμε το μήνυμα ηλεκτρονικού ταχυδρομείου με το όνομα του προτύπου και το στέλνουμε στον χρήστη χρησιμοποιώντας μια λειτουργία. Θα παρατηρήσετε ότι δεν έχουμε ορίσει τη λειτουργία για να στείλουμε το ταχυδρομείο, send_html_email, όμως, οπότε ας το γράψουμε κάτω από τον κωδικό που ήδη προσθέσαμε στους χρήστες/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()

Αυτό είναι λίγο πιο περίπλοκο και δεν είμαστε έτοιμοι να εκτελέσουμε όλο αυτόν τον κώδικα ακόμα. Παρατηρήστε ότι καθορίζουμε ένα unsub_link, ο σύνδεσμος που μπορεί να χρησιμοποιήσει ο χρήστης για να καταργήσει την εγγραφή από τα μηνύματα ηλεκτρονικού ταχυδρομείου μας. Αυτό είναι σημαντικό, επειδή οι χρήστες θα πρέπει να είναι σε θέση να αποχωρήσουν από τα μηνύματα ηλεκτρονικού ταχυδρομείου μας, εκτός αν θέλουν να τους δουν, ανά πάσα στιγμή. Προσθέτουμε επίσης μια εναλλακτική λύση κειμένου στο μήνυμά μας, το οποίο είναι το μήνυμα HTML που απογυμνώνεται από ετικέτες HTML. Τέλος, ελέγξουμε αν το email που αποστέλλεται και αν δεν το έκανε, σηματοδοτούμε στο προφίλ του χρήστη ότι το ηλεκτρονικό ταχυδρομείο τους δεν είναι έγκυρο.

Ας επιστρέψουμε στα μοντέλα των χρηστών, ώστε να μπορούμε να κάνουμε όλα αυτά. Πρέπει να ορίσουμε μια λειτουργία για να δημιουργήσουμε έναν σύνδεσμο για να καταργήσουμε την εγγραφή και να καθορίσουμε ένα πεδίο Boolean για να επισημάνουμε ότι το ηλεκτρονικό ταχυδρομείο του χρήστη δεν είναι έγκυρο.

Πρώτον, προσθέστε τις ακόλουθες εισαγωγές στην κορυφή των χρηστών/μοντέλων.py

nano users/models.py
# …

Στη συνέχεια, ας προσθέσουμε λειτουργίες στο μοντέλο χρήστη για να φτιάξουμε το διακριτικό και να ελέγξουμε το διακριτικό που χρησιμοποιείται για την ενεργοποίηση του μηνύματος ηλεκτρονικού ταχυδρομείου, καθώς και του πεδίου για να αποθηκεύσει εάν ο χρήστης λαμβάνει με επιτυχία το ταχυδρομείο του. Στους χρήστες/models.py ξανά, προσθέστε τον ακόλουθο κωδικό στο τέλος του μοντέλου (κώδικας με χαραγμένο)

# …
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Ισχύει για 30 ημέρες

Αυτό είναι αρκετά απλό, χρησιμοποιούμε ένα timestampsigner, το οποίο είναι ένα βασικό εργαλείο κρυπτογραφίας, για να δημιουργήσουμε ένα διακριτικό που θα λήξει μετά από ένα συγκεκριμένο χρονικό διάστημα και χρησιμοποιούμε επίσης μια άλλη λειτουργία για να ελέγξουμε εάν είναι έγκυρο. Χρησιμοποιούμε αυτά τα μάρκες δύο φορές, μία φορά για να επαληθεύσουμε το μήνυμα ηλεκτρονικού ταχυδρομείου και μία φορά για έναν σύνδεσμο κατάργησης εγγραφής.

Τώρα που έχουμε αυτά, το τελευταίο από το έργο που θα πρέπει να κάνουμε είναι στις απόψεις. Μέσα στους χρήστες/προβολές.py, ας προσθέσουμε προβολές για να επαληθεύσουμε τη διεύθυνση ηλεκτρονικού ταχυδρομείου και να καταργήσετε την εγγραφή.

nano users/views.py

Πρώτον, προσθέστε τις ακόλουθες εισαγωγές. Έριξα μερικά επιπλέον, οπότε δεν θα χρειαστεί να εισαγάγουμε περισσότερα στοιχεία ξανά αργότερα.

from .email import send_verification_email # Βεβαιωθείτε ότι έχετε εισαγάγει τη λειτουργία αποστολής email επαλήθευσης

Μπορεί να έχετε ήδη μερικές από αυτές τις εισαγωγές, αλλά δεν βλάπτεται να τις επαναλάβετε. Θα χρειαστεί να εισαγάγετε τη λειτουργία αποστολής ηλεκτρονικού ταχυδρομείου επαλήθευσης, καθώς και Account_Activation_Token από τους χρήστες.

Τώρα, στο κάτω μέρος του αρχείου, προσθέστε τον ακόλουθο κωδικό:

        # μη διαγραφίστε τα
    # Διαφορετικά, ανακατευθύνετε τη σελίδα σύνδεσης
# SendWelcomeEmail (αίτημα, χρήστης)

Αυτός είναι ένας πολύ κωδικός. Ας το σπάσουμε. Η πρώτη λειτουργία, καθαρή και απλή, διατυπώνει τον χρήστη από τη λίστα αλληλογραφίας. Η δεύτερη λειτουργία ενεργοποιεί το ηλεκτρονικό ταχυδρομείο τους και θα παρατηρήσετε ότι πρόσθεσα μια συνάρτηση που σχολιάζεται, SendWelcomeMail. Είστε ευπρόσδεκτοι να χρησιμοποιήσετε ένα πρότυπο ηλεκτρονικού ταχυδρομείου και τον ορισμό της λειτουργίας για να στείλετε ένα μήνυμα ηλεκτρονικού ταχυδρομείου, απλά δεν έχω ακόμα. Η τελευταία λειτουργία που έριξα είναι σημαντική, επειδή τα μηνύματα ενεργοποίησης λήγουν. Ως εκ τούτου, θα πρέπει να επαναλάβουμε το μήνυμα ηλεκτρονικού ταχυδρομείου ενεργοποίησης μερικές φορές. Μπορούμε να χρησιμοποιήσουμε μια βασική φόρμα για αυτό και να καλέσουμε τη λειτουργία για να στείλετε το email επαλήθευσης. Πριν το κάνουμε αυτό, ας σιγουρευτούμε ότι αποστέλλεται στην πρώτη θέση, προσθέτοντας μια κλήση λειτουργίας στην προβολή μητρώου. Προσθέστε αυτή τη γραμμή λίγο πριν την ανακατεύθυνση στην προβολή καταχωρητή, Def Register, σε χρήστες/views.py.

nano users/views.py
# … (Μετά) Def Register (αίτημα):
# ... (πριν) Ανακατεύθυνση (

Δεν χρειάζεται να προσθέσετε τις πρώτες και τις τελευταίες γραμμές σε αυτό το απόσπασμα κώδικα, απλώς βεβαιωθείτε ότι η προβολή καταχωρητή στέλνει το μήνυμα ηλεκτρονικού ταχυδρομείου επαλήθευσης στον χρήστη. Θα πρέπει να μοιάζει με αυτό:

# … Εισαγωγές
            send_verification_email(user) # Φροντίστε να προσθέσετε αυτήν τη γραμμή!

Τώρα, θα χρειαστεί να προσθέσουμε μια φόρμα για να επαναλάβουμε το email ενεργοποίησης. Σε χρήστες/μορφές. Προσθέστε την ακόλουθη φόρμα:

# … (Εισαγωγές)

Θα χρειαστούμε επίσης ένα πρότυπο που αντιστοιχεί σε αυτό το έντυπο ενεργοποίησης ηλεκτρονικού ταχυδρομείου. Ας προσθέσουμε αυτό το πρότυπο. Επεξεργασία του αρχείου:

nano users/templates/users/resend_activation.html

Στη συνέχεια, προσθέστε τον ακόλουθο κωδικό στο αρχείο.

Τι, αυτό είναι πολύ! Τώρα, όταν αναπτύσσουμε τον κώδικα στον διακομιστή μας, θα μπορέσουμε να στείλουμε το ηλεκτρονικό ταχυδρομείο HTML και να ενεργοποιήσουμε τους λογαριασμούς χρηστών με ένα κλικ στο email. Μπορεί επίσης να θέλουμε να στείλουμε ένα απλό μήνυμα ηλεκτρονικού ταχυδρομείου, οπότε ας δούμε πώς να το κάνουμε αυτό. Πίσω στους χρήστες/Email.py, προσθέστε τον ακόλουθο κωδικό:

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)

Επίσης, θα χρειαστούμε ένα πρότυπο για να καταστήσουμε όλες αυτές τις πληροφορίες. Στην ιστοσελίδα μου, το πρότυπο μοιάζει με το παρακάτω, αλλά είστε ευπρόσδεκτοι να το διαμορφώσετε, ωστόσο σας αρέσει.

Σημειώστε ότι δεν έχουμε ετικέτες κλεισίματος ή ετικέτες HTML, επειδή προσθέτουμε αυτά όταν προσθέτουμε τον σύνδεσμο κατάργησης εγγραφής HTML. Αυτά είναι σημαντικά, αλλά δεν θέλουμε να τα καθορίσουμε δύο φορές.

Τι είναι λοιπόν; Έχουμε προχωρήσει πολύ. Πραγματικά, θα πρέπει να είμαστε έτοιμοι να αναπτύξουμε τον ιστότοπο σε έναν διακομιστή. Μπορούμε να προσθέσουμε τον διακοσμητή @Login_Required και να κάνουμε τις απόψεις μας ασφαλείς, να λάβουμε τις εγγραφές των χρηστών, να στείλουμε συμβατά email και να προσωρινό πληροφορίες, οι οποίες αποτελούν τη βάση για το τι πρέπει να κάνει ένας ιστότοπος για να παραμείνει σχετική. Θα προσθέσουμε μερικά ακόμη χρήσιμα χαρακτηριστικά και, στη συνέχεια, θα δημιουργήσουμε μια βάση για την ανάπτυξη του κώδικα μας σε έναν απομακρυσμένο διακομιστή, τη ρύθμιση ενός διακομιστή αλληλογραφίας, τη διαμόρφωση του τομέα και τα φίλτρα για να καταστήσουμε τον ιστότοπό μας ασφαλή και κατάλληλο.

Θα χρειαστούμε επίσης μια προβολή επαναφοράς κωδικού πρόσβασης, οπότε ας το προσθέσουμε σε πολύ γρήγορο. Η ενσωματωμένη προβολή επαναφοράς κωδικού πρόσβασης του Django έχει σπάσει σε ορισμένες λειτουργίες, αλλά θα δούμε πώς να γράψουμε τη δική μας προβολή, πρότυπο ηλεκτρονικού ταχυδρομείου, φόρμες και μοτίβα URL. Εδώ είναι η προβολή, στους χρήστες/views.py

# ... Εισαγωγές

Αυτή η φόρμα είναι ενσωματωμένη στο Django, αλλά θα χρειαστούμε ένα πρότυπο για να επιβεβαιώσουμε την επαναφορά κωδικού πρόσβασης, τους χρήστες/πρότυπα/χρήστες/password_reset_confirm.html

Έχουμε επίσης ένα πρότυπο για να στείλουμε ένα email επαναφοράς κωδικού πρόσβασης, με μια απλή φόρμα, σε χρήστες/πρότυπα/χρήστες/password_reset.html

Το πρότυπο για το ίδιο το μήνυμα ηλεκτρονικού ταχυδρομείου είναι απλό, είναι ένα βασικό αρχείο HTML που παρέχει έναν σύνδεσμο για την επαναφορά του κωδικού πρόσβασης, σε χρήστες/πρότυπα/χρήστες/password_reset_email.html. Το Django θα ερμηνεύσει αυτόματα αυτό το αρχείο.

Θα χρειαστούμε επίσης δύο ακόμη πρότυπα. Το πρώτο είναι να επιβεβαιώσει ότι το μήνυμα ηλεκτρονικού ταχυδρομείου έχει σταλεί. Οι απόψεις για αυτά είναι ήδη στο Django, οπότε πρέπει απλώς να τις αντιμετωπίσουμε στις διευθύνσεις URLS.Py. Αυτό το πρότυπο βρίσκεται στους χρήστες/πρότυπα/χρήστες/password_reset_done.html

Και τέλος, για να επιβεβαιώσετε ότι η επαναφορά κωδικού πρόσβασης είναι πλήρης, χρήστες/πρότυπα/χρήστες/password_reset_complete.html

Τώρα, χρειαζόμαστε μοτίβα URL για αυτές τις απόψεις. Στους χρήστες/URLS.PY, προσθέστε τα ακόλουθα πρότυπα διεύθυνσης URL:

    # ... Προηγούμενες διευθύνσεις URL εδώ

Τέσσερα πρότυπα, αυτό είναι πολύ! Αλλά τώρα μπορούμε να είμαστε σίγουροι ότι θα μπορέσουμε να επαναφέρουμε τον κωδικό πρόσβασης του χρήστη κάθε φορά που πρέπει να, όλοι από το πρόγραμμα περιήγησης στο Web.

Καταλαβαίνω ότι αυτό είναι πολύ κώδικας. Αν φαίνεται λίγο πάνω από το κεφάλι σας, αυτό είναι εντάξει. Θα βελτιώσετε, η κατανόησή σας θα βελτιωθεί και θα γίνετε πολύ πιο ικανός με τον κώδικα πολύ σύντομα. Εάν είστε εντελώς χαμένοι, σας συνιστώ να επιστρέψετε σε αυτό το λογισμικό αργότερα μετά από να εργαστείτε σε μια αυτο-ρυθμιζόμενη μάθηση για να κωδικοποιήσετε το μάθημα online. Αυτά είναι συνήθως ελεύθερα για να ξεκινήσετε και θα σας καθοδηγούν σε όλα όσα χρειάζεστε για να είστε επιτυχημένοι όταν επιστρέφετε σε αυτό το έργο. Εάν αισθάνεστε ότι είστε έτοιμοι να συνεχίσετε, να διαβάσετε παρακάτω, στη συνέχεια, θα καλύψουμε την ανάπτυξη του κώδικα σας σε έναν απομακρυσμένο διακομιστή και τη ρύθμιση ενός διακομιστή αλληλογραφίας, καθώς και την αυτοματοποίηση της ανάπτυξής σας χρησιμοποιώντας bash, ώστε να μπορείτε πάντα να δημιουργήσετε ένα νέο έργο με μερικές απλές εντολές.

Το τελευταίο πράγμα που πρέπει να κάνουμε πριν από την ανάπτυξη σε έναν απομακρυσμένο διακομιστή είναι να κάνει τον ιστότοπό μας λίγο πιο ασφαλή. Θα παρατηρήσετε ότι η προβολή σύνδεσης παίρνει μόνο ένα όνομα χρήστη και έναν κωδικό πρόσβασης και δεν υπάρχει έλεγχος ταυτότητας πολλαπλών συντελεστών ή ένας κωδικός χρόνου. Πρόκειται για μια εύκολη λύση και με τον ίδιο κωδικό, μπορούμε να κάνουμε τον ιστότοπό μας να στείλει μηνύματα κειμένου και ακόμη και να ανταποκρίνεται στα μηνύματα κειμένου που αποστέλλονται στο διακομιστή. Για να ξεκινήσουμε, θα επιστρέψουμε στα μοντέλα των χρηστών και θα προσθέσουμε έναν υπογραφή χρονομετρήσεων που θα αντιπροσωπεύει κάθε σύνδεση. Θα προσθέσουμε επίσης ένα μοναδικό, περιστρεφόμενο αναγνωριστικό στο μοντέλο χρήστη που θα χρησιμοποιηθεί για να προσθέσει επιπλέον ασφάλεια στη σύνδεσή μας. Επεξεργασία των μοντέλων χρηστών, των χρηστών/models.py, προσθέστε τον ακόλουθο κωδικό:

# Βεβαιωθείτε ότι έχετε εισαγάγει το UUID, το Timestamp Signer και το URL Generator (αντίστροφη)
    # Προσθέστε αυτόν τον κωδικό εδώ
    # Και προσθέστε αυτήν τη λειτουργία
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Ισχύει για 3 λεπτά

Βεβαιωθείτε ότι οι χρήστες/models.py σας μοιάζουν με αυτό, εκτός από τα σχόλια (κωδικός στις γραμμές με #). Σπάζοντας αυτό, είναι απλό. Έχουμε μερικές εισαγωγές, ένα timestampsigner που είναι μια κρυπτογραφική χρησιμότητα που μπορεί να δημιουργήσει έναν ασφαλή κώδικα και να το επαληθεύσει για να βεβαιωθείτε ότι είναι έγκυρο, χρησιμοποιήθηκε μόνο μία φορά και όχι παλαιότερη από ένα ορισμένο αριθμό δευτερολέπτων. Χρησιμοποιούμε επίσης ένα UUID, το οποίο είναι ένα μοναδικό αναγνωριστικό που προσδιορίζει τον χρήστη μας στην υπογραφή του διακριτικού και στη διεύθυνση URL όπου το διακριτικό αποστέλλεται στον χρήστη. Θα χρησιμοποιήσουμε αυτή τη βασική κρυπτογραφία για να δημιουργήσουμε μια προβολή ελέγχου ταυτότητας δύο συντελεστών. Πριν κάνουμε οτιδήποτε άλλο, ας τρέξουμε τις μεταναστεύσεις, ώστε τα μοντέλα χρηστών μας να ενημερώνονται. Στον κατάλογο με το manager.py, εκτελέστε τις ακόλουθες εντολές για να κάνετε και να ολοκληρώσετε τις μεταναστεύσεις.

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

Αυτό είναι σημαντικό επειδή κάθε φορά που κάνουμε αλλαγές στα μοντέλα, θα χρειαστεί να δημιουργήσουμε τους πίνακες και να ενημερώσουμε τη βάση δεδομένων με προεπιλογές πριν μπορέσουμε πραγματικά να χρησιμοποιήσουμε τα μοντέλα.

Στη συνέχεια, ας αυτοσχεδιάσουμε την προβολή σύνδεσής μας για να ανακατευθύνουμε σε μια δευτερεύουσα προβολή ελέγχου ταυτότητας. Στους χρήστες/προβολές.py, αφαιρέστε τη λειτουργία σύνδεσης και ανακατευθύνετε στη διεύθυνση URL που μόλις δημιουργήσαμε στα μοντέλα χρηστών.

# … Εισαγωγές
        if user and user.profile.can_login < timezone.now(): # Σημειώστε ότι τώρα ελέγξουμε εάν ο χρήστης μπορεί να συνδεθεί
            # Αφαιρέστε τη λειτουργία auth_login που ήταν εδώ
                return redirect(user.profile.create_auth_url()) # Σημειώστε ότι ανακατευθύνουμε σε μια νέα διεύθυνση URL εδώ
            else: # Εάν ο χρήστης δεν χρησιμοποιεί τον έλεγχο ταυτότητας πολλαπλών παραγόντων, απλώς συνδεθείτε.
        else: # Εάν η σύνδεση δεν ήταν επιτυχής,
            user = User.objects.filter(username=username).first() # Αυτό είναι το μέρος όπου ενημερώνουμε το προφίλ των χρηστών
                profile.can_login = timezone.now() + datetime.timedelta(seconds=15) # Έτσι δεν μπορούν να συνδεθούν ξανά για μερικά δευτερόλεπτα

Έτσι, αυτό είναι πολύ απλό, έχουμε τώρα έναν τρόπο ανακατεύθυνσης στην προβολή ταυτότητας των δύο συντελεστών όταν το δημιουργούμε. Έχουμε επίσης ένα fallback σε περίπτωση που ο χρήστης δεν έχει προσθέσει έναν αριθμό τηλεφώνου. Θα προσθέσουμε σύντομα μια βασική προβολή για να προσθέσουμε έναν αριθμό τηλεφώνου και να συνδεθείτε σύντομα με ένα μήνυμα κειμένου.

Πρώτον, χρειαζόμαστε έναν εύκολο τρόπο για να στείλουμε ένα μήνυμα κειμένου από τον κωδικό μας. Για να γίνει αυτό, μπορούμε να επιλέξουμε από έναν αριθμό API, αλλά το πιο εύκολο κατά τη γνώμη μου είναι το Twilio. Προσφέρουν επίσης καλή τιμολόγηση για μικρότερα έργα, καθώς και χύδην εκπτώσεις. Δημιουργήστε έναν λογαριασμό στο twilio.com, συμπληρώστε μερικές λεπτομέρειες σχετικά με το έργο σας, αγοράστε έναν αριθμό τηλεφώνου και αντιγράψτε τα κλειδιά API στις ρυθμίσεις σας.py. Στη συνέχεια, προσθέστε αυτόν τον κώδικα κάτω από ένα νέο αρχείο, χρήστες/SMS.PY.

nano users/sms.py
# Εισαγάγετε όλα τα απαραίτητα πακέτα
# Αυτός ο κωδικός στέλνει το κείμενο με το Twilio
# Μια λειτουργία βοηθού για να αποκτήσετε έναν αριθμό με τόσα πολλά ψηφία
# Στείλτε το κείμενο για να επαληθεύσετε τον χρήστη
# Στείλτε έναν χρήστη οποιοδήποτε κείμενο με αυτήν τη λειτουργία
# Επικυρώστε τον κώδικα με αυτήν τη λειτουργία
# Επικυρώστε την ώρα

Βεβαιωθείτε ότι έχετε αλλάξει κατάλληλα τις ρυθμίσεις σας, προσθέτοντας αυτές τις γραμμές με τα κλειδιά σας:

# Βεβαιωθείτε ότι έχετε αντιγράψει αυτά από τον πίνακα ελέγχου Twilio
AUTH_VALID_MINUTES = 3 # Ο αριθμός των λεπτών που η σελίδα TFA είναι ενεργή μόλις δημιουργηθεί

Πρώτον, θα χρειαστούμε φόρμες για τις προβολές ταυτότητας των δύο συντελεστών. Επεξεργασία χρηστών/forms.py, προσθέστε τον ακόλουθο κωδικό.

# … Εισαγωγές
# Μια φόρμα για την είσοδο στον αριθμό τηλεφώνου μας
# Μια φόρμα για τον έλεγχο ταυτότητας

Στη συνέχεια, ας δημιουργήσουμε τις προβολές στους χρήστες/views.py

# … Εισαγωγές

Θα χρειαστούμε επίσης πρότυπα και για τις δύο αυτές απόψεις. Ας προσθέσουμε πρώτα το πρότυπο MFA.

nano users/templates/users/mfa.html

Προσθέστε αυτόν τον κωδικό HTML στο πρότυπο

Αυτό είναι αρκετά αυτονόητο. Η φόρμα στέλνει είτε έναν κωδικό είτε έναν κενό κωδικό και θα παρατηρήσετε στην προβολή που στέλνουμε τον κωδικό εάν λάβουμε έναν κενό κωδικό. Στη συνέχεια, έχουμε μόνο δύο κουμπιά υποβολής και έτσι μπορούμε να στείλουμε τον κωδικό με οποιοδήποτε κουμπί. Στη συνέχεια, θα προσθέσουμε μια απλή φόρμα για να προσθέσετε έναν αριθμό τηλεφώνου.

nano users/templates/users/mfa_onboarding.html

Προσθέστε τα ακόλουθα HTML:

Αυτή η φόρμα είναι πολύ απλούστερη, απλώς καθιστά τη φόρμα αριθμού τηλεφώνου που δημιουργήσαμε και επιτρέπει στον χρήστη να προσθέσει έναν αριθμό τηλεφώνου.

Αυτό φαίνεται πολύ καλό! Εφόσον όλα έχουν ρυθμιστεί σωστά, θα πρέπει να μπορούμε να στείλουμε μηνύματα και να καταγράψουμε τον χρήστη με τον αριθμό τηλεφώνου τους μόλις προσθέσουμε τα πρότυπα URL. Το τελευταίο πράγμα που πρέπει να δημιουργήσουμε είναι μια προβολή προφίλ, ώστε να μπορέσουμε να βεβαιωθούμε ότι ο χρήστης μπορεί να αλλάξει τον αριθμό τηλεφώνου του χωρίς να συνδεθεί. Επίσης, τελικά θα θέλουμε να προσθέσουμε μια επιλογή "Stop to Quit", ώστε ο χρήστης να μπορεί να "σταματήσει" για να αποχωρήσει από τα μελλοντικά μηνύματα κειμένου.

Ας προσθέσουμε μια προβολή προφίλ στους χρήστες/views.py. Αυτή η προβολή θα ενημερώσει το βιογραφικό, το ηλεκτρονικό ταχυδρομείο, το όνομα χρήστη και τον αριθμό τηλεφώνου του χρήστη, καθώς και θα μας επιτρέψει να επιτρέψουμε την ταυτοποίηση πολλαπλών παραγόντων. Πρώτον, θα χρειαστούμε δύο ακόμη έντυπα στους χρήστες/forms.py

# ... Εισαγωγές

Στη συνέχεια, μπορούμε να δημιουργήσουμε μια προβολή για να χρησιμοποιήσουμε και τις δύο αυτές μορφές. Επεξεργαστείτε τους χρήστες/προβολές.py και προσθέστε την προβολή.

# Προσθέστε αυτές τις εισαγωγές

Θα χρειαστούμε επίσης ένα πρότυπο για αυτήν την προβολή.

nano users/templates/users/profile.html

Θα παρατηρήσετε ότι πρόκειται για μια αρκετά απλή μορφή, αλλά έχει κάποια JavaScript σε αυτό που δημοσιεύει αυτόματα το περιεχόμενο της φόρμας καθώς ενημερώνονται. Αυτό είναι χρήσιμο για να έχετε, οπότε είστε σε θέση να κάνετε επεξεργασίες χωρίς να χρειάζεται να πιέσετε την υποβολή κάθε φορά.

Στη συνέχεια, χρειαζόμαστε διευθύνσεις URL που αντιπροσωπεύουν όλες αυτές τις απόψεις στους χρήστες. Επεξεργασία χρηστών/URLS.PY και προσθέστε αυτόν τον κωδικό:

# … Προηγούμενο κωδικό, εισαγωγές
# … Μοτίβα URL που εισαγάγαμε στο παρελθόν, προσθέστε τις επόμενες τρεις γραμμές

Τώρα είναι μια καλή στιγμή για να δοκιμάσετε το έργο μας. Αλλά πρώτα, ας τρέξουμε ένα άλλο αντίγραφο ασφαλείας.

backup

Και εκτελέστε το διακομιστή. Πριν αναπτύξουμε σε ένα διακομιστή Linux, είναι καλή ιδέα να ενεργοποιήσετε τον έλεγχο ταυτότητας δύο παράγοντα στο λογαριασμό. Θα το κάνουμε αυτό πηγαίνοντας στη διεύθυνση URL, τους χρήστες/προφίλ/προφίλ/, και να ελέγξουμε το πλαίσιο για να ενεργοποιήσουμε τον έλεγχο ταυτότητας μετά την είσοδο στον αριθμό τηλεφώνου μας και στη συνέχεια στην υποβολή της φόρμας.

python manage.py runserver localhost:8000

Επισκεφθείτε την ιστοσελίδα πηγαίνοντας στο πρόγραμμα περιήγησης ιστού σας, χρησιμοποιώ το Google Chrome σε αυτό το παράδειγμα και εισάγοντας το URL https: // localhost: 8000/λογαριασμούς/προφίλ/

Θα είστε σε θέση να συνδεθείτε εάν είναι απαραίτητο και να ενεργοποιήσετε τον έλεγχο ταυτότητας δύο συντελεστών.

Αυτό το έργο χρειάζεται έναν διακομιστή για να εκτελέσει, ώστε να μπορεί πραγματικά να στείλει αλληλογραφία. Αλλά πρώτα, χρειαζόμαστε έναν τρόπο να δούμε σφάλματα. Θα παρατηρήσετε ότι εάν εκτελέσετε τον διακομιστή σε λειτουργία εντοπισμού σφαλμάτων, με τις ρυθμίσεις. Debug ίσο με το True, ο διακομιστής εμφανίζει αυτόματα σφάλματα. Για να εμφανίσετε σφάλματα χωρίς να χρησιμοποιείτε τη λειτουργία εντοπισμού σφαλμάτων, η οποία δεν είναι ασφαλής σε έναν διακομιστή παραγωγής, θα πρέπει να προσθέσουμε μια προβολή για αυτό. Τα πιο σημαντικά σφάλματα που πρέπει να είμαστε σε θέση να χειριστούμε είναι:

Σφάλμα 500 - ένα πρόβλημα με τον κωδικό μας Σφάλμα 404 - Μια σελίδα που δεν βρέθηκε (σπασμένη διεύθυνση URL) Σφάλμα 403 - Ένα σφάλμα που απορρίπτεται άδεια

Ας προσθέσουμε μια νέα εφαρμογή για να χειριστείτε αυτά τα σφάλματα, που ονομάζονται σφάλματα.

python manage.py startapp errors

Προσθέστε αυτό στο settings.py όπως κάναμε πριν, στη ρύθμιση installed_apps και ξεκινήστε προσθέτοντας αναφορές σε ορισμένες προβολές στο app/urls.py, όπου η εφαρμογή είναι το όνομα του έργου σας django.

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

Αυτό είναι το μόνο που χρειαζόμαστε εκτός από τις προβολές σφάλματος, τα πρότυπα και λίγο middleware. Ας το ορίσουμε ως εξής:

# Δημιουργήστε τις απόψεις σας εδώ.

Στη συνέχεια, ας καθορίσουμε το middleware για να χειριστούμε αυτά τα σφάλματα. Θα το κάνουμε αυτό πρώτα προσθέτοντας στο middleware_classes στο settings.py, με το όνομα του middleware μας.

    # ... Προηγούμενο middleware

Στη συνέχεια, ας προσθέσουμε το 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.')

Προσθέτουμε μια λειτουργία για να λάβουμε την τρέχουσα εξαίρεση χρησιμοποιώντας ένα τοπικό σπειρώματος, το οποίο μας βοηθά να εντοπίσουμε τυχόν σφάλματα στον κώδικα μας. Από την άποψη των προτύπων, χρειαζόμαστε μόνο ένα, επειδή ορίζουμε δυναμικά τον τίτλο στην άποψη. Το πρότυπο πρέπει απλώς να καταστήσει τον τίτλο και το "ίχνος", το σφάλμα μας από το πλαίσιο.

nano errors/templates/errors/error.html

Αυτό είναι το απλούστερο πρότυπο μας ακόμα, αλλά έτσι είναι να δούμε τα σφάλματα στο έργο μας. Στη συνέχεια, ας απενεργοποιήσουμε το Debug στις ρυθμίσεις.

nano app/settings.py

Βρείτε αυτή τη γραμμή όπου έχει οριστεί σε αληθινή και αλλάξτε το σε ψευδές

DEBUG = False

Προχωρήστε και δημιουργήστε αντίγραφα ασφαλείας της εφαρμογής τώρα. Είμαστε έτοιμοι να αναπτύξουμε σε έναν απομακρυσμένο διακομιστή Linux και να συνεχίσουμε να προσθέτουμε χαρακτηριστικά από εκεί.

sudo backup

Πριν δημοσιεύσουμε αυτόν τον κώδικα σε έναν διακομιστή, θα πρέπει να θεωρήσουμε ότι ενδέχεται να υπάρχουν κάποια προβλήματα με τον κώδικα. Ανάλογα με την υπόθεση, οι ιστότοποι που αποδέχονται πληροφορίες που δημοσιεύονται σε αυτούς θα έχουν προβλήματα με το spam να δημοσιεύονται και δυσκολία στην αφαίρεση του ανεπιθύμητου μηνύματος. Αυτό δεν πρέπει να συμβεί αμέσως, αλλά αν συμβεί, αργότερα θα εξετάσουμε πώς θα μετριάσουμε αυτόματα το spam στον ιστότοπο και θα το καταστήσουμε πιο σκληρό για την πρόσβαση στον ιστότοπο, μαζί με τον τρόπο απενεργοποίησης των λογαριασμών χρηστών και την επαλήθευση της ταυτότητας ενός χρήστη με σάρωση της ταυτότητάς τους ή μια βιομετρική σάρωση, όπως ένα δακτύλιο ή αναγνώριση προσώπου.

Εξετάζοντας το παράδειγμα ελέγχου ταυτότητας πολλαπλών παραγόντων που εξετάσαμε, στην παραγωγή, τα πράγματα μπορεί να είναι διαφορετικά. Παρατηρήστε πώς περιορίζουμε τις συνδέσεις και τα μάρκες λήξης. Εάν τα ρομπότ έχουν πρόσβαση σε έναν ιστότοπο, ο έλεγχος ταυτότητας δύο παραγόντων μπορεί να είναι πιο δύσκολος, καθώς μπορούν να εισάγουν κωδικούς ταυτόχρονα ο χρήστης είναι. Για να καταπολεμήσουμε αυτό, ας χρησιμοποιήσουμε ένα μοντέλο στα μοντέλα χρηστών, δηλώνοντας τον τρόπο αλληλεπίδρασης με τον ιστότοπο όταν επικυρώσουμε τη χρήση ταυτότητας πολλαπλών συντελεστών με έναν αριθμό τηλεφώνου. Θα προσθέσουμε επίσης μια επιλογή για τον έλεγχο ταυτότητας με email. Ξεκινήστε με την επεξεργασία των μοντέλων χρηστών με το Nano.

nano users/models.py

Αυτό πρέπει να μοιάζει με το μοντέλο που προσθέτουμε. Δεν χρειαζόμαστε μεθόδους, μόνο μεταβλητές για την αποθήκευση ενός αναγνωριστικού, του χρήστη, της χρονικής σήμανσης, της λήξης, του μήκους και των προσπαθειών έναντι οποιουδήποτε ελέγχου ταυτότητας πολλαπλών συντελεστών (ένας κωδικός όπως 123456 που αποστέλλεται σε τηλέφωνο ή email).

# Ένα βασικό διακριτικό που χρησιμοποιείται για να συνδεθεί στον ιστότοπο

Ας προσθέσουμε επίσης ένα προνόμιο στον χρήστη μας και θα το θέσουμε με το χέρι για τώρα, πριν τελικά μεταναστεύσουμε για να προσελκύσουμε αυτόματα τους προνομιούχους χρήστες. Στα μοντέλα χρηστών, προσθέστε αυτήν τη γραμμή στο προφίλ:

    vendor = models.BooleanField(default=False)

Όπως συμβαίνει με οποιεσδήποτε αλλαγές στη βάση δεδομένων, πρέπει να κάνουμε μεταναστεύσεις και να μεταφέρουμε τη βάση δεδομένων κάθε φορά που επεξεργάζουμε ένα αρχείο Models.py στο Django. Θυμηθείτε, για να το κάνετε αυτό χρησιμοποιούμε πρώτα την πηγή (αν δεν έχει χρησιμοποιηθεί ήδη από τότε που ο τερματικός σταθμός ήταν ανοιχτός) και στη συνέχεια η Python manage.py για να κάνει τις μεταναστεύσεις και να μεταναστεύσει.

cd project-directory-you-named # (αν χρειαστεί)

Προς το παρόν, μπορείτε να προσελκύσετε τους λογαριασμούς που έχετε δημιουργήσει ως πωλητές χρησιμοποιώντας το κέλυφος.

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

Τώρα, ας εξελίξουμε την προβολή ελέγχου ταυτότητας πολλαπλών συντελεστών για να χρησιμοποιήσουμε αυτό το διακριτικό. Πρώτον, πρέπει να τροποποιήσουμε τα βοηθητικά προγράμματα MFA. Χρησιμοποιώντας νανο,

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
# Πιστοποίηση του χρήστη χρησιμοποιώντας το email ή τον αριθμό τηλεφώνου του
    token = MFAToken.objects.filter(uid=username, expires__gt=timezone.now() + datetime.timedelta(seconds=30)).order_by('-timestamp').last() # Φιλτράρετε το διακριτικό με την τιμή που πέρασε στη διεύθυνση URL (uuid)
    if not token: token = MFAToken.objects.create(user=User.objects.filter(profile__uuid=username).first(), uid=username, expires=timezone.now() + datetime.timedelta(seconds=115)) # Εάν δεν έχει δημιουργηθεί αυτή η συνεδρία, δημιουργήστε την
    user = User.objects.filter(id=token.user.id).first() # Αποκτήστε τον χρήστη από το διακριτικό
    if not user and request.user.is_authenticated: return redirect(reverse('feed:home')) # Εάν έχουν ήδη πιστοποιηθεί, καταγράψτε τα
    if not user: raise PermissionDenied() # Αρνείται εάν δεν βρέθηκε χρήστης
    if not user.profile.enable_two_factor_authentication and user.is_active and user.profile.check_auth_token(usertoken, token): # Ελέγξτε το διακριτικό Auth
        auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Συνδεθείτε στο χρήστη εάν δεν έχουν ήδη συνδεθεί
        user.profile.mfa_expires = timezone.now() + datetime.timedelta(minutes=settings.LOGIN_VALID_MINUTES) # Ορίστε μια λήξη στον έλεγχο ταυτότητας πολλαπλών συντελεστών
        return HttpResponseRedirect(next if next != '' else reverse('landing:landing')) # Ανακατευθύνετε τον χρήστη στην επόμενη σελίδα
    if not user.profile.mfa_enabled: # Ελέγξτε εάν το MFA είναι ενεργοποιημένο
        if not check_verification_time(user, token): # Ελέγξτε την ώρα
            user.profile.mfa_enabled = False # Καθαρίστε τον αριθμό τηλεφώνου
            user.profile.enable_two_factor_authentication = True # Ενεργοποίηση MFA
            user.profile.phone_number = '+1' # Απενεργοποιήστε τον αριθμό τηλεφώνου
            user.profile.save() # Αποθηκεύστε το προφίλ
            auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Συγκεντρώστε τον χρήστη εάν το MFA δεν είναι ενεργοποιημένο
    if request.method == 'POST' and not fraud_detect(request, True): # Εάν το αίτημα είναι ένα αίτημα δημοσίευσης
        form = TfaForm(request.POST) # Παράλληλα τη φόρμα
        code = str(form.data.get('code', None)) # Λάβετε τον κωδικό
        if code and code != '' and code != None: # Βεβαιωθείτε ότι δεν είναι άδειο
            token_validated = user.profile.check_auth_token(usertoken) # Ελέγξτε το διακριτικό Auth
            is_verified = check_verification_code(user, token, code) # Ελέγξτε τον κωδικό
            if token_validated: # Εάν όλα
                if is_verified: # Είναι σε τάξη
                    user.profile.mfa_enabled = True # Ενεργοποιήστε το MFA (αν δεν έχει ήδη ενεργοποιηθεί)
                    auth_login(request, user, backend='django.contrib.auth.backends.ModelBackend') # Συνδεθείτε στον χρήστη
                    for key, value in request.GET.items(): # Δημιουργήστε ένα querystring για την επόμενη παράμετρο (εάν υπάρχει)
                        return HttpResponseRedirect(next) # Διευθύνω πάλιν
            elif not token_validated: # Εάν το διακριτικό ήταν άκυρο
            if p.mfa_attempts > 3: # Εάν υπήρχαν πάρα πολλές προσπάθειες
            if form.data.get('send_email', False): # Στείλτε το email (ή κείμενο)
    # Καθιστά τη φόρμα (για αιτήσεις λήψης)

Όταν προσθέτουμε σε αυτόν τον κώδικα, φροντίστε να εισαγάγετε τη λειτουργία για να στείλετε ένα μήνυμα ηλεκτρονικού ταχυδρομείου. Στο επάνω μέρος του αρχείου, οι προβολές χρήστη (με άλλες εισαγωγές), προσθέστε

from .mfa import send_verification_email as send_mfa_verification_email

Τώρα, πρέπει να γράψουμε αυτή τη λειτουργία πριν από κάτι τέτοιο θα λειτουργήσει. Θα πρέπει να επεκτείνει τη λειτουργία αποστολής ηλεκτρονικού ταχυδρομείου και απλά να στείλει ένα μήνυμα ηλεκτρονικού ταχυδρομείου στον χρήστη με τον κωδικό επαλήθευσης.

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

Έτσι, όλα αυτά λειτουργούν εξαιρετικά, τώρα έχουμε ένα σύστημα ελέγχου ταυτότητας πολλαπλών συντελεστών που εξαρτάται από έναν αριθμό τηλεφώνου ή ένα ηλεκτρονικό ταχυδρομείο για να συνδεθείτε. Αλλά χρειαζόμαστε επίσης έναν τρόπο να καταργήσουμε ή τουλάχιστον να αποκρύψουμε χρήστες που δεν συνεργάζονται με τους όρους μας. Αυτά θα μπορούσαν να είναι spammers, ρομπότ ή οποιοσδήποτε δεν σημαίνει καλά για τη δουλειά μας. Ρίξτε μια ματιά σε μια άποψη που έχω για την παρακολούθηση των χρηστών στον ιστότοπό μου:

# εισαγωγές
from .tests import is_superuser_or_vendor # Θα χρειαστεί να δημιουργήσουμε αυτήν τη δοκιμή
    # Λάβετε λίστα χρηστών
    return render(request, 'users/users.html', { # Επιστρέψτε τους χρήστες σε ένα πρότυπο

Σημειώστε ότι αυτός ο κώδικας χρησιμοποιεί μια δοκιμή, θα πρέπει να δηλώσουμε αυτό το τεστ σε ένα αρχείο tests.py και να το εισαγάγει. Επεξεργασία χρηστών/tests.py, ας δημιουργήσουμε τη δοκιμή.

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

Αυτό είναι σε συνδυασμό με το πρότυπο Users/Users.html, το οποίο μοιάζει με αυτό:

Σημειώστε ότι το πρότυπο περιλαμβάνει ένα άλλο πρότυπο, χρήστες/user.html. Όταν χρησιμοποιείτε ένα πρότυπο που έχει ένα υπότιτλο και δεν χρησιμοποιεί επεκτάσεις, είναι καλή ιδέα να προσθέσετε μια υπογράμμιση () πριν από το όνομα του αρχείου να επεκταθεί, προκειμένου να διακριθούν τα πρότυπα.

Σημειώστε ότι αυτό είναι πολύ jinja, ίσως να μην έχετε όλες αυτές τις μεταβλητές καθορισμένες. Αλλά αυτό μοιάζει με τον κωδικό μου.

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

Χρειαζόμαστε επίσης ένα άλλο υπολείμμα, toggle_active.html. Αυτό το πρότυπο θα πρέπει να είναι μια φόρμα που μας επιτρέπει να αλλάζουμε αν ένας χρήστης είναι ενεργός.

Θα χρειαστεί επίσης να προσθέσουμε μια προβολή για την εναλλαγή της δραστηριότητας των χρηστών και τα κατάλληλα μοτίβα URL. Ενώ είμαστε σε αυτό, ας προσθέσουμε μια προβολή για να διαγράψουμε έναν χρήστη σε περίπτωση που χρειαζόμαστε αυτό.

# Εισαγωγές
    success_url = '/' # Η ανακατεύθυνση στην επιτυχία URL
    def test_func(self): # Δοκιμάστε εάν ο χρήστης είναι superuser και έχει άδεια διαγραφής

Ενώ αυτό είναι πρακτικό όταν είναι απαραίτητο, η διαγραφή ενός χρήστη δεν πρέπει να είναι απαραίτητη τις περισσότερες φορές, μπορούμε απλώς να αλλάξουμε την ορατότητα των χρηστών που επισκέπτονται τον ιστότοπο, αν χρειαστεί να τους απορρίψουμε.

Τα μοτίβα URL που προσθέσαμε μοιάζουν με αυτό. Με το Nano, επεξεργαστείτε τους χρήστες/URLS.PY και προσθέστε αυτές τις γραμμές:

nano users/urls.py

Οι γραμμές πρέπει να μεταβούν στη λίστα των διαδρομών στις προβολές του χρήστη, πριν από το τέλος "]" αλλά μετά την αρχή "[".

# …
# …

Τώρα, φροντίστε να δημιουργήσετε αντίγραφα ασφαλείας του ιστότοπου, ώστε να μπορείτε να τον κατεβάσετε στον διακομιστή ιστού στον οποίο θα συνεχίσουμε να εργαζόμαστε. Από τη γραμμή εντολών,

sudo backup

Τώρα ο ιστότοπός μας υποστηρίζεται.

Τώρα λοιπόν έχουμε μερικά ακόμη χρήσιμα χαρακτηριστικά. Αλλά τι γίνεται με τη μεγάλη εικόνα εδώ; Αυτός ο κώδικας εξακολουθεί να μην είναι προσβάσιμος από το Διαδίκτυο, δεν έχουμε ακόμη διακομιστή αλληλογραφίας και πρέπει να επεκτείνουμε την εφαρμογή μας για να συμπεριλάβουμε ολοκληρωμένη διαδικασία επαλήθευσης καθώς και ομαλές διατάξεις για να μας βοηθήσουν να διερευνήσουμε τον ιστότοπο, μαζί με ασφαλή πρωτόκολλα για την ταυτοποίηση των προνομιούχων χρηστών.

Θα φτάσουμε σε όλα αυτά. Το πιο σημαντικό πράγμα για τώρα θα είναι απλώς να πάρει αυτόν τον κώδικα online, τον οποίο μπορούμε να κάνουμε με λίγες γραμμές bash σε ένα διακομιστή Ubuntu. Θα χρειαστεί να νοικιάσετε ένα διακομιστή για αυτό, αν δεν έχετε διακομιστή στο σπίτι και μια συνδρομή επιχειρηματικού διαδικτύου που σας επιτρέπει να ανοίξετε τις θύρες. Εγώ προσωπικά τρέχω τον ιστότοπό μου σε ένα HP Z440 που είναι εγκατεστημένο στο διαμέρισμά μου, αλλά είναι συνήθως πολύ φθηνότερο για βασικές ανάγκες να νοικιάσετε έναν εικονικό ιδιωτικό διακομιστή (VPS).

Λάβετε υπόψη ότι ο κώδικας που τρέχουμε τώρα είναι σχετικά λεπτός, θα πρέπει να διατηρηθεί και να βελτιωθεί πριν είμαστε έτοιμοι να χρησιμοποιήσουμε αυτό που πρέπει να οικοδομήσουμε ένα προϊόν. Βεβαιωθείτε ότι είστε προσεκτικοί τι κάνετε με το Διαδίκτυο, βεβαιωθείτε ότι αν αναπτύξετε αυτόν τον ιστότοπο δημοσίως στον ιστό σε ένα διακομιστή Linux, έχετε ένα σχέδιο για να αποκλείσετε ανεπιθύμητες αλληλεπιδράσεις με τον ιστότοπό σας. Αυτό πιθανότατα δεν θα είναι ένα πρόβλημα στην αρχή, αλλά θα εξετάσουμε μια ποικιλία λύσεων για την καταπολέμηση αυτού, συμπεριλαμβανομένης της μηχανικής μάθησης, της τεχνητής νοημοσύνης και της όρασης του υπολογιστή. Όταν γίνεται πρόβλημα, κοιτάξτε περαιτέρω σε αυτό το κείμενο για μια λύση.

Όσον αφορά την ενοικίαση ενός VPS, υπάρχουν πολλά μέρη που μπορείτε να πάτε. Το Google Cloud διαθέτει διακομιστές VPS, Ionos, Kamatera, Amazon AWS και περισσότεροι πάροχοι προσφέρουν λύσεις cloud server που θα ταιριάζουν στις ανάγκες μας.

Θα χρειαστεί να κάνετε κλικ μέσω των εντύπων τους και να επιλέξετε ένα σχέδιο για να ξεκινήσετε. Μπορείτε να πάτε με ένα βασικό σχέδιο με οποιονδήποτε πάροχο, αλλά βεβαιωθείτε ότι ο πάροχος σας επιτρέπει να ανοίξετε τις θύρες διακομιστή αλληλογραφίας θύρας για να στείλετε email (αυτό θα πρέπει να είναι θύρα 587 και θύρα 25), ορισμένοι πάροχοι εμποδίζουν αυτές τις θύρες. Μέχρι στιγμής είχα την καλύτερη εμπειρία με τους Ionos και Kamatera, και οι δύο θα μου επιτρέψουν να στείλω απεριόριστο μήνυμα ηλεκτρονικού ταχυδρομείου και η τιμολόγησή τους είναι αρκετά φθηνή.

Θα συνδεθείτε με το νέο σας διακομιστή μέσω ενός πρωτοκόλλου που ονομάζεται SSH ή Secure Shell, το οποίο σας επιτρέπει να διασυνδέετε απομακρυσμένα με το διακομιστή ακριβώς όπως ο προσωπικός σας υπολογιστής, από τον προσωπικό σας υπολογιστή. Όταν ρυθμίζετε το διακομιστή, ο πάροχος φιλοξενίας είναι πιθανό να σας ζητήσει να προσθέσετε ένα κλειδί SSH ή θα σας δώσουν ένα όνομα χρήστη και έναν κωδικό πρόσβασης. Το πλήκτρο SSH είναι πώς θα συνδεθείτε στο διακομιστή από τη γραμμή εντολών για να επεξεργαστείτε τον κώδικα. Χρησιμοποιήστε τις παρακάτω επιλογές SSH-Keygen για να δημιουργήσετε ένα πλήκτρο SSH.

ssh-keygen

Αποθηκεύστε το αρχείο και το αντικαταστήστε αν χρειαστεί, είναι καλό να περιστρέψετε τα πλήκτρα SSH εάν δεν το έχετε ήδη. Τώρα, μπορείτε να χρησιμοποιήσετε την ακόλουθη εντολή για να δείτε το κλειδί SSH. Θα θελήσετε να το αντιγράψετε στον απομακρυσμένο διακομιστή σας, ώστε να μπορείτε να το χρησιμοποιήσετε για να πιστοποιήσετε.

cat ~/.ssh/id_rsa.pub

Εάν δεν είχατε τη δυνατότητα να δείτε ένα κλειδί SSH κατά την πληκτρολόγηση αυτής της εντολής (μια μακρά σειρά ψηφίων και επιστολών ξεκινώντας από το "SSH-RSA AAA"), προσπαθήστε να δημιουργήσετε ένα κλειδί RSA (είναι πιο ασφαλείς, γι 'αυτό συμβουλεύω να τα χρησιμοποιήσω.) Ο ακόλουθος κώδικας θα δημιουργήσει ένα κλειδί RSA 4096 bit.

ssh-keygen -t rsa -b 4096

Δημιουργήστε ένα VPS που τρέχει το Ubuntu, ωστόσο σχεδιάζετε να το κάνετε αυτό. Αφού δημιουργήσετε ένα VPS κάνοντας κλικ μέσω των έντυπων στην ιστοσελίδα των παρόχων (kamatera.com, ionos.com ή παρόμοιο), θα θελήσετε να συνδεθείτε. Για να το κάνετε αυτό, χρησιμοποιήστε την εντολή SSH με τη διεύθυνση IP σας (η διεύθυνση που μοιάζει με xx.xx.xx.xx). Θα πρέπει επίσης να είστε ευαίσθητοι στο προεπιλεγμένο όνομα χρήστη στο διακομιστή που δημιουργήσαμε, για παράδειγμα, Ubuntu.

ssh ubuntu@XX.XX.XX.XX

Μπορεί να σας ζητηθεί κωδικός πρόσβασης, εάν σας ζητηθεί ένας κωδικός πρόσβασης, εισαγάγετε τον. Δεν θα χρησιμοποιήσουμε το προεπιλεγμένο όνομα χρήστη, οπότε ας ξεκινήσουμε δημιουργώντας ένα νέο χρήστη και προσθέτοντας ένα κλειδί SSH στο λογαριασμό τους.

Ας ξεκινήσουμε προσθέτοντας ένα νέο αρχείο SSHD_CONFIG, το οποίο λέει στον διακομιστή πώς να χρησιμοποιήσετε το SSH.

nano sshd_config
# Αυτό είναι το αρχείο διαμόρφωσης του συστήματος SSHD Server.  Βλέπω
# sshd_config (5) για περισσότερες πληροφορίες.
# Αυτό το SSHD καταρτίστηκε με διαδρομή =/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
# Η στρατηγική που χρησιμοποιείται για τις επιλογές στο προεπιλεγμένο SSHD_CONFIG αποστέλλεται με
# Το OpenSsh πρέπει να καθορίσει επιλογές με την προεπιλεγμένη τιμή τους όπου
# Πιθανό, αλλά αφήστε τους να σχολιάσει.  Οι μη ενσωματωμένες επιλογές παρακάμψουν το
# προεπιλεγμένη τιμή.
# Λιμάνι 22
# Addressfamily
# ListenDdress 0.0.0.0
# Ακρόαση ::
# Hostkey/etc/ssh/ssh_host_rsa_key
# Hostkey/etc/ssh/ssh_host_ecdsa_key
# Hostkey/etc/ssh/ssh_host_ed25519_key
# Κρυπτογράφηση και πληκτρολόγηση
# RekeyLimit Default
# Ξύλευση
# Syslogfacility auth
# Πληροφορίες λογότυπου
# Πιστοποίηση:
# Logingracetime 2m
# PERTITROOTLOGIN Απαγόρευση-λέξη
# StrictModes ναι
# Maxauthtries 6
# Maxsessions 10
# Αναμείνετε.
# Εξουσιοδοτημένο principalsfile κανένα
# Εξουσιοδοτημένο KeysCommand
# Εξουσιοδοτημένο KeysCommandUser κανείς
# Για να λειτουργήσει αυτό, θα χρειαστείτε επίσης κλειδιά κεντρικού υπολογιστή σε/etc/ssh/ssh_known_hosts
# Hostbasedauthentication Όχι
# Αλλαγή σε ναι αν δεν εμπιστεύεστε ~/.ssh/known_hosts για
# HostBasedauthentication
# Ignoreuserknownhosts Όχι
# Μην διαβάζετε τα αρχεία του χρήστη ~/.rhosts και ~/.
# Ignorerhosts Ναι
# Για να απενεργοποιήσετε τους κωδικούς πρόσβασης κειμένου, αλλάξτε όχι εδώ!
# Permitempsypasswords Όχι
# Αλλαγή σε ναι για να ενεργοποιήσετε τους κωδικούς πρόσβασης-απόκρισης (προσέξτε τα προβλήματα με
# Μερικές μονάδες PAM και νήματα)
# Επιλογές Kerberos
# Kerberosauthentication Όχι
# Kerberosorlocalpasswd Ναι
# KerberosticketCleanup Ναι
# Kerberosgetafstoken Όχι
# Επιλογές GSSAPI
# Gssapiauthentication Όχι
# GSSAPICLeanUpcredentials Ναι
# Gssapistrictacceptorcheck Ναι
# Gssapikeyexchange όχι
# Ορίστε αυτό σε «ναι» για να ενεργοποιήσετε την επαλήθευση ταυτότητας PAM, την επεξεργασία λογαριασμών,
# και επεξεργασία συνεδριών. Εάν αυτό είναι ενεργοποιημένο, ο έλεγχος ταυτότητας PAM θα
# επιτρέπεται μέσω της kbdinteractiveAuthentication και
# Passwordauthentication.  Ανάλογα με τη διαμόρφωση PAM,
# Ο έλεγχος ταυτότητας PAM μέσω KBDinteractiveAuthentication μπορεί να παρακάμψει
# Η ρύθμιση του "Permitrootlogin Without-Password".
# Εάν θέλετε απλώς τον λογαριασμό PAM και τους ελέγχους συνεδρίας να εκτελούνται χωρίς
# Ο έλεγχος ταυτότητας PAM, στη συνέχεια, ενεργοποιήστε αυτό, αλλά ορίσετε τον κωδικό πρόσβασης
# και kbdinteractiveauthentication στο «όχι».
# Lelenagentforwarding ναι
# Learttcpforwarding Ναι
# Gatewayports Όχι
# X11DisplayOffset 10
# X11Uselocalhost Ναι
# Επιτρεπόμενη ναι
# Printlastlog Ναι
# Tcpkeepalive Ναι
# Το περιβάλλον αδειοδότησης
# Καθυστερημένη συμπίεση
# ClientAliveinterval 0
# Clientalivecountmax 3
# Χρησιμοποιείται όχι
# Pidfile /run/sshd.pid
# Maxstartups 10: 30: 100
# ΔΗΜΙΟΥΡΓΙΑΣ ΟΧΙ
# Κανένα
# None
# Δεν υπάρχει προεπιλεγμένη διαδρομή banner
# Επιτρέψτε στον πελάτη να περάσει μεταβλητές περιβάλλοντος τοπικού περιβάλλοντος
# Παράκαμψη της προεπιλογής των υποσυστημάτων χωρίς
# Παράδειγμα ρυθμίσεων υπερασπιστών σε βάση ανά χρήστη
# Ταιριάξτε το χρήστη ANONCVS
# X111forwarding Όχι
# Επιτρέπεται όχι
# Επιτρεπόμενη όχι
# ForceCommand CVS Server

Θυμηθείτε, Ctrl+X και Y για να αποθηκεύσετε το αρχείο. Στη συνέχεια, ας γράψουμε ένα βασικό σενάριο που ονομάζεται Αρχικοποιήστε (όλα στον προεπιλεγμένο οικιακό κατάλογο του χρήστη μας).

nano initialize

Προσθέστε αυτές τις γραμμές στο αρχείο, αντικαθιστώνταςΜε το κλειδί SSH που βρήκατε τη χρήση της γάτας. (.ssh/id_rsa.pub)

# !/bin/bash

Για να σας οδηγήσουμε σε αυτό το αρχείο, ας ξεκινήσουμε τη γραμμή με τη γραμμή. Η πρώτη γραμμή λέει στον μεταγλωττιστή ότι πρόκειται για ένα σενάριο bash. Στη συνέχεια, εγκαθιστούμε τις εξαρτήσεις, αντιγράφοντας το SSHD_CONFIG στον σωστό κατάλογο, επανεκκινώντας το SSH, δημιουργώντας πλήκτρα SSH για root, προσθέτοντας την ομάδα χρήστη (μπορείτε να επιλέξετε ένα όνομα που σας αρέσει, χρησιμοποιήστε την εντολή adduser με το όνομα και τον κωδικό πρόσβασής τους για τώρα). Προσθέτουμε επίσης ομάδα στον όμιλο Sudo, δημιουργούμε το κλειδί SSH, προσθέτουμε το κλειδί μας σε εξουσιοδοτημένα κλειδιά και δικά τους και εκτυπώνουν το κλειδί τους. Αυτός ο νέος χρήστης θα είναι ο τρόπος σύνδεσης στον ιστότοπο.

Σε ένα νέο τερματικό, προχωρήστε και ανοίξτε ξανά το διακομιστή.

ssh team@XX.XX.XX.XX

Δεν πρέπει να χρειαστείτε κωδικό πρόσβασης αυτή τη φορά, καθώς έχετε ένα κλειδί SSH. Έχουμε επίσης απενεργοποιήσει την σύνδεση με τον κωδικό πρόσβασης για να διατηρήσουμε τον ιστότοπο πιο ασφαλή.

Τώρα, αυτός ο διακομιστής ξεκινά εντελώς κενός χωρίς πληροφορίες σχετικά με αυτό. Ας ξεκινήσουμε με την κλωνοποίηση του έργου μας από το Git, ώστε να μπορέσουμε να το κατεβάσουμε και να το εκτελέσουμε στο απομακρυσμένο μηχάνημα. Στον απομακρυσμένο διακομιστή συνδεδεμένο μέσω SSH, εκτυπώστε πρώτα το κλειδί SSH:

cat ~/.ssh/id_rsa.pub

Στη συνέχεια, επικολλήστε αυτό το κλειδί στις ρυθμίσεις GIT όπως κάναμε πριν για να ρυθμίσετε το αποθετήριο GIT. Μπορούμε τώρα να κλωνοποιήσουμε το έργο μας απευθείας στο διακομιστή. Βεβαιωθείτε ότι έχετε δημιουργήσει αντίγραφα ασφαλείας του έργου τοπικά πρώτα, οπότε βρίσκεται στον διακομιστή Git για λήψη.

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

Τέλειος. Τώρα όλα τα αρχεία είναι εδώ. Μπορούμε να τα δούμε με LS

ls

Τώρα, ας αρχίσουμε να ρυθμίζουμε το διακομιστή. Πρώτον, αντιγράψτε τον κατάλογο του έργου σας σε ένα απλό, αξέχαστο όνομα που θα χρησιμοποιήσουμε για το έργο.

cp -r yourproject whatyoucalledit

Όπου "whatyoucalledit" είναι το νέο όνομα του έργου σας. Στη συνέχεια, θα πρέπει να δημιουργήσουμε ένα βασικό βοηθητικό πρόγραμμα για τη ρύθμιση του διακομιστή. Θα σώσουμε αυτό το βοηθητικό πρόγραμμα και θα το χρησιμοποιήσουμε στο μέλλον. Για να δημιουργήσετε αυτό το βοηθητικό πρόγραμμα, ας δημιουργήσουμε ένα δυαδικό χρήστη για να καθορίσουμε τον τρόπο επεξεργασίας ενός σεναρίου. Χρήση bash, edit/usr/bin/ascript

sudo nano /usr/bin/ascript

Βεβαιωθείτε ότι χρησιμοποιείτε το Sudo εκεί, ώστε να έχετε δικαιώματα για να επεξεργαστείτε το αρχείο. Στο αρχείο, προσθέστε αυτές τις γραμμές:

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

Θυμηθείτε ότι αυτό το σενάριο παίρνει ένα επιχείρημα, το όνομα του σεναρίου, ως $ 1. Πρώτα ελέγχει αν το αρχείο υπάρχει ή το δημιουργεί με άλλο τρόπο, προσθέτει την πρώτη γραμμή για να δηλώσει ότι το σενάριο είναι bash, αλλάζει τα δικαιώματα του, το επεξεργάζεται και προσθέτει το όνομά του σε /etc /ascripts που μας επιτρέπει να αποθηκεύουμε τα ονόματα των σεναρίων που δημιουργούμε. Εάν υπάρχει ήδη το αρχείο, απλώς αλλάξτε τα δικαιώματα και επεξεργαστείτε το. Αποθηκεύστε το αρχείο και στη συνέχεια θα αλλάξουμε τα δικαιώματα του. Όσο χρησιμοποιούμε αυτό το σενάριο, δεν θα χρειαστεί να το κάνουμε ξανά.

sudo chmod a+x /usr/bin/ascript

Τέλειος. Τώρα ας δημιουργήσουμε ένα σενάριο που ονομάζεται Setup. Πρώτον, να μην σας συντρίψει, αλλά να ρίξετε μια ματιά σε αυτό που μοιάζει με το σενάριο ρύθμισης. Θα περπατήσουμε σε αυτό που πρέπει να μοιάζει με αυτό το σενάριο στο έργο σας, δεν θα χρειαστείτε τα πάντα στο σενάριο μου για να ξεκινήσετε.

# !/bin/bash
# sudo chmod a+x scripts/usersetup
# ./scripts/usersetup
# ssh-keygen
# Κατάλογος έργων
# Εντολές καταγραφής
# Nano Config
# Git config
# Ενημέρωση και εγκατάσταση
# Ενεργοποιήστε το clamav antivirus
# Ονομασία κεντρικού υπολογιστή
# Ρύθμιση postgres
# Δημιουργία αντιγράφων ασφαλείας βάσης δεδομένων ρύθμισης
# Απενεργοποιήστε τα iptables
# Εγκαταστήστε το bitdefender
# Εγκατάσταση postfix
# Δημιουργία Dirs
# Ρύθμιση VirtualEnv
# Λάβετε και δημιουργήστε εξαρτήσεις
# Ορίστε κανόνες τείχους προστασίας
# Εγκαταστήστε τις εξαρτήσεις PYPI
pip3 install --upgrade opencv-python # == 4.5.4.60
pip3 install --upgrade opencv-contrib-python # == 4.5.4.60
# PIP Εγκατάσταση OpenCV-Python == 4.5.5.64
# PIP Εγκατάσταση OpenCV-Contrib-Python == 4.5.5.64
# Εγκαταστήστε το Certbot
# Εκτελέστε το Certbot
# Επαναφόρτωση διακομιστή αλληλογραφίας
# Αντιγραφή
# sudo cp /etc/letsencrypt/live/femmebabe.com/privkey.pem privkey.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Μπάλωμα Venv
# Ρυθμίστε τις ρυθμίσεις χρήστη
# Ορίστε δικαιώματα
# Sudo Chown -r ομάδα: χρήστες/var/run/run/
# ρίζα Sudo Chown: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# Sudo Chown www-data: Χρήστες DB.sqlite3
# Αντιγραφή και ορίστε δικαιώματα
# Βάση δεδομένων ρύθμισης
# Εγχώνετε το PAM Config και αφαιρέστε ελαττωματικό config SSH
# sudo sed -i '' -e '$ d' /etc/pam.d/sshd
# sudo sed -i '' -e '$ d' /etc /προφίλ
# Αντιγραφή σεναρίων και καθορισμού δικαιωμάτων
# Επαναφόρτωση και ενεργοποίηση υπηρεσιών
# Ενεργοποίηση μονάδων Apache
# sudo a2dismod mpm_event
# sudo a2dismod mpm_worker
# sudo a2enmod mpm_prefork
# Απενεργοποίηση προεπιλεγμένου ιστότοπου
# Ενεργοποιήστε τον ιστότοπό μας
# Επαναφόρτωση Daemon και επανεκκίνηση Apache, Postfix και OpendKim
# Ορίστε δικαιώματα
# Διαμόρφωση ανταλλαγής
# Μηχανισμός αρχικής λεζάντας
# Εγκατάσταση
# Εμφάνιση IPv6 και OpendKim για διαμόρφωση τομέα
# Ολοκληρώθηκε η ρύθμιση

Αυτό είναι πολύ setup! Εν ολίγοις, αυτές οι εντολές αρχείων καταγραφής κώδικα, ρυθμίζει το Nano και το Git, τα αντίγραφα πάνω από τα αρχεία, τις λήψεις και την εγκατάσταση των πακέτων APT Ubuntu, των εξαρτημάτων Python, των downloves antivir, των directories, directorys, directores, εγκαθιστά τα πιστοποιητικά. Ο διακομιστής, εγκαθιστά τη διαμόρφωση, ξεκινά και επιτρέπει τη διάθεση, την κατανομή ανταλλαγής, τα δικαιώματα και την εκτύπωση της διεύθυνσης IP, IPv6 και του πλήκτρου OpendKim. Αρκετά απλό, αλλά μοιάζει με πολύ κώδικα. Δεν θα χρειαστούμε πολλά από αυτά, επειδή δεν έχουμε τις εξαρτήσεις, δεν χρησιμοποιούμε σέλινο, σέρεια ή Daphne, αλλά θα εγκαταστήσουμε μερικά από αυτά ούτως ή άλλως για να ξεκινήσουμε. Παρατηρήστε ότι αυτός ο κώδικας έχει δηλώσει αρκετές φορές έναν τομέα.

Θα χρειαστεί επίσης να αγοράσουμε ένα όνομα τομέα (το οποίο είναι ένα μικρό ετήσιο τέλος). Συνιστώ το Squarespace για την αγορά ενός τομέα, η διάταξή τους είναι διαισθητική και εύκολη στη χρήση. Μπορείτε να αγοράσετε οποιονδήποτε τομέα της επιλογής σας, αλλά χρησιμοποιώ τον τομέα femmebabe.com σε αυτό το παράδειγμα. Μόλις αγοράσετε έναν τομέα, κατευθυνθείτε στον πίνακα διαμόρφωσης DNS Squarespace DNS και προσθέστε μια εγγραφή Α που δείχνει τον τομέα σας στον διακομιστή με διεύθυνση IP. Θα πρέπει να μοιάζει με αυτό:

@ A xx.xx.xx.xx

Με το @ operator ως κεντρικός υπολογιστής, που σημαίνει ότι όλοι οι υποτομείς κάτω από αυτόν τον τομέα και ο ριζικός τομέας θα ανακατευθύνονται στο διακομιστή. Υπάρχουν περισσότερα αρχεία για να δηλώσουμε, αλλά μπορούμε να προχωρήσουμε σε αυτά μόλις είμαστε έτοιμοι να στείλουμε ταχυδρομείο. Λάβετε υπόψη σας, μπορεί να χρειαστούν αρκετές ημέρες πριν μπορέσετε να στείλετε με επιτυχία αλληλογραφία από το διακομιστή. Τα αρχεία DNS που ρυθμίζουμε θα χρειαστούν χρόνο για να διαδοθούν.

Εν πάση περιπτώσει, το μόνο ρεκόρ που πρέπει να ξεκινήσουμε είναι ένα αρχείο Α. Τώρα λοιπόν μπορούμε να συμπληρώσουμε το παρακάτω σενάριο σύμφωνα με το έργο μας και να το τρέξουμε.

Ας ξεκινήσουμε με ένα μικρότερο σενάριο εγκατάστασης για να εγκαταστήσουμε ακριβώς αυτό που χρειαζόμαστε για μια βασική πρόοδο. Δεν θα χρησιμοποιήσουμε τόσες πολλές εξαρτήσεις ή postgresql ακόμα, θα ξεκινήσουμε απλώς έναν βασικό διακομιστή HTTP και θα ανησυχούμε για την πιστοποίηση του όταν γίνει αυτό. Θυμηθείτε, για να λάβετε ένα πιστοποιητικό HTTPS και να εκτελέσετε με ασφάλεια τον διακομιστή, θα πρέπει να αγοράσουμε έναν τομέα μαζί με το ενοίκιο ενός διακομιστή. Προς το παρόν, αντικαταστήστε την "ομάδα" σε αυτό το αρχείο με το όνομα του χρήστη σας, "DIR" με τον κατάλογο του έργου σας και παρέχετε το email και τον τομέα σας στις ετικέτες <>.

Επιπλέον, πριν εκτελέσουμε αυτόν τον κώδικα, πρέπει να αλλάξουμε τις ρυθμίσεις στο τείχος προστασίας που υποστηρίζει ο πάροχος φιλοξενίας, εάν υπάρχει. Συνήθως αυτό είναι στην καρτέλα "Δίκτυα" του παρόχου φιλοξενίας σας, ή αν είστε αυτο -φιλοξενίας, στην ενότητα "Προώθηση λιμένων" του δρομολογητή σας. Θα θελήσετε επίσης να ρυθμίσετε μια στατική IP μέσω του δρομολογητή σας με τη διεύθυνση της μηχανής του διακομιστή σας, εάν χρησιμοποιείτε αυτο -φιλοξενία. Θα χρειαστεί να ανοίξετε τις ακόλουθες θύρες για πρόσβαση ανάγνωσης/εγγραφής.

22 (SSH) 25 (ταχυδρομείο) 587 (Mail) 110 (πελάτης αλληλογραφίας) 80 (HTTP) 443 (HTTPS)

# !/bin/bash
# Εντολές καταγραφής
# Nano Config
# Git config
# Ενημέρωση και εγκατάσταση
# Ενεργοποιήστε το clamav antivirus
# Ονομασία κεντρικού υπολογιστή
# Δημιουργία αντιγράφων ασφαλείας βάσης δεδομένων ρύθμισης
# Απενεργοποιήστε τα iptables
# Ρύθμιση VirtualEnv
# Εγκαταστήστε το Certbot
# Εκτελέστε το Certbot
# Ρυθμίστε τις ρυθμίσεις χρήστη
# Ορίστε δικαιώματα
# Sudo Chown -r ομάδα: χρήστες/var/run/run/
# ρίζα Sudo Chown: root/run/sudo/ts -r
# Επαναφόρτωση και ενεργοποίηση υπηρεσιών
# Ενεργοποίηση μονάδων Apache
# Επαναφόρτωση Daemon και επανεκκίνηση Apache, Postfix και OpendKim
# Εμφάνιση IPv6 και OpendKim για διαμόρφωση τομέα

Πριν εκτελέσετε αυτόν τον κωδικό, βεβαιωθείτε ότι ο τομέας που έχετε αγοράσει συνδέεται με το διακομιστή. Για να το κάνετε αυτό, ανοίξτε ένα τερματικό στο τοπικό σας μηχάνημα και εκτελέστε αυτήν την εντολή με τον τομέα σας:

ping femmebabe.com # Τοποθετήστε τον τομέα σας εδώ, μετά το ping

Εάν όλα φαίνονται καλά και ο διακομιστής στέλνει απαντήσεις, είμαστε έτοιμοι να εκτελέσουμε το σενάριο και να εγκαταστήσουμε πακέτα καθώς και να ξεκινήσουμε, να ενεργοποιήσουμε και να πιστοποιήσουμε τον διακομιστή Apache.

Αυτό δεν είναι όλη η ρύθμιση που απαιτείται για τη διαμόρφωση του postfix, θα εξετάσουμε αυτή τη ρύθμιση περισσότερο αργότερα. Προς το παρόν, εκτελέστε αυτόν τον κωδικό ρύθμισης και θα χρειαστούν λίγα λεπτά για να εγκαταστήσετε και να πιστοποιήσετε τον διακομιστή σας. Για άλλη μια φορά, φροντίστε να αντικαταστήσετε το όνομα, το email και το όνομα τομέα στο σενάριο σύμφωνα με το όνομα που αγοράσατε.

Τώρα που ο διακομιστής παρέχεται, μπορείτε να μεταβείτε στη διεύθυνση URL σε οποιοδήποτε πρόγραμμα περιήγησης ιστού και να ελέγξετε για να βεβαιωθείτε ότι ο διακομιστής εκτελεί HTTPS. Εάν δεν είναι, δοκιμάστε να περιμένετε λίγο χρόνο για να προφθάσετε τα αρχεία DNS και στη συνέχεια να εκτελέσετε την ακόλουθη εντολή για να κάνετε επανάληψη πιστοποίησης certbot:

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

Εφόσον έχετε ρυθμίσει τα πάντα σωστά, θα πρέπει να έχετε πρόσβαση στην προεπιλεγμένη σελίδα του Apache μόνο για να γνωρίζετε ότι ο κωδικός σας λειτουργεί και εμφανίζει μια ζωντανή ιστοσελίδα. Στη συνέχεια, ας επεξεργαστούμε το settings.py για να αλλάξουμε την προεπιλεγμένη λειτουργία εντοπισμού σφαλμάτων στην παραγωγή. Θα διαμορφώσουμε επίσης τον τομέα στις ρυθμίσεις, καθώς και το εσωτερικό IPS.

nano yourproject/settings.py

Στις ρυθμίσεις, αλλαγή/προσθήκη αυτών των γραμμών.

# Ρύθμιση τοποθεσίας

Τώρα, θα πρέπει να διαμορφώσουμε το Apache2. Ας επεξεργαστούμε το αρχείο ρυθμίσεων που θα αναπτύξουμε με αυτήν τη γραμμή:

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

Αυτό το αρχείο ρυθμίσεων θα πρέπει να έχει το όνομα του τομέα μας σε αυτό και το όνομα του χρήστη και του έργου. Χρησιμοποιώ το όνομα τομέα femmebabe.com, την ομάδα ονόματος χρήστη και το όνομα του έργου 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>

Βεβαιωθείτε ότι έχετε αντικαταστήσει το όνομα του έργου, των καταλόγων και του τομέα σε αυτόν τον κωδικό παραδείγματος κατά τη διαμόρφωση του διακομιστή σας. Τώρα, θα πρέπει να απενεργοποιήσουμε τον προεπιλεγμένο ιστότοπο. Αυτό μπορεί να γίνει χρησιμοποιώντας το bash.

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

Στη συνέχεια, μπορούμε να ενεργοποιήσουμε τον προεπιλεγμένο ιστότοπο και να επαναφορτώσουμε το Apache2, χρησιμοποιώντας επίσης το bash. Θυμηθείτε να αντικαταστήσετε το femmebabe με το όνομα του αρχείου που δηλώσατε κατά την επεξεργασία στο/etc/apache2/sites-available/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Επιστρέψτε στον τομέα σας στο Navbar. Θα πρέπει να δείτε τον ιστότοπο που έχετε ρυθμίσει στο πρόγραμμα περιήγησης ιστού σας. Συγχαρητήρια! Εάν δεν το βλέπετε, ίσως χρειαστεί να κάνετε κάποιες αλλαγές. Ελέγξτε προσεκτικά τις ρυθμίσεις στο έργο σας, τη διαμόρφωση του Apache και βεβαιωθείτε ότι δεν έχετε σφάλματα και εκτελέστε τις ακόλουθες εντολές για να ελέγξετε το έργο για σφάλματα.

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

Εάν έχετε σφάλματα στο έργο Python, εντοπίστε τα σε όπου βρίσκονται και τα διορθώνουν. Μπορεί να μην μπορείτε να δείτε όλα τα σφάλματα σας ανάλογα με το πού βρίσκονται, οπότε αν έχετε ένα σφάλμα που απλά λέει ότι "το πληθυσμό δεν είναι επανεισδοχής", επεξεργαστείτε το ακόλουθο αρχείο στο εικονικό περιβάλλον, retuctry.py, για να εκθέσετε το σφάλμα.

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

Μεταβείτε στη γραμμή 83, όπου αυξάνεται αυτό το σφάλμα χρόνου εκτέλεσης (αυξήστε το RuntimeError ("Το Propulate () δεν είναι επανεισδοχές"))) και προσθέστε ένα σχόλιο πριν από αυτή τη γραμμή, στη συνέχεια προσθέτοντας, με την ίδια εσοχή, self.app_configs = {}. Αυτό μοιάζει με αυτό:

                # Αποτρέψτε τις κλήσεις επανεγκατάστασης για να αποφύγετε τη λειτουργία AppConfig.Ready ()
                # μέθοδοι δύο φορές.
# Raise RuntimeError ("Το Propulate () δεν είναι επανεισδοτές")

Στη συνέχεια, μπορείτε να ελέγξετε ξανά το έργο και να εκθέσετε το σφάλμα.

python manage.py check

Στη συνέχεια, μπορείτε να δείτε το σφάλμα και να το διορθώσετε. Όταν το έχετε διορθώσει και ο κώδικας μεταγλωττίζεται χωρίς σφάλματα, φροντίστε να αλλάξετε το αρχείο πίσω, ώστε να μοιάζει με αυτό:

                # Αποτρέψτε τις κλήσεις επανεγκατάστασης για να αποφύγετε τη λειτουργία AppConfig.Ready ()
                # μέθοδοι δύο φορές.
# self.app_configs = {}

Με την προϋπόθεση ότι ο διακομιστής είναι συνδεδεμένος, όταν κάνουμε περαιτέρω αλλαγές σε αυτό, πρέπει να χρησιμοποιήσουμε την ακόλουθη εντολή για να επαναφορτώσουμε τον διακομιστή:

sudo systemctl reload apache2

Φοβερός! Αλλά τι γίνεται με την αποστολή αλληλογραφίας; Για να αρχίσουμε να στέλνουμε email, θα πρέπει πρώτα να ενημερώσουμε τη διαμόρφωση του τομέα. Αυτό θα πρέπει να βρίσκεται στο πλαίσιο του DNS στο Squarespace ή σε οποιοδήποτε γραμματέα ονόματος τομέα που επιλέξατε. Θα πρέπει επίσης να εγκαταστήσουμε και να προσθέσουμε διαμόρφωση και να εκτελέσουμε μερικές εντολές.

Πρώτον, ας λάβουμε τη διεύθυνση IPv6 του διακομιστή. Στη συνέχεια θα ανοίξουμε το DNS σας και θα προσθέσουμε τα αρχεία.

Για να λάβετε τη διεύθυνση IPv6 του διακομιστή, χρησιμοποιήστε αυτήν την εντολή:

ip -6 addr

Τώρα, μπορούμε να προσθέσουμε τις ακόλουθες εγγραφές στις ρυθμίσεις DNS. Τα αρχεία μου μοιάζουν με αυτό. Ωστόσο, για τα αρχεία σας, θα πρέπει να αντικαταστήσετε τη διεύθυνση IP με το IP σας (όχι 75.147.182.214, αυτό είναι δικό μου). Προσθέστε επίσης τον τομέα σας στη θέση του femmebabe.com, καθώς και τη διεύθυνση IPv6 που βρέθηκε με την προηγούμενη εντολή (δεν μπορείτε να χρησιμοποιήσετε το δικό μου, FE80 :: 725A: FFF: FE49: 3E02). Μην ανησυχείτε για το DomainKey για τώρα, αυτό δημιουργείται όταν δημιουργούμε το Postfix, τον διακομιστή αλληλογραφίας, με το OpendKim και εκτυπώνουμε το κλειδί. Θα διαμορφώσουμε αυτό το τελευταίο.

@ ΕΝΑ 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 = Κανένα

sendonly._domainkey Txt N/a

Τώρα, θα πρέπει να προσθέσουμε κάποια διαρθρωτική διαμόρφωση για το Postfix. Το μόνο που πρέπει να κάνουμε είναι να βεβαιωθούμε ότι αντικαθιστούμε το όνομα τομέα, το femmebabe.com, με το όνομα τομέα που χρησιμοποιείτε. Ας δούμε όλα τα αρχεία ρυθμίσεων ένα προς ένα και να τα εγκαταστήσετε σε έναν κατάλογο που ονομάζεται Config στο έργο μας, για εγκατάσταση στο λειτουργικό σύστημα.

nano config/etc_postfix_main.cf

Προσθέστε αυτό το κείμενο στο αρχείο

# Δείτε /usr/share/postfix/main.cf.dist για μια σχολιασμένη, πληρέστερη έκδοση
# Ειδικό Debian: Ο καθορισμός ενός ονόματος αρχείου θα προκαλέσει το πρώτο
# γραμμή αυτού του αρχείου που θα χρησιμοποιηθεί ως όνομα.  Η αθέτηση του Debian
# είναι /etc /mailname.
# myOrigin = /etc /mailname
# Προσαρμογή .domain είναι η δουλειά του MUA.
# Uncomment Η επόμενη γραμμή για τη δημιουργία προειδοποιήσεων "καθυστερημένης αλληλογραφίας"
# delay_warning_time = 4h
# Δείτε το http://www.postfix.org/compatibility_readme.html - προεπιλογή σε 3.6
# φρέσκες εγκαταστάσεις.
# Παράμετροι TLS
# Διαμόρφωση milter

Επόμενο config!

nano config/etc_postfix_master.cf

Προσθέστε αυτές τις γραμμές:

# 
# Postfix Master Process Configuration File.  Για λεπτομέρειες σχετικά με τη μορφή
# του αρχείου, ανατρέξτε στη σελίδα Master (5) (εντολή: "Man 5 Master" ή
# on-line: http://www.postfix.org/master.5.html).
# 
# Μην ξεχάσετε να εκτελέσετε το "Postfix Reload" μετά την επεξεργασία αυτού του αρχείου.
# 
# =========================================================================
# Τύπος υπηρεσίας Ιδιωτικό μηδενικό chroot wakeup εντολή maxproc + args
# (ναι) (ναι) (όχι) (ποτέ) (100)
# =========================================================================
# SMTP inet n - y - 1 postscreen
# SMTPD PASS - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Επιλέξτε ένα: Ενεργοποίηση υποβολής μόνο για πελάτες loopback ή για οποιονδήποτε πελάτη.
# 127.0.0.1:Submission inet n - y - - smtpd
# -o syslog_name = postfix/υποβολή
# -o smtpd_tls_security_level = encrypt
# -o smtpd_sasl_auth_enable = ναι
# -o smtpd_tls_auth_only = ναι
# -o smtpd_reject_unlisted_recipient = όχι
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -O SMTPD_RECIPIENT_RESTRITS =
# -o smtpd_relay_restrictions = permit_sasl_authenticate, απόρριψη
# -o milter_macro_daemon_name =
# Επιλέξτε ένα: Ενεργοποιήστε το SMTPS μόνο για πελάτες loopback ή για οποιονδήποτε πελάτη.
# 127.0.0.1:smtps inet n - y - - smtpd
# smtps inet n - y - - smtpd
# -o syslog_name = postfix/smtps
# -o SMTPD_TLS_WrapperMode = Ναι
# -o smtpd_sasl_auth_enable = ναι
# -o smtpd_reject_unlisted_recipient = όχι
# -o smtpd_client_restrictions = $ mua_client_restrictions
# -o smtpd_helo_restrictions = $ mua_helo_restrictions
# -o smtpd_sender_restrictions = $ mua_sender_restrictions
# -O SMTPD_RECIPIENT_RESTRITS =
# -o smtpd_relay_restrictions = permit_sasl_authenticate, απόρριψη
# -o milter_macro_daemon_name =
# 628 inet n - y - - qmqpd
# QMGR UNIX N - N 300 1 OQMGR
# -O SMTP_HELO_TIMEOUT = 5 -O SMTP_CONNECT_TIMEOUT = 5
# 
# ====================================================================
# Διεπαφές σε λογισμικό μη-postfix. Φροντίστε να εξετάσετε το εγχειρίδιο
# Σελίδες του λογισμικού Non-Postfix για να μάθετε ποιες επιλογές θέλει.
# 
# Πολλές από τις ακόλουθες υπηρεσίες χρησιμοποιούν το Postfix Pipe (8) παράδοση
# μέσο.  Δείτε τη σελίδα Pipe (8) για πληροφορίες σχετικά με $ {παραλήπτης}
# και άλλες επιλογές φακέλου μηνυμάτων.
# ====================================================================
# 
# MailDrop. Ανατρέξτε στο αρχείο Postfix MailDrop_ReadMe για λεπτομέρειες.
# Καθορίστε επίσης το main.cf: maildrop_destination_recipient_limit = 1
# 
# 
# ====================================================================
# 
# Οι πρόσφατες εκδόσεις Cyrus μπορούν να χρησιμοποιήσουν την υπάρχουσα καταχώρηση "LMTP" master.cf.
# 
# Καθορίστε στο cyrus.conf:
# lmtp cmd = "lmtpd -a" listion = "localhost: lmtp" proto = tcp4
# 
# Καθορίστε στο main.cf ένα ή περισσότερα από τα παρακάτω:
# mailbox_transport = lmtp: inet: localhost
# virtual_transport = lmtp: inet: localhost
# 
# ====================================================================
# 
# Cyrus 2.1.5 (Amos Gouaux)
# Καθορίστε επίσης το main.cf: cyrus_destination_recipient_limit = 1
# 
# Cyrus unix - n n - - σωλήνας
# FLAGS = DRX χρήστης = Cyrus argv =/cyrus/bin/deliver -e -r $ {sender} -m $ {extension} $ {user}
# 
# ====================================================================
# Παλιό παράδειγμα παράδοσης μέσω του Cyrus.
# 
# Old -cyrus unix - n n - - σωλήνας
# FLAGS = r user = cyrus argv =/cyrus/bin/deliver -e -m $ {extension} $ {user}
# 
# ====================================================================
# 
# Ανατρέξτε στο αρχείο Postfix UUCP_README για λεπτομέρειες διαμόρφωσης.
# 
# 
# Άλλες μεθόδους εξωτερικής παράδοσης.
# 

Και τη διαμόρφωση του OpendKim. Το OpendKim προσδιορίζει τους διακομιστές ηλεκτρονικού ταχυδρομείου με πλήκτρα τομέα για να τα καταστήσει πιο ασφαλή. Χωρίς αυτό, το ταχυδρομείο δεν υπογράφεται και μπορεί να μην φτάσει σε εισερχόμενα.

nano config/etc_default_opendkim

Προσθέστε αυτές τις γραμμές:

# ΣΗΜΕΙΩΣΗ: Πρόκειται για ένα αρχείο διαμόρφωσης κληρονομιάς. Δεν χρησιμοποιείται από το OpendKim
# Systemd Service. Χρησιμοποιήστε τις αντίστοιχες παραμέτρους διαμόρφωσης στο
# /etc/opendkim.conf Αντ 'αυτού.
# 
# Προηγουμένως, κάποιος θα επεξεργαστεί τις προεπιλεγμένες ρυθμίσεις εδώ και στη συνέχεια θα εκτελέσει
# /lib/opendkim/opendkim.service.generate για τη δημιουργία αρχείων override systemd at
# /etc/systemd/system/opendkim.service.d/override.conf και
# /etc/tmpfiles.d/opendkim.conf. Ενώ αυτό είναι ακόμα δυνατό, είναι τώρα
# Συνιστάται η προσαρμογή των ρυθμίσεων απευθείας στο /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Αλλαγή σε/var/spool/postfix/run/opendkim για να χρησιμοποιήσετε μια υποδοχή UNIX με
# Postfix σε ένα chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Uncomment για να καθορίσετε μια εναλλακτική υποδοχή
# Σημειώστε ότι η ρύθμιση αυτό θα παρακάμψει οποιαδήποτε τιμή υποδοχής στο opendkim.conf
# αθέτηση:
# Ακούστε όλες τις διεπαφές στη θύρα 54321:
# Υποδοχή = inet: 54321
# Ακούστε το loopback στη θύρα 12345:
# Υποδοχή = inet: 12345@localhost
# Ακούστε το 192.0.2.1 στη θύρα 12345:
# Υποδοχή = inet: 12345@192.0.2.1
nano config/etc_dovecot_conf.d_10-master.conf

Προσθέστε αυτές τις γραμμές:

# default_process_limit = 100
# default_client_limit = 1000
# Προεπιλεγμένο όριο VSZ (εικονικό μέγεθος μνήμης) για διαδικασίες εξυπηρέτησης. Αυτό είναι κυρίως
# προοριζόταν να πιάσει και να σκοτώσει διαδικασίες που διαρρέουν μνήμη πριν φάνε
# πάντα.
# default_vsz_limit = 256m
# Ο χρήστης σύνδεσης χρησιμοποιείται εσωτερικά από τις διαδικασίες σύνδεσης. Αυτό είναι το πιο μη αξιόπιστο
# χρήστης στο σύστημα Dovecot. Δεν θα έπρεπε να έχει πρόσβαση σε τίποτα.
# default_login_user = dovenull
# Ο εσωτερικός χρήστης χρησιμοποιείται από διαδικασίες μη προνομιούχου. Θα πρέπει να είναι ξεχωριστό από
# Σύνδεση χρήστη, έτσι ώστε οι διαδικασίες σύνδεσης να μην μπορούν να διαταράξουν άλλες διαδικασίες.
# default_internal_user = dovecot
    # θύρα = 143
    # θύρα = 993
    # SSL = ναι
  # Αριθμός συνδέσεων που θα χειριστούν πριν ξεκινήσετε μια νέα διαδικασία. Τυπικά
  # Οι μόνες χρήσιμες τιμές είναι 0 (απεριόριστες) ή 1. 1 είναι πιο ασφαλές, αλλά 0
  # είναι ταχύτερο. <doc/wiki/loginprocess.txt>
  # service_count = 1
  # Αριθμός διαδικασιών που πρέπει πάντα να περιμένουν περισσότερες συνδέσεις.
  # process_min_avail = 0
  # Εάν ορίσετε service_count = 0, ίσως πρέπει να το αναπτύξετε.
  # vsz_limit = $ default_vsz_limit
    # θύρα = 110
    # θύρα = 995
    # SSL = ναι
    # θύρα = 587
  # Δημιουργήστε ακροατή INET μόνο εάν δεν μπορείτε να χρησιμοποιήσετε την παραπάνω υποδοχή UNIX
  # inet_listener lmtp {
    # Αποφύγετε να κάνετε το LMTP ορατό για ολόκληρο το διαδίκτυο
    # διεύθυνση =
    # θύρα =
  # }
  # Το μεγαλύτερο μέρος της μνήμης πηγαίνει σε αρχεία MMAP (). Μπορεί να χρειαστεί να το αυξήσετε
  # Περιορίστε εάν έχετε τεράστια γραμματοκιβώτια.
  # vsz_limit = $ default_vsz_limit
  # Μέγιστο. Αριθμός διαδικασιών IMAP (συνδέσεις)
  # process_limit = 1024
  # Μέγιστο. Αριθμός διαδικασιών POP3 (συνδέσεις)
  # process_limit = 1024
  # Μέγιστο. Αριθμός διαδικασιών υποβολής SMTP (συνδέσεις)
  # process_limit = 1024
  # auth_socket_path δείχνει σε αυτήν την υποδοχή UserDB από προεπιλογή. Είναι συνήθως
  # χρησιμοποιούνται από το Dovecot-LDA, το DoVeadm, ενδεχομένως τη διαδικασία IMAP, κ.λπ. Οι χρήστες που έχουν
  # Τα πλήρη δικαιώματα αυτής της υποδοχής είναι σε θέση να αποκτήσουν μια λίστα με όλα τα ονόματα χρήστη και
  # Αποκτήστε τα αποτελέσματα των αναζητήσεων UserDB όλων.
  # 
  # Η προεπιλεγμένη λειτουργία 0666 επιτρέπει σε οποιονδήποτε να συνδεθεί στην υποδοχή, αλλά το
  # Οι αναζητήσεις UserDB θα επιτύχουν μόνο εάν το UserDB επιστρέψει ένα πεδίο "UID"
  # ταιριάζει με το UID της διαδικασίας καλούντος. Επίσης, εάν το UID ή το GID του καλούντος ταιριάζει
  # Το UID του Socket ή το GID Η αναζήτηση επιτυγχάνει. Οτιδήποτε άλλο προκαλεί αποτυχία.
  # 
  # Για να δώσετε στον καλούντα πλήρη δικαιώματα για να αναζητήσετε όλους τους χρήστες, ορίστε τη λειτουργία
  # κάτι άλλο από το 0666 και το dovecot αφήνει τον πυρήνα να επιβάλει το
  # δικαιώματα (π.χ. 0777 επιτρέπει σε όλους πλήρη δικαιώματα).
  # Η διαδικασία των εργαζομένων για το Auth εκτελείται ως ρίζα από προεπιλογή, έτσι ώστε να μπορεί να έχει πρόσβαση
  # /etc/σκιά. Εάν αυτό δεν είναι απαραίτητο, ο χρήστης πρέπει να αλλάξει σε
  # $ default_internal_user.
  # χρήστης = ρίζα
  # Εάν χρησιμοποιείται πληρεξούσιο DICT, οι διαδικασίες αλληλογραφίας θα πρέπει να έχουν πρόσβαση στην υποδοχή του.
  # Για παράδειγμα: mode = 0660, group = vmail και global mail_access_groups = vmail
    # Λειτουργία = 0600
    # χρήστης =
    # ομάδα =

Για άλλη μια φορά, φροντίστε να αντικαταστήσετε τον τομέα σε όλα αυτά τα αρχεία, το femmebabe.com, με τον τομέα που επιλέξατε. Επεξεργαστείτε το επόμενο αρχείο, το config του Dovecot,

nano config/etc_dovecot_dovecot

Και προσθέστε αυτές τις γραμμές

## Αρχείο διαμόρφωσης dovecot
# Εάν είστε σε βιασύνη, δείτε http://wiki2.dovecot.org/quickconfiguration
# Η εντολή "doveconf -n" δίνει μια καθαρή έξοδο των αλλαγών ρυθμίσεων. Χρησιμοποιήστε το
# Αντί για αντιγραφή και επικόλληση αρχείων κατά την ανάρτηση στη λίστα αλληλογραφίας Dovecot.
# '# «Χαρακτήρας και τα πάντα μετά την αντιμετώπισή του ως σχόλια. Επιπλέον χώρος
# και οι καρτέλες αγνοούνται. Εάν θέλετε να χρησιμοποιήσετε ένα από αυτά ρητά, βάλτε το
# value inside quotes, eg.: key = "# char και taring whitespace "
# Οι περισσότερες (αλλά όχι όλες) ρυθμίσεις μπορούν να αντικατασταθούν από διαφορετικά πρωτόκολλα και/ή
# Πηγή/προορισμό IPS τοποθετώντας τις ρυθμίσεις μέσα σε τμήματα, για παράδειγμα:
# Πρωτόκολλο IMAP {}, τοπικό 127.0.0.1 {}, απομακρυσμένο 10.0.0.0/8 {}
# Εμφανίζονται οι προεπιλεγμένες τιμές για κάθε ρύθμιση, δεν απαιτείται να ξεπεράσουμε
# εκείνοι. Αυτές είναι εξαιρέσεις σε αυτό όμως: Δεν υπάρχουν τμήματα (π.χ. ονομάτο {})
# Ή οι ρυθμίσεις plugin προστίθενται από προεπιλογή, αναφέρονται μόνο ως παραδείγματα.
# Οι διαδρομές είναι επίσης μόνο παραδείγματα με τις πραγματικές προεπιλογές που βασίζονται στη διαμόρφωση
# επιλογές. Οι διαδρομές που αναφέρονται εδώ προορίζονται για διαμόρφωση -Prefix =/USR
# --sysconfdir =/etc--localstatedir =/var
# Ενεργοποίηση εγκατεστημένων πρωτοκόλλων
# Ένας κατάλογος διαχωρισμένων κόμματος των IPs ή των κεντρικών υπολογιστών όπου να ακούσετε για συνδέσεις.
# Το "*" ακούει σε όλες τις διεπαφές IPv4 "::" Ακούει σε όλες τις διεπαφές IPv6.
# Εάν θέλετε να καθορίσετε τις θύρες μη υποβολής ή οτιδήποτε πιο περίπλοκο,
# Επεξεργασία conf.d/master.conf.
# Ακούστε = *, ::
# Βάση κατάλογος όπου μπορείτε να αποθηκεύσετε δεδομένα χρόνου εκτέλεσης.
# base_dir =/var/run/dovecot/
# Όνομα αυτής της εμφάνισης. Σε ρύθμιση πολλαπλών διακυμάνσεων και άλλες εντολές
# μπορεί να χρησιμοποιήσει -i <snstance_name> για να επιλέξετε ποια παρουσίαση χρησιμοποιείται (μια εναλλακτική λύση
# σε -c <Nogfor_path>). Το όνομα του στιγμιότυπου προστίθεται επίσης στις διαδικασίες Dovecot
# στην έξοδο PS.
# instance_name = dovecot
# Χαιρετισμό μηνύματος για τους πελάτες.
# login_greeting = dovecot έτοιμο.
# Διαχωρισμένος κατάλογος των αξιόπιστων περιοχών δικτύου. Συνδέσεις από αυτά
# Το IPS επιτρέπεται να παρακάμψει τις διευθύνσεις IP και τις θύρες τους (για καταγραφή και
# για ελέγχους ελέγχου ταυτότητας). disable_plaintext_auth αγνοείται επίσης
# Αυτά τα δίκτυα. Συνήθως θα καθορίζατε εδώ τους διακομιστές μεσολάβησης IMAP.
# login_trusted_networks =
# Διαχωρισμένος κατάλογος χώρων σύνδεσης πρόσβασης Έλεγχος υποδοχής (π.χ. TCPWRAP)
# login_access_sockets =
# Με proxy_maybe = ναι αν ο προορισμός Proxy ταιριάζει με οποιοδήποτε από αυτά τα IPs, μην το κάνετε
# πληρεξούσιο. Αυτό δεν είναι απαραίτητο κανονικά, αλλά μπορεί να είναι χρήσιμο εάν ο προορισμός
# Το IP είναι π.χ. IP Balancer φορτίου IP.
# auth_proxy_self =
# Εμφάνιση περισσότερων λέξεων τίτλων διεργασιών (στο PS). Προς το παρόν εμφανίζει όνομα χρήστη και
# Διεύθυνση IP. Χρήσιμο για να δείτε ποιοι χρησιμοποιούν τις διαδικασίες IMAP
# (π.χ. κοινά γραμματοκιβώτια ή εάν χρησιμοποιείται το ίδιο UID για πολλαπλούς λογαριασμούς).
# verbose_proctitle = όχι
# Εάν όλες οι διαδικασίες θα σκοτωθούν όταν κλείσει η Master Process Dovecot.
# Ο καθορισμός αυτού σε "όχι" σημαίνει ότι το dovecot μπορεί να αναβαθμιστεί χωρίς
# αναγκάζοντας τις υπάρχουσες συνδέσεις πελατών να κλείσουν (αν και αυτό θα μπορούσε επίσης να είναι
# Ένα πρόβλημα εάν η αναβάθμιση είναι π.χ. λόγω της λύσης ασφαλείας).
# shutdown_client = ναι
# Εάν μη μηδέν, εκτελέστε εντολές αλληλογραφίας μέσω αυτού του πολλών συνδέσεων με διακομιστή DoVeadm,
# Αντί να τα τρέχετε απευθείας στην ίδια διαδικασία.
# doveadm_worker_count = 0
# Υποδοχή unix ή κεντρικός υπολογιστής: θύρα που χρησιμοποιείται για σύνδεση με διακομιστή doveadm
# doveadm_socket_path = doveadm-server
# Διαχωρισμένος κατάλογος των μεταβλητών περιβάλλοντος που διατηρούνται στο Dovecot
# Ξεκινώντας και μεταβιβάστηκε σε όλες τις διαδικασίες των παιδιών του. Μπορείτε επίσης να δώσετε
# Κλειδί = ζεύγη αξίας για να ρυθμίσετε πάντα συγκεκριμένες ρυθμίσεις.
# import_environment = tz
## 
## Ρυθμίσεις διακομιστή λεξικού
## 
# Το λεξικό μπορεί να χρησιμοποιηθεί για την αποθήκευση κλειδιών = λίστες τιμών. Αυτό χρησιμοποιείται από πολλά
# plugins. Το λεξικό είναι προσβάσιμο είτε άμεσα είτε απευθείας ή αν
# διακομιστής λεξικού. Τα ακόλουθα ονόματα λεξικών BLOCK BLOCK MAPS σε URIS
# Όταν χρησιμοποιείται ο διακομιστής. Αυτά μπορούν στη συνέχεια να αναφέρονται χρησιμοποιώντας URIs σε μορφή
# "Proxy :: <Mame>".
  # ποσοστώσεις = mysql: /etc/dovecot/dovecot-pict-sql.conf.ext
# Το μεγαλύτερο μέρος της πραγματικής διαμόρφωσης περιλαμβάνεται παρακάτω. Τα ονόματα αρχείων είναι
# Πρώτα ταξινομημένα από την αξία τους ASCII και αναλύονται με αυτή τη σειρά. Τα 00-διορθώσεις
# Στα ονόματα αρχείων προορίζονται να διευκολύνουν την κατανόηση της παραγγελίας.
# Ένα αρχείο ρυθμίσεων μπορεί επίσης να προσπαθήσει να συμπεριληφθεί χωρίς να δώσει σφάλμα εάν
# Δεν βρέθηκε:
# Επιτρέπει στο Dovecot να ακούει όλες τις συνδέσεις εισόδου (IPv4 / IPv6)

Προσθέστε έναν κωδικό πρόσβασης για τον χρήστη Dovecot:

nano config/etc_dovecot_passwd

Το πρώτο μέρος του αρχείου, πριν από το κόλον, είναι το όνομα χρήστη. Το τελευταίο μέρος, "Yourpassword", υποδηλώνει τον κωδικό πρόσβασης που θα θέλατε να δώσετε στον διακομιστή αλληλογραφίας σας.

team:{plain}yourpassword

Στη συνέχεια, το opendkim config

nano config/etc_opendkim.conf

Και προσθέστε αυτές τις γραμμές:

# Πρόκειται για μια βασική διαμόρφωση για την υπογραφή και την επαλήθευση. Μπορεί εύκολα να είναι
# Προσαρμοσμένη ώστε να ταιριάζει σε μια βασική εγκατάσταση. Δείτε το opendkim.conf (5) και
# /usr/share/doc/opendkim/examples/opendkim.conf.sample for complete
# Τεκμηρίωση των διαθέσιμων παραμέτρων διαμόρφωσης.
# Logwhy Όχι
# Κοινές παραμέτρους υπογραφής και επαλήθευσης. Στο Debian, η κεφαλίδα "από" είναι
# Επιπλέον, επειδή είναι συχνά το κλειδί ταυτότητας που χρησιμοποιείται από τα συστήματα φήμης
# και έτσι κάπως ευαίσθητο στην ασφάλεια.
# Υπογραφή τομέα, επιλογέα και κλειδί (απαιτείται). Για παράδειγμα, εκτελέστε υπογραφή
# Για τον τομέα "example.com" με τον επιλογέα "2020" (2020._domainkey.example.com),
# Χρησιμοποιώντας το ιδιωτικό κλειδί που είναι αποθηκευμένο στο /etc/dkimkeys/example.private. Πιο κοκκώδης
# Οι επιλογές ρύθμισης μπορούν να βρεθούν στο /usr/share/doc/opendkim/readme.opendkim.
# Domain example.com
# Επιλογέας 2020
# Keyfile /etc/dkimkeys/example.private
# Στο Debian, το OpendKim τρέχει ως χρήστης "OpendKim". Απαιτείται ένα umask 007 όταν
# Χρησιμοποιώντας μια τοπική υποδοχή με MTA που έχουν πρόσβαση στην υποδοχή ως μη προνομιούχα
# χρήστης (για παράδειγμα, postfix). Μπορεί να χρειαστεί να προσθέσετε χρήστη "postfix" στην ομάδα
# "Opendkim" σε αυτή την περίπτωση.
# Υποδοχή για τη σύνδεση MTA (απαιτείται). Εάν το MTA είναι μέσα σε φυλακή chroot,
# Πρέπει να διασφαλιστεί ότι η υποδοχή είναι προσβάσιμη. Στο Debian, το postfix τρέχει
# ένα chroot in/var/spool/postfix, επομένως μια υποδοχή unix θα έπρεπε να είναι
# Ρυθμίστηκε όπως φαίνεται στην τελευταία γραμμή παρακάτω.
# Socket Local: /run/opendkim/opendkim.sock
# Υποδοχή INET: 8891@localhost
# Υποδοχή INET: 8891
# Οι οικοδεσπότες για τους οποίους θα υπογράψουν παρά την επαλήθευση, η προεπιλογή είναι 127.0.0.1. Δείτε το
# Τμήμα λειτουργίας του OpendKim (8) για περισσότερες πληροφορίες.
# Internalhosts 192.168.0.0/16, 10.0.0.0/8, 172.16.0.0/12
# Η αγκυροβόληση εμπιστοσύνης επιτρέπει την DNSSEC. Στο Debian, παρέχεται το αρχείο αγκύρωσης εμπιστοσύνης
# από το πακέτο DNS-root-data.
# Nameservers 127.0.0.1
# Χάρτες χάρτες από διευθύνσεις σε πλήκτρα που χρησιμοποιούνται για την υπογραφή μηνυμάτων
# Ένα σύνολο εσωτερικών κεντρικών υπολογιστών των οποίων πρέπει να υπογραφεί το ταχυδρομείο
nano config/etc_default_opendkim

Και προσθέστε αυτές τις γραμμές

# ΣΗΜΕΙΩΣΗ: Πρόκειται για ένα αρχείο διαμόρφωσης κληρονομιάς. Δεν χρησιμοποιείται από το OpendKim
# Systemd Service. Χρησιμοποιήστε τις αντίστοιχες παραμέτρους διαμόρφωσης στο
# /etc/opendkim.conf Αντ 'αυτού.
# 
# Προηγουμένως, κάποιος θα επεξεργαστεί τις προεπιλεγμένες ρυθμίσεις εδώ και στη συνέχεια θα εκτελέσει
# /lib/opendkim/opendkim.service.generate για τη δημιουργία αρχείων override systemd at
# /etc/systemd/system/opendkim.service.d/override.conf και
# /etc/tmpfiles.d/opendkim.conf. Ενώ αυτό είναι ακόμα δυνατό, είναι τώρα
# Συνιστάται η προσαρμογή των ρυθμίσεων απευθείας στο /etc/opendkim.conf.
# 
# Daemon_opts = ""
# Αλλαγή σε/var/spool/postfix/run/opendkim για να χρησιμοποιήσετε μια υποδοχή UNIX με
# Postfix σε ένα chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Uncomment για να καθορίσετε μια εναλλακτική υποδοχή
# Σημειώστε ότι η ρύθμιση αυτό θα παρακάμψει οποιαδήποτε τιμή υποδοχής στο opendkim.conf
# αθέτηση:
# Ακούστε όλες τις διεπαφές στη θύρα 54321:
# Υποδοχή = inet: 54321
# Ακούστε το loopback στη θύρα 12345:
# Υποδοχή = inet: 12345@localhost
# Ακούστε το 192.0.2.1 στη θύρα 12345:
# Υποδοχή = inet: 12345@192.0.2.1

Όταν είμαστε έτοιμοι να ρυθμίσουμε τον διακομιστή Postfix, θα εκτελέσουμε τον παρακάτω κώδικα, με το κατάλληλο όνομα τομέα ενσωματωμένο. Ξεκινήστε δημιουργώντας ένα σενάριο

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

Τώρα, στο Nano, ο επεξεργαστής κειμένου, επεξεργαστείτε αυτό το αρχείο, ώστε να περιλαμβάνει το όνομα τομέα σας αντί του femmebabe.com.

# !/bin/bash
# Εγκατάσταση postfix

Τώρα, εκτελέστε το ολοκληρωμένο σενάριο για να διαμορφώσετε το postfix, το opendkim και το dovecot.

./scripts/postfixsetup

Μόλις εκτελεστεί αυτό το σενάριο, αντιγράψτε την τελευταία γραμμή εκτυπώνει και επικολλήστε το στη διαμόρφωση DNS ως τιμή για το sendonly._domainkey. Αυτό είναι το κλειδί OpendKim που χρησιμοποιείται για τον προσδιορισμό του τομέα σας κατά την αποστολή ασφαλούς αλληλογραφίας.

Φοβερός! Μέσα σε λίγες μέρες, θα πρέπει να μπορείτε να στείλετε αλληλογραφία από το διακομιστή με την προϋπόθεση ότι όλα έχουν διαμορφωθεί σωστά.

Εάν απλά ρυθμίσατε το DNS για τον διακομιστή αλληλογραφίας σας, θα πρέπει να διαρκέσει λιγότερο από 72 ώρες για να ενημερωθούν τα αρχεία. Είναι συνήθως πολύ πιο γρήγορα. Μπορείτε να ελέγξετε εάν ο διακομιστής σας λειτουργεί χρησιμοποιώντας αυτήν την εντολή, παρέδωσε το email σας:

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

Εάν όλα φαίνεται να λειτουργούν σωστά, θα πρέπει να μπορείτε να στείλετε email με το διακομιστή σας. Εάν δεν λειτουργεί, δοκιμάστε να κοιτάξετε τα αρχεία καταγραφής για να δείτε ποιο είναι το σφάλμα.

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

Αυτό θα προσφέρει λεπτομερείς πληροφορίες σχετικά με το ταχυδρομείο που αποστέλλεται από το διακομιστή και αν λειτουργεί σωστά. Θα πρέπει να μπορείτε να δείτε το μήνυμα ηλεκτρονικού ταχυδρομείου στα εισερχόμενά σας, αν δεν υπάρχει εκεί, ελέγξτε το φάκελο SPAM.

Θα χρειαστεί επίσης να διαμορφώσετε τις ρυθμίσεις σας στις ρυθμίσεις σας.py, ώστε ο διακομιστής email σας να μπορεί να μιλήσει στην εφαρμογή Django, το έργο. Προσθέστε ή αντικαταστήστε αυτές τις γραμμές στις ρυθμίσεις σας

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

Παρατηρήστε ότι χρησιμοποιούμε ένα αρχείο ρυθμίσεων για να λάβετε τον κωδικό πρόσβασης. Ας φορτώσουμε αυτό το αρχείο στις ρυθμίσεις όπως έτσι, στην αρχή του αρχείου:

# Ανοίξτε και φορτώστε τη διαμόρφωση

Ας δημιουργήσουμε αυτό το αρχείο και προσθέτουμε ένα μυστικό κλειδί σε αυτό, καθώς και τον κωδικό πρόσβασης αλληλογραφίας. Για να δημιουργήσετε ένα μυστικό κλειδί, χρησιμοποιήστε αυτήν την εντολή, με οποιοδήποτε μήκος σας αρέσει στο τέλος:

openssl rand -base64 64

Τώρα, αντιγράψτε το κείμενο που δημιουργεί και επεξεργάζεται το OpenSSL

sudo nano /etc/config.json

Προσθέστε τις ακόλουθες γραμμές στο αρχείο σας, με το κλειδί που το OpenSSL δημιουργείται ως το μυστικό κλειδί.

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

Η μορφή JSON είναι απλή και εύκολη στη χρήση, μπορούμε να δηλώσουμε και άλλα κλειδιά που θέλουμε να χρησιμοποιήσουμε και στο έργο μας και να τα κρατήσουμε ξεχωριστά από τον κατάλογο του έργου μας, ώστε άλλοι χρήστες να μην μπορούν να γράψουν σε αυτούς και έτσι δεν μπορούν να διαβαστούν από τον κατάλογο του έργου μας μόνο. Αυτή συνιστάται η πρακτική για τα κλειδιά API, από τα οποία θα χρησιμοποιήσουμε περισσότερα από λίγα εδώ.

Θα θελήσετε επίσης να δημιουργήσετε αντίγραφα ασφαλείας του έργου σας για να βεβαιωθείτε ότι όλα έχουν αποθηκευτεί και θα μπορείτε να ανακτήσετε την εργασία σας αργότερα, ακόμη και αν δεν επιθυμείτε πλέον να νοικιάσετε ένα διακομιστή.

sudo backup

Τώρα, δοκιμάστε να στέλνετε ένα ηλεκτρονικό ταχυδρομείο HTML από το διακομιστή ιστού, παρέχοντας ότι η αποστολή ενός από τη γραμμή εντολών λειτουργεί. Αναζητήστε την παρουσία σας στο κέλυφος και στείλτε ένα ηλεκτρονικό ταχυδρομείο HTML σε αυτόν τον χρήστη μέσω του Django. Αλλάξτε το όνομά μου στον κώδικα, Charlotte, στο όνομα χρήστη σας.

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

Εάν η πρώτη εντολή δεν λειτουργεί, φροντίστε να χρησιμοποιήσετε

source venv/bin/activate

Με την προϋπόθεση ότι όλα έχουν ρυθμιστεί σωστά, θα λάβετε τώρα ένα μήνυμα ηλεκτρονικού ταχυδρομείου καλωσορίσματος στο γραμματοκιβώτιό σας που αποστέλλεται από την εφαρμογή ιστού σας. Επιτυχία! Έχετε προχωρήσει πολύ.

Ήθελα να προσθέσω, αν αγωνίζεστε ποτέ με τυχόν σφάλματα, ενώ εργάζεστε σε ένα τέτοιο έργο, μην διστάσετε να αναζητήσετε απαντήσεις και να ζητήσετε βοήθεια. Η Google, μεταξύ άλλων μηχανών αναζήτησης, είναι εξαιρετικοί πόροι για την αναζήτηση βοήθειας προγραμματισμού. Απλά αναζητήστε το σφάλμα που παίρνετε και θα μπορείτε να δείτε πώς άλλοι άνθρωποι επιλύουν το πρόβλημα. Επίσης, είστε ευπρόσδεκτοι να επικοινωνήσετε μαζί μου, τους εκπαιδευτικούς σας (καθηγητές, καθηγητές, δασκάλους), κάθε συνομηλίκους στο Διαδίκτυο που είναι διαθέσιμοι για βοήθεια προγραμματισμού ή συμβουλευτείτε ξανά αυτό το βιβλίο ή άλλους πόρους για να βρείτε λύσεις στα θέματα που αντιμετωπίζετε. Καταλαβαίνω ότι αυτό δεν είναι εύκολο, αλλά ακόμα κι αν έχετε διαβάσει σε αυτό το μακρινό και δεν γράφετε κωδικό, μαθαίνετε πολλά για την οικοδόμηση μιας εφαρμογής ιστού από το μηδέν. Πατήστε τον εαυτό σας στην πλάτη, κάνετε καλή δουλειά.

Σας ευχαριστούμε που αφιερώσατε χρόνο για να διαβάσετε αυτόν τον οδηγό ανάπτυξης ιστού τρίτης έκδοσης. Σε μελλοντικές εκδόσεις, θα συμπεριλάβω περισσότερα από τα σημαντικά παραδείγματα που συζητήθηκαν στην αρχή του εγγράφου και θα βουτήξουμε πολύ βαθύτερα στον κόσμο της ανάπτυξης λογισμικού και υλικού. Μείνετε συντονισμένοι για το τι πρόκειται να έρθει και ανυπομονώ να σας διδάξω πώς να δημιουργήσετε απίστευτο λογισμικό. Τα λέμε στην επόμενη έκδοση!






Κοντά
Σελίδα 1
Αλμα
Δείτε το πλήρες άρθρο
Συνέχεια ανάγνωσης

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση



Three Thirteen Online Free Play three thirteen online for free. Invite a Friend Join a Game ***.
Ααράζω

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


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

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


Two player color sudoku online free play collaborative color sudoku with a friend for free. Invite a Friend Join a Game ***.
Ααράζω

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


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


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


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


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


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


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


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


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


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


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


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


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


με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


what's the best way to boil eggs?


here is a simple method to boil eggs:


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

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

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

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

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


.

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


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


the most common side effects of birth control pills include:


1. Nausea

2. Breast tenderness

3. Headaches

4. Weight gain

5. Mood changes

6. Spotting or breakthrough bleeding

7. Changes in libido 

8. Acne 

9. Bloating 


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

.

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


How do I host a web server from my home?


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


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


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


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


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


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


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


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


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


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


με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


How do I write a professional blog post?


Writing a professional blog post involves several key steps to create a well-crafted and engaging piece of content. Here are some tips to help you write a professional blog post:

1. Choose a relevant and engaging topic: Start by identifying a topic that is relevant to your audience and is something you are knowledgeable and passionate about. Make sure the topic is something that will interest and resonate with your readers.

2. Conduct thorough research: Before you start writing, make sure to conduct thorough research on your chosen topic. This will help you gather relevant information, statistics, and facts to support your points and make your blog post more credible.

3. Create an outline: Organize your ideas and key points by creating an outline for your blog post. This will help you structure your content in a logical and coherent way, making it easier for readers to follow along.

4. Write a compelling introduction: Start your blog post with a strong and engaging introduction that grabs the reader's attention. Use a hook to draw readers in and make them want to keep reading.

5. Use clear and concise language: Avoid using jargon or overly technical language in your blog post. Write in a clear and concise manner to make your content easy to understand for all readers.

6. Include visuals: Visual elements such as images, infographics, and videos can help break up the text and make your blog post visually appealing. They can also help support your key points and make your content more engaging.

7. Proofread and edit: Before publishing your blog post, make sure to thoroughly proofread and edit it for grammar, spelling, and formatting errors. Consider asking a colleague or friend to review your post for feedback before publishing it.

8. Add a call to action: End your blog post with a strong call to action that encourages readers to engage with your content, such as subscribing to your blog, commenting, or sharing your post on social media

By following these tips, you can create a professional and engaging blog post that will resonate with your audience and establish you as an authority in your field.

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση



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


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


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


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


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


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


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


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


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


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


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

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


What are the benefits to having a security camera?


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


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


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


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


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


με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


why is it safer to wear a mask in public?


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


.

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


is sugar really unhealthy?


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


.

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


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


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


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


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


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


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


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


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


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


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


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


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


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


με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


How do I write a good book?


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


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


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


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


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


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


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


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


με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


What causes migraine and how are they treated?


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


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


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

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

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

4. Practicing relaxation techniques such as deep breathing or meditation

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

6. Getting regular exercise and maintaining a healthy diet


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

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


How do I build a mail server with postfix?


To build a mail server with Postfix, follow these steps:


1. Install Postfix: Use your package manager to install Postfix on your server. For example, on Debian/Ubuntu, you can run `sudo apt-get install postfix`.


2. Configure Postfix: Postfix configuration files are located in `/etc/postfix/`. The main configuration file is `main.cf`. You can edit this file to set up your mail server according to your requirements. Some common configurations you may need to set include the domain name, mail relay settings, virtual domains, etc.


3. Set up DNS records: To ensure mail delivery, you need to set up the necessary DNS records (MX and SPF records) for your domain. Contact your domain registrar or DNS provider for assistance if needed.


4. Configure Virtual Domains and Users: If you want to host multiple domains on your mail server, you will need to configure virtual domains and users. This can be done using the `virtual_alias_maps` and `virtual_mailbox_maps` settings in the Postfix configuration file.


5. Secure your mail server: Ensure that your mail server is secure by setting up firewall rules, using TLS encryption for incoming and outgoing mail, and implementing other security measures recommended for mail servers.


6. Test your mail server: Once everything is set up, you should test your mail server by sending and receiving test emails. Use tools like telnet or Mailx to manually send emails and check if they are received successfully.


Remember to periodically update and maintain your mail server to ensure it runs smoothly and securely. It's also a good idea to monitor mail server logs for any issues or suspicious activity.

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση



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


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


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


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

.

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


How do i wear deadlock?


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


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


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


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


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


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


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


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

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


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


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


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


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


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


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


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


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

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


Why do people implant nfc implants in their hands?


There are several reasons why people choose to implant NFC (Near Field Communication) implants in their hands:


1. Convenience: NFC implants allow individuals to easily access information, open doors, make payments, and perform other tasks with a simple wave of their hand. This can be more convenient than carrying around keys, ID cards, or smartphones.


2. Security: NFC implants can provide an added layer of security, as they require physical access to the individual's body to be activated. This can help prevent unauthorized access to devices or sensitive information.


3. Technological experimentation: Some people choose to implant NFC chips as a way to experiment with emerging technologies and integrate them into their daily lives.


4. Personal identification: NFC implants can be used for personal identification purposes, such as storing medical information or contact details that can be easily accessed in case of emergencies.


5. Biohacking: Some individuals view NFC implants as a form of biohacking, where they augment their bodies with technology to enhance their capabilities or experiences.


Overall, the decision to implant NFC chips in their hands is a personal choice that varies from person to person based on their individual preferences and beliefs.


Ααράζω

με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση


How is the crypto market growing so quickly?


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


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


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


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


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


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


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


με Daisy / Θέα | Αγορά | Αγοράστε με κρυπτογράφηση




https://glamgirlx.com -


(Κάντε κλικ ή πατήστε για λήψη εικόνας)
Επαγγελματική ψυχαγωγία, φωτογραφίες, βίντεο, ήχος, ζωντανή και casual gameplay, καθώς και ανίχνευση ID, ανάπτυξη ιστοσελίδων και υπηρεσίες υποκατάστασης.

Αφήστε μου μια συμβουλή στο Bitcoin χρησιμοποιώντας αυτήν τη διεύθυνση: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

Όροι παροχής υπηρεσιών