خبریں - سائٹ ملاحظہ کریں
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 року

Передмова:

Міркування щодо безпеки у створенні програмного забезпечення для Інтернету є важливою частиною плану та виконання будь -якого веб -розробника, а також інженерія прототипу, який є надійним, стабільним та корисним для практичних цілей. 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 Вбити час або щось зробити в Інтернеті, як правило, на пристрої смартфона сенсорного екрану. Більшість людей навіть не знають, з чого почати, коли вони хочуть створити веб -сайт з нуля, вони, як правило, почали б на веб -сайті іншої людини та створити щось обмежене у функціональності, надійності, простоті використання та особливо творчості, коли вони могли мати всі останні потужні інструменти у своєму розпорядженні, щоб побудувати щось корисне, не витрачаючи часу на натискання кнопок, і витрачають гроші на оплату грошей на дорогих підписок на програмне забезпечення, мало хто бажає вживати в будь -якому випадку, враховуючи обмеження, що не витрачає обмеження. Якщо у вас є кілька хвилин, щоб прочитати цю книгу і дізнатися, чого я хочу навчити вас, або навіть поговорити зі мною особисто про ваші цілі та отримати певні вказівки в правильному напрямку, і мотивовані навчитися кодувати та писати власне програмне забезпечення, візьміть цю книгу додому та відкладіть деякий час, щоб навчитися створювати наступні впливові, потужні, спрощених і важливих веб -додатків, веб -сайту, який є всім на вас і робить саме те, що ви хочете і задовольняють потреби.

Про мене: Я розробник програмного забезпечення з широким спектром досвіду в C/C ++, Java, Python, HTML, CSS та JavaScript. Я будую веб -сайти, які люди хочуть користуватися, хочуть відвідати і навіть пристрастився до використання просто для того, щоб дізнатися, відтворити та вбивати час, а головне, я продаю програмне забезпечення. Якщо у вас було уявлення про те, як ви хотіли, щоб веб-сайт виглядав і функціонував, ви готові підтримати мене, щоб я міг задовольнити власні потреби, поки я задовольняю ваші, і ви готові покрити витрати на запуску веб-сайту самостійно, я б створив вам наступний YouTube, Tiktok, Twitter, Google або навіть високотехнологічний додаток безпеки лише ви можете отримати доступ. Замість того, щоб намагатися продати вам свій час, я намагаюся придбати ваш: я хочу поговорити з вами, щоб створити програму (веб -сайт) з такою інформацією, яка вже існує, і навчити вас, що вам потрібно, щоб бути незалежним розробником програмного забезпечення, підприємцем, що веде успішну кар'єру в будь -якій галузі, яку ви бажаєте. І дозвольте мені бути зрозумілим, освіта, яку я даю вам, буде неофіційною. Ви можете піти до школи і дізнатися все це з офіційною освітою, або навіть прочитати цю книгу в школі, виконати свої завдання та забрати багато від вашої освіти, але я офіційно не поставлю вас на гаряче місце і попрошу вас виконати завдання. Я не твій професор, ти можеш подумати про мене, як про друга, який хоче спрямувати тебе до кар'єри, керованої вашим особистим успіхом. І я також не продаю вам успіх, вам потрібно буде купувати його у свій час. Навчання коду має круту криву навчання і ніколи не було легким або навіть не було. Вам потрібно працювати так сильно, як можливо, і продовжувати намагатися провалитись і спробувати ще раз, навіть коли ви розчаровані, щоб вивчити та створити програми самостійно. Це в природі самого коду. Код працює компілятором, який призначений для надання повідомлень про помилки програміста, і вони навчать вас кодувати, навіть якщо ви просто скопіюєте помилку у свою пошукову систему та читаєте приклади інших людей. І я мушу сказати, що вам не потрібно бути надзвичайно багатим, розумним, успішним або навіть детально орієнтованим або організованим для створення програми. Комп'ютер піклується про цю організацію за вас. Вам просто потрібно наполягати на спробах та помилках, підтримувати фокус і наполегливо працювати над тим, що ви робите, і у вас буде дуже успішна кар'єра в цілому того, що робите.

Хто я: Я усвідомлюю, що останній розділ був більше про навчання та ваші шляхи з цієї книги. Хто я саме? Це складне питання. Мені це незрозуміло, коли я страждаю від медичних умов, які можуть ускладнити мені навіть кодувати чи писати цю книгу, при цьому представляючи проблеми з соціалізацією та питаннями ідентичності, які ускладнюють моє життя, коли справа доходить до себе. Коротше кажучи, якщо ви читаєте цю книгу, ви привезли її додому, тому що ви прогортали її і подумали, що це корисно, або навіть якщо ви просто прочитали це далеко, для вас я схожий на індивіда, яка хоче бачити, як вам вдасться у всьому, що ви робите. Я сам інженер, розробник програмного забезпечення та студент, і я пишу цю книгу для інших студентів, які хочуть полегшити своє життя, маючи посібник із програмного забезпечення, що їм потрібно полегшити своє життя, наводячи приклади, щоб скопіювати, що поєднується, як велика головоломка, у робочому, корисному, великому, функціональному, згуртованому та залученні додатку, що може спричинити успіх незалежно від лінії бізнесу. Багато в чому це я роблю: я будую програми, щоб допомогти собі та іншим людям досягти успіху. Я також автор, хоча це моя перша публікація, яку я маю намір завершити, щоб скласти своє портфоліо в корисний документ, а також художник. Я визнаю це тобі, я начебто дивна людина. Я не ідеальний, я керував законом, навіть змусив мене залишити коледжі та університетів і залишити держави, щоб спробувати зробити собі ім'я з більшим успіхом. Я за народженням жінки, я ношу макіяж, фотографую себе, ношу сукні та інший жіночий одяг, і я залишаюся усвідомленим за собою як жінку. У мене були проблеми з іншими людьми в минулому, які призводять до боротьби з написанням та створенням WebApps, і я перепрошую, що мені не вдалося швидше дістати цю книгу в руки: вам це було потрібно. Ви захочете прочитати та написати код, схожий на мій, і працює як моє, і робить те саме, але ще краще, бо якщо ви можете дозволити собі придбати цю книгу, а не розмивати клавіатуру, як я, просто для того, щоб створити книгу, самі просячи за неї, у вас є ресурси, які ви повинні досягти успіху у своєму житті. У мене були всілякі проблеми з ростом сім'ї, станами здоров'я, лікарями, засобами масової інформації та законом, і мій код глибоко відображає боротьбу, яка є фемінізмом та жіночою природою у розділеному та розчарованому світі. Однак ця книга - це те, про що я глибоко дбаю, моя дитина, моє портфоліо та засоби для існування, тому я ціную ваш розгляд, коли ви візьмете текст додому і ретельно порите його, щоб навчитися у мене. Будь ласка, майте на увазі, що я не ідеальний, у цій книзі будуть помилки, зміни та нові видання, і вам потрібно буде подумати з вашим логічним мозком якнайкраще, щоб мати успішний досвід мого написання. Крім того, зрозумійте, що я маю на увазі для вас, навіть коли ви стикаєтесь з викликами під час написання. Подумайте про це так: Коли ви можете просто взяти напрокат комп'ютерну систему, щоб зробити все, що ви можете уявити в цифровому просторі, зберігати всю інформацію, з якою ви стикаєтесь, проаналізуйте та організовуєте її, і зрозумієте, що ви неминуче стикаєтеся з інформацією, яку ви приймаєте та навіть публікуєте. Я вам це кажу, бо стикаюся з тими ж труднощами. Використовуйте цю книгу на власний ризик, працюйте зі своєю спільнотою та спільнотами, доступними для вас, щоб створити програмне забезпечення в безпечній обстановці, і не сприймайте речі особисто, коли ви не зможете або навіть досягти успіху в тому, як я дістався так далеко, і чому я можу принести вам цей текст і допомогти вам досягти успіху, не розбиваючись на шлях божевілля, який залишає мене пошкодженим, розірваним, коли ми з глобальною мережею, що ми отримуємо глобальну мережу, що ми отримуємо глобальну мережу, що стосується того, що ми, всі, всі проблеми, що перебувають у глобальній мережі, що ми вживаю, що ми працюємо з глобальною мережами, що ми працюємо з глобальною мережею. буде працювати, Інтернет. Ви, можливо, не дуже знайомі з тим, ким я є лише з кількома словами, але я закликаю вас читати далі, ви познайомитесь з мною, коли продовжуєте читати та розуміти мене, будуючи власні проекти, щоб завершити свою роботу. З цією книгою не буде домашнього завдання, доки ваші професори чи викладачі не призначають вам, але я дуже рекомендую вам створити портфоліо проектів самостійно під час читання, а також проект Capstone, який демонструє, як ви можете застосувати те, що ви дізналися. Мій проект Capstone - це основа для більшості того, що ви прочитаєте в цій книзі, оскільки він включає код з моїх попередніх проектів, код, який я створив, і навчився писати методично вручну, і широкий спектр ідей та порад, які допомогли мені досягти успіху до того, де я можу скрутити простий додаток, який повністю представлений і виглядає і поводиться як популярний додаток, ви можете побачити ваш друг або родина, що використовує в Інтернеті, рекламується, або в новинах.

Що таке книга: Ця книга - це підручник за прикладом. Ви можете знайти тут код, інструкції щодо того, як навчитися кодувати, інформацію про налагодження коду та виправлення помилок, кроки усунення несправностей, інструкції щодо того, як створити резервне копіювання та зберегти свій код, повторно розгортайте, якщо хтось порушує ваш код, захищає код, розгортання свого коду, створення інтерактивних веб-сайтів, які розважають, залучають та звикають, і ви отримаєте програму, як я, як і програму Ви створюєте абсолютне найкраще світло, щоб бути найбільш привабливим для ваших кінцевих користувачів, відвідувачів вашого веб -сайту. У цій книзі я продемонструю ряд прикладів дизайну програмного забезпечення з акцентом на Інтернет як платформу, а також безпеку. Ми ініціюємо досвід навчання, створивши базовий проект за допомогою оболонки Unix, з функціями резервного копіювання та сценаріїв. Потім ми розглянемо базовий веб -сайт блогу, оновіть наш блог за допомогою функцій фото та відео, а також використовувати ці функції для використання рішень безпеки за допомогою безкоштовного програмного забезпечення та захищає наш сервер за допомогою модуля аутентифікації, що підключається (PAM). Потім ми розглянемо обробку та обробку файлів, вивчення редагування відео, пожертвування голосу, сканування штрих -коду та розпізнавання оптичного характеру серед інших понять. По дорозі ми розглянемо API, які допоможуть нам зробити наше програмне забезпечення більш корисним та безпечним, з безкоштовними та платними варіантами. Попутно ми вивчимо інструменти для фізичної безпеки та войовничих дій, такі як конгрес та конструкція, розробка та виробництво боєприпасів, включаючи дизайн ствола та ретранслятора, дизайн башточок та безпілотників та інші принципи, які ми інтегруємо з нашим програмним забезпеченням у існуючій мережі, щоб захистити наше програмне забезпечення та продемонструвати самооборону та стійкість. Ми зробимо перерви по дорозі до створення ігор, 2D та 3D -рендерінгу та працювати з вбудованим обладнанням у прикладах дослідження базового розміру програмного забезпечення та електронного вібраційного масажера, що відливаються в силіконовому гумі відповідно. Попутно ми також будемо використовувати вже доступні рішення машинного навчання, щоб краще забезпечити наше програмне забезпечення. Ми також використовуватимемо інструменти для акцій, доступні для Інтернету, щоб впорядкувати та забезпечити процес. Ця книга - це посібник з вашого успіху у створенні веб -додатку та інтеграції її з професійною мережею комп'ютерних та вбудованих механічних систем, а в цілому - посібником з побудови програмного забезпечення та вбудованого обладнання без фонового знання чи попереднього досвіду.

Що це за книга: Якщо ви дійсно хочете мати веб -сайт, ви можете просто налаштувати простий магазин і продати те, що вам потрібно, опублікувати блог, опублікувати фотографії чи відео чи іншим чином, не пишучи жодного рядка коду. Ця книга - це не така. Ця книга навчить вас створювати програмне забезпечення, яке є більш корисним, повністю представленим, функціональним та безпечним, ніж будь -яке програмне забезпечення, яке ви вже можете знайти, оскільки воно розгортає останнє програмне забезпечення, яке все ще є прототипами, може бути дорогим для роботи в масштабах, які старші працюють, і не звертаються до зворотних, скромних компаній, створених для заробляти гроші на людей, які насправді нічого не роблять. Якщо ви уважно дотримуєтесь цієї книги, ви хочете написати код, код дослідження, створити власні програми, і ви заробляєте гроші з того, що робите. Я зароблю гроші з цієї книги навіть на ранніх стадіях, оскільки вона містить інформацію, яку люди потребують і хочуть читати, і вже купують, коли вони купують або використовують мої програми. Ця книга не створить для вас додаток, але вона буде вказувати вам у правильному напрямку та озброїти вам потрібні інструменти та навички та поради, які полегшать ваш власний успіх у створенні програмного забезпечення для Інтернету, з кожним рядком коду, який вам потрібно буде написати як приклад, готовий бути складеним у програмне забезпечення, яке ви та ваші прихильники, гості, клієнта, друзі, родина, відвідувачі, підрядники та люди, які хочуть використовувати та підтримувати.

Що ви дізнаєтесь: Ця книга навчить вас будувати та продавати програмне забезпечення, дійсно функціональне, корисне програмне забезпечення, записи медіа, функції безпеки, такі як розпізнавання обличчя, сканування штрих -коду з читабельним машинами, веб -API для аутентифікації, запису та надання відео та фотографій та обміну повідомленнями Bluetooth та NFC (NFC). Ця книга навчить вас використовувати мережевий комп'ютер, зосередившись на Debian Linux, як створити код Bash, щоб зробити встановлення та резервне копіювання вашого програмного забезпечення безшовним, автоматизованим вітерцем, як створити код Python як резервну службу для обслуговування динамічних повідомлень, стильних речей, які чудово використовують стилі CSS, Bootstrap, ввімкнення користувачів, що займаються власністю, як і інтерактивність, як і інтерактивність, як і інтерактивність, як і інтерактивні повідомлення, як і ввімкнено, як і ввімкненості Цілі, сканування ідентифікатора, модерація зображень та відео, мікротранзакції даних, щоб забезпечити захист вашого програмного забезпечення, обробку платежів, торгівлю криптовалютами, асинхронні завдання тощо. Ви дізнаєтесь, як будувати власні пристрої Bluetooth, з акумуляторами, зарядними пристроями, мікроконтролами, ланцюгами, двигунами та датчиками, використовуючи припою, дріт та 3D -надруковані, а також литі матеріали. Я продемонструватиму основних директорів 3D -дизайну, застосованих до виробництва добавок та інструментів та виготовлення штампів, тому ви зможете виготовити власні вбудовані, апаратні пристрої з інтегрованими батареями, зарядними пристроями, електронними схемами та функціональними виходами. і налагодити їх за допомогою Bluetooth та Інтернету. Зокрема, ми розглянемо два тематичні дослідження, вібруючий масажер та домашню вогнепальну зброю, обидва запрограмовані в OpenScad, який доступний як графічний інтерфейс або утиліта командного рядка і може бути інтегрована в Інтернет для більш швидких результатів. Ви дізнаєтесь, як будувати та розгорнути веб -сайт з нуля без попереднього досвіду, робити його функціональним, безпечним, красивим, корисним та найголовніше практичним. Ви дізнаєтесь, як використовувати машинне навчання та комп'ютерне бачення, щоб зробити сайт безпечним та практичнішим, записуйте відео та аудіо з вашого веб -сайту, пожертвуйте свій голос, створюйте музику та модулюйте аудіо, щоб створити корисні зразки та як пробити шум, використовуючи інші веб -сайти, щоб створити найкращу можливу мережу веб -сайтів, які ви можете зв'язати безпосередньо з вашим, щоб поділитися всіма корисними інформацією, яку ви пропонуєте, і навіть важливіше принести люди та ділових програмних програм. Ця книга буде зосереджена найбільш значною мірою на медіа, безпеці та машинному навчанні, які є основними трьома компонентами, які допоможуть вам створити корисне програмне забезпечення для Інтернету, залучаючи правильних користувачів та відключаючи неправильні способи реалістичного, практичного, руки та залучення, а також автоматичним та міцним. Ця книга вчить Unix, зокрема Debian (Ubuntu), Bash Shell, Python, HTML, CSS, JavaScript та ряд корисних програмних пакетів для Python, як запити, а також корисне програмне забезпечення Bash, як GIT та FFMPEG. Я також навчу вас автоматично торгувати криптовалютою та приймати платежі в криптовалюті або з регулярних дебетових карток, навіть виплачуючи відвідувачам частку вашого доходу, якщо ви вирішите це зробити. Я навчу вас заробляти гроші на своєму веб -сайті за допомогою реклами, як підготувати свою програму для пошукових систем та зробити його швидким, займає перше рейтинг за тим, що ваші клієнти будуть шукати вас, і рейтинг якомога більше загальних пошуків. Я навчу вас продавати своє програмне забезпечення, рекламувати його, звертатися до клієнтів, які шукають ваші послуги, та зробіть ім'я в Інтернеті через шляхи, які вже існують, є недорогими та добре працюють. Я навчу вас, як зберегти свої дані на хмарних комп'ютерах, які працюють для вас, і дешево зберегти ваші дані, як планувати та створити веб -сайт, який робить те, що ваші користувачі хочуть, і те, що ви хочете, і як підтримувати користувачі, залучаючи ваш сайт, натисніть на їхні телефони з сповіщеннями, електронною поштою, текстовими повідомленнями, телефонними дзвінками та більше проспектів, щоб повернути своїх користувачів до вашого веб -сайту на вашій дискусії за клацанням клацання. Ця книга буде зосереджена на практичній публікації та розповсюдженню ЗМІ у великих кількостях, від тексту до фотографій до відео до аудіо, справляючи гарне враження на кінцевих користувачів (ваша клієнтура), а також продавати себе будь -яким способом, щоб створити веб -сайт, додаток, який є представником вас і ви тільки, і робить вас, програмне забезпечення та ваша компанія добре виглядають найкращим шляхом. Ви також дізнаєтесь від мене кілька порад та рекомендацій, від порад щодо кодування, практичної марнославства, таких як макіяж та фотографія, моделювання та акторська майстерність, та багато іншого, що буде важливим для зображення себе та вашої компанії в найкращому можливому світлі, використовуючи всі доступні вам інструменти, розповсюджуючи стільки вмісту, скільки вам потрібно в здоровому балансі платформ, щоб принести ваше програмне забезпечення для ухилення від без зусиль, робочих місць чи грошей. Ця книга називається "практичноюГлибоке навчання та безпека на основі веб -сайту "з причини: він стосується навчання коду, зокрема для Інтернету, зокрема з акцентом на безпеку, з практичної точки зору, з прикладами робочого коду, який служить практичним цілям, викладеним у тексті. Компонент навчання цього тексту також охоплює машинне навчання, код I покаже, як працювати в Інтернеті, що займається комп'ютерним баченням, зображенням, зображенням, зображенням, зображенням, зображенням. Вдосконалення, підписи зображень та інші завдання, такі як показники прогнозування, отримані з зображень, таких як природа зображення як автентичне, комп'ютерне зображення, або оптична копія (фотографія зображення або друкована фотографія). З обличчям ви можете зробити серверний комп'ютер, комп'ютер, який зазвичай просить вас провести ім'я користувача та пароль і ввійти, можливо, з підтвердженням для кожного нового входу або нової IP -адреси, але якщо ви будуєте велике масштаб, простий у використанні, принципово безпечне та потужне програмне забезпечення, це може бути достатньо. використання). Кожен, хто будує програмне забезпечення, яке бездоганно захищає, має певне розуміння того, що це означає. Програмне забезпечення за своєю суттю невпевнено, оскільки пристрої та облікові записи, які ми використовуємо для доступу до нього, не завжди є в нашому розпорядженні, вони можуть бути в руках тих, хто має намір для програмного забезпечення, і тому можуть становити ризик для самого програмного забезпечення. Це щось у фокусі цієї книги. Мережевий комп'ютер за замовчуванням забезпечений довгим ключовим маркером, який називається клавішем SSH або Secure Shell, і в іншому випадку найкраще захищається веб -сервером, оскільки веб -сервер забезпечує відкритий доступ, а також сучасні інструменти безпеки, що працюють на самому сервері. Веб -сервер має доступ до веб -браузера користувача, який, мабуть, є найпотужнішою частиною пристрою користувача, оскільки це місце, де користувач може отримати доступ до мережевого програмного забезпечення. Цей інструментарій може відображати текст, веб -сторінки, які ви бачите, а також можуть записувати зображення, аудіо та відео (як фотографія обличчя або ідентифікатор стану), можуть прочитати та записувати в Bluetooth Radio пристрої, а також читати та записувати до польового транспондера, нерозумні ключові картки, FOBS, наклейки, кірки та навіть чіп -імплантатів із унікальними серійними номерами, які можна читати та писати дані. Використовуючи всі інструменти у вашому розпорядженні, за допомогою цієї книги ви оснащете себе знаннями для створення безпечного веб -сайту, і загалом безпечна мережева комп'ютерна система, яка працює для вас

З чого почати: Ви можете пропустити повз розділ, я починаю цю книгу, або будь -який розділ, до того, що вам потрібен код, особливо якщо у вас є досвід кодування до або будь -якого з вищезгаданих інструментів, які я детально описую в цій книзі, а також документувати випадки використання та практичні приклади. Якщо у вас немає досвіду написання коду, я настійно рекомендую прочитати всю цю книгу, і особливо рекомендую прочитати попередні розділи, щоб переконатися, що ця книга підходить саме вам. Якщо ця книга не підходить для вас, подумайте про те, щоб подарувати її другові чи родичу, який може бути зацікавлений у вивченні веб -розвитку самі, і навіть подумати над тим, щоб позичити її та навчитися у них заповнити прогалини, де я провалив вас як вчитель, або інші вчителі зробили перед мною. Почніть там, де ви хочете, кожна частина цієї книги буде корисною, якщо ви маєте намір створити корисну програму, і вважати, що найкращі програми побудовані з урахуванням кінцевого користувача: знайте свого клієнта. Тепер ви знаєте мене, знаєте цю книгу, і ви готові розпочати. Для початку візьміть комп'ютер (навіть найдешевший ноутбук із магазину коробки, Amazon або старий робочий стіл працює, і налаштуйте його таким чином, що працює для вас.

Як читати цю книгу: Виділений текст, позначає, що текст належить до командного рядка, де ви напишете код, який ви запускаєте. Командний рядок сильно орієнтований на клавіатуру і вимагає мало клацання, прискорюючи свій робочий процес та полегшуючи вам речі.

Початок роботи: Давайте зануримось. Ми почнемо з побудови коду на місцевій машині та почнемо без створення веб -сайту, підключеного до Інтернету. Це безпечніше, щоб почати, нічого не коштує, і вам легко. Залежно від вашої операційної системи, потрапляння в оболонку баш буде трохи інакше. Для Mac ОС я рекомендую встановити віртуальну машину в цей момент, оскільки ви отримаєте найбільш сумісність з віртуальною машиною. Різні постачальники, такі як VirtualBox та Paralells, можуть запустити для вас віртуальну машину, хоча також можна встановити Ubuntu безпосередньо на машині, якщо ви вважаєте за краще використовувати рідне середовище, яке рекомендується для створення швидкого, обтічного досвіду. Якщо ви використовуєте Linux або Windows, які я рекомендую, створити проект це повинно бути досить просто. Відкрийте термінал, відрегулюйте розмір, як вважаєте за потрібне, і почніть наступний крок 2. Якщо ви використовуєте Windows, будь ласка, дотримуйтесь кроку 1.

Крок 1: - Тільки користувачі Windows У Windows відкрийте командний рядок як адміністратор та введіть WSL - ВІДПОВІДЬ

Крок 2: - Продовжуйте тут, або пропустіть крок 1 до тут, якщо ви не використовуєте Windows У відкритому терміналі (залежно від вашої ОС, що називається Ubuntu у Windows, термінал у Mac або Linux, або подібне ім'я), почніть із створення проекту. Ми робимо це за допомогою команди MKDIR, яка створює каталог. Якщо вам потрібно створити каталог для зберігання проекту, який рекомендується, використовуйте команду CD, щоб змінити каталог та та

CD/PATH/TO/каталог - Шлях - це папки (файли), які передують каталогу призначення, ваш шлях за замовчуванням - ~ або/домашнє/користувача (де ім'я користувача - ваше ім'я користувача). Щоб змінити каталог за замовчуванням, введіть 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" на ім'я вашого сценарію. Код у нано повинен виглядати:

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

І щоб закрити Nano, ми можемо утримувати клавішу управління і натиснути X, а потім Y, щоб позначити, що ми зберігаємо файл, і натиснуте на повернення. Тепер замість того, щоб вводити ці три команди для редагування сценарію, ми зможемо ввести Sudo Ascript Ascript, щоб знову редагувати сценарій. Це працює! І будь -який новий сценарій можна легко запустити, викликаючи його в оболонку. Давайте збережемо нашу роботу зараз: Давайте напишемо сценарій резервного копіювання, щоб зберегти наш новий сценарій, а потім створили резервну копію в нашому каталозі проекту, а також створимо резервну копію сценарію резервного копіювання.

sudo ascript backup

Тепер, в Нано:

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

Де/шлях/до/каталог - це шлях до проекту, який ви створили за допомогою MKDIR. Пізніше ми дізнаємось, як копіювати подібні повторні шляхи за допомогою циклу та списку, що менше коду, але поки що давайте простіше і матимемо кілька рядків. Щоб запустити цей сценарій та створити резервну копію коду, збережіть файл у Nano за допомогою Control+x, y та поверніться, і введіть нижче у свою оболонку

backup

Якщо вам взагалі буде запропоновано пароль під час читання цієї книги та слідкуючи за оболонкою, будь ласка, введіть пароль користувача правильно, у вас будуть три спроби, перш ніж вам потрібно повторно запустити команду. Ви можете використовувати стрілки вгору та вниз, щоб повторно їх та редагувати, якщо вам потрібно запустити що -небудь двічі. Прості натискання вгору та вниз, щоб вибрати команду, перш ніж редагувати команду правою, лівою стрілкою та видалити клавішу, а також клавіатуру, і запустити її з поверненням.

Вітаємо! Вам вдалося створити дивовижний сценарій резервного копіювання, який підкріплює два важливі сценарії оболонки у вашому робочому каталозі. Ми можемо перемістити речі пізніше, коли проект стає більшим, але це вже працює. Давайте перейдемо до резервного копіювання у хмарі, ми використовуємо для цього Github (хоча є численні інші рішення для резервного копіювання, вони все приблизно однакові.) Git - це програмне забезпечення для контролю Verision, яке дозволяє вам створити резервні копії до вашого програмного забезпечення, коли ви робите їх на сервер, а також дозволяє завантажувати цілі копії вашого програмного забезпечення за паролем або ключем. Це сприяє збереженню вашого програмного забезпечення, тим більше, що ми переходимо до захищених екземплярів Linux, які іноді розбиваються, коли один рядок коду не виходить з ладу, залишаючи вас заблокованим, поки ваш код може не бути резервним копією, якщо ви не отримаєте шансів автоматично створити його резервну копію, що ми покриємо.

Якщо ви вже не використовуєте віртуальну машину Ubuntu на даний момент, я рекомендую використовувати віртуальну машину Ubuntu на даний момент, оскільки це полегшить ваше життя при встановленні всіх пакетів, необхідних для створення робочого веб -сайту та заробити глибокі операції з навчання на своєму комп'ютері. Ми перенесемо код на веб -сервер найближчим часом, але ми хочемо переконатися, що за нашим веб -сервером є щонайменше кілька шарів безпеки, стійкі до фішингу, і використовуємо ряд пакетів Linux для цього. Якщо ви все ще хочете використовувати ОС Mac, ви можете шукати та встановити необхідні пакети в Інтернеті, але для кожного пакету, що ця книга чи серія може не бути.

Додамо кілька команд, щоб здійснити нашу роботу за допомогою сценарію резервного копіювання, запустивши резервну копію Command Sudo Ascript.

# ...

Ще раз керувати 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 може це зробити теж, але 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 є критичним у цьому випадку, оскільки це програмне забезпечення, яке працює веб -сайти, і дозволяє їм розміщувати веб -сайти з усім вищезгаданим програмним забезпеченням.

Давайте копаємося в Джанго.

Знову в нашому каталозі з 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, Aufterfer. Використовуючи нано,

nano app/settings.py

У налаштуваннях знайдіть встановлений_apps та розділіть [] на 3 рядки. Використовуючи чотири простори на порожній центральній лінії, додайте "подачу" або назву вашого додатка. Цей розділ налаштувань.py повинен виглядати:

INSTALLED_APPS = [
    'feed',
]

Перш ніж забути, давайте перевіримо, що Джанго працює. Використовуючи команду Python Manage.py Runserver 0.0.0.0:8000, ми можемо запустити сервер, а потім перейти у веб -браузер на комп'ютері, що працює з кодом на http: // localhost: 8000 і перегляньте приклад веб -сторінки (вона працює!) Увімкніть сервер з управлінням c, таким же, як і будь -якою іншою командою.

Тепер давайте розберемося, щоб написати якийсь код Python. У Джанго є три основні компоненти, усі вони повністю працюють за кодом. Компоненти називаються моделлю, переглядом та шаблоном, і кожен знаходиться на більш високому та нижньому рівні відповідно до доставки веб -сторінки користувачеві.

Модель - це код, який зберігає інформацію в базі даних для пошуку, сортування та візуалізації.

Вид вирішує, як модель надається, маніпулюється та модифіковано, майже кожен вигляд буде використовувати модель безпосередньо.

Шаблон - це HTML -код з деякими додатковими дзвонами та свистами, які називаються мовою шаблону. Шаблон надається поглядом, де він наповнений кодом Python та контекстом, такими як моделі та інформація (рядки та цілі числа) з перегляду.

У Джанго є й інші компоненти, включаючи, але не обмежуючись ними:

Налаштування, які налаштовують додаток, як ми говорили.

URL -адреси, які є шаблоном, до яких користувач дотримується, щоб отримати доступ до конкретних частин веб -програми.

Форми, які визначають, як інформація, яка надсилається на сервер, обробляється та надається до бази даних, а також користувачеві. Це основа інформації про обробку на стороні сервера і може приймати будь -який тип інформації, яку зберігає комп'ютер, особливо текстові рядки, цифри та справжні/помилкові булеви (зазвичай прапорці).

Шаблони, які є HTML -кодом та мовою шаблону, та мостоять розрив між Python та HTML, що означає інформацію Python, може бути виконаний як HTML -код, до якого кожен може отримати доступ, і може захистити веб -сайт з обмеженим доступом, одночасно робить код Python доступним для Інтернету і корисні для різноманітних цілей на віддаленому пристрої, який не повинен бути поруч із сервером.

Статичні файли, які зазвичай є JavaScript, і це бібліотеки, які сервер обслуговує і пов'язаний з шаблоном.

Медіа -файли, які сервер обслуговує або проводиться зовні, або просто записується на сервер, перш ніж обробляти та розміщувати на інший сервер (відро) для хостингу.

Middleware, яке є кодом, які запускаються одночасно, як і кожен погляд, і вважаються "включеними" у погляді.

Контекстні процесори, які обробляють контекст кожного погляду та використовуються для додавання додаткового контексту.

Тести, які підтверджують, що користувач або запит передає певні вимоги до того, як перегляд буде надано.

Споживачі, які диктують, як WebSockets обробляють та реагують на спілкування.

Адміністратор, який використовується для реєстрації моделей, щоб їх можна було детально маніпулювати на сторінці адміністратора Django, де база даних може бути введена через графічний інтерфейс.

Селера, яка визначає асинхронні завдання, частини коду Django можуть почати працювати, перш ніж негайно перейти до наступного завдання або рядка коду.

Django може мати багато інших компонентів, про які ми детально обговоримо тут. Існує безліч способів зробити Django більш функціональним, додавши WebSockets, які є швидкими, впорядкованими каналами зв'язку, селерою, яка виконує асинхронні завдання, та безліч інших програмного забезпечення для розширення Django, особливо у функціях перегляду, де здійснюється більша частина коду. Функції перегляду є ключовими, оскільки вони зазвичай оголошують кожен фрагмент коду, який є специфічним для конкретної схеми URL -адрес або розділу сервера.

Спочатку давайте вивчимо функції перегляду. Функції перегляду починаються з імпорту, що позначає код, який буде використаний у перегляді, і визначаються за допомогою регулярних визначень функцій або класів. Найпростіші погляди визначаються визначенням функції DEF та повернути httpression з основним шаблоном. Почнемо з визначення основного подання, щоб повернути текст "Hello World". Пам'ятайте, що кожного разу, коли ви додаєте код після такого оператора, як DEF, якщо, в той час як для тощо, вам потрібно буде додати 4 пробіли для кожного з попередніх визначень, які ви хотіли б застосувати до своєї функції. Ми незабаром увійдемо в те, що кожен із цих означає.

З каталогу нашого сайту відредагуйте файл seed/views.py за допомогою нано та додайте наступні рядки до кінця файлу.

from django.http import HttpResponse

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

HTTPRESSONS Django відповідає текстовим рядком, позначеним відкриттям та закриттям ". Кожен раз, коли ви передаєте інформацію на функцію чи клас, наприклад, запит або рядок, вам потрібно буде використовувати дужки (відкриття та закриття).

Це не все, що нам потрібно, щоб побачити наш погляд. Звичайно, ми не розповіли серверу, де саме погляд нам все одно потрібно визначити шлях, за допомогою якого погляд повинен відображати. Почнемо з визначення основного шляху в APP/urls.py, і ми пізніше перейдемо до груп шляху.

У додатку/urls.py додайте рядок після операторів імпорту після початку імпорту подання, який ми тільки що створили.

from feed import views as feed_views

Тепер давайте визначимо схему перегляду. Шаблони перегляду мають три компоненти, компонент шляху, який розповідає серверу, де подання існує на сервері (шлях URL, який користувач вводить у панель навігації для введення веб -сторінки), компонент перегляду, де вказаний перегляд, та дружнє ім'я для перегляду, щоб було легко отримати його шаблон для іншого, щоб отримати шаблон або прийняти більше, щоб назва було змінено і оновлюється, якщо це потрібно, щоб зробити простір для іншого перегляду. Має сенс робити речі таким чином і бути гнучким, оскільки ваша кодова база буде постійно мінливим середовищем, яке потребує гнучкості та імпровізації, щоб бути цінним та легким для роботи. Ось як виглядатиме ваш погляд, ви можете додати це до urlpatterns = [розділ програми/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 вашого додатка. Використовуючи нано, редагувати додаток/моделі.py та додайте новий клас. Клас визначається з визначенням класу і передається суперкласом, від якого він успадковує, у цьому випадку моделі. Модель. Назва класу з'являється після визначення класу, і після використання визначення класу A: (Колон) використовується, перш ніж атрибути та визначення функцій, пов'язані з класом, позначаються нижче. Наш клас потребує ідентифікатора, який ми можемо використовувати, щоб отримати його та зберегти його унікальним, а також потребує текстового поля для зберігання певної інформації. Пізніше ми можемо додати часові позначки, файли, булеві (правдиві чи помилкові визначення, які можуть допомогти нашому коду прийняти рішення про те, що робити з моделлю, і може бути використаний для його сортування), екземпляр для прив'язки моделі з користувачем, що ввійшов на сервер, тощо. Давайте розпакуємо код нижче:

from django.db import models # Імпорт, який використовується для визначення нашого класу та його атрибутів
class Post(models.Model): # Визначення нашого класу самого класу
    id = models.AutoField(primary_key=True) # Ідентифікатор нашої моделі, автоматично створений ключ, який дозволить нам запитувати модель, зберігати її унікальним і є корисним, коли нам потрібно взаємодіяти з моделлю після її створення.
    text = models.TextField(default='') # Атрибут нашого класу, в даному випадку, якийсь текст, за замовчуванням порожній рядок.

Закрийте і збережіть файл, як і раніше, щоб закінчити.

Існує багато інших полів та варіантів, які ми вивчимо, коли ми оновлюємо цей клас у міру розвитку нашої програми, але це основні потреби створення програми для розміщення певного тексту. Однак ця модель не буде працювати поодинці. Як описано раніше, нам знадобиться власний перегляд та спеціальний візерунок URL -адреси, щоб ця модель працювала, і нам також знадобиться форма разом із шаблоном. Давайте спочатку вивчимо форму.

Щоб визначити форму, редагувати додаток/forms.py з нано та додайте наступні рядки. Нам знадобиться два імпорту, наш клас форм, а також модель, яку ми створили (Feed.models.post), визначення класу, подібне до моделі, та поле разом із підкласом під назвою META, який визначатиме модель, з якою взаємодіє форма. Форма також може мати функцію ініціалізації, яка налаштовує її на основі інформації у запиті, моделі чи іншим чином, ми вивчимо це пізніше.

Форми моделі настільки корисні, оскільки вони можуть створити модель або також редагувати модель, тому ми будемо використовувати їх для обох. Давайте визначимо одну у формах.

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

Це займе хвилину, щоб виконати, але як тільки це станеться, це дозволить вам отримати доступ до моделі в поданнях, проміжному програмному забезпеченні чи деінде в програмному забезпеченні. Давайте продовжимо, оглядаючи, де ми можемо побачити нашу модель. Редагувати канал/views.py та додайте наступний код, як зазначалося. Вам не потрібно буде додавати нічого після знака #, що код - це коментарі, які використовуються для позначення інформації про код. Ми почнемо з імпорту нашої моделі в переглядах та додаванням до контексту, де ми можемо зробити її в шаблоні як список для дисплея. Далі ми додамо шаблон, де ми можемо зробити форму та модель за допомогою кнопки, щоб створити новий об'єкт на основі моделі та розмістити його на сервер. Це звучить складно, тому давайте просто зробимо крок за кроком. Перш ніж ми закінчимо вигляд, давайте створимо шаблон, який просто робить модель і переконайтеся, що ми можемо її побачити, створивши нову публікацію в оболонці. Ось як виглядати ця думка:

    posts = Post.objects.all() # Запитайте всі публікації в базі даних досі

Це все виглядає досить просто, поки ми не дістанмось до дна. Рендер, значення, повернене функцією, замість HTTP -відповіді, як і попередній приклад, завжди приймає запит як свій перший вхід, приймає контекст (у цьому випадку публікації в базі даних), який тепер може бути наданий у шаблоні, і повертає шаблон, визначений у функції. Шаблон буде документом HTML з невеликою мовою під назвою Jinja2, який надає Python інформацію в HTML.

Щоб почати створювати шаблони, зробіть два каталоги в кормі.

mkdir feed/templates
mkdir feed/templates/feed

Далі відредагуйте шаблон у каталозі вище, подача/шаблони/подача та додайте код для цього прикладу. Давайте розглянемо шаблон для цього прикладу.

Це дуже простий шаблон. Він визначає відкриття та закриття тегів HTML, тег типу документа, тег кузова з заголовком легенди, тег перерви, який додає невеликий рядок по екрану, і для циклу, що надає кожну публікацію у списку публікацій як абзац у шаблоні. Це все, що потрібно для надання публікацій, але в базі даних ще немає. Давайте створимо деякі з оболонкою. Ми можемо запустити оболонку з manage.py

python manage.py shell

Тепер імпортуємо нашу модель пост

from feed.models import Post

Далі ми створимо просту публікацію з рядком і вийдемо з оболонки. Рядок може бути будь -яким, доки це дійсне текст.

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

Нарешті, нам потрібно буде додати схему URL -адреси до нашого каналу. Оскільки наш додаток для каналів буде використовувати кілька URL -адрес, і ми хочемо зберегти розміри файлів невеликими, давайте створимо локальну URLS.PY у нашому додатку для подачі каналу, який виглядає так:

from django.urls import path
from . import views

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

Нам також потрібно буде відредагувати urls.py у базовому додатку, як би ми не вирішили його назвати, це був перший каталог, який ми створили. Редагувати додаток/app.py та додайте наступне до шаблонів URL -адрес

from django.urls import include # вгорі
    # ... Попередній код тут

Тепер, коли ми запускаємо сервер за допомогою Python Manage.py Runserver, ми побачимо створену нами сторінку, оскільки у нас є модель, перегляд та шаблон, а також шаблон URL -адреси, а також елементи в базі даних. Далі, давайте реалізуємо форму, яку ми створили, і почнемо створювати власні публікації. Але перш ніж ми напишемо занадто багато коду, давайте зробимо резервну копію за допомогою сценарію, який ми писали раніше, резервне копіювання. Запустіть цей сценарій в оболонці, зачекайте кілька моментів, і весь код буде підкріплений нашому сховищі 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 -адресу з запитом GET
        'form': PostForm(), # Не забудьте передати форму в контекст, щоб ми могли її зробити.

Тепер нам потрібно буде оновити шаблон для обліку нової форми. Ми можемо це зробити, використовуючи

Позначте HTML та надаючи форму в шаблоні HTML за допомогою кнопки подання. Нам також знадобиться маркер CSRF, маркер, який запобігає зовнішнім сайтам публікації у форму без попереднього завантаження сторінки.

Давайте розберемо це. Існує новий клас форми, маркер, сама форма та кнопка подання. Досить прості, але коли ми дивимось на це, ми можемо захотіти, щоб він виглядав краще. Це працює, ми можемо розміщувати нові публікації з формою, і вони зараз зберігаються в базі даних. Тут відбувається кілька речей. Ми використовуємо теги HTML, щоб заявити, що документ - це документ HTML, ми використовуємо тег шаблону ({ %… %}) для візуалізації маркера для форми та іншого, {{…}} для візуалізації форми. У нас також є петля для надання тексту за допомогою блоків тегів та тегу шаблону. Теги блоків дійсно важливі, оскільки ми можемо визначити, як з ними надаються розділи шаблону, а теги шаблонів - це основа того, як ми вкладаємо змінні в наш код.

Тепер нам потрібно зробити наш додаток краще, адже наразі це виглядає дійсно базовим. Ми можемо це зробити, використовуючи CSS, вбудований, або в класах, прив'язаних до кожного об'єкта в документі. CSS дуже приємний, тому що він розповідає все на сторінці, як він повинен виглядати, і може зробити це дуже добре. Є кілька бібліотек, які можуть це зробити, але мій особистий рух - Bootstrap.

Bootstrap можна завантажити зі свого веб -сайту,getbootstrap.com/. Потрапивши туди, натисніть кнопку, щоб прочитати документи про встановлення та скопіюйте код із розділу VINCE CDN. Вам знадобиться цей код у верхній частині вашого документа HTML, у тегу під назвою Head. Крім того, давайте продовжимо і створимо базовий шаблон, щоб нам не потрібно відтворювати ці посилання в кожному шаблоні.

Зробіть новий каталог під назвою Шаблони з шаблоном MKDIR, а потім редагувати шаблони/base.html.

Це повинно виглядати так:

Не забудьте скопіювати файли CSS та JavaScript, .CSS та .JS, оскільки нам знадобиться JavaScript, щоб зробити наш сайт більш функціональним у майбутньому.

Тепер повернемося до оболонки баш і запустимо швидку команду. Пам'ятайте, якщо вам коли -небудь потрібно отримати доступ до віртуального середовища, введіть джерело venv/bin/активуйте. Це дозволить вам встановити пакети Python локально таким чином, щоб дозволити Джинго отримати доступ до них. Щоб надати наші форми, створені заняттями Django Bootstrap, ми будемо використовувати пакет Python під назвою хрусткі форми. Ми можемо завантажити це за допомогою наступної команди

pip install django-crispy-forms

Після того, як це встановлено, додайте його до settings.py

    # … Попередній код тут

Тепер, назад у нашому шаблоні подачі, ми можемо видалити деякі речі. Давайте видалимо початок і кінець документа та замінимо його успадкуванням з нашого базового шаблону, використовуючи розширення та визначення блоку. Також ми додамо імпорт фільтра шаблону з навантаженням та шаблонним фільтром у форму. Нарешті, додамо клас завантажувального класу до кнопки на формі, щоб він виглядав більше як кнопка. Це повинно виглядати так:

Красиво! Це вже зовсім трохи коду. Далі ми повинні перевірити це і переконатися, що ми можемо побачити, що все виглядає приємно, а також будьте впевнені, що все працює належним чином. Запустіть сервер відповідно до попередніх інструкцій та переконайтесь, що сайт виглядає і працює добре. Чудова робота! Ви готові перейти до наступного кроку, на якому ми додамо функціональність входу користувача, використовуючи подібні URL -адреси, форми, перегляд та шаблони. Базовий шаблон важливий, і ми продовжуватимемо його змінювати та вносити зміни за потребою, але наразі зосередимось на тому, щоб зробити наш сайт більш безпечним, дозволяючи користувачам увійти в систему з іменем користувача та паролем, і, зрештою, ще важливішою інформацією, яка допоможе зберегти ваш додаток, а ваш власний рахунок доступний лише вами.

Для цього нам потрібно буде використовувати модель користувача, вбудовану в Django. Модель користувача - це модель бази даних, як і наша публікація, яку можна зробити для входу користувача на веб -сайт. В майбутньому, перш ніж ми розгорнемо сайт в Інтернеті, ми розширимо цю модель з іншими моделями, що віднесені до нього, та створимо додаткові заходи безпеки для входу, стійких до фішингу. Ми почнемо з використання деяких вбудованих у формах входу, які надає Джанго. По -перше, давайте створимо новий додаток, який ми будемо використовувати для візуалізації шаблонів та перегляду для основної сторінки входу. Ми також створимо інші програми для представлення постійних проблем входу, щоб забезпечити додаток, включаючи піндод, розпізнавання обличчя, польові зв'язки, зовнішні пристрої, багатофакторну автентифікацію та розпізнавання відбитків пальців.

Ми вже говорили про створення програми. З нашого каталогу, всередині віртуального середовища, проходять керувати цими аргументами

python manage.py startapp users

Тепер ми повинні мати каталог для нового додатка. Почнемо з створення подання в тому каталозі, який відповідає входу користувача. Django вбудував у «Погляди для входу користувачів», але вони не підходять для нас, оскільки нам потрібен власний вигляд, який, бажано, зроблено з визначенням.

У цьому перегляді ми почнемо з перевірки запиту на публікацію, передайте запит.

У користувачів/views.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 в майбутньому. Відредагуйте форми з Nano користувачами/forms.py та додайте наступний код.

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

Отже, у нас є інша форма, яка працює досить просто. Це форма реєстрації користувачів із іменем користувача, електронною поштою та паролем, а також полем підтвердження пароля. Зауважте, що ця форма не розширює звичайні форми. Одне поле визначається так само, і мета класу визначає модель, що форма відповідає решті інформації, яка буде записана у форму. Більшість цього вже існує в побудованому Django в UserCreationForm, тому ми будемо використовувати це як основу для класу (передані в дужках).

Далі ми розглянемо перегляд, щоб зареєструвати користувача, тепер, коли у нас є форма та шаблон. Це моделформ, як і той, що в новому поданні публікації. Редагувати користувачів/views.py та додайте наступний код:

# … Імпорт

Це все, що нам потрібно, щоб зареєструватися користувачем, але ми повинні мати більше інформації. Ми хочемо знати час, коли користувач зареєстрував, який час вони востаннє були на сайті, деяку інформацію про них, як, наприклад, біографія, часовий пояс тощо. Для цього ми оновимо моделі.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 ().

Тепер давайте зробимо наші входи більш стійкими. Ми вже можемо зробити наш сайт набагато менш вразливим до фішингу, просто обмежуючи кількість разів, коли ми дозволимо входити до сайту, це досить просто. Почнемо також зберігати деяку інформацію про кожного користувача раніше, коли ми продовжуємо розробляти нашу програму. Редагування користувачів/моделей.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. У нас є додатковий імпорт, Timezone, який дозволить нам встановити за замовчуванням на полях DateTime, а також у нас є персонаж Feild та TextField, як публікація. Використання всіх цих часових позначень допомагає нам захистити сайт та зрозуміти його використання, а текстові поля дозволяють нам надати інформацію про кожного користувача чи автора на веб -сайті. Onetoonefield повинен бути єдиним незначним увагою, воно поводиться точно так само, як і з лише одним на наступну модель. Таким чином, у користувача є лише один профіль, тоді як у них може бути багато публікацій.

Тепер давайте вдосконалюємо наш логін та зареєструємось для обліку профілю. По -перше, редагувати користувачів/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 Unix під назвою Cron. Щоб активувати цю утиліту, запустіть наступну команду та введіть свій пароль:

sudo crontab -e

Якщо ви ще не вибрали варіант 1 для Nano, текстовий редактор, з яким ви вже повинні бути знайомі, і прокрутіть до нижньої частини файлу за допомогою клавіш зі стрілками. Додайте наступний рядок:

0 * * * * sudo backup

Cron використовує формат хвилини, годину, день місяця, місяць, день тижня, де * або число являє собою, коли запускати команду. Використовуючи 0 для хвилини та * для решти параметрів, ми можемо запустити команду на першій хвилині кожної години на початку хвилини. Це дозволяє нам автоматично створити резервну копію коду. Усі завдання Крон, виконані з Sudo, запускаються як Root, тому нам не потрібно буде вводити пароль щогодини.

Щоб полегшити резервну копію наш код без використання пароля, давайте відключимо пароль для нашої команди резервного копіювання. Ми зробимо це, виконуючи таку команду та ввівши пароль:

sudo visudo

Тепер давайте прокрутимося внизу файлу і додамо інший рядок:

ALL ALL=NOPASSWD: /bin/backup

Це дозволяє нам запускати команду "резервне копіювання" як будь -який користувач, без пароля. Формат для цього простий, просто призначте рядок із "All All = nopasswd:/bin/" і закінчити команду, наприклад,/bin/backup, який існує в/usr/bin/.

Тепер почнемо працювати з електронною поштою. Електронна пошта дійсно важлива для веб -сайтів, оскільки це спосіб зберегти веб -сайт більш безпечним, перевірити, що користувачі є реальними людьми та навіть ринковими продуктами чи послугами для клієнтів. Багато людей, які часто відвідують Інтернет, перевіряють свою електронну пошту щодня, і отримують всілякі маркетингові електронні листи про продукти та послуги, які їх цікавить. Є кілька варіантів, коли мова йде про ввімкнення електронної пошти на веб -сайті Django, і ви можете вибрати будь -який найкраще для вас.

По -перше, ви можете оплатити послугу електронної пошти, яка дозволить вам надсилати електронний лист із домену та вимагає мінімального коду. Існує багато служб, які пропонують це, такі як Google Workspace, SendinBlue, Mailgun тощо.

В іншому випадку ви добре створюєте власну службу електронної пошти на своєму сервері з нуля. Я рекомендую цей варіант, навіть якщо він більше коду і може зажадати спеціального хостингу. Ви не зможете запустити поштовий сервер із домашнього комп'ютера, швидше за все, тому давайте продовжимо та вивчимо конфігурацію та код, щоб надсилати електронний лист, перш ніж ми запустимо сервер у хмарі та створимо власний поштовий сервер всередині.

По -перше, редагувати налаштування.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_host_password) повинен бути встановлений на пароль, який ви генеруєте для сервера. Я завантажую пароль з конфігураційного файлу, щоб він не був від коду за допомогою наступної логіки, над цими рядками в Settings.py:

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

Потім я налаштував файл JSON з Config in /etc/config.json, використовуючи Nano наступним чином.

Редагувати файл:

sudo nano /etc/config.json

Додайте наступні рядки:

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

Ми продовжуватимемо редагувати файл конфігурації та додавати всі паролі та клавіші, які ми будемо використовувати в додатку. Поки що швидко розглянемо, як надсилати електронну пошту за допомогою Python. По -перше, давайте створимо шаблон для перевірки електронної пошти, який ми можемо надіслати нашим користувачам та поставити його в каталог шаблонів користувачів. Цей шаблон буде написаний у HTML.

nano users/templates/users/verification_email.html

Цей електронний лист досить простий. Це потребує контексту користувача, базової URL -адреси для сайту, ідентифікатора користувача та маркера, які використовуються для перевірки електронної пошти користувача. Не забудьте визначити базову URL -адресу в налаштуваннях.py, перш ніж писати якийсь код Python, щоб зробити шаблон. Вперед і додайте наступні рядки до app/settings.py, на початку.

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

BASE_URL = PROTOCOL + '://' + DOMAIN

Врешті -решт, коли ваш сайт буде готовий до Інтернету і ви розгортаєте його, ви хочете визначити свій домен як доменне ім'я, яке ви купуєте для представлення сайту. Це ім'я, яке ви введете в NAVBAR, щоб отримати доступ до свого сайту. Поки що ви можете залишити домен порожнім або використовувати заповнювач. Ви також захочете змінити ім'я сайту на ім'я, яке ви хочете дати свій сайт, на вибір.

Перш ніж надсилати електронну пошту, давайте створимо генератор маркерів, щоб ми могли мати маркер активації облікового запису, який ніколи не закінчується. Ми можемо це зробити, будуючи та імпортуючи маркер активації облікового запису, який виглядає як наступне. Відредагуйте файл:

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 -адресі, і користувач може використовувати для перевірки своєї електронної пошти та активації їх облікового запису.

Далі, давайте подивимось, як надіслати електронний лист. Використовуючи 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)

Це досить просто. Ми імпортуємо функції, необхідні для надсилання електронної пошти, надання електронної пошти за допомогою шаблонів та наших налаштувань, а потім визначаємо електронну пошту за іменем шаблону та надсилаємо його користувачеві за допомогою функції. Ви помітили

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. Нарешті, ми перевіряємо, чи надісланий електронний лист, і якщо цього не було, ми позначаємо в профілі користувача, що їх електронна пошта не є дійсною.

Давайте повернемося до моделей користувачів, щоб ми могли зробити це все. Нам потрібно визначити функцію для створення посилання на скасування підписки та визначити булеве поле, щоб позначити, що електронна пошта користувача не є дійсною.

По -перше, додайте наступний імпорт до вершини користувачів/моделей.py

nano users/models.py
# ...

Далі, додамо функції до моделі користувача, щоб зробити маркер та перевірити маркер, який використовується для активації електронної пошти, а також поле, щоб зберегти, чи успішно користувач отримує свою пошту. У користувачів/моделей.

# ...
            TimestampSigner().unsign(key, max_age=60 * 60 * 24 * 30) # Дійсна протягом 30 днів

Це досить просто, ми використовуємо TimestampSigner, який є основним інструментом криптографії, щоб створити маркер, який закінчується через певну кількість часу, а також ми використовуємо іншу функцію, щоб перевірити, чи вона дійсна. Ми використовуємо ці жетони двічі, один раз для перевірки електронної пошти та один раз для скасування підписки.

Тепер, коли ми маємо це, останнє з роботи, яку нам потрібно буде зробити, - це погляди. У межах користувачів/views.py додамо подання, щоб перевірити адресу електронної пошти та скасувати підписку.

nano users/views.py

Спочатку додайте наступний імпорт. Я кинув кілька додаткових, тому пізніше нам не доведеться імпортувати більше предметів.

from .email import send_verification_email # Переконайтесь, що імпортуйте функцію надсилання електронної пошти підтвердження

Можливо, у вас вже є деякий з цих імпортів, але повторювати їх не завадить. Вам потрібно буде імпортувати функцію надсилання електронної пошти перевірки, а також Account_Activation_token від користувачів.

Тепер, внизу файлу, додайте наступний код:

        # скасувати їх
    # Інакше перенаправити на сторінку входу
# Sendwelcomeemail (запит, користувач)

Це багато коду. Давайте розберемо його. Перша функція, чиста і проста, скасовує користувача зі списку розсилки. Друга функція активує їх електронну пошту, і ви помітите, що я додав коментувану функцію, Sendwelcomeemail. Ви можете використовувати шаблон електронної пошти та визначення функції, щоб надіслати привітання електронної пошти, я просто ще цього не зробив. Остання функція, яку я кинув, є важливою, оскільки закінчується термін дії електронних листів активації. Тому нам потрібно буде деякий час надіслати електронну пошту з активацією. Ми можемо використовувати для цього основну форму та зателефонувати на функцію, щоб надіслати електронну пошту перевірки. Перш ніж ми це зробимо, давайте переконаємось, що він надсилається в першу чергу, додавши функцію виклику до перегляду реєстру. Додайте цей рядок безпосередньо перед перенаправленням у перегляді реєстру, DEF Register, у користувачів/views.py.

nano users/views.py
# … (Після) Реєстр DEF (запит):
# … (Раніше) переспрямувати (

Вам не потрібно додавати перші та останні рядки в цей фрагмент коду, просто переконайтеся, що перегляд реєстру надсилає електронну пошту користувачеві. Це повинно виглядати так:

# … Імпорт
            send_verification_email(user) # Переконайтеся, що додайте цей рядок!

Тепер нам потрібно буде додати форму для перебування електронного листа з активацією. У користувачів/forms.py додайте таку форму:

# … (Імпорт)

Нам також знадобиться шаблон, що відповідає цій формі активації електронної пошти. Додамо цей шаблон. Відредагуйте файл:

nano users/templates/users/resend_activation.html

Далі додайте наступний код у файл.

Ух, це багато! Тепер, коли ми розгортаємо код на нашому сервері, ми зможемо надсилати електронну пошту HTML та активувати облікові записи користувачів за допомогою клацання в електронній пошті. Ми також можемо хотіти надіслати простий вітальний електронний лист, тож давайте подивимось, як це зробити. Повернувшись до користувачів/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 та зробити наші погляди безпечними, приймати реєстрації користувачів, надсилати сумісну електронну пошту та інформацію про кеш, що є основою того, що потрібно зробити веб -сайту, щоб залишатися актуальними. Ми додамо ще кілька корисних функцій, а потім створимо основу для розгортання нашого коду на віддалений сервер, налаштування поштового сервера, конфігурації домену та фільтрів, щоб зробити наш сайт безпечним та доцільним.

Нам також знадобиться перегляд скидання пароля, тому давайте додамо це дуже швидко. Вбудований перегляд скидання пароля Django зламається в деяких функціях, але ми розглянемо, як написати власний перегляд, шаблон електронної пошти, форми та шаблони URL -адрес. Ось як виглядає погляд, у користувачів/views.py

# ... імпорт

Ця форма вбудована в Django, але нам знадобиться шаблон для підтвердження скидання пароля, користувачів/шаблонів/користувачів/password_reset_confirm.html

У нас також є шаблон для надсилання електронної пошти для скидання пароля з простою формою, у користувачів/шаблонах/користувачів/password_reset.html

Шаблон для самої електронної пошти простий, це основне HTML -файл, що відображає посилання на скидання пароля, у користувачів/шаблонах/користувачів/пароля_eset_email.html. Django автоматично інтерпретує цей файл.

Нам також знадобляться ще два шаблони. Перший - це підтвердити, що електронний лист надіслав. Погляди на них вже в Джинго, тому нам просто потрібно звернутися до них у urls.py. Цей шаблон розташований на користувачах/шаблонах/користувачі/пароль_reset_done.html

І нарешті, для підтвердження того, що скидання пароля завершено, користувачі/шаблони/користувачі/password_reset_complete.html

Тепер нам потрібні моделі URL -адреси для цих поглядів. У користувачів/urls.py додайте такі шаблони URL -адреси:

    # ... попередні URL -адреси тут

Чотири шаблони, це багато! Але тепер ми можемо бути впевнені, що зможемо скинути пароль користувача в будь -який час, коли нам потрібно, все з веб -браузера.

Я розумію, що це багато коду. Якщо це здається трохи над головою, це нормально. Ви покращите, ваше розуміння покращиться, і ви станемо набагато компетентнішими з кодом дуже скоро. Якщо ви повністю загублені, я рекомендую повернутися до цього програмного забезпечення пізніше після роботи над самостійним кроком "Навчитися кодувати курс в Інтернеті. Зазвичай вони вільні для початку, і проведуть вас через усе, що вам потрібно, щоб досягти успіху, коли ви повернетесь до цього проекту. Якщо ви відчуваєте, що готові продовжувати, читайте далі, далі, ми висвітлюємо розгортання вашого коду на віддалений сервер та налаштовуємо поштовий сервер, а також автоматизуючи своє розгортання за допомогою BASH, щоб ви завжди могли налаштувати новий проект з кількома простими командами.

Останнє, що нам потрібно зробити перед розгортанням на віддаленому сервері, - це зробити наш сайт трохи більш безпечним. Ви помітите, що перегляд входу приймає лише ім'я користувача та пароль, і немає багатофакторної автентифікації або одноразового коду. Це просте виправлення, і з тим самим кодом ми можемо зробити наш сайт надсилати текстові повідомлення і навіть відповідати текстом, що надсилаються на сервер. Для початку ми повернемося до моделей користувачів і додамо підписник часової позначки, який представлятиме кожен вхід. Ми також додамо унікальний, обертовий ідентифікатор до моделі користувача, яка буде використана для додавання додаткової безпеки до нашого входу. Редагування моделей користувачів, користувачів/моделей.py, додайте наступний код:

# Переконайтесь, що імпортуйте UUID, генератор подій часової позначки та генератор URL -адреси (зворотне)
    # Додайте цей код сюди
    # І додати цю функцію
            TimestampSigner().unsign(key, max_age=60 * settings.AUTH_VALID_MINUTES) # Дійсна протягом 3 хвилин

Переконайтеся, що ваші користувачі/моделі.py виглядає так, крім коментарів (код у рядках з #). Розбиваючи це, це просто. У нас є кілька імпорту, часовий тілесний показник, який є криптографічною утилітою, яка може генерувати безпечний код і перевірити його, щоб переконатися, що він є дійсним, використовувався лише один раз, а не старше певної кількості секунд. Ми також використовуємо UUID, який є унікальним ідентифікатором, який ідентифікує нашого користувача у підписанні маркера та в URL -адресі, де маркер надсилається користувачеві. Ми використаємо цю основну криптографію для створення двофакторного виду аутентифікації. Перш ніж ми зробимо щось інше, запустимо міграцію, щоб наші моделі користувачів оновлювались. У каталозі з Manage.py запустіть наступні команди, щоб здійснити та завершити міграцію.

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

Це важливо, оскільки щоразу, коли ми вносимо зміни в моделі, нам потрібно буде створити таблиці та оновлювати базу даних за замовчуванням, перш ніж ми зможемо реально використовувати моделі.

Далі, давайте імпровізуємо наш перегляд входу, щоб перенаправити на вторинний перегляд аутентифікації. У користувачах/views.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) # Тож вони не можуть увійти знову на кілька секунд

Тож це досить просто, тепер у нас є спосіб перенаправити на подання аутентифікації двох факторів, коли ми його створюємо. У нас також є резерв, якщо користувач не додав номер телефону. Незабаром ми додамо базовий вигляд, щоб додати номер телефону та ввійти з текстовим повідомленням незабаром.

По -перше, нам потрібен простий спосіб надіслати текстове повідомлення з нашого коду. Для цього ми можемо вибрати з ряду API, але найпростішим, на мою думку, є Twilio. Вони також пропонують хороші ціни для менших проектів, а також об'ємних знижок. Створіть обліковий запис на twilio.com, заповніть деякі деталі про свій проект, придбайте номер телефону та скопіюйте свої ключі API на свої settings.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 -адреси. Останнє, що нам потрібно налаштувати, - це подання профілю, щоб ми могли переконатися, що користувач може змінити свій номер телефону, не ввійшовши в систему.

Додамо перегляд профілю до користувачів/views.py. Цей вигляд оновлює біографію, електронну пошту, ім'я користувача та номер телефону, а також дозволить нам дозволити багато факторів. По -перше, нам знадобиться ще дві форми в користувачах/формах.py

# ... імпорт

Далі ми можемо створити вигляд для використання обох цих форм. Редагувати користувачів/views.py та додайте в перегляд.

# Додайте цей імпорт

Нам також знадобиться шаблон для цього погляду.

nano users/templates/users/profile.html

Ви помітите, що це досить проста форма, але в ньому є якийсь JavaScript, який автоматично розміщує вміст форми під час їх оновлення. Це корисно мати, тому ви зможете робити редагування без необхідності подавати щоразу.

Далі нам потрібні URL -адреси, що представляють усі ці погляди в URL -адресах користувачів. Редагувати користувачів/urls.py та додайте цей код:

# … Попередній код, імпорт
# … Шаблони URL -адреси, які ми раніше вводили, додайте наступні три рядки

Зараз хороший час для перевірки нашого проекту. Але спочатку запустимо ще одну резервну копію.

backup

І запустити сервер. Перш ніж ми розгортаємо на сервер Linux, це гарна ідея, щоб увімкнути дві факторні автентифікацію в обліковому записі. Ми зробимо це, перейти до нашої URL -адреси профілю,/користувачів/профіль/, а також встановити поле, щоб увімкнути аутентифікацію після введення нашого номера телефону, а потім подати форму.

python manage.py runserver localhost:8000

Відвідайте веб -сторінку, перейшовши до свого веб -браузера, я використовую Google Chrome у цьому прикладі та вводячи URL HTTPS: // LOCALHOST: 8000/ACCOUNTS/Профіль/Профіль/

Ви зможете увійти, якщо це необхідно, і ввімкнути аутентифікацію двох факторів.

Цей проект потребує сервера для запуску, щоб він справді міг відправити пошту. Але спочатку нам потрібен спосіб побачити помилки. Ви помітите, що якщо ви запустите сервер у режимі налагодження, з settings.debug дорівнює справжньому, сервер автоматично показує помилки. Щоб показати помилки, не використовуючи режим налагодження, що небезпечно на виробничому сервері, ми повинні додати вигляд для нього. Найважливіші помилки, з якими ми повинні вміти впоратися:

Помилка 500 - проблема з нашим кодом Помилка 404 - сторінка, яка не знайшла (зламана URL -адреса) Помилка 403 - дозвіл заперечується помилка

Додамо новий додаток для обробки цих помилок, що називається помилками.

python manage.py startapp errors

Додайте це до settings.py, як ми це робили раніше, у налаштуванні встановлення_apps, і почніть з додавання посилань до деяких переглядів у додатку/urls.py, де додаток - це назва вашого проекту Django.

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

Це все, що нам потрібно, крім перегляду помилок, шаблонів та трохи проміжного програмного забезпечення. Давайте визначимо їх як такі:

# Створіть тут свої погляди.

Далі визначимо середнє програмне забезпечення для обробки цих помилок. Ми зробимо це, спочатку додавши до Middleware_Classes у settings.py, з назвою нашого середнього програмного забезпечення.

    # ... Попереднє програмне забезпечення

Далі додамо проміжне програмне забезпечення.

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

Це наш найпростіший шаблон досі, але так легко побачити помилки в нашому проекті. Далі відключимо налагодження в налаштуваннях.

nano app/settings.py

Знайдіть цей рядок, де він встановлений на істину, і змініть його на фальшивий

DEBUG = False

Вперед і резервне копіювання програми зараз. Ми готові розгорнутись на віддалений сервер Linux і продовжуємо додавати функції звідти.

sudo backup

Перш ніж ми опублікуємо цей код на сервер, ми повинні врахувати, що з кодом можуть виникнути деякі проблеми. Залежно від справи, сайти, які приймають інформацію, розміщуються, матимуть проблеми з розміщенням спаму та труднощами усунення спаму. Це не повинно відбуватися негайно, але якщо це відбудеться, ми пізніше вивчимо, як автоматично поміркувати спам на сайті та зробити його жорсткішим для роботи, щоб отримати доступ до сайту, а також, як деактивувати облікові записи користувачів та перевірити особу користувача за допомогою сканування їх посвідчення особи або біометричного сканування, як відбиток пальців або розпізнавання обличчя.

Дивлячись на приклад багатофакторної автентифікації, який ми вивчали у виробництві, все може бути різним. Зверніть увагу, як ми обмежуємо входи, що обмежуємо тарифи, і термін дії жетонів. Якщо роботи отримують доступ до сайту, аутентифікація з двома факторами може бути складнішою, оскільки вони можуть вводити коди одночасно з користувачем. Для боротьби з цим давайте використовуємо модель у моделях користувачів, заявляючи, як ми взаємодіємо з сайтом, коли ми автентифікуємось за допомогою багатофакторної автентифікації з номером телефону. Ми також додамо можливість для автентифікації електронною поштою. Почніть з редагування моделей користувачів за допомогою Nano.

nano users/models.py

Це те, як повинна виглядати модель, яку ми додаємо. Нам не потрібні будь -які методи, просто змінні для зберігання ідентифікатора, користувача, часової позначки, терміну придатності, довжини та спроб проти будь -якої багатофакторної автентифікації (такий код, як 123456, надісланий на телефон або електронну пошту).

# Основний маркер, який використовується для входу на веб -сайт

Давайте також додамо привілей до нашого користувача, і ми встановимо її вручну, перш ніж врешті -решт перейти на залучення привілейованих користувачів автоматично. У моделях користувачів додайте цей рядок у профілі:

    vendor = models.BooleanField(default=False)

Як і в будь -яких змінах бази даних, нам потрібно здійснити міграцію та мігрувати базу даних у будь -який час, коли ми редагуємо файл моделей.py у Django. Пам'ятайте, що для цього ми використовуємо джерело спочатку (якщо воно вже не використовувалося з моменту відкритого терміналу), а потім Python керує.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
# Автентифікуйте користувача за допомогою їх електронної пошти або номера телефону
    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(): # Створіть запит для наступного параметра (якщо такі є)
                        return HttpResponseRedirect(next) # Переспрямувати
            elif not token_validated: # Якщо маркер був недійсним
            if p.mfa_attempts > 3: # Якби було занадто багато спроб
            if form.data.get('send_email', False): # Надішліть електронний лист (або текст)
    # Надайте форму (для отримання запитів)

Коли ми додаємо цей код, переконайтеся, що імпортуйте функцію, щоб надіслати електронний лист. У верхній частині файлу користувач переглядає (з іншим імпортом), додайте

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

Тож все це чудово працює, тепер у нас є багатофакторна система аутентифікації, яка залежить від номера телефону або електронної пошти для входу. Але нам також потрібен спосіб видалити або принаймні приховувати користувачів, які не співпрацюють з нашими умовами. Це можуть бути спамери, роботи чи кожен, хто не означає добре для нашої роботи. Погляньте на погляд, який я маю для моніторингу користувачів на своєму веб -сайті:

# імпорт
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

Це спільно з шаблоном користувачів/користувачів.html, який виглядає приблизно так:

Зауважте, що шаблон включає ще один шаблон, користувачі/user.html. Використовуючи шаблон, який має суб'єкт і не використовує розширення, це гарна ідея додати підкреслення () перед назвою файлу для продовження, щоб розрізнити шаблони.

Зауважте, що це багато джинджа, ви можете не визначити всіх цих змінних. Але так виглядає мій код.

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

Нам також потрібен ще один субтемпат, toggle_active.html. Цей шаблон повинен бути формою, яка дозволяє нам перемикати, чи працює користувач.

Нам також потрібно буде додати вигляд для перемикання активності користувачів та відповідних моделей URL -адрес. Поки ми в ньому, додамо вигляд, щоб видалити користувача на випадок, якщо нам це потрібно.

# Імпорт
    success_url = '/' # Перенаправлення на URL -адресу успіху
    def test_func(self): # Перевірте, якщо користувач є надпорядником і має дозвіл на видалення

Хоча це практично, коли це необхідно, видалення користувача не повинно бути необхідним більшу частину часу, ми можемо просто перемістити видимість користувачів, які відвідують сайт, якщо нам потрібно їх звільнити.

Шаблони URL -адреси, які ми додали, виглядають так. З Nano редагувати користувачів/urls.py і додайте ці рядки:

nano users/urls.py

Рядки повинні перейти до списку шляхів у перегляді користувачів, перед закінченням "]", але після початку "[".

# ...
# ...

Тепер переконайтеся, що створити резервну копію сайту, щоб ви могли завантажити його на веб -сервер, над яким ми продовжимо працювати. З командного рядка,

sudo backup

Тепер наш сайт резервно копіюється.

Тож тепер у нас є ще кілька корисних функцій. А як щодо великої картини тут? Цей код досі не доступний з Інтернету, у нас ще немає поштового сервера, і нам потрібно розширити нашу програму, щоб включити комплексний процес перевірки, а також плавні макети, щоб допомогти нам вивчити сайт, а також безпечні протоколи для автентифікації привілейованих користувачів.

Ми дістанемося до всього цього. Найголовніше на даний момент буде просто отримати цей код в Інтернеті, що ми можемо зробити лише за допомогою декількох рядків BASH на сервері Ubuntu. Вам потрібно буде взяти напрокат сервер для цього, якщо у вас є сервер вдома та підписка на бізнес, яка дозволяє відкривати порти. Я особисто запускаю свій веб -сайт на HP Z440, який встановлюється в моїй квартирі, але зазвичай це набагато дешевше для основних потреб в оренді віртуального приватного сервера (VPS).

Майте на увазі, що код, який ми зараз працюємо, відносно тонкий, його потрібно буде підтримувати та вдосконалити, перш ніж ми будемо готові використовувати те, що ми маємо для створення продукту. Переконайтеся, що будьте обережні, що ви робите з Інтернетом, переконайтеся, що якщо ви публічно розгортаєте цей веб -сайт на Інтернеті на сервері Linux, у вас є план блокувати небажані взаємодії з вашим веб -сайтом. Спочатку це, ймовірно, не буде проблемою, але ми розглянемо різноманітні рішення для боротьби з цим, включаючи машинне навчання, штучний інтелект та комп'ютерне бачення. Коли це стає проблемою, погляньте далі в цьому тексті для рішення.

Що стосується оренди VPS, то можна багато місць, куди можна поїхати. Google Cloud має сервери VPS, Ionos, Kamatera, Amazon AWS та інші постачальники пропонують рішення хмарних серверів, які відповідатимуть нашим потребам.

Вам потрібно буде натиснути їх форми та вибрати план, щоб розпочати роботу. Ви можете перейти з базовим планом з будь -яким постачальником, але переконайтеся, що постачальник дозволяє відкрити порти поштового сервера для надсилання електронної пошти (це повинен бути порт 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 (вони більш безпечні, тому я раджу їх використовувати.) Наступний код генерує ключ 4096 Bit RSA SSH.

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/ігри
# Стратегія, що використовується для параметрів у SSHD_CONFIG за замовчуванням
# OpenSsh - це вказати параметри зі значенням за замовчуванням, де
# можливо, але залиште їх коментованими.  Некомментовані параметри перекривають
# Значення за замовчуванням.
# Порт 22
# Адресна вільність будь -якої
# ListeAddress 0.0.0.0
# Listeaddress ::
# HostKey/etc/ssh/ssh_host_rsa_key
# HostKey/etc/ssh/ssh_host_ecdsa_key
# HostKey/etc/ssh/ssh_host_ed25519_key
# Цифери та ключ
# Rekeylimit за замовчуванням
# Реєстрація
# Syslogfacistily auth
# Інформація про реєстрацію
# Автентифікація:
# Logingracetime 2m
# DeveroOtlogin забороняє
# СТРИКТМОДИ ТАК
# Maxauthtries 6
# Максссія 10
# Очікуйте .ssh/avollized_keys2 не враховується за замовчуванням у майбутньому.
# Avollizzyprincipalsfile None
# AllosizedKeyscommand None
# AlloizedKeysCommandUser ніхто
# Для цього вам також знадобляться клавіші хоста в/etc/ssh/ssh_ invellow_hosts
# HOSTBASEDAUTHENTICATION NO
# Змініть на так, якщо ви не довіряєте ~/.ssh/know_hosts для
# HostBasedAuthentication
# Ігнорезер відомого
# Не читайте файли користувача ~/.rhosts та ~/.shosts
# Невігласи так
# Щоб відключити тунельні прозорі текстові паролі, змініть тут ні!
# Directemptypasswords
# Змініть на Так, щоб увімкнути паролі відповіді на виклик (
# Деякі модулі та нитки)
# Варіанти Кербероса
# Kerberosauthentication №
# Kerberosorlocalpasswd так
# Kerberosticketcleanup так
# Kerberosgetafstoken ні
# Параметри GSSAPI
# Gssapiauthentication №
# Gssapicleanupcredentials так
# Gssapistrictacceptorcheck так
# Gssapikeyexchange
# Встановіть це на "так", щоб увімкнути автентифікацію PAM, обробку облікових записів,
# та обробка сеансу. Якщо це увімкнено, аутентифікація PAM буде
# бути дозволеним через KbDinterActiveAuthentication і
# Пароль  Залежно від конфігурації PAM,
# Аутентифікація PAM через KBDinterActiveAuthentication може обходитися
# Налаштування "DeallootLogin без Password".
# Якщо ви просто хочете, щоб перевіри облікового запису та сеанси проходили без
# Аутентифікація PAM, а потім ввімкніть це, але встановіть пароль
# і KbDinterActiveAuthentication до "Ні".
# Дозволити зафіксовано так
# Allowtcpforwarding так
# Шлюзи ні
# X11displayOffset 10
# X11uselocalhost так
# Дозвіл Так
# Printlastlog так
# Tcpkeepalive так
# Dielluserenvironment №
# Стиснення затримки
# ClientAliveInterval 0
# ClientAliveCountMax 3
# Usens no
# Pidfile /run/sshd.pid
# Maxstartups 10: 30: 100
# Дозвіл
# Chrootdirectory none
# Версія
# Немає шляху банера за замовчуванням
# Дозвольте клієнту передавати змінні середовища місцевості
# Переоцінка за замовчуванням відсутності підсистем
# Приклад переважних налаштувань на основі користувача
# Відповідати користувачеві anoncvs
# X11Forwarding NO
# Дозволити
# Дозвіл ні
# Сервер CVS Forcommand

Пам'ятайте, ctrl+x і y, щоб зберегти файл. Далі напишемо основний сценарій, який називається ініціалізацією (все в домашньому каталозі за замовчуванням нашого користувача).

nano initialize

Додайте ці рядки до файлу, замінюючиЗа допомогою ключа SSH ви знайшли за допомогою CAT. (.ssh/id_rsa.pub)

# !/bin/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
# Каталог проекту
# Команди журналів
# Нано конфігурація
# Git config
# Оновлення та встановлення
# Увімкнути Clamav Antivirus
# Встановити ім'я хоста
# Налаштування Postgres
# Налаштування резервного копіювання бази даних
# Вимкнути iptables
# Встановіть BitDefender
# Налаштування PostFix
# Створити Діру
# Налаштування 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 privke.pem
# sudo cp /etc/letsencrypt/live/femmebabe.com/cert.pem cert.pem
# Патч Венв
# Встановити налаштування користувача
# Встановити дозволи
# Sudo Chown -R Team: Користувачі/var/run/
# Sudo Chown root: root/run/sudo/ts -r
# sudo chmod 664 db.sqlite3
# Sudo Chown www-data: користувачі db.sqlite3
# Скопіюйте конфігурацію та встановіть дозволи
# База даних налаштування
# Введіть конфігурацію PAM та видаліть несправну конфігурацію 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
# Вимкнути сайт за замовчуванням
# Увімкніть наш сайт
# Перезавантажте демон і перезапустіть Apache, Postfix та Opendkim
# Встановити дозволи
# Конфігурація заміни
# ІНТЕРИНАЦІЙНИЙ ДВИГАТЕЛЬ
# Налаштування git
# Показати IPv6 та Opendkim для конфігурації домену
# Налаштування завершено

Це багато налаштувань! In short, this code logs commands, configures nano and git, copies over files, downloads and installs ubuntu apt packages, python dependencies, configures postfix, configures postgresql (the database server) and loads the database, configures ufw (an uncomplicated firewall), disables iptables, downloads an antivirus, makes directories, clones dependencies, installs certificates and Встановлює сервер, встановлює конфігурацію, запускається та дозволяє розподіляти, розподіляти обмін, встановлює дозволи та друкує IP, IPv6 -адресу та ключ Opendkim. Досить просто, але це виглядає як багато коду. Нам не знадобиться багато цього, тому що у нас немає залежностей, ми не використовуємо селеру, селекцію чи дафну, але ми встановимо деякі з них, щоб розпочати роботу. Зауважте, що цей код має домен, оголошений кілька разів.

Нам також потрібно буде придбати доменне ім'я (що є невеликою щорічною плату). Я рекомендую Squarespace для придбання домену, їх макет є інтуїтивно зрозумілим та простим у використанні. Ви можете придбати будь -який домен на ваш вибір, але я використовую домен femmebabe.com у цьому прикладі. Після того, як ви купили домен, перейдіть на панель конфігурації DNS Squarespace і додайте запис, що вказує на свій домен на сервер за IP -адресою. Це повинно виглядати так:

@ Xx.xx.xx.xx

З оператором @ в якості хоста, тобто всі субдомени під цим доменом та кореневим доменом перенаправляться на сервер. Є більше записів, які можна оголосити, але ми можемо перейти до них, як тільки ми будемо готові надіслати пошту. Майте на увазі, може пройти кілька днів, перш ніж ви зможете успішно відправити пошту з сервера. Записи DNS, які ми встановлюємо, потребує часу для поширення.

У будь -якому випадку, єдиний запис, який нам потрібно почати, - це запис. Тож тепер ми можемо заповнити сценарій нижче відповідно до нашого проекту та запустити його.

Почнемо з меншого сценарію налаштування, щоб просто встановити те, що нам потрібно для основного прогресу. Ми ще не будемо використовувати стільки залежностей або postgresql, ми просто запустимо основний HTTP -сервер і турбуємось про його засвідчення, коли це буде зроблено. Пам'ятайте, щоб отримати сертифікат HTTPS та надійно запустити сервер, нам потрібно буде придбати домен разом з орендою сервера. Наразі замініть "Команду" у цьому файлі на ім'я вашого користувача "Дір" на каталог вашого проекту та надайте електронну пошту та домен у тегах <>.

Крім того, перед тим, як запустити цей код, нам потрібно змінити налаштування на брандмауер, який підтримує хостинг -провайдер, якщо такі є. Зазвичай це на вкладці "Мережі" вашого хостингового постачальника, або якщо ви самостійно хостинг, його в розділі "Переадресація порту" вашого маршрутизатора. Ви також захочете налаштувати статичний IP через свій маршрутизатор із адресою вашої серверної машини, якщо ви використовуєте самостійне хостинг. Вам потрібно буде відкрити наступні порти для доступу до читання/запису.

22 (SSH) 25 (пошта) 587 (пошта) 110 (поштовий клієнт) 80 (HTTP) 443 (HTTPS)

# !/bin/bash
# Команди журналів
# Нано конфігурація
# Git config
# Оновлення та встановлення
# Увімкнути Clamav Antivirus
# Встановити ім'я хоста
# Налаштування резервного копіювання бази даних
# Вимкнути iptables
# Налаштування virtualenv
# Встановіть certbot
# Запустити certbot
# Встановити налаштування користувача
# Встановити дозволи
# Sudo Chown -R Team: Користувачі/var/run/
# Sudo Chown root: root/run/sudo/ts -r
# Перезавантажити та ввімкнути послуги
# Увімкнути модулі Apache
# Перезавантажте демон і перезапустіть Apache, Postfix та Opendkim
# Показати IPv6 та Opendkim для конфігурації домену

Перш ніж запустити цей код, переконайтеся, що придбаний вами домен підключений до сервера. Для цього відкрийте термінал на своїй локальній машині та запустіть цю команду з доменом:

ping femmebabe.com # Вставте сюди свій домен, після пінг

Якщо все виглядає добре, і сервер надсилає відповіді, ми готові запустити сценарій та встановити пакети, а також запустити, увімкнути та засвідчити наш сервер Apache.

Це не всі налаштування, необхідні для налаштування Postfix, ми розглянемо цю установку більше пізніше. Наразі запустіть цей код налаштування, і для встановлення та сертифікації сервера потрібно потрібно кілька хвилин. Ще раз обов'язково замініть ім'я, електронну пошту та доменне ім'я в сценарії відповідно до імені, яке ви придбали.

Тепер, коли сервер надається, ви можете перейти до URL -адреси в будь -якому веб -браузері та перевірити, чи переконатися, що сервер працює HTTPS. Якщо це не так, спробуйте трохи чекати, коли записи DNS наздогнали, а потім запустіть наступну команду, щоб повторно повторно сертифікувати Certrbot:

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/сайти, доступні/.

sudo a2ensite femmebabe-le-ssl
sudo systemctl reload apache2

Поверніться до свого домену в Навбарі. Ви повинні побачити сайт, який ви налаштували у своєму веб -браузері. Вітаємо! Якщо ви цього не бачите, можливо, вам доведеться внести деякі зміни. Ретельно перегляньте налаштування у вашому проекті, конфігурація Apache та переконайтеся, що у вас немає помилок, і запустіть наступні команди, щоб перевірити проект на наявність помилок.

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

Якщо у вас є помилки у вашому проекті Python, простежте їх туди, де вони знаходяться, і виправте їх. Можливо, ви не зможете побачити всі свої помилки залежно від того, де вони знаходяться, тому, якщо у вас є помилка, яка просто говорить, що "заповнення не є повторним", відредагуйте наступний файл у віртуальному середовищі, register.py, щоб викрити помилку.

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

Перейдіть до рядка 83, де піднімається ця помилка виконання (підніміть Runtimeerror ("Poculate () не повторно")) і додайте коментар до цього рядка, а потім додавання, з тим самим відступом, self.app_configs = {}. Це виглядає так:

                # Запобігти повторним дзвінкам, щоб уникнути запуску AppConfig.ready ()
                # методи двічі.
# Підвищити RunTimeerror ("Poculate () - це не повторно")

Потім ви можете перевірити проект ще раз і викрити помилку.

python manage.py check

Потім ви можете побачити помилку і виправити її. Коли у вас його виправлено, і код компілює без помилок, обов'язково змініть назад файл, щоб він виглядав так:

                # Запобігти повторним дзвінкам, щоб уникнути запуску AppConfig.ready ()
                # методи двічі.
# self.app_configs = {}

За умови, що сервер є в Інтернеті, коли ми вносимо будь -які подальші зміни до нього, нам потрібно використовувати наступну команду для перезавантаження сервера:

sudo systemctl reload apache2

Дивовижно! А як щодо надсилання пошти? Щоб почати надсилати електронну пошту, спочатку нам потрібно буде оновити конфігурацію домену. Це має бути на вашій панелі DNS у Squarespace, або будь -якому реєстратору доменних імен. Нам також потрібно буде встановити та додати конфігурацію та запустити кілька команд.

Спочатку давайте отримаємо адресу IPv6 сервера. Потім ми відкриємо ваші DNS та додамо записи.

Щоб отримати адресу IPv6 сервера, використовуйте цю команду:

ip -6 addr

Тепер ми можемо додати наступні записи до налаштувань DNS. Мої записи виглядають так. Однак для своїх записів слід замінити IP -адресу на ваш IP (не 75.147.182.214, це моє). Також додайте свій домен замість femmebabe.com, а також вашу адресу IPv6, знайдену з попередньою командою (ви не можете використовувати мою, Fe80 :: 725A: FFF: Fe49: 3E02). Наразі не турбуйтеся про доменей, це створюється, коли ми налаштовуємо 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 ~ всі

за замовчуванням._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 Конкретний: уточнення імені файлу спричинить перше
# рядок цього файлу, який буде використовуватися як ім'я.  Дебіан за замовчуванням
# є /etc /mailname.
# myorigin = /etc /mailname
# Додавання. Домен - це робота Муа.
# Послідовність наступного рядка для створення попереджень про "затримку пошти"
# DALDE_WARNING_TIME = 4H
# Див. Http://www.postfix.org/compatibility_readme.html - за замовчуванням до 3.6
# свіжі установки.
# Параметри TLS
# Мілтерна конфігурація

Наступна конфігурація!

nano config/etc_postfix_master.cf

Додайте ці рядки:

# 
# Файл конфігурації головного процесу Postfix.  Детальніше про формат
# файлу див.
# Он-лінія: http://www.postfix.org/master.5.html).
# 
# Не забудьте виконати "Postfix Reload" після редагування цього файлу.
# 
# ==============================================================================================================
# Тип сервісу приватне uncriv chroot wakeup maxproc command + args
# (так) (так) (ні) (ніколи) (100)
# ==============================================================================================================
# smtp inet n - y - 1 Постекр
# SMTPD PASS - - Y - - SMTPD
# dnsblog unix - - y - 0 dnsblog
# tlsproxy unix - - y - 0 tlsproxy
# Виберіть один: Увімкніть подання лише для клієнтів, що займаються петлями, або для будь -якого клієнта.
# 127.0.0.1:Submission inet n - y - - smtpd
# -O syslog_name = postfix/подання
# -o smtpd_tls_security_level = шифрування
# -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_restrictions =
# -o smtpd_relay_restrictions = DEVIRE_SASL_AUTHENTICT, відхилити
# -o milter_macro_daemon_name =
# Виберіть один: Увімкніть SMTPS лише для клієнтів, що займаються петлями, або для будь -якого клієнта.
# 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_restrictions =
# -o smtpd_relay_restrictions = DEVIRE_SASL_AUTHENTICT, відхилити
# -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. Обов'язково вивчіть посібник
# Сторінки програмного забезпечення, що не є Postfix, щоб дізнатися, які варіанти він хоче.
# 
# Багато з наступних служб використовують доставку Postfix (8)
# агент.  Див. Сторінку PIPE (8) MAN для отримання інформації про $ {одержувач}
# та інші параметри конверта повідомлення.
# ====================================================================================
# 
# maildrop. Докладніше див.
# Також вкажіть у main.cf: maildrop_destination_recipient_limit = 1
# 
# 
# ====================================================================================
# 
# Останні версії Cyrus можуть використовувати існуючий запис Master.cf "LMTP".
# 
# Вкажіть у cyrus.conf:
# lmtp cmd = "lmtpd -a" listen = "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 user = cyrus argv =/cyrus/bin/doell -e -r $ {sender} -m $ {extension} $ {user}
# 
# ====================================================================================
# Старий приклад доставки через Cyrus.
# 
# Old -Cyrus unix - n n - - труба
# flags = r user = cyrus argv =/cyrus/bin/doell -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 для генерації файлів SystemD
# /etc/systemd/system/opendkim.service.d/override.conf та
# /etc/tmpfiles.d/opendkim.conf. Хоча це все ще можливо, це зараз
# Рекомендується регулювати налаштування безпосередньо в /etc/opendkim.conf.
# 
# Deemon_opts = ""
# Змініть на/var/spool/postfix/run/opendkim, щоб використовувати розетку Unix за допомогою
# Postfix в chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Нерозбірливий для визначення альтернативної розетки
# Зауважте, що налаштування це замінить будь -яке значення розетки на opendkim.conf
# за замовчуванням:
# Слухайте на всіх інтерфейсах на порту 54321:
# Розетка = inet: 54321
# Слухайте на Loopback на порту 12345:
# Розетка = inet: 12345@localhost
# Слухайте 192.0.2.1 на порту 12345:
# Socket = 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 = 256 м
# Користувач для входу в систему використовується внутрішньо в процесах входу. Це найбільш ненадійне
# користувач у системі 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 процес тощо.
  # Повні дозволи цій розетці можуть отримати список усіх імен користувачів і
  # Отримайте результати пошуку кожного користувача.
  # 
  # Режим 0666 за замовчуванням дозволяє будь -кому підключитися до розетки, але
  # Пошуки userdb досягне успіху лише в тому випадку, якщо userdb поверне поле "UID", яке
  # відповідає UID процесу абонента. Також, якщо UID або GID Caller відповідає
  # uid або gid socket. Пошук досягає успіху. Все інше викликає невдачу.
  # 
  # Щоб надати абоненту повну дозволи шукати всіх користувачів, встановіть режим
  # Ще щось, ніж 0666, і Dovecot дозволяє ядру застосовувати
  # Дозволи (наприклад, 0777 дозволяє всім повними дозволами).
  # Процес робітника Auth за замовчуванням виконується як корінь, щоб він міг отримати доступ
  # /etc/тінь. Якщо це не потрібно, користувача слід змінити на
  # $ default_internal_user.
  # користувач = root
  # Якщо використовується DICT проксі, поштові процеси повинні мати доступ до його розетки.
  # Наприклад: режим = 0660, група = vmail та глобальна mail_access_groups = vmail
    # режим = 0600
    # користувач =
    # Група =

Ще раз обов'язково замініть домен у всіх цих файлах, femmebabe.com, із обраним вами доменом. Відредагуйте наступний файл, конфігурація Dovecot,

nano config/etc_dovecot_dovecot

І додайте ці рядки

## Файл конфігурації DoveCot
# Якщо ви поспішаєте, дивіться http://wiki2.dovecot.org/quickconfiguration
# Команда "doveconf -n" дає чистий вихід змінених налаштувань. Використовувати його
# Замість копіювання та вставки файлів під час публікації до списку розсилки DoveCot.
# '# 'Характер і все після нього трактуються як коментарі. Додаткові простори
# і вкладки ігноруються. Якщо ви хочете використовувати будь -який із них прямо, покладіть
# value inside quotes, eg.: key = "# char і проміжок пробілу "
# Більшість (але не всіх) налаштувань можуть бути перекриті різними протоколами та/або
# Джерело/призначення IPS, розміщуючи налаштування всередині розділів, наприклад:
# Протокол IMAP {}, локальний 127.0.0.1 {}, віддалений 10.0.0.0/8 {}
# Значення за замовчуванням відображаються для кожного налаштування, це не потрібно роз'єднати
# ті. Це винятки з цього: немає розділів (наприклад, простір імен {})
# Або налаштування плагіна додаються за замовчуванням, вони вказані лише як приклади.
# Шляхи також є лише прикладами, коли реальні за замовчуванням базуються на налаштуваннях
# варіанти. Перераховані тут шляхи призначені для налаштування --prefix =/usr
# --sysconfdir =/etc-localstatedir =/var
# Увімкнути встановлені протоколи
# Кома -розділений список IPS або хостів, де слухати для з'єднань.
# "*" прослуховує у всіх інтерфейсах IPv4 ",:" Послухає у всіх інтерфейсах IPv6.
# Якщо ви хочете вказати порти, що не є дефоутом, або щось більш складне,
# редагувати conf.d/master.conf.
# слухати = *, ::
# Базовий каталог, де зберігати дані про виконання.
# base_dir =/var/run/dovecot/
# Ім'я цього екземпляра. У налаштуванні багатоповерхової установки та інших команд
# Можна використовувати -I <SIDANCE_NAME>, щоб вибрати, який екземпляр використовується (альтернатива
# до -c <config_path>). Назва екземпляра також додається до процесів DoveCot
# У вихідному PS.
# instance_name = dovecot
# Вітальне повідомлення для клієнтів.
# login_greeting = dovecot готовий.
# Простір розділений список надійних мережевих діапазонів. З'єднання з них
# IPS дозволяється перекрити свої IP -адреси та порти (для журналу та
# для перевірки аутентифікації). disable_plaintext_auth також ігнорується для
# ці мережі. Зазвичай ви вказали тут свої сервери проксі -серверів IMAP.
# login_trusted_networks =
# Простір відокремлений список доступу до доступу до входу (наприклад, TCPWRAP)
# login_access_sockets =
# З proxy_maybe = так, якщо проксі -сервер відповідає будь -якому з цих IPS, не робіть
# проксі. Це не потрібно нормально, але може бути корисним, якщо призначення
# IP, наприклад, IP -файл балансира навантаження.
# auth_proxy_self =
# Показати більше заголовків багатослівних процесів (у PS). В даний час показує ім'я користувача та
# IP -адреса. Корисно для того, щоб побачити, хто насправді використовує процеси IMAP
# (Наприклад, спільні поштові скриньки або якщо для декількох облікових записів використовується той самий UID).
# verbose_proctitle = ні
# Якщо всі процеси будуть вбиті, коли головний процес DOVECOT закривається.
# Встановлення цього "ні" означає, що Dovecot може бути оновлений
# Примушення існуючих клієнтських з'єднань закриватися (хоча це також може бути
# Проблема, якщо оновлення, наприклад, через виправлення безпеки).
# Shutdown_clients = так
# Якщо ненуль, запустіть команди пошти за допомогою багатьох підключень до сервера Doveadm,
# Замість того, щоб запускати їх безпосередньо в одному процесі.
# doveadm_worker_count = 0
# Unix Socket або Host: Порт, що використовується для підключення до сервера Doveadm
# doveadm_socket_path = doveadm-сервер
# Простір відокремлений перелік змінних навколишнього середовища, які зберігаються на Dovecot
# запуск і передав усім його дитячим процесам. Ви також можете дати
# КЛЮЧ = Пари значення, щоб завжди встановлювати конкретні налаштування.
# import_environment = tz
## 
## Налаштування словника сервера
## 
# Словник може бути використаний для зберігання ключів = списки значення. Це використовується декількома
# плагіни. До словника можна отримати або безпосередньо, або хоча
# Словник Словника. Наступні назви словника карт DICT до URIS
# Коли використовується сервер. Потім можна посилатися на використання URI у форматі
# "Проксі :: <Ім'я>".
  # quota = mysql: /etc/dovecot/dovecot-dict-sql.conf.ext
# Більшість фактичної конфігурації включається нижче. Імена файлів є
# вперше відсортовано за їх вартості ASCII і проаналізовано в такому порядку. 00-префікси
# Імена файлів призначені для того, щоб полегшити розуміння замовлення.
# Конфігураційний файл також може спробувати включити, не даючи помилки, якщо
# це не знайдено:
# Дозволяє DoveCot слухати всі вхідні з'єднання (IPv4 / IPv6)

Додайте пароль для користувача DoveCot:

nano config/etc_dovecot_passwd

Перша частина файлу, перед товстою, - це ім'я користувача. Остання частина "YourPassword" позначає пароль, який ви хотіли б дати своєму поштовому сервері.

team:{plain}yourpassword

Далі, конфігурація Opendkim

nano config/etc_opendkim.conf

І додайте ці рядки:

# Це основна конфігурація для підписання та перевірки. Це може бути легко
# адаптований відповідно до основної установки. Див. OpendKim.conf (5) та
# /usr/share/doc/opendkim/examples/opendkim.conf.sample
# Документація доступних параметрів конфігурації.
# Logwhy ні
# Загальні параметри підписання та перевірки. У Debian, "від" заголовка є
# винищені, оскільки це часто ключ ідентичності, який використовується в системах репутації
# і, таким чином, дещо чутливий до безпеки.
# Підписання домену, селектора та ключа (потрібно). Наприклад, виконайте підписання
# для домену "example.com" з селектором "2020" (2020._domainkey.example.com),
# Використання приватного ключа, що зберігається в /etc/dkimkeys/example.private. Більш детально
# Параметри налаштування можна знайти в /usr/share/doc/opendkim/readme.opendkim.
# Домен Приклад.com
# Селектор 2020
# Keyfile /etc/dkimkeys/example.private
# У Debian Opendkim працює як користувач "opendkim". UMASK 007 потрібен, коли
# Використання локальної розетки з MTA, які отримують доступ до розетки як невіле
# Користувач (наприклад, Postfix). Можливо, вам доведеться додати користувача "postfix" до групи
# "Opendkim" у цьому випадку.
# Розетка для з'єднання MTA (необхідна). Якщо MTA знаходиться всередині в'язниці з чуватом,
# Потрібно забезпечити, щоб розетка доступна. У Debian, Postfix працює
# Chroot In/var/Spool/Postfix, тому повинен бути розетка Unix
# налаштовано, як показано на останньому рядку нижче.
# Локальна розетка: /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.
# Сересри імен 127.0.0.1
# Карта доменів від адрес до клавіш, що використовуються для підписання повідомлень
# Набір внутрішніх хостів, пошта яких слід підписати
nano config/etc_default_opendkim

І додайте ці рядки

# Примітка. Це застарілий файл конфігурації. Він не використовується Opendkim
# Systemd Service. Будь ласка, використовуйте відповідні параметри конфігурації в
# /etc/opendkim.conf.
# 
# Раніше можна було б відредагувати налаштування за замовчуванням тут, а потім виконати
# /lib/opendkim/opendkim.service.generate для генерації файлів SystemD
# /etc/systemd/system/opendkim.service.d/override.conf та
# /etc/tmpfiles.d/opendkim.conf. Хоча це все ще можливо, це зараз
# Рекомендується регулювати налаштування безпосередньо в /etc/opendkim.conf.
# 
# Deemon_opts = ""
# Змініть на/var/spool/postfix/run/opendkim, щоб використовувати розетку Unix за допомогою
# Postfix в chroot:
# Rundir =/var/spool/postfix/run/opendkim
# 
# Нерозбірливий для визначення альтернативної розетки
# Зауважте, що налаштування це замінить будь -яке значення розетки на opendkim.conf
# за замовчуванням:
# Слухайте на всіх інтерфейсах на порту 54321:
# Розетка = inet: 54321
# Слухайте на Loopback на порту 12345:
# Розетка = inet: 12345@localhost
# Слухайте 192.0.2.1 на порту 12345:
# Socket = 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 годин. Зазвичай це набагато швидше. Ви можете перевірити, чи працює ваш сервер за допомогою цієї команди, постачає вашу електронну пошту:

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

Якщо все, здається, працює правильно, ви повинні мати можливість надсилати електронну пошту з вашим сервером. Якщо це не працює, спробуйте переглянути журнали, щоб побачити, якою може бути помилка.

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

Це запропонує багатослівну інформацію про пошту, яка надсилається сервером та чи працює вона належним чином. Ви повинні мати можливість побачити електронну пошту і у папці "Вхідні", якщо його немає, перевірте свою папку спаму.

Вам також потрібно буде налаштувати свої налаштування у ваших settings.py, щоб ваш сервер електронної пошти могла поговорити з вашим додатком Django, проектом. Додайте або замініть ці рядки у своїх налаштуваннях

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

Зауважте, що ми використовуємо конфігураційний файл для отримання пароля. Давайте завантажимо цей файл у налаштуваннях, як так, на самому початку файлу.:

# Відкрити та завантажувати конфігурацію

Давайте створимо цей файл і додамо до нього секретний ключ, а також пароль пошти. Щоб створити секретний ключ, використовуйте цю команду, з будь -якою довжиною, яка вам подобається в кінці:

openssl rand -base64 64

Тепер скопіюйте текст, який OpenSSL створений та редагувати /etc/config.json

sudo nano /etc/config.json

Додайте до свого файлу наступні рядки з ключем, який OpenSSL створюється як секретний ключ.

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

Формат JSON простий і простий у використанні, ми можемо оголосити інші клавіші, які ми хочемо використовувати в нашому проекті таким чином, і тримати їх окремими від нашого каталогу проекту, щоб інші користувачі не могли їх писати, і тому їх не можна читати з нашого каталогу проекту. Це рекомендується практика для клавіш API, з яких ми будемо використовувати тут більше кількох.

Ви також захочете створити резервну копію проекту, щоб переконатися, що все збережено, і ви зможете відновити свою роботу пізніше, навіть якщо ви більше не хочете взяти напрокат сервер.

sudo backup

Тепер спробуйте надіслати електронну пошту HTML з веб -сервера, що надає один із командного рядка працює. Запитайте ваш екземпляр користувача в Shell та надішліть електронну пошту HTML цьому користувачеві через Django. Змініть моє ім'я в коді, Шарлотта, на своє ім'я користувача.

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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں



Three Thirteen Online Free Play three thirteen online for free. Invite a Friend Join a Game ***.
خrیdیں

بذریعہ Daisy / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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

بذریعہ Daisy / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


Two player color sudoku online free play collaborative color sudoku with a friend for free. Invite a Friend Join a Game ***.
خrیdیں

بذریعہ Daisy / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں



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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں



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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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.


خrیdیں

بذریعہ Daisy / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں


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 / دیکھیں | خریدیں | cryptocurrency کے ساتھ خریدیں




https://glamgirlx.com -


(تصویر ڈاؤن لوڈ کرنے کے لئے کلک کریں یا ٹیپ کریں)
پیشہ ورانہ تفریح ​​، تصاویر ، ویڈیوز ، آڈیو ، لائیو اسٹریمنگ اور آرام دہ اور پرسکون گیم پلے کے ساتھ ساتھ ID اسکیننگ ، ویب ڈویلپمنٹ اور سروگیسی خدمات۔

اس پتے کا استعمال کرتے ہوئے مجھے بٹ کوائن میں ایک نوک چھوڑیں: 3KhDWoSve2N627RiW8grj6XrsoPT7d6qyE

© Glam Girl X 2025

خدمت کی شرائط